В процессе эксплуатации систем на базе 1С:Предприятие 8.3 часто возникает необходимость изменить внешний вид печатной формы: добавить логотип, изменить шрифт или, что гораздо сложнее, вывести новый реквизит документа, который ранее не отображался. В этой статье мы подробно разберем, как добавить параметры в макет печатной формы непосредственно в пользовательском режиме, рассмотрим ограничения этого метода и найдем способы их обхода с помощью небольших программных манипуляций.
Прежде всего, проанализируем, как работает механизм печати в типовых конфигурациях. Большинство современных решений используют Библиотеку стандартных подсистем (БСП). В пользовательском режиме (раздел «Администрирование» — «Печатные формы, отчеты и обработки» — «Макеты печатных форм») можно открыть любой макет и отредактировать его. Однако простое добавление текста в ячейку не превратит его в динамические данные. Чтобы данные подтягивались из документа, ячейка должна иметь тип Параметр или Шаблон.
Рассмотрим ситуацию, когда нам везет, и разработчик конфигурации заранее предусмотрел гибкое заполнение макета. В программном коде 1С часто используется метод Заполнить() для заполнения параметров области макета значениями из какого-либо объекта (структуры или самого документа).
Проанализируем алгоритм работы этого механизма. Если в коде формирования печатной формы встречается конструкция вида:
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
ТабличныйДокумент.Вывести(ОбластьМакета);
В этом случае система ищет в структуре ДанныеПечати свойства, чьи имена совпадают с именами параметров в макете. Разберем по шагам, как это использовать:
Склад или Ответственный).Важный нюанс: Если этот реквизит уже присутствует в запросе, который собирает ДанныеПечати, он автоматически отобразится в форме без написания кода. Часто программисты выгружают в структуру ДанныеПечати весь объект целиком, и тогда любой реквизит шапки будет доступен для вывода простым добавлением его имени в макет.
Если стандартный запрос не содержит нужного нам поля, нам придется прибегнуть к расширению. Рассмотрим ситуацию, когда нужно вывести специфический реквизит, которого нет в структуре данных для печати. Проанализируем, как переопределить метод печати.
Выясним причину отсутствия данных: скорее всего, в модуле менеджера объекта в процедуре формирования данных для печати этот реквизит просто не выбирается из базы данных. Мы можем использовать аннотацию &Вместо или &После для корректировки данных. Посмотрим на пример кода в расширении:
&Вместо("СформироватьДанныеДляПечати")
Функция Мой_СформироватьДанныеДляПечати(МассивОбъектов, ПараметрыПечати)
// Получаем стандартную структуру данных
Данные = ПродолжитьВызов(МассивОбъектов, ПараметрыПечати);
// Добавляем в структуру свои данные для каждого объекта
Для Каждого СтрокаДанных Из Данные Цикл
// Например, нам нужно добавить артикул из связанного справочника
СтрокаДанных.Вставить("МойНовыйПараметр", "Значение из БД");
КонецЦикла;
Возвращает Данные;
КонецФункции
После внесения таких изменений в расширение, мы можем вернуться в пользовательский режим и добавить в макет параметр с именем МойНовыйПараметр. Теперь система «увидит» его и заполнит данными.
Иногда нам нужно вывести не просто значение реквизита, а комбинированный текст, например: «Срок поставки: [СрокДней] рабочих дней». Для этого разберем работу с шаблонами:
[] система воспримет как имя параметра.Этот способ удобен тем, что позволяет пользователю самостоятельно форматировать вывод без изменения структуры ячеек таблицы. Если в коде используется метод Заполнить(), параметры внутри шаблона также будут обработаны автоматически.
Если задача стоит в том, чтобы дать пользователю максимум свободы в добавлении параметров без участия программиста, проанализируем возможность использования макетов в формате .docx. В БСП реализован мощный механизм «Печать по шаблонам Word».
Разберем преимущества этого подхода:
Для активации этого механизма в некоторых конфигурациях достаточно создать новый макет на основе файла Word в справочнике «Шаблоны сообщений» или через «Макеты печатных форм» (в зависимости от версии БСП).
Часто возникает вопрос: как вывести «Дополнительные реквизиты», созданные пользователем в режиме «1С:Предприятие»? Это сложная задача, так как эти данные хранятся в отдельной табличной части. Проанализируем ситуацию: просто написать имя доп. реквизита в макете MXL обычно недостаточно, так как он не попадает в общую структуру ДанныеПечати автоматически.
Для решения этой задачи мы рекомендуем либо использовать шаблоны Word (где доп. реквизиты видны сразу), либо написать небольшую вспомогательную функцию в расширении, которая будет собирать доп. реквизиты в общую структуру данных перед выводом на печать.
Подводя итоги, отметим, что возможность добавления параметра в макет в пользовательском режиме напрямую зависит от того, как написан исходный код печати. Если используется метод Параметры.Заполнить(), то задача решается за 2 минуты в пользовательском интерфейсе. Если же заполнение идет «точечно» (каждый параметр прописан в коде отдельно), то без расширения или Внешней печатной формы (ВПФ) не обойтись. Мы рекомендуем всегда начинать с анализа структуры данных через консоль запросов или отладчик, чтобы проверить, какие данные уже доступны для вывода.