Как программно сформировать печатную форму Т-6 в ЗУП 3.1 и добавить вывод часов для внутрисменных отпусков?

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

При разработке собственных инструментов в 1С:Зарплата и управление персоналом 3.1 программисты часто сталкиваются с необходимостью программного вызова типовых печатных форм, таких как приказ о предоставлении отпуска (форма Т-6). Однако стандартный подход через компоновку данных отчета ПечатнаяФормаТ6 часто возвращает пустой результат. Кроме того, возникает специфическая задача: как вывести в эту форму не только дни, но и часы, если сотрудник берет внутрисменный отпуск (например, за свой счет на несколько часов).

В этой статье мы подробно разберем, почему данные приходят пустыми, как работает механизм печати в ЗУП 3.1 и как с помощью расширения реализовать вывод часов в приказе Т-6.

Выясняем причину пустых данных в СКД

Рассмотрим ситуацию, когда мы пытаемся получить макет ОсновнаяСхемаКомпоновкиДанных из отчета ПечатнаяФормаТ6 и выполнить его «в лоб». Результат оказывается пустым, даже если параметры переданы верно. Проанализируем причину этого поведения.

Дело в том, что печатные формы в современных конфигурациях на базе 1С:Библиотеки стандартных подсистем (БСП) редко используют простые запросы к базе данных. Внутри СКД отчета ПечатнаяФормаТ6 заложены обращения к внешним наборам данных или временным таблицам с именами вида Представления_СрезПоследних_КадроваяИсторияСотрудников. Эти таблицы не существуют физически в базе данных — они должны быть сформированы программно в памяти сеанса перед запуском компоновки.

Чтобы данные появились, необходимо инициализировать отчет через специализированные процедуры кадрового учета, которые подготовят временные таблицы (ВТ). Простое назначение параметра СсылкаНаНашДокумент в настройках компоновщика не заставляет систему генерировать кадровые срезы. Для корректного формирования данных программным способом рекомендуется использовать функции общего модуля КадровыйУчет, такие как ДанныеДляПечатиТ6.

Разбор решения: Вывод часов в форму Т-6 через расширение

Допустим, наша задача шире: нам нужно изменить типовой макет Т-6, чтобы при внутрисменном отсутствии (флаг ОтсутствиеВТечениеЧастиСмены в документе «Отпуск без сохранения оплаты») в поле продолжительности выводились часы. Рассмотрим, как это реализовать наиболее экологичным способом — через расширение.

Нам потребуется перехватить управление в общем модуле КадровыйУчет в процедуре ВывестиНаПечатьТ6. Мы будем использовать аннотацию &ИзменениеИКонтроль, чтобы сохранить типовой алгоритм, но внедрить в него свою логику подмены макета и данных.

Шаг 1. Создание вспомогательной функции

Сначала определим, нужно ли нам вообще менять логику печати для конкретного документа. Создадим функцию в расширении:


Функция зн_ОпределитьНеобходимостьИзмененияПроцедурыЗаполненияПФТ6(СсылкаНаДокумент)
    Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.ОтпускБезСохраненияОплаты") Тогда
        Если СсылкаНаДокумент.ОтсутствиеВТечениеЧастиСмены Тогда
            Возврат Истина;
        Иначе
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;
    Возврат Ложь;
КонецФункции

Шаг 2. Модификация основной процедуры печати

Теперь проанализируем фрагмент процедуры зн_ВывестиНаПечатьТ6, где происходит основная магия. Нам нужно подменить стандартный МакетПечатнойФормы на наш модифицированный макет (добавленный в расширение как общий макет), если условие из шага 1 выполняется.


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

        // ... далее идет стандартный цикл формирования областей ...

Корректировка данных для вывода в макет

Просто подменить макет недостаточно. Типовой механизм заполняет параметр СсылкаНаОбъектПродолжительностьВсего значением в днях. Нам нужно принудительно подставить туда значение из реквизита ЧасовОтпуска. Рассмотрим, как это сделать внутри цикла обработки данных для печати:


#Вставка
Если зн_НеобходимостьИзмененияПроцедурыЗаполненияПФТ6 Тогда
    // Подменяем продолжительность в днях на часы для вывода в форму
    ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектПродолжительностьВсего", ЧасовОтпуска); 
Иначе 
    ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектПродолжительностьВсего", ДанныеНаПечать.СсылкаНаОбъектПродолжительностьОсновногоОтпуска);
КонецЕсли;
#КонецВставки

Посмотрим на пример вывода: если сотрудник уходит на 2 часа, в стандартной форме Т-6 в графе «на ____ календарных дней» вывелось бы «0», так как календарный день не завершен. После нашей доработки там будет выведено «2», а в макете рядом мы можем жестко прописать текст «часа(ов)» или использовать расшифровку.

Важные рекомендации при работе с Т-6

При реализации данного решения стоит учитывать несколько технических и методических моментов:

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

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

← На главную