При разработке в конфигурации 1С:Зарплата и управление персоналом 3.1 программисты часто сталкиваются с необходимостью понять, как заполняется независимый регистр сведений СостоянияСотрудников. Этот регистр является ключевым для отображения текущего статуса работника (в отпуске, болеет, работает) в списках и отчетах. Однако найти прямой вызов Записать() в модулях документов бывает непросто.
В этой статье мы подробно разберем внутреннее устройство этого механизма, выясним, через какие общие модули происходит обновление данных, и научимся правильно изменять эти состояния программно, не нарушая логику системы.
Регистр сведения СостоянияСотрудников является периодическим и независимым. Это означает, что он не имеет жесткой привязки к регистратору, как это бывает у подчиненных регистров. Однако в ЗУП 3.1 он работает как «производный»: его данные почти всегда формируются на основе других кадровых документов.
Важно понимать, что прямое создание набора записей и его запись крайне не рекомендуются. Система использует оптимизированные механизмы, которые учитывают приоритеты состояний (например, если на один период накладываются отпуск и болезнь) и предотвращают коллизии данных.
Если стандартный глобальный поиск по конфигурации (например, СостоянияСотрудников.СоздатьНаборЗаписей()) не дает результатов, проанализируем ситуацию с помощью инструментов платформы. Рассмотрим два эффективных метода поиска точки записи:
СостоянияСотрудников.СостоянияСотрудников и добавим процедуру ПередЗаписью. Внутри установим точку останова. При проведении любого кадрового документа система остановится в этой точке, и мы сможем изучить стек вызовов, чтобы понять, какая процедура инициировала запись.Как показывает практика, вся основная логика сосредоточена в одноименном общем модуле — СостоянияСотрудников. Разберем ключевые методы, которые используются системой:
Основным методом для массового обновления данных является ОбновитьСостоянияСотрудников(). Интересной особенностью является то, что ЗУП часто использует временные таблицы для передачи данных в этот механизм. Рассмотрим примерный алгоритм, который использует система:
// Формируется временная таблица с данными о состояниях
// (Обычно это делается внутри кадровых механизмов)
МенеджерВТ = Новый МенеджерВременных Таблиц;
СостоянияСотрудников.ОбновитьСостоянияСотрудников(МенеджерВТ);
Если нам необходимо зарегистрировать изменение состояния для конкретного документа, следует искать вызов функции СостоянияСотрудников.ОбновитьСостоянияСотрудниковПоДаннымДокумента(). Эта процедура анализирует движения документа и синхронизирует их с регистром состояний.
Если перед нами стоит задача программно изменить состояние сотрудника (например, при написании внешней обработки или интеграции), крайне желательно использовать типизированные методы общего модуля вместо прямого формирования набора записей.
Проанализируем метод ЗарегистрироватьСостояния(). Он позволяет корректно добавить запись в регистр, учитывая период и уникальность ключа записи. Это помогает избежать ошибок, когда на одну дату у сотрудника оказывается несколько противоречивых статусов.
В современных версиях конфигураций на базе 1С:ERP и ЗУП 3 реализован механизм «отложенной» или пакетной записи. Система сначала готовит таблицу ВТСостоянияСотрудников, заполняя ее нужными полями (Сотрудник, Организация, Начало, Окончание, Состояние), а затем вызывает универсальный метод обновления. Это выглядит следующим образом:
1. В менеджере временных таблиц создается таблица с данными.
2. Вызывается процедура:
СостоянияСотрудников.ОбновитьСостоянияСотрудников(МенеджерВременныхТаблиц);
Этот подход позволяет минимизировать количество обращений к базе данных и обеспечивает целостность информации.
Иногда возникают ситуации, когда документ проведен, а состояние в справочнике «Сотрудники» или в отчетах отображается неверно. Выясним причину. Часто это происходит из-за того, что регистр СостоянияСотрудников не обновился корректно при программном создании документов (если разработчик забыл вызвать соответствующие методы обновления).
Для исправления таких ошибок в типовой конфигурации предусмотрены процедуры пересчета. Программист может инициировать полное обновление состояний по списку сотрудников, вызвав методы из модуля КадровыйУчетРасширенный или СостоянияСотрудников. Это восстановит актуальность данных на основе существующих кадровых приказов.
Подведем итоги нашего анализа работы с регистром СостоянияСотрудников:
Записать() в модуле документа. Ищите вызовы процедур общего модуля СостоянияСотрудников.ПередЗаписью набора записей самого регистра.СостоянияСотрудников.ЗарегистрироватьСостояния() или формирование временной таблицы ВТСостоянияСотрудников с последующим вызовом ОбновитьСостоянияСотрудников().Такой подход гарантирует, что кадровый учет в вашей системе будет работать стабильно, а статусы сотрудников всегда будут актуальными и непротиворечивыми.