Как добавить данные о днях компенсации отпуска в печатную форму Т-8 в 1С:ЗУП 3.1

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

Переход с платформы 7.7 на 8.3, особенно на конфигурацию Зарплата и управление персоналом 3.1, часто вызывает сложности у разработчиков из-за многоуровневой архитектуры формирования печатных форм. Одной из популярных задач является доработка унифицированной формы Т-8 (Приказ об увольнении) для вывода данных о днях компенсации или удержания отпуска. В этой статье мы подробно разберем, как реализовать эту задачу, учитывая особенности работы механизмов печати в ЗУП.

Понимание архитектуры печати в ЗУП 3.1

Прежде чем приступать к написанию кода, проанализируем, как система формирует печатную форму. В отличие от старых конфигураций, где запрос писался непосредственно в модуле документа, в ЗУП 3.1 используется так называемый «конвейер» данных:

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

Важный момент: если вы просто измените запрос в конструкторе СКД в конфигураторе, ваши правки могут быть затерты программным кодом в процедуре ИнициализироватьОтчет. Поэтому действовать нужно комплексно.

Шаг 1. Подготовка функции для обработки данных

Для корректного вывода текста (компенсация или удержание) нам понадобится вспомогательная функция. Разместим её в модуле менеджера отчета ПечатнаяФормаТ8 (или в соответствующем расширении). Эта функция будет определять, нужно ли выплатить компенсацию или удержать средства, исходя из знака количества дней.


Функция КомпенсацияУдержаниеОтпускаНаПечать(Знач Дни) Экспорт
    
    Если Дни > 0 Тогда
        Возврат "Выплатить компенсацию за неиспользованные дни отпуска " + Дни + " календарных дня(ей)";
    ИначеЕсли Дни < 0 Тогда
        // Используем модуль числа для корректного отображения количества дней удержания
        Возврат "Удержать за использованный авансом отпуск " + Abs(Дни) + " календарных дня(ей)";
    Иначе
        Возврат "";
    КонецЕсли;
    
КонецФункции

Шаг 2. Модификация запроса в СКД

Проанализируем структуру запроса. Нам необходимо вытянуть данные из документа Увольнение. Основные реквизиты, которые нас интересуют: ДнейКомпенсацииУдержанияОтпуска и ПризнакКомпенсацииУдержанияОтпуска. Рассмотрим пример фрагмента запроса, который нужно внедрить в схему компоновки данных:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Увольнение.Ссылка КАК СсылкаНаОбъект,
    Увольнение.ДатаУвольнения КАК Период,
    Увольнение.Сотрудник КАК Сотрудник,
    Увольнение.ПризнакКомпенсацииУдержанияОтпуска КАК ПризнакКомпенсацииУдержанияОтпуска,
    ВЫБОР
        КОГДА Увольнение.ПризнакКомпенсацииУдержанияОтпуска = ЗНАЧЕНИЕ(Перечисление.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные)
            ТОГДА Увольнение.ДнейКомпенсацииУдержанияОтпуска
        КОГДА Увольнение.ПризнакКомпенсацииУдержанияОтпуска = ЗНАЧЕНИЕ(Перечисление.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом)
            ТОГДА -Увольнение.ДнейКомпенсацииУдержанияОтпуска
        ИНАЧЕ 0
    КОНЕЦ КАК КомпенсацияУдержаниеОтпуска
ПОМЕСТИТЬ ВТСсылкиНаДокумент

Обратите внимание на использование ЗНАЧЕНИЕ(Перечисление...). Это позволяет системе однозначно определить тип операции. Мы преобразуем удержание в отрицательное число, чтобы наша функция из первого шага могла корректно отработать логику Если Дни < 0.

Шаг 3. Использование расширений для контроля запроса

Поскольку ЗУП часто обновляется, крайне рекомендуется выполнять доработку через механизм расширений. Чтобы наши поля не «потерялись» при программной сборке запроса, используем аннотацию &ИзменениеИКонтроль для процедуры, отвечающей за формирование данных. Обычно это методы в общем модуле КадровыйУчет или в модуле менеджера самого отчета.

Выясним причину, по которой поля могут не выводиться: в процедуре ИнициализироватьОтчет проверьте, передаются ли новые поля в структуру ПараметрыПостроения. Если поле описано в СКД как СсылкаНаОбъект.КомпенсацияУдержаниеОтпуска, убедитесь, что путь к данным корректен и доступен для системы компоновки.

Шаг 4. Настройка вычисляемых полей в СКД

Теперь перейдем на закладку «Вычисляемые поля» в конструкторе СКД. Добавим новое поле, например, ТекстКомпенсации. В выражении этого поля вызовем нашу экспортную функцию:

Отчеты.ПечатнаяФормаТ8.КомпенсацияУдержаниеОтпускаНаПечать(КомпенсацияУдержаниеОтпуска)

Важно: Убедитесь, что поле КомпенсацияУдержаниеОтпуска (числовое значение дней) доступно в наборе данных, иначе функция получит NULL или 0.

Шаг 5. Редактирование макета печатной формы

Последний этап — визуальное отображение. Вы можете отредактировать макет двумя способами:

  1. В конфигураторе/расширении: Найдите общий макет ПФ_MXL_Т8. Добавьте в нужное место параметр, например [ТекстКомпенсации].
  2. В режиме «1С:Предприятие»: Перейдите в раздел Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм. Найдите форму Т-8 и отредактируйте её визуально. Это более безопасный способ, не требующий навыков программирования для изменения внешнего вида.

Методологическое предостережение

Проанализируем ситуацию с точки зрения методологии учета. Форма Т-8 является приказом об увольнении, то есть кадровым распорядительным документом. Согласно ТК РФ и стандартам делопроизводства, расчетные данные (суммы, количество дней компенсации) обычно выносятся в отдельный документ — Записку-расчет при увольнении (форма Т-61).

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

← На главную