Переход с платформы 1С 8.3 на старую добрую 1С 7.7 часто вызывает у новичков культурный шок. Отсутствие привычного слова «Макет», иная структура метаданных и специфические механизмы работы с внешними формами заставляют тратить часы на простые задачи. В этой статье мы подробно разберем, как найти, отредактировать и настроить печатную форму договора в среде 1С 7.7, особенно если вы работаете с конфигурациями типа «Камин».
Первое, что нужно усвоить: в 1С 7.7 нет «Макетов» в том виде, к которому мы привыкли в «восьмерке». Аналогом макета здесь выступает Таблица. Она может находиться в трех местах, и нам необходимо последовательно их проверить:
.mxl (только таблица) или .ert (внешняя обработка с формой и кодом).Проанализируем ситуацию: как понять, какой файл используется? Для этого воспользуемся отладчиком. Поставим точку останова в процедуре Печать модуля формы документа. Нам нужно найти вызов функции ОткрытьФорму или ОткрытьФормуМодально, где в качестве параметра указан путь к файлу в папке ExtForms. Обычно в «Камине» печатные формы лежат по пути: КаталогИБ() + "\ExtForms\PrnForms\".
Если мы выяснили, что макет находится во внешнем файле .ert, откроем его через меню «Файл — Открыть» в Конфигураторе. Внутри мы увидим привычное окно с закладками «Диалог», «Модуль» и «Таблица». Если же перед нами файл .mxl, его можно редактировать как обычную таблицу. Рассмотрим основные типы ячеек, которые нам встретятся:
Договор № [НомерДок].Внешние формы в 1С 7.7 не имеют прямой связи с реквизитами документа. Чтобы передать данные из документа в печатную форму, используется специальный объект — Контекст. В конфигурациях «Камин» он часто передается под именем n_Контекст.
Выясним причину, по которой данные могут не выводиться. Если мы просто напишем в таблице [Статус], программа может выдать ошибку или пустую строку, так как переменная Статус не определена в самом модуле обработки печати. Чтобы «достучаться» до данных документа, необходимо обращаться через переданный контекст:
[n_Контекст.Статус]
Если же Статус — это ссылка на справочник, а нам нужно вывести его текстовое наименование, используем конструкцию:
[n_Контекст.Статус.Наименование]
Рассмотрим задачу: в договоре нужно писать «Автор», если сотрудник один, и «Соавторы», если их несколько. В 1С 7.7 нет встроенного механизма склонений, поэтому нам придется реализовать простую логику в модуле обработки. Разберем по шагам, как это сделать.
Для начала создадим СписокЗначений, в котором сопоставим формы единственного и множественного числа. Это удобнее, чем писать бесконечные условия Если...Иначе.
// Создаем соответствие ед. и мн. числа
СЗ_Статусы = СоздатьОбъект("СписокЗначений");
СЗ_Статусы.ДобавитьЗначение("авторы", "автор");
СЗ_Статусы.ДобавитьЗначение("соавторы", "соавтор");
СЗ_Статусы.ДобавитьЗначение("наследники", "наследник");
СЗ_Статусы.ДобавитьЗначение("составители", "составитель");
Затем определим количество сотрудников в документе и выберем нужную форму слова. Предположим, у нас есть переменная КолвоСотрудников, которую мы получили из табличной части документа.
// Получаем статус из контекста (например, "автор")
ТекущийСтатусЕд = n_Контекст.Статус.Наименование;
// Ищем множественное число в нашем списке
МнЧисло = "";
Позиция = СЗ_Статусы.НайтиЗначение(ТекущийСтатусЕд);
Если Позиция > 0 Тогда
ТекущийСтатусМн = СЗ_Статусы.ПолучитьЗначение(Позиция, МнЧисло);
Иначе
ТекущийСтатусМн = ТекущийСтатусЕд; // Если не нашли, оставляем как есть
КонецЕсли;
// Финальный выбор для печатной формы
ПечСтатус = ?(КолвоСотрудников > 1, МнЧисло, ТекущийСтатусЕд);
Теперь в ячейке таблицы (тип «Шаблон») мы можем просто написать: именуемые в дальнейшем [ПечСтатус]. Переменная ПечСтатус будет автоматически подставлена при выводе секции.
Проанализируем еще одну особенность 1С 7.7 — Слои. В редакторе таблицы вы можете увидеть, что некоторые элементы перекрывают друг друга. Это сделано для того, чтобы выводить разный контент в зависимости от условий. Например, слой «Организация» и слой «ФизЛицо».
Управление слоями в коде происходит при выводе секции:
Таб.ВывестиСекцию("Шапка|СлойОрганизации");
Если вы добавили новых сотрудников и хотите, чтобы они выводились списком, убедитесь, что вы используете цикл в модуле и метод ВывестиСекцию. В макете (таблице) это должна быть одна строка, оформленная как секция (меню «Таблица — Секции — Назначить имя»).
// Пример вывода списка сотрудников
n_Контекст.ВыбратьСтроки();
Пока n_Контекст.ПолучитьСтроку() = 1 Цикл
// Заполняем переменные для текущей строки
ПечСотрудник = n_Контекст.Сотрудник.Наименование;
// Выводим секцию "СтрокаСотрудника" из макета
Таб.ВывестиСекцию("СтрокаСотрудника");
КонецЦикла;
Важный совет: При работе с внешними файлами всегда делайте резервную копию файла .ert или .mxl перед началом редактирования. В 1С 7.7 нет системы отката изменений (Undo), которая работала бы после сохранения файла.
Таким образом, мы рассмотрели полный цикл модификации печатной формы: от идентификации местоположения макета до написания программного кода для обработки бизнес-логики. Понимая разницу между контекстом документа и локальными переменными макета, вы сможете эффективно решать задачи любой сложности в среде 1С:Предприятие 7.7.