При разработке в конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникает необходимость получить актуальные сведения о сотруднике: его должность, подразделение, текущее состояние (работает, в отпуске или болеет) или график работы. Новички часто пытаются обращаться напрямую к регистрам сведений, таким как ТекущиеКадры или СостоянияСотрудников. Однако фирма 1С настоятельно рекомендует использовать для этих целей специальный программный интерфейс получения кадровых данных.
В этой статье мы подробно разберем, почему прямые запросы к регистрам — это плохая практика, какие модули для этого предназначены и как правильно написать код для получения данных программным способом.
Разберем основные причины, по которым использование стандартных функций 1С предпочтительнее написания собственных запросов к таблицам базы данных:
API (программный интерфейс), вы защищаете свой код: фирма 1С сама обновляет внутреннюю логику функций так, чтобы они возвращали те же псевдонимы полей из новых таблиц.Рассмотрим основной инструмент разработчика — функцию КадровыеДанныеСотрудников, расположенную в общем модуле КадровыйУчет. Эта функция позволяет получить практически любые сведения по списку сотрудников на определенную дату.
Для вызова функции нам необходимо подготовить три параметра:
Сотрудники.Проанализируем пример кода:
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(ВыбранныйСотрудник);
Поля = "ФИОПолные, Должность, Подразделение, ТабельныйНомер, ВидЗанятости";
ДатаСреза = ТекущаяДата();
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, СписокСотрудников, Поля, ДатаСреза);
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
Сообщить(СтрокаДанных.ФИОПолные + " работает в " + СтрокаДанных.Подразделение);
КонецЦикла;
В данном примере функция возвращает таблицу значений, где колонками будут являться заказанные нами поля. Это избавляет нас от необходимости делать левые соединения в запросе.
Выясним, где найти список всех возможных полей (псевдонимов), которые можно передать в функцию. Для этого нам понадобится общий модуль КадровыйУчетВнутренний. В нем расположена процедура ЗаполнитьОписанияКадровыхДанных.
Проанализируем структуру этого модуля. В нем описаны связи между понятными названиями (например, Оклад) и реальными физическими полями регистров. Вот некоторые популярные поля:
ТекущееСостояние — статус (работает, отпуск, болезнь);ДатаПриема — дата выхода на работу;ГрафикРаботы — ссылка на график из кадровых документов;ФИОПолные — представление сотрудника;Подразделение, Должность — текущее место работы.Если вы пишете сложный отчет или обработку и вам нужно использовать кадровые данные внутри своего запроса, рекомендуется использовать механизм создания временных таблиц. Это гораздо эффективнее, чем получать данные в таблицу значений и потом передавать её обратно в запрос.
Разберем по шагам, как это реализовать:
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников.Посмотрим на пример реализации:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
// Шаг 1: Предположим, у нас уже есть ВТ_Сотрудники в менеджере
// Шаг 2: Дополняем её данными
КадровыеДанные = "Должность, Подразделение, Оклад";
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(МенеджерВТ, Истина, КадровыеДанные, "ВТ_Сотрудники");
// Шаг 3: Теперь мы можем использовать эти данные в своем основном запросе
Запрос.Текст =
"ВЫБРАТЬ
| Т.Сотрудник,
| Т.Должность,
| Т.Оклад
|ИЗ
| ВТ_КадровыеДанныеСотрудников КАК Т";
Результат = Запрос.Выполнить();
Обратите внимание, что система сама создаст таблицу с именем ВТ_КадровыеДанныеСотрудников, которую вы сможете соединять с другими данными вашего запроса.
Помимо модуля КадровыйУчет, полезно знать о существовании модуля ЗарплатаКадрыОбщиеНаборыДанных. Именно в нем происходит низкоуровневая "магия" сборки запросов. Если вам не хватает стандартных полей, анализ этого модуля поможет понять, как система объединяет данные о стажах, личных данных и оплате труда.
Для получения специфических данных о состояниях (например, периоды отсутствия для графиков) можно также рассмотреть функции модуля СостоянияСотрудников, но в 95% случаев универсального программного интерфейса КадровыйУчет будет достаточно.
Использование программного интерфейса в ЗУП 3.1 — это не просто рекомендация, а стандарт качественной разработки. Это гарантирует, что ваша обработка не "сломается" после очередного обновления конфигурации и будет работать максимально быстро, учитывая все нюансы сложной бизнес-логики кадрового учета. Помните, что основной точкой входа всегда является модуль КадровыйУчет, а справочником полей — модуль КадровыйУчетВнутренний.