Переход с платформы 7.7 на 8.3, особенно на конфигурацию Зарплата и управление персоналом 3.1, часто вызывает сложности у разработчиков из-за многоуровневой архитектуры формирования печатных форм. Одной из популярных задач является доработка унифицированной формы Т-8 (Приказ об увольнении) для вывода данных о днях компенсации или удержания отпуска. В этой статье мы подробно разберем, как реализовать эту задачу, учитывая особенности работы механизмов печати в ЗУП.
Прежде чем приступать к написанию кода, проанализируем, как система формирует печатную форму. В отличие от старых конфигураций, где запрос писался непосредственно в модуле документа, в ЗУП 3.1 используется так называемый «конвейер» данных:
ПечатнаяФормаТ8.ИнициализироватьОтчет, которая динамически модифицирует текст запроса в схеме компоновки данных (СКД).КадровыйУчет).Важный момент: если вы просто измените запрос в конструкторе СКД в конфигураторе, ваши правки могут быть затерты программным кодом в процедуре ИнициализироватьОтчет. Поэтому действовать нужно комплексно.
Для корректного вывода текста (компенсация или удержание) нам понадобится вспомогательная функция. Разместим её в модуле менеджера отчета ПечатнаяФормаТ8 (или в соответствующем расширении). Эта функция будет определять, нужно ли выплатить компенсацию или удержать средства, исходя из знака количества дней.
Функция КомпенсацияУдержаниеОтпускаНаПечать(Знач Дни) Экспорт
Если Дни > 0 Тогда
Возврат "Выплатить компенсацию за неиспользованные дни отпуска " + Дни + " календарных дня(ей)";
ИначеЕсли Дни < 0 Тогда
// Используем модуль числа для корректного отображения количества дней удержания
Возврат "Удержать за использованный авансом отпуск " + Abs(Дни) + " календарных дня(ей)";
Иначе
Возврат "";
КонецЕсли;
КонецФункции
Проанализируем структуру запроса. Нам необходимо вытянуть данные из документа Увольнение. Основные реквизиты, которые нас интересуют: ДнейКомпенсацииУдержанияОтпуска и ПризнакКомпенсацииУдержанияОтпуска. Рассмотрим пример фрагмента запроса, который нужно внедрить в схему компоновки данных:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Увольнение.Ссылка КАК СсылкаНаОбъект,
Увольнение.ДатаУвольнения КАК Период,
Увольнение.Сотрудник КАК Сотрудник,
Увольнение.ПризнакКомпенсацииУдержанияОтпуска КАК ПризнакКомпенсацииУдержанияОтпуска,
ВЫБОР
КОГДА Увольнение.ПризнакКомпенсацииУдержанияОтпуска = ЗНАЧЕНИЕ(Перечисление.КомпенсацияУдержаниеОтпускаПриУвольнении.КомпенсироватьНеИспользованные)
ТОГДА Увольнение.ДнейКомпенсацииУдержанияОтпуска
КОГДА Увольнение.ПризнакКомпенсацииУдержанияОтпуска = ЗНАЧЕНИЕ(Перечисление.КомпенсацияУдержаниеОтпускаПриУвольнении.УдержатьЗаИспользованныеАвансом)
ТОГДА -Увольнение.ДнейКомпенсацииУдержанияОтпуска
ИНАЧЕ 0
КОНЕЦ КАК КомпенсацияУдержаниеОтпуска
ПОМЕСТИТЬ ВТСсылкиНаДокумент
Обратите внимание на использование ЗНАЧЕНИЕ(Перечисление...). Это позволяет системе однозначно определить тип операции. Мы преобразуем удержание в отрицательное число, чтобы наша функция из первого шага могла корректно отработать логику Если Дни < 0.
Поскольку ЗУП часто обновляется, крайне рекомендуется выполнять доработку через механизм расширений. Чтобы наши поля не «потерялись» при программной сборке запроса, используем аннотацию &ИзменениеИКонтроль для процедуры, отвечающей за формирование данных. Обычно это методы в общем модуле КадровыйУчет или в модуле менеджера самого отчета.
Выясним причину, по которой поля могут не выводиться: в процедуре ИнициализироватьОтчет проверьте, передаются ли новые поля в структуру ПараметрыПостроения. Если поле описано в СКД как СсылкаНаОбъект.КомпенсацияУдержаниеОтпуска, убедитесь, что путь к данным корректен и доступен для системы компоновки.
Теперь перейдем на закладку «Вычисляемые поля» в конструкторе СКД. Добавим новое поле, например, ТекстКомпенсации. В выражении этого поля вызовем нашу экспортную функцию:
Отчеты.ПечатнаяФормаТ8.КомпенсацияУдержаниеОтпускаНаПечать(КомпенсацияУдержаниеОтпуска)
Важно: Убедитесь, что поле КомпенсацияУдержаниеОтпуска (числовое значение дней) доступно в наборе данных, иначе функция получит NULL или 0.
Последний этап — визуальное отображение. Вы можете отредактировать макет двумя способами:
ПФ_MXL_Т8. Добавьте в нужное место параметр, например [ТекстКомпенсации].Т-8 и отредактируйте её визуально. Это более безопасный способ, не требующий навыков программирования для изменения внешнего вида.Проанализируем ситуацию с точки зрения методологии учета. Форма Т-8 является приказом об увольнении, то есть кадровым распорядительным документом. Согласно ТК РФ и стандартам делопроизводства, расчетные данные (суммы, количество дней компенсации) обычно выносятся в отдельный документ — Записку-расчет при увольнении (форма Т-61).
Рассмотрим риски: если в приказе будет указано конкретное количество дней, а бухгалтер при окончательном расчете обнаружит ошибку или округление (например, 8.67 дней вместо 9), вам придется переделывать и переподписывать приказ у генерального директора. Поэтому, прежде чем вносить изменения, согласуйте это с бухгалтерией и кадровой службой. Если требования бизнеса непоколебимы — используйте описанный выше алгоритм через расширение и СКД.