При переходе на новые релизы конфигурации 1С:Зарплата и управление персоналом 3.1 (начиная с ветки 3.1.9 и КОРП-версий) многие разработчики и администраторы баз данных столкнулись с неожиданным поведением системы. Перестает корректно отображаться структура компании, «ломаются» права доступа на уровне записей (RLS), а при попытке закрыть или расформировать подразделения программа выдает неочевидные ошибки или попросту игнорирует действия пользователя.
Причиной такого поведения часто становится вспомогательный технический объект — РегистрСведений.ПодчиненностьПодразделенийОрганизаций. В этой статье мы подробно разберем, зачем разработчики фирмы «1С» добавили этот регистр в архитектуру ЗУП 3.1, почему его заполнение периодически сбоит и какими способами можно быстро вернуть систему в рабочее состояние.
В ранних версиях решений на платформе «1С:Предприятие» иерархия подразделений определялась классическим способом — через реквизит Родитель самого справочника Подразделения. Однако в крупных базах с разветвленной структурой компании и тысячами позиций штатного расписания такой подход создавал колоссальную нагрузку на СУБД.
Рассмотрим подробнее три ключевые причины, по которым был внедрен плоский регистр подчиненности:
Подразделение.Родитель.Родитель.Родитель. Использование регистра подчиненности позволяет «развернуть» многоуровневое дерево в плоскую таблицу. В ней для каждого подразделения хранятся готовые записи обо всех его вышестоящих уровнях. Любая проверка вложенности теперь выполняется простым и быстрым соединением с этой таблицей.Проанализируем ситуации, при которых данные в регистре сведений начинают расходиться с реальным деревом справочника Подразделения:
Если вы столкнулись с тем, что структура компании отображается некорректно, не закрываются подразделения или «поплыли» права RLS, выберите один из следующих вариантов решения проблемы.
Для полного восстановления целостности данных лучше всего запустить стандартный метод обновления регистра, который заново пересчитает всю иерархию компании по актуальным данным справочника.
Для этого нам понадобится внешняя обработка «Консоль кода» или стандартная обработка «Групповое изменение реквизитов» (с возможностью выполнения произвольного алгоритма на сервере). Выполним следующий программный код:
// Вызов стандартного метода пересчета иерархии подразделений
РегистрыСведений.ПодчиненностьПодразделенийОрганизаций.ПерезаполнитьПодчиненностьПодразделений();
Этот метод полностью очистит устаревшие записи регистра и сформирует новые, корректные связи для всех организаций в базе. Данный способ является самым надежным при обнаружении массовых расхождений после переноса данных или крупных обновлений.
Если проблема локализована и касается только одного или нескольких конкретных подразделений, можно обойтись без написания кода:
Этот простой маневр заставит платформу принудительно перезаписать строки в регистре ПодчиненностьПодразделенийОрганизаций именно для этой ветки структуры.
Когда сбой регистра влияет на актуальность подразделений и не позволяет закрыть расформированные отделы, дело может быть в документах, фиксирующих состояние штатного расписания. Проанализируем следующую последовательность действий для исправления:
Регулярный контроль за состоянием технического регистра подчиненности подразделений поможет избежать внезапных проблем с производительностью системы и неожиданным ограничением прав доступа у кадровых специалистов вашей организации.