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