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