При разработке кастомных отчетов, доработке документов или создании проверок перед проведением кадровых документов в конфигурации «Зарплата и управление персоналом 3.1» (1С:ЗУП 3.1) разработчики часто сталкиваются с необходимостью оперативно получать информацию о количестве занятых и свободных ставок по конкретной позиции штатного расписания. Ранее для этой цели программисты писали прямые запросы к регистрам, но с развитием конфигурации архитектурные подходы существенно изменились. Рассмотрим подробно, как правильно решать эту задачу в современных релизах конфигурации.
В старых версиях конфигурации 1С:ЗУП 3.1 (до релиза 3.1.10) учет занятых ставок велся в Регистре накопления «Занятые позиции штатного расписания». Прямой запрос к этому регистру позволял получить остатки по занятым ставкам. Однако у такой схемы был серьезный недостаток: в регистре отсутствовало измерение Сотрудник (оно присутствовало лишь как реквизит), что сильно усложняло получение точечной аналитики в разрезе конкретных людей и временных интервалов.
Начиная с версии 3.1.10, этот регистр накопления был полностью упразднен. Разработчики фирмы 1С перевели механизм учета занятости ставок на более гибкие регистры сведений:
ЗанятостьПозицийШтатногоРасписания — основной регистр сведений, отражающий текущее состояние.ЗанятостьПозицийШтатногоРасписанияИнтервальный — ключевой источник данных, который хранит временные интервалы занятости ставок сотрудниками. Именно этот регистр используется системой для построения большинства кадровых отчетов на временной оси.ЗанятостьПозицийШтатногоРасписанияИспр — вспомогательный регистр, предназначенный для корректного отражения кадровых документов, проведенных задним числом («документы исправления»).Таким образом, прямые запросы к старому регистру накопления перестанут работать сразу после обновления конфигурации на релиз 3.1.10 или выше. Написание новых прямых запросов к интервальным регистрам сведений вручную — задача трудоемкая, так как требует учета множества временных пересечений и статусов документов.
Вместо написания собственных сложных запросов к новым регистрам сведений, разработчикам рекомендуется использовать готовые экспортные методы общего модуля УправлениеШтатнымРасписанием. Это гарантирует, что при последующих обновлениях системы ваш код продолжит работать корректно.
Основным инструментом для получения занятости является экспортная функция УправлениеШтатнымРасписанием.ЗанятостьПозицийШтатногоРасписания. Разберем по шагам, как получить данные с ее помощью.
Эта функция принимает на вход структуру параметров, анализирует данные по интервальным регистрам и возвращает таблицу значений с подробными сведениями о занятых ставках.
Рассмотрим пример использования этой функции в программном коде:
// Определяем параметры для получения занятости ставок
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("Период", ТекущаяДата()); // Дата, на которую анализируется занятость
ПараметрыЗапроса.Вставить("Позиция", СсылкаНаПозицию); // Ссылка на элемент справочника ШтатноеРасписание
// Получаем таблицу занятости позиций
ТаблицаЗанятости = УправлениеШтатнымРасписанием.ЗанятостьПозицийШтатногоРасписания(ПараметрыЗапроса);
// Анализируем полученный результат
Для Каждого СтрокаЗанятости Из ТаблицаЗанятости Цикл
КоличествоЗанятыхСтавок = СтрокаЗанятости.ВременноЗанято + СтрокаЗанятости.ПостоянноЗанято;
Сообщить("Позиция: " + СтрокаЗанятости.Позиция + " | Занято ставок: " + КоличествоЗанятыхСтавок); КонецЦикла;
Помимо указанной функции, в общем модуле УправлениеШтатнымРасписанием есть еще одна крайне полезная функция — ДанныеПозицииШтатногоРасписания. Она позволяет получить комплексную информацию по позиции штатного расписания на определенную дату, включая оклады, начисления и показатели занятости.
Пример обращения к этой функции:
ПозицияШР = Справочники.ШтатноеРасписание.НайтиПоКоду("00000001");
ДатаАнализа = ТекущаяДата();
ПолучитьЗанятость = Истина; // Обязательно передаем Истина, чтобы рассчитать занятые ставки
ТаблицаДанных = УправлениеШтатнымРасписанием.ДанныеПозицииШтатногоРасписания(ПозицияШР, ДатаАнализа, ПолучитьЗанятость);
Если ТаблицаДанных.Количество() > 0 Тогда
ВсегоСтавокПоШтату = ТаблицаДанных[0].КоличествоСтавок;
ЗанятоСтавок = ТаблицаДанных[0].ЗанятоСтавок;
СвободноСтавок = ВсегоСтавокПоШтату - ЗанятоСтавок;
Сообщить("Всего ставок по штату: " + ВсегоСтавокПоШтату);
Сообщить("Занято ставок: " + ЗанятоСтавок);
Сообщить("Свободно ставок: " + СвободноСтавок);
КонецЕсли;
При анализе занятости ставок важно понимать бизнес-логику, заложенную в современные версии ЗУП 3.1. Понятие «занятая ставка» теперь рассчитывается по усложненному алгоритму, который учитывает различные кадровые ситуации:
Часто программистам ставят задачу вывести информацию о количестве занятых и свободных ставок в форму списка справочника «Штатное расписание». Прежде чем приступать к доработке формы в конфигураторе или расширении, проверим стандартные возможности интерфейса «1С:Предприятие».
Вывести эти показатели можно штатными средствами платформы за несколько простых шагов:
После выполнения этих действий прямо в форме списка штатного расписания появятся новые колонки с оперативной информацией о занятых и свободных ставках. Кадровик сможет видеть актуальную картину в режиме реального времени без использования дополнительных отчетов.
Иногда пользователи могут жаловаться, что отчеты или разработанные вами функции показывают неверное количество свободных ставок. Самой частой причиной этого является нарушение хронологической последовательности проведения кадровых документов.
Например, если документ «Возврат из отпуска по уходу за ребенком» был проведен раньше, чем фактически зарегистрирован предшествующий ему «Кадровый перевод», временные интервалы в регистре сведений ЗанятостьПозицийШтатногоРасписанияИнтервальный могут перекрыть друг друга некорректно. В результате ставка ошибочно помечается как свободная.
Для исправления подобных коллизий необходимо перепровести цепочку кадровых документов по сотруднику в строгой хронологической последовательности.