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