По вопросу 1.
В таблице 
Договора создаете поле 
num, типа 
число. Скрываете его в настройках доступа. В вычислениях таблицы 
Договора создаете вычисление
if (!$line['num']) {
  $sqlQuery = "SELECT max(`fXX1`) AS maxNUM FROM `".DATA_TABLE."78` WHERE (`status`<>'2' AND `f849`='" . $line['Компания']['ID'] . "')";
  $result = mysql_query($sqlQuery) or user_error(mysql_error() . "<br>" . $sqlQuery . "<br>", E_USER_ERROR);
  $row = mysql_fetch_assoc($result);
  $line['num']=$row['maxNUM']+1;
}
 Устанавливаете срабатывание вычисления - 
Сохранение в таблице.
Касаемо внутренних имен полей. Каждое поле помимо названия, которое Вы ему присваиваете, имеет внутреннее имя. Посмотреть его можно, например, если войти в настройки полей таблицы. При наведении обычно внизу появляется ссылка перехода. Параметр field - это номер требуемого поля, внутреннее имя соответствует ему с буквой f в начале, т.е. f492, например. В случае, если ссылка при наведении не выводится, кликните по нему - в адресной строке все будет. Т.о., Вы определите имя поля 
num, которое создали, и имя поля связи Таблицы 
Контрагенты и 
Договора. В стандартной конфигурации это поля называется 
Компания и имеет имя в базе 
f849.
Если хотите подойти глобально к структуре базы, посмотрите 
здесь.
Пояснение по вычислению.
Запросом sql из таблицы 
Договора выбирается запись, которая не является удаленной (`status`<>'2'), в поле связи имеет номер соответствующий номеру текущего контрагента (`f849`='" . $line['Компания']['ID'] . "') и при этом имеет максимальное значение в поле 
num (SELECT max(`fXX1`)). После этого номер увеличивается на единицу и заносится в текущую запись (последняя строчка вычисления).
Далее.
Меняете тип поля 
Номер на текстовое. И в вычислениях таблицы 
Договора создаете еще одно:
$line['Номер']=$line['Компания'] ['ID'] . "-" . str_pad($line['num'], 3, "0", STR_PAD_LEFT);
Настраиваете срабатывание также, как и в первом случае, при сохранении в таблице.
Для удобства пользователей в настройках доступа поля снимите галочку с опции 
Добавление. В этом случае при создании новой записи поле 
Номер появляться не будет, что исключит неправильное его заполнение. Но при повторном открытии записи будет возможность откорректировать номер, если в этом будет необходимость.
По вопросу 2.
Нумерацию Вы можете создать по аналогичной схеме, выбирая из таблицы 
Приложения запись, связанную с текущим 
Договором  и максимальным значением поля 
num. Что касается шаблона - при его формировании в теле ставите отбор по тому же полю 
num. Если равно 1 - формируете один шаблон печати, если 2 - второй шаблон и т.д. Вот только вопрос. У Вас поля для шаблонов одни и те же или для каждого свои? Ежели вариант 2 - тогда все намного 
интереснее.