Почему при настройке печатных форм в 1С:ЗУП (например, Т-10а) выбранные поля остаются пустыми?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

Многие пользователи и начинающие разработчики сталкиваются с ситуацией, когда при редактировании макета в режиме "Настраиваемые печатные формы" в конфигурации 1С:Зарплата и Управление Персоналом, добавленные поля не выводятся на печать. В дереве доступных реквизитов поле есть, мы перетаскиваем его в макет, но в сформированном документе (например, в "Служебном задании" Т-10а) видим пустоту.

В этой статье мы подробно разберем, почему возникает эта проблема, как устроена механика формирования данных для печати и какие существуют способы решения задачи.

Суть проблемы

Рассмотрим ситуацию, описанную в обсуждении. Пользователь пытается отредактировать печатную форму Т-10а. Задача — вывести ФИО руководителя структурного подразделения (для задач контроля вывода данных может пригодиться Печать всех реквизитов документов и справочников для конфигураций на БСП). В редакторе макета слева мы видим дерево реквизитов, где можно раскрыть структуру:

Работа.РуководительСтруктурногоПодразделения.ФизическоеЛицо.ФИО

Система позволяет выбрать это поле и поместить его в ячейку макета. Однако при печати значение отсутствует. Это происходит даже если мы выбираем разные вариации пути к данным. Возникает ощущение ошибки или скрытых ограничений программы.

Причина: Различие между Метаданными и Данными

Чтобы понять причину, нам нужно углубиться в архитектуру печатных форм на базе БСП (Библиотеки Стандартных Подсистем). Механизм, который строит дерево реквизитов в пользовательском режиме, работает на основе Схемы Компоновки Данных (СКД) и метаданных конфигурации.

  1. Что видит конструктор: Конструктор "видит", что у документа есть ссылка на справочник Сотрудники, у сотрудника есть Подразделение, а у подразделения теоретически может быть реквизит, указывающий на руководителя (или регистр сведений, связанный с ним). Он строит дерево всех возможных связей.
  2. Что происходит в коде: Когда вы нажимаете кнопку "Печать", срабатывает процедура в модуле менеджера документа. Там выполняется конкретный запрос к базе данных для получения значений. Разработчики типовой конфигурации (1С) пишут этот запрос максимально оптимально, выбирая только те поля, которые нужны для стандартной формы.

Если в стандартной форме Т-10а не предусмотрен вывод непосредственного начальника сотрудника, то в запросе просто нет соединения (JOIN) с соответствующими таблицами (например, со срезом последних регистра ответственных лиц или штатным расписанием). В результате, СКД получает набор данных, где поле РуководительСтруктурногоПодразделения имеет значение NULL.

Таким образом, наличие поля в дереве выбора означает лишь то, что путь к данным существует в структуре метаданных, но не гарантирует, что данные были физически извлечены из базы данных запросом печати.

Способ 1: Проверка данных (Пользовательский уровень)

Прежде чем приступать к программированию, давайте исключим самую банальную причину — отсутствие данных в базе.

Иногда поле пустое просто потому, что оно не заполнено в карточке подразделения или в регистре ответственных лиц.

  1. Откройте карточку подразделения, к которому относится сотрудник.
  2. Проверьте, указан ли там руководитель.
  3. Важно: Проверьте историю изменений. Печатная форма формируется на дату документа. Если приказ от 01.01.2023, а руководитель назначен с 01.02.2023, на момент формирования документа поле будет пустым.

Если данные в базе есть и корректны на дату документа, но в печатной форме все равно пусто, значит, нам необходимо вмешательство в код.

Способ 2: Использование Внешней печатной формы (Рекомендуемый)

Это наиболее надежный и безопасный способ решения. Мы не меняем конфигурацию, а создаем внешнюю обработку (как основу можно использовать этот пример внешней печатной формы), которая подменяет стандартную печать.

Давайте рассмотрим алгоритм действий:

  1. Создайте новую внешнюю обработку в конфигураторе.
  2. В модуле объекта обработки нужно реализовать интерфейс БСП для внешних печатных форм (функция СведенияОВнешнейОбработке).
  3. Скопируйте код формирования печати из модуля менеджера документа (например, документа Командировка, если мы говорим о Т-10а).
  4. Найдите запрос, который формирует данные для печати. Обычно он находится внутри функции, возвращающей структуру данных или выборку.

Нам необходимо модифицировать этот запрос. В типовом коде запрос часто обращается к временным таблицам или делает выборку из справочников. Нам нужно добавить соединение, чтобы получить руководителя.

Примерная логика изменения запроса (псевдокод):


// Было: Выбираем данные о сотруднике и организации
ВЫБРАТЬ
    Сотрудник.Ссылка,
    Сотрудник.Подразделение,
    Организация.Руководитель.Наименование КАК РуководительОрганизации
ИЗ
    Документ.Командировка КАК Док

// Стало: Добавляем соединение с регистром сведений или вычисляем руководителя
ВЫБРАТЬ
    Сотрудник.Ссылка,
    Сотрудник.Подразделение,
    Организация.Руководитель.Наименование КАК РуководительОрганизации,
    ЕСТЬNULL(ОтветственныеЛицаСрезПоследних.ФизическоеЛицо.ФИО, "") КАК РуководительПодразделения
ИЗ
    Документ.Командировка КАК Док
    // Добавляем ЛЕВОЕ СОЕДИНЕНИЕ с регистром сведений об ответственных лицах
    // или программно вычисляем руководителя в пост-обработке

В ЗУП 3.1 логика определения руководителя подразделения может быть сложной (через позицию штатного расписания). Часто проще воспользоваться типовыми общими модулями. В модуле печати можно перебрать результат запроса и программно заполнить недостающее поле, используя функцию:

КадровыйУчет.ОтветственныеЛицаНаДату(...)

После того как данные получены, вы регистрируете эту обработку в режиме "1С:Предприятие" через раздел Администрирование — Печатные формы, отчеты и обработки. В макете внешней формы нужно будет добавить параметр РуководительПодразделения и разместить его в нужном месте.

Способ 3: Расширение конфигурации

Если вы не хотите создавать полную копию печатной формы, можно воспользоваться механизмом расширений. Это позволяет "внедриться" в процесс формирования данных стандартной формы.

Разберем основные шаги:

  1. Создайте расширение конфигурации.
  2. Заимствуйте в расширение модуль менеджера документа Командировка (или того, чей макет правите).
  3. Найдите процедуру, отвечающую за подготовку данных для печати. Обычно это Печать(...).
  4. Используйте аннотацию &После ("After"), чтобы перехватить управление после того, как типовой механизм сформировал данные, но еще не вывел их в макет.

В этой процедуре вы можете обратиться к коллекции данных для печати (обычно это Таблица Значений или Структура) и дозаполнить её.


&После("Печать")
Процедура Расш1_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
    
    // Перебираем сформированные печатные формы
    Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
        
        Если ПечатнаяФорма.ИмяВРЕГ = "Т10А" Тогда
            // Получаем табличный документ или данные макета
            // В современных версиях данные часто лежат в структуре параметров
            // Здесь необходимо найти таблицу данных, которая передается в макет
            
            // Примерный алгоритм:
            // 1. Найти таблицу с данными сотрудников.
            // 2. Обойти строки таблицы.
            // 3. Для каждой строки, зная Подразделение и Дату, вызвать функцию получения руководителя.
            // 4. Записать полученное значение в колонку таблицы (предварительно добавив её, если нет).
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Важный нюанс: Если вы добавляете колонку программно в расширении, она должна иметь то же имя, которое вы используете в пользовательском макете (например, РуководительСтруктурногоПодразделения). Тогда механизм СКД пользовательского макета сможет "подхватить" это значение.

Заключение

Пустые поля в настраиваемых печатных формах ЗУП — это не ошибка, а следствие оптимизации работы системы. Типовой код не выбирает из базы данные, которые не требуются для утвержденных унифицированных форм.

Чтобы вывести дополнительную информацию, такую как руководитель структурного подразделения в форме Т-10а, необходимо либо использовать внешнюю печатную форму (что безопаснее для обновлений), либо создать расширение, которое программно добавит нужные данные в коллекцию перед формированием табличного документа.

← На главную