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