Как правильно получать кадровые данные в ЗУП 3.1 через программный интерфейс вместо прямых запросов к регистрам

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

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

В этой статье мы подробно разберем, почему прямые запросы к регистрам — это плохая практика, какие модули для этого предназначены и как правильно написать код для получения данных программным способом.

Почему стоит отказаться от прямых запросов к регистрам

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

  1. Сложная логика состояний: Информация о том, работает сотрудник или нет, в ЗУП 3.1 не всегда лежит в одной таблице. Система должна учитывать приоритеты: если на один и тот же день у сотрудника есть запись о работе и документ «Больничный лист», программный интерфейс корректно определит, что сотрудник сейчас болеет. Написать такой запрос вручную крайне трудозатратно.
  2. Учет RLS (права доступа): При использовании встроенных функций система автоматически проверяет права доступа текущего пользователя на уровне записей. Если вы напишете прямой запрос к регистру, вы рискуете либо получить ошибку доступа, либо, наоборот, предоставить пользователю данные, которые он видеть не должен.
  3. Совместимость при обновлениях: Структура метаданных в ЗУП меняется довольно часто. Поля могут переноситься из одного регистра в другой или менять свой тип. Используя API (программный интерфейс), вы защищаете свой код: фирма 1С сама обновляет внутреннюю логику функций так, чтобы они возвращали те же псевдонимы полей из новых таблиц.
  4. Оптимизация производительности: Внутренние алгоритмы используют индексированные временные таблицы и пакетные запросы, которые оптимизированы под высокие нагрузки и большие объемы данных.

Использование основной функции КадровыеДанныеСотрудников

Рассмотрим основной инструмент разработчика — функцию КадровыеДанныеСотрудников, расположенную в общем модуле КадровыйУчет. Эта функция позволяет получить практически любые сведения по списку сотрудников на определенную дату.

Для вызова функции нам необходимо подготовить три параметра:

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

Проанализируем пример кода:


СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(ВыбранныйСотрудник);

Поля = "ФИОПолные, Должность, Подразделение, ТабельныйНомер, ВидЗанятости";
ДатаСреза = ТекущаяДата();

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

Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    Сообщить(СтрокаДанных.ФИОПолные + " работает в " + СтрокаДанных.Подразделение);
КонецЦикла;

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

Как узнать доступные поля для запроса

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

Проанализируем структуру этого модуля. В нем описаны связи между понятными названиями (например, Оклад) и реальными физическими полями регистров. Вот некоторые популярные поля:

Работа с временными таблицами (Продвинутый уровень)

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

Разберем по шагам, как это реализовать:

  1. Создаем менеджер временных таблиц.
  2. Помещаем во временную таблицу список ссылок на сотрудников.
  3. Вызываем процедуру КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников.

Посмотрим на пример реализации:


МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

// Шаг 1: Предположим, у нас уже есть ВТ_Сотрудники в менеджере
// Шаг 2: Дополняем её данными
КадровыеДанные = "Должность, Подразделение, Оклад";
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(МенеджерВТ, Истина, КадровыеДанные, "ВТ_Сотрудники");

// Шаг 3: Теперь мы можем использовать эти данные в своем основном запросе
Запрос.Текст = 
"ВЫБРАТЬ
|	Т.Сотрудник,
|	Т.Должность,
|	Т.Оклад
|ИЗ
|	ВТ_КадровыеДанныеСотрудников КАК Т";

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

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

Вспомогательные модули

Помимо модуля КадровыйУчет, полезно знать о существовании модуля ЗарплатаКадрыОбщиеНаборыДанных. Именно в нем происходит низкоуровневая "магия" сборки запросов. Если вам не хватает стандартных полей, анализ этого модуля поможет понять, как система объединяет данные о стажах, личных данных и оплате труда.

Для получения специфических данных о состояниях (например, периоды отсутствия для графиков) можно также рассмотреть функции модуля СостоянияСотрудников, но в 95% случаев универсального программного интерфейса КадровыйУчет будет достаточно.

Заключение

Использование программного интерфейса в ЗУП 3.1 — это не просто рекомендация, а стандарт качественной разработки. Это гарантирует, что ваша обработка не "сломается" после очередного обновления конфигурации и будет работать максимально быстро, учитывая все нюансы сложной бизнес-логики кадрового учета. Помните, что основной точкой входа всегда является модуль КадровыйУчет, а справочником полей — модуль КадровыйУчетВнутренний.

← На главную