Как правильно и быстро получить список сотрудников по позиции штатного расписания в 1С:ЗУП 3

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

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

В этой статье мы подробно разберем, как красиво, быстро и в соответствии со стандартами разработки «1С» отобрать сотрудников за определенный период по конкретной штатной единице (позиции штатного расписания).

Главная терминологическая ловушка: Должность vs Позиция

Часто начинающие разработчики путают два ключевых понятия в структуре метаданных кадрового учета ЗУП 3, из-за чего не могут найти нужное поле в параметрах отбора:

  1. Должность — это элемент простого справочника Справочники.Должности (например, «Бухгалтер», «Директор», «Системный администратор»).
  2. ДолжностьПоШтатномуРасписанию — это конкретная штатная единица (объект типа СправочникСсылка.ШтатноеРасписание), которая жестко привязана к определенному подразделению, имеет свою ставку, категорию и другие уникальные свойства. Это и есть позиция штатного расписания.

Для того чтобы сделать выборку по штатной единице, в параметрах штатных функций кадрового учета нам нужно обращаться именно к полю ДолжностьПоШтатномуРасписанию.

Способ 1. Получение данных во временную таблицу (ВТ) для сложных запросов

Рассмотрим ситуацию, когда вам необходимо не просто получить список людей, а использовать его в дальнейшем внутри большого и сложного запроса (например, соединить с регистром начислений или отработанного времени). Для этого оптимально использовать создание временной таблицы через менеджер временных таблиц.

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


// Инициализируем параметры получения сотрудников
ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияСотрудников.НачалоПериода = НачалоПериода;
ПараметрыПолученияСотрудников.ОкончаниеПериода = ОкончаниеПериода;

// Добавляем отбор по нашей позиции штатного расписания (переменная ПозицияШтатки)
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
    ПараметрыПолученияСотрудников.Отборы, 
    "ДолжностьПоШтатномуРасписанию", 
    "=", 
    ПозицияШтатки
);

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

После выполнения этого кода в вашем распоряжении внутри объекта Запрос появится готовая временная таблица с именем ВТСотрудникиОтбор. Система автоматически выберет только тех сотрудников, которые работали на указанной позиции в заданном интервале дат, учитывая все кадровые переводы.

Способ 2. Получение готовой таблицы значений (ТЗ) на стороне сервера

Что делать, если вам не нужно писать сложный запрос, а требуется просто получить список сотрудников на стороне сервера для последующего быстрого обхода в цикле или вывода на форму? Писать «ВЫБРАТЬ... ИЗ ВТ» в таком случае избыточно.

Проанализируем альтернативный легкий метод — использование функции КадровыйУчет.СотрудникиОрганизации(). Она возвращает готовую заполненную таблицу значений.


// 1. Создаем структуру параметров получения данных
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.НачалоПериода = НачалоПериода;
ПараметрыПолучения.ОкончаниеПериода = ОкончаниеПериода;

// 2. Указываем, какие именно кадровые поля нам нужны на выходе в колонках ТЗ
ПараметрыПолучения.КадровыеДанные = "Сотрудник,Подразделение,ДолжностьПоШтатномуРасписанию,ВидЗанятости";

// 3. Устанавливаем фильтр по нужной позиции штатного расписания
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
    ПараметрыПолучения.Отборы, 
    "ДолжностьПоШтатномуРасписанию", 
    "=", 
    НужнаяПозицияШтатногоРасписания
);

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

// 5. Обрабатываем результат
Для Каждого СтрокаКадров Из ТаблицаСотрудников Цикл
    // Ваша бизнес-логика обработки сотрудников
    Сообщить(СтрокаКадров.Сотрудник);
КонецЦикла;

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

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

Давайте выясним причину, почему разработчики фирмы «1С» и ведущие эксперты настоятельно рекомендуют использовать описанные выше методы вместо привычного написания прямых запросов к регистрам вроде КадроваяИсторияСотрудников:

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

← На главную