При разработке внешних печатных форм, отчетов и обработок для конфигурации 1С:Зарплата и управление персоналом 3.1 разработчики часто сталкиваются с вопросом корректного извлечения данных по сотрудникам и организации. В отличие от более ранних редакций программы, прямое обращение через запросы к срезам последних периодических регистров сведений (таким как КадроваяИсторияСотрудников или ПлановыеНачисления) в ЗУП 3.1 считается некорректным подходом. Прямые запросы не учитывают сложную логику приоритетов кадровых документов, временные переводы, учет времени документов внутри дня и ограничения прав доступа на уровне записей (RLS).
В конфигурациях на базе подсистемы БЗК (Библиотека Зарплата и Кадры) реализован специализированный программный интерфейс (API), который позволяет получать актуальные сведения гарантированно надежным и оптимизированным способом. Разберем по шагам, какие функции и модули следует использовать для различных задач.
Основным инструментом для программного извлечения кадровой информации является функция КадровыеДанныеСотрудников общего модуля КадровыйУчет. Функция принимает список сотрудников, перечень требуемых полей и дату среза, возвращая готовую таблицу значений с результатом.
Рассмотрим структуру вызова данной функции на практическом примере:
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);
// Формируем список запрашиваемых полей через запятую
КадровыеПоля = "ФИО, Должность, Подразделение, ДатаПриема, ДатаУвольнения, "
+ "ДокументВид, ДокументСерия, ДокументНомер, ДокументДатаВыдачи, ДокументКемВыдан, ДокументКодПодразделения, "
+ "АдресПоПропискеПредставление, АдресРегистрации, ТелефонМобильный, ИНН, СтраховойНомерПФР, "
+ "ТарифнаяСтавка, ВидТарифнойСтавки, КоличествоСтавок, ВидЗанятости";
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(
Истина, // ТолькоРазрешенные (учет RLS)
МассивСотрудников, // Массив или список ссылок на сотрудников
КадровыеПоля, // Список запрашиваемых полей
ТекущаяДатаСеанса(), // Дата получения данных
Истина // ФормироватьСПериодичностьДень
);
Если ТаблицаДанных.Количество() > 0 Тогда
СтрокаДанных = ТаблицаДанных[0];
Сообщить("Должность: " + СтрокаДанных.Должность);
Сообщить("Оклад/Тариф: " + СтрокаДанных.ТарифнаяСтавка);
КонецЕсли;
Проанализируем параметры этой функции:
Истина, запрос автоматически отфильтрует данные с учетом прав текущего пользователя (RLS).Сотрудники.Сотрудник и Период.Истина срез выполняется на конец дня без учета секунд, что повышает производительность. Если требуется учитывать точное время документов (например, несколько переводов в один день), передаем Ложь.Если кадровые данные требуется сразу объединить с табличной частью документа или данными других таблиц без выгрузки в оперативную память, используются специализированные методы генерации текста запросов.
Для кадровых данных применяется процедура:
КадровыйУчет.ЗапросВТКадровыеДанныеСотрудников(
ИмяВТ,
ИмяВременнойТаблицыОтборов,
КадровыеДанные,
ТолькоРазрешенные
);
Для получения списка плановых начислений сотрудника на определенную дату (например, для вывода всех действующих надбавок и доплат) модуль КадровыйУчет предоставляет отдельную функцию формирования запроса к временной таблице:
КадровыйУчет.ЗапросВТПлановыеНачисленияСотрудников(
ТолькоРазрешенные,
ИмяВТПлановыеНачисленияСотрудников,
ИмяВременнойТаблицыОтборовСотрудников,
Знач ПоляОтбораСотрудников = "Сотрудник,Период",
ПоляОтбораПериодическихДанных = Неопределено,
ФормироватьСПериодичностьДень = Истина
);
Разберем по шагам, как использовать этот механизм в своем пакетном запросе:
Сотрудник и Период.КадровыйУчет.Для вывода реквизитов организации (юридический адрес, ИНН, КПП, ОГРН, банковские реквизиты) и фамилий подписантов (руководитель, главный бухгалтер, кадровик) в печатных формах предназначены функции общего модуля ЗарплатаКадрыПечатныеФормы.
Посмотрим на пример извлечения сведений об организации и подписантах:
// Получение полных реквизитов организации
СведенияОбОрганизации = ЗарплатаКадрыПечатныеФормы.СведенияОбОрганизации(
СсылкаНаОрганизацию,
ТекущаяДатаСеанса()
);
ИННОрганизации = СведенияОбОрганизации.ИНН;
ЮрАдрес = СведенияОбОрганизации.ЮридическийАдрес;
ПолноеИмя = СведенияОбОрганизации.НаименованиеПолное;
// Получение ответственных лиц (руководитель, кадровик)
ОтветственныеЛица = ЗарплатаКадрыПечатныеФормы.ОтветственныеЛицаОрганизации(
СсылкаНаОрганизацию,
ТекущаяДатаСеанса()
);
ФИОРуководителя = ОтветственныеЛица.Руководитель;
ДолжностьРуководителя = ОтветственныеЛица.РуководительДолжность;
ФИОКадровика = ОтветственныеЛица.Кадровик;
Для корректного грамматического оформления печатных форм (договоров, приказов, соглашений) используем специализированные сервисные функции:
СклонениеПредставлений или метод ЗарплатаКадрыПечатныеФормы.СклонениеФИО(ФИО, НомерПадежа). Номера падежей соответствуют стандартному порядку (1 — именительный, 2 — родительный, 3 — дательный, 4 — винительный, 5 — творительный, 6 — предложный).ФизическиеЛицаКлиентСервер.ФамилияИнициалы(ПолноеФИО).ЧислоПрописью с параметрами валюты:
СуммаПрописью = ЧислоПрописью(
СуммаОклада,
"L=ru_RU",
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2"
);
Если для сотрудника, подразделения или организации заданы дополнительные реквизиты через подсистему БСП «Свойства», их получение выполняется с помощью функций модуля УправлениеСвойствами:
СтруктураСвойств = УправлениеСвойствами.ЗначенияСвойств(СсылкаНаСотрудника);
В запросах обращение к дополнительным реквизитам выполняется через соединение с табличной частью ДополнительныеРеквизиты соответствующего объекта или с регистром сведений ЗначенияСвойствОбъектов.
При использовании типового API важно соблюдать ключевые правила оптимизации:
КадровыйУчет.КадровыеДанныеСотрудников в цикле по каждому сотруднику отдельно. Передавайте в функцию сразу весь массив ссылок за один вызов — это кардинально ускорит формирование печатных форм на списки сотрудников.КадровыйУчет гарантирует корректную работу печатных форм при регулярных обновлениях конфигурации 1С:ЗУП 3.1.