Как добавить дату и номер трудового договора в печатную форму документа Увольнение в 1С:ЗУП 3.1

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

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

В этой статье мы разберем, как программно извлечь эти сведения и передать их в макет, используя механизмы Библиотеки стандартных подсистем (БСП) и программный интерфейс конфигурации.

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

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

Для решения задачи нам потребуется либо создание Внешней печатной формы (ВПФ), либо использование Расширения конфигурации. Рассмотрим наиболее эффективные способы получения данных.

Способ 1. Использование программного интерфейса КадровыйУчет

Разработчики 1С предусмотрели удобный механизм для получения актуальных сведений о сотрудниках. Вместо написания сложных запросов к таблицам документов ПриемНаРаботу, мы можем воспользоваться экспортной функцией общего модуля КадровыйУчет. Это наиболее надежный метод, так как он учитывает историю перемещений и различные виды договоров.

Рассмотрим пример кода, который позволяет получить дату и номер договора:


// Определяем массив сотрудников, по которым нужны данные
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаОбъект.Сотрудник);

// Задаем список необходимых полей
КадровыеДанные = "ДатаДоговора, НомерДоговора";

// Получаем таблицу значений с данными на дату увольнения
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников, КадровыеДанные, СсылкаНаОбъект.Дата);

Если ТаблицаДанных.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаДанных[0];
    ДатаДоговора = СтрокаДанных.ДатаДоговора;
    НомерДоговора = СтрокаДанных.НомерДоговора;
КонецЕсли;

Обратите внимание, что в функцию КадровыйУчет.КадровыеДанныеСотрудников первым параметром передается признак ТолькоТекущиеДанные (Ложь, если нужны данные на конкретную дату). В качестве даты получения сведений рекомендуется использовать дату документа увольнения.

Способ 2. Прямой запрос к регистру сведений

Иногда требуется более тонкая настройка или получение данных, которые API не отдает в нужном формате. Выясним причину: данные о трудовых договорах в ЗУП 3.1 хранятся в специализированном регистре сведений ОсновныеДанныеКонтрактаСотрудника. Это позволяет системе быстро находить сведения о договоре, не перебирая все документы приема.

Проанализируем пример запроса, который можно вставить в модуль печати:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ОсновныеДанныеКонтрактаСотрудника.ДатаДоговора КАК ДатаДоговора,
    |	ОсновныеДанныеКонтрактаСотрудника.НомерДоговора КАК НомерДоговора
    |ИЗ
    |	РегистрСведений.ОсновныеДанныеКонтрактаСотрудника КАК ОсновныеДанныеКонтрактаСотрудника
    |ГДЕ
    |	ОсновныеДанныеКонтрактаСотрудника.Сотрудник = &Сотрудник
    |	И ОсновныеДанныеКонтрактаСотрудника.Организация = &Организация";

Запрос.УстановитьПараметр("Сотрудник", СсылкаНаОбъект.Сотрудник);
Запрос.УстановитьПараметр("Организация", СсылкаНаОбъект.Организация);

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Обработка полученных значений
    ЗначениеПараметраДата = ВыборкаДетальныеЗаписи.ДатаДоговора;
КонецЦикла;

Важно помнить, что если сотрудник увольнялся и принимался заново, в регистре может быть несколько записей. Поэтому в реальном запросе следует добавить фильтр по периоду или выбирать запись, соответствующую текущему рабочему периоду сотрудника.

Способ 3. Реализация через внешнюю печатную форму (ВПФ)

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


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Проверяем, нужна ли наша печатная форма
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "НазваниеВашегоМакета");
    Если ПечатнаяФорма <> Неопределено Тогда
        
        // Получаем макет
        Макет = ПолучитьМакет("НазваниеВашегоМакета");
        
        // Заполняем табличный документ
        ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
        
        // Возвращаем результат в коллекцию
        ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент;
        ПечатнаяФорма.ПолныйПутьКМакету = "ВнешняяПечатнаяФорма.НазваниеВашегоМакета";
        
    КонецЕсли;
    
КонецПроцедуры

В функции СформироватьПечатнуюФорму вы должны реализовать цикл по МассивОбъектов, вызвать один из описанных выше методов получения даты договора и заполнить область макета через Область.Параметры.ТрудовойДоговорДата = НужноеЗначение;.

Рекомендации по заполнению макета

При оформлении макета в конфигураторе 1С используйте следующие приемы:

  1. В свойстве ячейки Заполнение выберите значение Параметр.
  2. Имя параметра должно точно совпадать с тем, что вы передаете в коде (например, ТрудовойДоговорДата).
  3. Для вывода даты в красивом формате используйте функцию Формат(Дата, "ДЛФ=DD") или укажите формат прямо в свойствах ячейки макета.
  4. Часто дату и номер договора выводят одной строкой. В коде это выглядит так: Область.Параметры.РеквизитыДоговора = "от " + Формат(ДатаДоговора, "ДЛФ=D") + " № " + НомерДоговора;.

Таким образом, мы выяснили, что наиболее современным и правильным способом является использование программного интерфейса КадровыйУчет в рамках расширения или внешней печатной формы. Это гарантирует корректность данных при обновлениях конфигурации и минимизирует вероятность ошибок в запросах.

← На главную