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

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

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

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

Выясняем причину ошибки: почему не работал код автора

В исходном обсуждении автор пытался вызвать функцию получения кадровых данных следующим образом:


ОбластьШапка.Параметры.ДатаДоговора = КадровыйУчет.КадровыеДанныеСотрудников(Истина, 
    СсылкаНаДокумент.ФИО,
    "ТрудовойДоговорДата",
    НачалоДня(ТекущаяДата()));

В данном коде допущены сразу две критические ошибки:

  1. Неверный тип передаваемого параметра. Функция КадровыйУчет.КадровыеДанныеСотрудников ожидает в качестве второго параметра массив ссылок на элементы справочника Сотрудники. Передача строки (ФИО) или ссылки на другой документ вызывает исключение или возвращает пустой результат.
  2. Ожидание конкретного значения вместо таблицы. Данная функция всегда возвращает объект типа ТаблицаЗначений, даже если мы запрашиваем сведения по одному сотруднику. Напрямую присвоить результат вызова функции параметру макета нельзя — сначала необходимо извлечь строку из полученной таблицы.

Решение через программный интерфейс БСП

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

Ниже представлен готовый шаблон кода, который можно использовать во внешней печатной форме (ВПФ) или обработке:


// Предположим, что СсылкаНаОбъект — это ссылка на текущего сотрудника (СправочникСсылка.Сотрудники)
СотрудникСсылка = СсылкаНаОбъект; 

// Преобразуем одиночную ссылку в массив, так как этого требует интерфейс БСП
МассивСотрудников = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СотрудникСсылка);

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

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

// Извлекаем данные из таблицы значений
Если ТаблицаДанных.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаДанных[0];
    
    НомерДоговора = СтрокаДанных.ТрудовойДоговорНомер;
    ДатаДоговора  = СтрокаДанных.ТрудовойДоговорДата;
    
    // Заполняем параметры макета печатной формы
    ОбластьШапка.Параметры.НомерДоговора = НомерДоговора;
    
    // Форматируем дату для вывода в печатную форму
    Если ЗначениеЗаполнено(ДатаДоговора) Тогда
        ОбластьШапка.Параметры.ДатаДоговора = Формат(ДатаДоговора, "ДФ=dd.MM.yyyy");
    Иначе
        ОбластьШапка.Параметры.ДатаДоговора = "";
    EndIf;
КонецЕсли;

Какие еще поля поддерживает функция кадрового учета?

Метод КадровыйУчет.КадровыеДанныеСотрудников является крайне мощным инструментом. Помимо даты и номера договора, вы можете передавать в строку запроса (третий параметр) следующие идентификаторы:

Альтернативное решение: Прямой запрос к базе данных

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

Важно помнить, что в конфигурации ЗУП 3.1 данные трудового договора не хранятся непосредственно в справочнике Сотрудники (как это было в устаревшей версии ЗУП 2.5). Они распределены по специальным регистрам сведений:

  1. РегистрСведений.ОсновныеДанныеКонтрактаДоговораСотрудника — содержит ключевые реквизиты: НомерДоговораКонтракта, ДатаДоговораКонтракта и ДатаНачала.
  2. РегистрСведений.СведенияКонтрактаДоговораСотрудника — хранит дополнительные параметры, такие как признак срочности, срок действия и представителя работодателя.

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


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

Запрос.УстановитьПараметр("Сотрудник", СсылкаНаСотрудника);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    НомерДоговора = Выборка.НомерДоговора;
    ДатаДоговора  = Выборка.ДатаДоговора;
КонецЕсли;

Анализируем возможные проблемы: почему данные возвращаются пустыми?

Если вы применили один из указанных выше способов, но программа все равно возвращает пустые значения полей даты и номера договора, проанализируйте следующие факторы:

1. Последствия переноса данных из ЗУП 2.5

При переходе на редакцию 3.1 с использованием рекомендованного (краткого) переноса данных реальные документы «Прием на работу» в новую базу не создаются. Вместо них кадровые срезы записываются в технические документы «Перенос данных» (с кодами ТДК, ГПХ и др.). Если при переносе возникли сбои или данные в старой базе изначально были заполнены некорректно, записи в регистре Основные данные контракта... могут отсутствовать. В такой ситуации данные придется дозаполнить вручную.

2. Опция работы «без приказов о приеме»

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

← На главную