Почему «криво» работает иерархия подразделений в 1С:ЗУП 3.1 и как решить проблемы с регистром подчиненности

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

При переходе на новые релизы конфигурации 1С:Зарплата и управление персоналом 3.1 (начиная с ветки 3.1.9 и КОРП-версий) многие разработчики и администраторы баз данных столкнулись с неожиданным поведением системы. Перестает корректно отображаться структура компании, «ломаются» права доступа на уровне записей (RLS), а при попытке закрыть или расформировать подразделения программа выдает неочевидные ошибки или попросту игнорирует действия пользователя.

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

Зачем нужен регистр «Подчиненность подразделений организаций»?

В ранних версиях решений на платформе «1С:Предприятие» иерархия подразделений определялась классическим способом — через реквизит Родитель самого справочника Подразделения. Однако в крупных базах с разветвленной структурой компании и тысячами позиций штатного расписания такой подход создавал колоссальную нагрузку на СУБД.

Рассмотрим подробнее три ключевые причины, по которым был внедрен плоский регистр подчиненности:

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

Выясняем причины: почему регистр начинает работать «криво»?

Проанализируем ситуации, при которых данные в регистре сведений начинают расходиться с реальным деревом справочника Подразделения:

Как исправить работу регистра: три практических способа

Если вы столкнулись с тем, что структура компании отображается некорректно, не закрываются подразделения или «поплыли» права RLS, выберите один из следующих вариантов решения проблемы.

Способ 1. Принудительное программное перезаполнение (рекомендуемый метод)

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

Для этого нам понадобится внешняя обработка «Консоль кода» или стандартная обработка «Групповое изменение реквизитов» (с возможностью выполнения произвольного алгоритма на сервере). Выполним следующий программный код:


// Вызов стандартного метода пересчета иерархии подразделений
РегистрыСведений.ПодчиненностьПодразделенийОрганизаций.ПерезаполнитьПодчиненностьПодразделений();

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

Способ 2. Интерактивное исправление (для точечного решения)

Если проблема локализована и касается только одного или нескольких конкретных подразделений, можно обойтись без написания кода:

  1. Перейдем в справочник Подразделения и найдем проблемный элемент.
  2. Откроем его карточку и в поле Вышестоящее подразделение временно выберем любого другого «родителя» (или очистим это поле, сделав подразделение головным).
  3. Нажмем кнопку Записать. В этот момент система пересчитает связи и внесет изменения в регистр сведений.
  4. Вернем исходное правильное вышестоящее подразделение обратно в карточку и снова нажмем Записать и закрыть.

Этот простой маневр заставит платформу принудительно перезаписать строки в регистре ПодчиненностьПодразделенийОрганизаций именно для этой ветки структуры.

Способ 3. Перепроведение документов штатного расписания

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

  1. Сначала обновим регистр подчиненности с помощью Способа 1 или Способа 2.
  2. Затем откроем список документов Утверждение штатного расписания или Изменение штатного расписания, которыми вносились последние изменения по проблемным отделам.
  3. Последовательно перепроведем эти документы. При проведении система заново сопоставит штатные единицы с актуальной иерархией подразделений из исправленного регистра, и некорректные связи окончательно разорвутся.

Регулярный контроль за состоянием технического регистра подчиненности подразделений поможет избежать внезапных проблем с производительностью системы и неожиданным ограничением прав доступа у кадровых специалистов вашей организации.

← На главную