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