Как программно изменить состояние сотрудника в 1С:ЗУП 3.1 и найти модуль управления регистром

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

При разработке в конфигурации 1С:Зарплата и управление персоналом 3.1 программисты часто сталкиваются с необходимостью понять, как заполняется независимый регистр сведений СостоянияСотрудников. Этот регистр является ключевым для отображения текущего статуса работника (в отпуске, болеет, работает) в списках и отчетах. Однако найти прямой вызов Записать() в модулях документов бывает непросто.

В этой статье мы подробно разберем внутреннее устройство этого механизма, выясним, через какие общие модули происходит обновление данных, и научимся правильно изменять эти состояния программно, не нарушая логику системы.

Особенности регистра Состояния сотрудников

Регистр сведения СостоянияСотрудников является периодическим и независимым. Это означает, что он не имеет жесткой привязки к регистратору, как это бывает у подчиненных регистров. Однако в ЗУП 3.1 он работает как «производный»: его данные почти всегда формируются на основе других кадровых документов.

Важно понимать, что прямое создание набора записей и его запись крайне не рекомендуются. Система использует оптимизированные механизмы, которые учитывают приоритеты состояний (например, если на один период накладываются отпуск и болезнь) и предотвращают коллизии данных.

Поиск механизмов обновления через отладку

Если стандартный глобальный поиск по конфигурации (например, СостоянияСотрудников.СоздатьНаборЗаписей()) не дает результатов, проанализируем ситуацию с помощью инструментов платформы. Рассмотрим два эффективных метода поиска точки записи:

  1. Использование замера производительности: Это самый быстрый способ. Запустите замер в конфигураторе, проведите документ (например, «Прием на работу» или «Больничный лист»), остановите замер и найдите в списке выполненных строк те, которые относятся к общему модулю СостоянияСотрудников.
  2. Точка останова в модуле набора записей: Откроем модуль набора записей регистра СостоянияСотрудников и добавим процедуру ПередЗаписью. Внутри установим точку останова. При проведении любого кадрового документа система остановится в этой точке, и мы сможем изучить стек вызовов, чтобы понять, какая процедура инициировала запись.

Разбор общего модуля СостоянияСотрудников

Как показывает практика, вся основная логика сосредоточена в одноименном общем модуле — СостоянияСотрудников. Разберем ключевые методы, которые используются системой:

Основным методом для массового обновления данных является ОбновитьСостоянияСотрудников(). Интересной особенностью является то, что ЗУП часто использует временные таблицы для передачи данных в этот механизм. Рассмотрим примерный алгоритм, который использует система:


// Формируется временная таблица с данными о состояниях
// (Обычно это делается внутри кадровых механизмов)
МенеджерВТ = Новый МенеджерВременных Таблиц;
СостоянияСотрудников.ОбновитьСостоянияСотрудников(МенеджерВТ);

Если нам необходимо зарегистрировать изменение состояния для конкретного документа, следует искать вызов функции СостоянияСотрудников.ОбновитьСостоянияСотрудниковПоДаннымДокумента(). Эта процедура анализирует движения документа и синхронизирует их с регистром состояний.

Программное изменение состояний: правильный подход

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

Проанализируем метод ЗарегистрироватьСостояния(). Он позволяет корректно добавить запись в регистр, учитывая период и уникальность ключа записи. Это помогает избежать ошибок, когда на одну дату у сотрудника оказывается несколько противоречивых статусов.

Использование менеджера временных таблиц

В современных версиях конфигураций на базе 1С:ERP и ЗУП 3 реализован механизм «отложенной» или пакетной записи. Система сначала готовит таблицу ВТСостоянияСотрудников, заполняя ее нужными полями (Сотрудник, Организация, Начало, Окончание, Состояние), а затем вызывает универсальный метод обновления. Это выглядит следующим образом:

1. В менеджере временных таблиц создается таблица с данными.

2. Вызывается процедура:

СостоянияСотрудников.ОбновитьСостоянияСотрудников(МенеджерВременныхТаблиц);

Этот подход позволяет минимизировать количество обращений к базе данных и обеспечивает целостность информации.

Диагностика проблем с состояниями

Иногда возникают ситуации, когда документ проведен, а состояние в справочнике «Сотрудники» или в отчетах отображается неверно. Выясним причину. Часто это происходит из-за того, что регистр СостоянияСотрудников не обновился корректно при программном создании документов (если разработчик забыл вызвать соответствующие методы обновления).

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

Резюме для разработчика

Подведем итоги нашего анализа работы с регистром СостоянияСотрудников:

Такой подход гарантирует, что кадровый учет в вашей системе будет работать стабильно, а статусы сотрудников всегда будут актуальными и непротиворечивыми.

← На главную