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