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