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