Как добавить новый реквизит в печатную форму приказа об увольнении (Т-8) в ЗУП 3.1 и почему он не выводится?

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

При работе с конфигурацией 1С:Зарплата и Управление Персоналом 3.1 программисты часто сталкиваются с необходимостью кастомизации типовых кадровых приказов. Казалось бы, задача тривиальна: добавить новый реквизит (например, ОснованиеПодробно) в документ «Увольнение», затем отредактировать макет отчета ПечатнаяФормаТ8, внести изменения в запрос схемы компоновки данных (СКД) — и поле должно появиться в печатной форме. Однако на практике поле часто остается пустым или вовсе не выводится в отчет. Рассмотрим детально, почему так происходит и как правильно решить эту задачу.

Разбор архитектуры печатных форм в современных конфигурациях

Для начала проанализируем ситуацию: почему стандартный подход «открыл СКД — добавил поле в запрос — сохранил» не работает? В современных версиях ЗУП 3.1 (начиная с версий 3.1.10 и выше) печатные формы строятся с использованием механизмов БСП (Библиотеки стандартных подсистем). Это означает, что макет СКД зачастую является лишь каркасом или шаблоном оформления, а реальный сбор данных происходит программно в модулях менеджеров или специализированных процедурах.

Выясним причину отсутствия данных. В типовых решениях часто применяется метод формирования данных через внешний набор. Если в коде формирования структуры данных ваше новое поле не описано и не заполнено, то СКД просто не получит эти данные, даже если в тексте запроса в конфигураторе вы это поле добавили.

Процедура ИнициализироватьОтчет и программная подмена запроса

Рассмотрим подробнее одну из главных причин проблемы. В модуле объекта отчета ПечатнаяФормаТ8 (или аналогичных) существует процедура ИнициализироватьОтчет(). Проанализируем её роль:

  1. Она управляет процессом компоновки данных перед выводом.
  2. В этой процедуре текст запроса СКД может полностью пересобираться программно.
  3. Система может использовать метод УстановитьТекстЗапроса, который заменяет ваш отредактированный запрос в макете на динамический код.

Если вы внесли изменения в визуальный конструктор макета, но не проверили процедуру инициализации, ваши правки будут просто проигнорированы в момент исполнения кода. Посмотрим на пример того, как это может выглядеть в коде:


Процедура ИнициализироватьОтчет(ПараметрыОтчета) Экспорт
    // Программное формирование текста запроса
    ТекстЗапроса = ПолучитьТекстЗапросаДляПечатиТ8();
    СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
    // ... дальнейшая настройка компоновщика
КонецПроцедуры

Как мы видим, если текст запроса берется из функции ПолучитьТекстЗапросаДляПечатиТ8(), то правка макета в конструкторе бесполезна — нужно править именно эту функцию в модуле.

Взаимодействие с менеджером печати и документами

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

Проанализируем шаги, которые необходимо выполнить для корректного вывода нового реквизита:

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

Обновление вариантов отчетов и кэширование

Иногда программный код верен, но поле всё равно не отображается. Выясним, почему это случается. Система 1С сохраняет пользовательские настройки вариантов отчетов. Если вы добавили поле в «Выбранные поля» макета, это изменение применится только для новых пользователей или при сбросе настроек.

Рассмотрим, как принудительно обновить настройки:

Использование расширений для правки макетов

Если вы работаете в расширении (что является правильным подходом), нужно учитывать нюансы видимости. Проанализируем типичную ошибку: реквизит ОснованиеПодробно добавлен в документ в расширении, а макет ПечатнаяФормаТ8 заимствован. В этом случае в запросе внутри расширения поле должно выбираться через псевдоним или с явным указанием на расширенный объект.

Для корректной работы в расширении рекомендуется переопределять процедуру печати в модуле менеджера, используя аннотацию &Вместо. Рассмотрим пример структуры такого переопределения:


&Вместо("СформироватьДанныеДляПечатиТ8")
Функция Мой_СформироватьДанныеДляПечатиТ8(Параметры)
    // Вызываем стандартный сбор данных
    Результат = ПродолжитьВызов(Параметры);
    
    // Дополняем результат нашим новым полем
    Для Каждого СтрокаДанных Из Результат Цикл
        СтрокаДанных.ОснованиеПодробно = СтрокаДанных.СсылкаНаОбъект.ОснованиеПодробно;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Важный момент: Если данные передаются в СКД как объект, убедитесь, что в схеме в расширении в описании набора данных это поле также присутствует.

Рекомендация: Внешняя печатная форма

Несмотря на возможность правки типовых макетов, профессиональное сообщество часто рекомендует использовать механизм Внешних печатных форм (ВПФ). Разберем преимущества этого способа:

Итоги и контрольный список действий

Подведем итог. Чтобы успешно вывести поле ОснованиеПодробно, выполните следующие шаги:

  1. Проверьте наличие поля в макете СКД и в выбранных полях варианта «Приказ об увольнении (Т-8)».
  2. Изучите модуль объекта отчета ПечатнаяФормаТ8 на предмет процедуры ИнициализироватьОтчет. Если текст запроса там переопределяется — внесите правки в код формирования строки запроса.
  3. Убедитесь, что данные физически попадают в компоновщик. Для этого можно использовать отладку, остановившись в момент вызова СкомпоноватьРезультат.
  4. Очистите настройки пользователя для данной печатной формы в режиме «Предприятие».

Соблюдение этой последовательности позволит вам избежать ситуации, когда «поле в коде есть, а в печати — нет», и обеспечит корректную работу кадрового учета в вашей организации.

← На главную