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