При работе с конфигурацией 1С:Зарплата и Управление Персоналом 3.1 программисты часто сталкиваются с необходимостью кастомизации типовых кадровых приказов. Казалось бы, задача тривиальна: добавить новый реквизит (например, ОснованиеПодробно) в документ «Увольнение», затем отредактировать макет отчета ПечатнаяФормаТ8, внести изменения в запрос схемы компоновки данных (СКД) — и поле должно появиться в печатной форме. Однако на практике поле часто остается пустым или вовсе не выводится в отчет. Рассмотрим детально, почему так происходит и как правильно решить эту задачу.
Для начала проанализируем ситуацию: почему стандартный подход «открыл СКД — добавил поле в запрос — сохранил» не работает? В современных версиях ЗУП 3.1 (начиная с версий 3.1.10 и выше) печатные формы строятся с использованием механизмов БСП (Библиотеки стандартных подсистем). Это означает, что макет СКД зачастую является лишь каркасом или шаблоном оформления, а реальный сбор данных происходит программно в модулях менеджеров или специализированных процедурах.
Выясним причину отсутствия данных. В типовых решениях часто применяется метод формирования данных через внешний набор. Если в коде формирования структуры данных ваше новое поле не описано и не заполнено, то СКД просто не получит эти данные, даже если в тексте запроса в конфигураторе вы это поле добавили.
Рассмотрим подробнее одну из главных причин проблемы. В модуле объекта отчета ПечатнаяФормаТ8 (или аналогичных) существует процедура ИнициализироватьОтчет(). Проанализируем её роль:
УстановитьТекстЗапроса, который заменяет ваш отредактированный запрос в макете на динамический код.Если вы внесли изменения в визуальный конструктор макета, но не проверили процедуру инициализации, ваши правки будут просто проигнорированы в момент исполнения кода. Посмотрим на пример того, как это может выглядеть в коде:
Процедура ИнициализироватьОтчет(ПараметрыОтчета) Экспорт
// Программное формирование текста запроса
ТекстЗапроса = ПолучитьТекстЗапросаДляПечатиТ8();
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
// ... дальнейшая настройка компоновщика
КонецПроцедуры
Как мы видим, если текст запроса берется из функции ПолучитьТекстЗапросаДляПечатиТ8(), то правка макета в конструкторе бесполезна — нужно править именно эту функцию в модуле.
Разберем ситуацию глубже. В ЗУП 3.1 данные для кадровых приказов подготавливаются в менеджере модуля документа (в нашем случае это документ Увольнение). Процесс печати обычно делегируется общему модулю УправлениеПечатью.
Проанализируем шаги, которые необходимо выполнить для корректного вывода нового реквизита:
Увольнение функцию, отвечающую за формирование данных для печати (обычно это функции со словами ДанныеДляПечати или ПодготовитьТаблицуДанных).ОснованиеПодробно включен в запрос, который формирует таблицу значений для передачи в печатную форму.Иногда программный код верен, но поле всё равно не отображается. Выясним, почему это случается. Система 1С сохраняет пользовательские настройки вариантов отчетов. Если вы добавили поле в «Выбранные поля» макета, это изменение применится только для новых пользователей или при сбросе настроек.
Рассмотрим, как принудительно обновить настройки:
Если вы работаете в расширении (что является правильным подходом), нужно учитывать нюансы видимости. Проанализируем типичную ошибку: реквизит ОснованиеПодробно добавлен в документ в расширении, а макет ПечатнаяФормаТ8 заимствован. В этом случае в запросе внутри расширения поле должно выбираться через псевдоним или с явным указанием на расширенный объект.
Для корректной работы в расширении рекомендуется переопределять процедуру печати в модуле менеджера, используя аннотацию &Вместо. Рассмотрим пример структуры такого переопределения:
&Вместо("СформироватьДанныеДляПечатиТ8")
Функция Мой_СформироватьДанныеДляПечатиТ8(Параметры)
// Вызываем стандартный сбор данных
Результат = ПродолжитьВызов(Параметры);
// Дополняем результат нашим новым полем
Для Каждого СтрокаДанных Из Результат Цикл
СтрокаДанных.ОснованиеПодробно = СтрокаДанных.СсылкаНаОбъект.ОснованиеПодробно;
КонецЦикла;
Возврат Результат;
КонецФункции
Важный момент: Если данные передаются в СКД как объект, убедитесь, что в схеме в расширении в описании набора данных это поле также присутствует.
Несмотря на возможность правки типовых макетов, профессиональное сообщество часто рекомендует использовать механизм Внешних печатных форм (ВПФ). Разберем преимущества этого способа:
ПечатнаяФормаТ8 могут быть затерты или привести к конфликтам, если типовой запрос существенно изменится. ВПФ останется нетронутой.Подведем итог. Чтобы успешно вывести поле ОснованиеПодробно, выполните следующие шаги:
ПечатнаяФормаТ8 на предмет процедуры ИнициализироватьОтчет. Если текст запроса там переопределяется — внесите правки в код формирования строки запроса.СкомпоноватьРезультат.Соблюдение этой последовательности позволит вам избежать ситуации, когда «поле в коде есть, а в печати — нет», и обеспечит корректную работу кадрового учета в вашей организации.