Ошибка «Зацикливание уровней» в подразделениях ЗУП: разрываем петлю иерархии

· 9 мин

Содержание

Ошибка Зацикливание уровней в 1С ЗУП означает, что в иерархическом справочнике (чаще всего — подразделения организации) элемент оказался подчинён сам себе: напрямую или через цепочку «А в Б, Б в В, В в А». Лечится это одним действием — у одного элемента из петли очищают поле «Родитель» или ставят правильное верхнее подразделение. Сложность только в том, чтобы найти этот элемент: в дереве он не виден.

Чаще всего ошибка всплывает при записи подразделения, при загрузке данных обмена из Бухгалтерии или ERP и при переносе данных из старой ЗУП 2.5. Кадровые документы при исправлении не страдают: меняется только место элемента в дереве.

Откуда в базе берётся циклическая ссылка на родителя

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

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

  • 🔄 Обмен данными с БП 3.0, ERP или КА. Правила обмена загружают элементы по одному. Если в базе-источнике структура менялась, а в приёмнике осталась старая, после загрузки части элементов цепочка может замкнуться.
  • 📦 Перенос из ЗУП 2.5 или загрузка из файла. Данные пишутся в режиме загрузки, когда часть проверок отключена ради скорости.
  • 👥 Параллельная реорганизация. Один кадровик переносит «Склад» в «Логистику», второй в это же время переносит «Логистику» в «Склад». При неудачном совпадении обе записи проходят.
  • 🛠 Доработки и внешние обработки. Обработка массовой смены родителя, написанная без проверки, легко создаёт петлю.
  • 💾 Сбой при записи или восстановление части таблиц из копии — редкий, но реальный случай.

Как выглядит петля на примере

Возьмём структуру: «Администрация» → «Логистика» → «Склад». Кадровик переносит «Администрацию» внутрь «Склада». Получилось бы: «Склад» подчинён «Логистике», «Логистика» — «Администрации», а «Администрация» — «Складу». Пройти от любого из трёх элементов вверх до корня невозможно: путь ходит по кругу.

В форме такую запись платформа не даст сделать. Но если те же три изменения пришли пакетом обмена, причём «Администрация» пришла раньше остальных, каждая отдельная запись выглядит допустимой — а итог замкнутый.

Элементы из петли не связаны с корнем дерева. Поэтому в иерархическом просмотре справочника они просто пропадают — пользователь видит, что подразделение «исчезло», хотя оно есть и по нему даже числятся сотрудники.

Как найти зацикленные подразделения: журнал регистрации и список

Текст ошибки и где он появляется

Типичное сообщение выглядит так:

Ошибка при вызове метода контекста (Записать)
Зацикливание уровней

Перед ним обычно стоит имя объекта: Справочник.ПодразделенияОрганизаций или Справочник.СтруктураПредприятия. По имени понятно, в каком справочнике искать. Если ошибка пришла из обмена, в протоколе синхронизации будет ещё и наименование загружаемого элемента — это первый кандидат.

Журнал регистрации

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

  1. В ЗУП 3.1: Администрирование → Обслуживание, ссылка «Журнал регистрации». В Конфигураторе: Администрирование → Журнал регистрации.
  2. Установите отбор по уровню «Ошибка» и по периоду, когда случился сбой.
  3. Найдите события с текстом «Зацикливание уровней» и посмотрите колонку «Данные» — там ссылка на элемент, который не записался.
  4. Рядом ищите события «Данные. Изменение» по тому же справочнику: кто и когда менял родителей у соседних подразделений.

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

Как увидеть «пропавшие» элементы

Переключите форму списка подразделений из дерева в обычный список. В формах БСП это делается командой «Ещё»: найдите там переключатель режима просмотра (иерархический / список). В режиме списка видны все элементы, включая выпавшие из дерева. Добавьте колонку «Родитель» и отсортируйте по ней — петлю видно по парам, где элементы ссылаются друг на друга.

Исправление иерархии вручную и обработкой

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

Способ 1. Через форму подразделения

Подходит, если в петле 2–3 элемента и вы их уже нашли.

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

Если при записи снова выходит Зацикливание уровней, значит, выбранный родитель тоже в петле. Сделайте элемент корневым — пустой родитель петлю не создаёт никогда.

Способ 2. Внешняя обработка для поиска петель

Когда подразделений сотни, а ошибка пришла из обмена, вручную петлю не найти. Создайте в Конфигураторе внешнюю обработку (Файл → Новый → Внешняя обработка), добавьте форму и команду, а в модуле — код. Он проходит вверх по родителям от каждого элемента и сообщает, если вернулся к самому себе.

&НаСервере
Процедура НайтиПетлиНаСервере()
    Выборка = Справочники.ПодразделенияОрганизаций.Выбрать();
    Пока Выборка.Следующий() Цикл
        Текущий = Выборка.Родитель;
        Шаг = 0;
        Пока ЗначениеЗаполнено(Текущий) И Шаг < 100 Цикл
            Если Текущий = Выборка.Ссылка Тогда
                Сообщить("Петля: " + Выборка.Наименование + " (код " + Выборка.Код + ")");
                Прервать;
            КонецЕсли;
            Текущий = Текущий.Родитель;
            Шаг = Шаг + 1;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Ограничение в 100 шагов защищает от бесконечного цикла: реальная структура глубже 10–15 уровней почти не бывает. Каждый элемент петли попадёт в список, так что вы увидите её целиком.

Чтобы разорвать петлю программно, у одного найденного элемента очистите родителя:

Объект = Ссылка.ПолучитьОбъект();
Объект.Родитель = Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
Объект.Записать();

Для справочника «Структура предприятия» замените имя на Справочники.СтруктураПредприятия. Запускать обработку нужно под пользователем с полными правами.

Не меняйте родителя у всех найденных элементов сразу. Хватит одного — остальные останутся на своих местах, и вы потом вручную поставите разорванный элемент куда нужно.

Способ 3. Повторная загрузка из базы-источника

Если подразделения ведутся в Бухгалтерии или ERP, а в ЗУП приходят обменом, правильнее починить структуру там, где она главная. Проверьте её в источнике тем же способом, исправьте и выполните синхронизацию. Иначе следующий обмен вернёт петлю обратно.

Тестирование и исправление информационной базы

Если петля появилась после сбоя записи или восстановления, есть смысл прогнать штатную проверку базы. В Конфигураторе: Администрирование → Тестирование и исправление.

Отметьте:

  • ✅ «Проверка логической целостности информационной базы»;
  • ✅ «Проверка ссылочной целостности информационной базы»;
  • ✅ «Реиндексация таблиц информационной базы» — если подозреваете повреждение индексов.

Режим — «Тестирование и исправление», а не только тестирование. Результат проверки выводится в окне сообщений: по нему видно, какие таблицы и объекты были с нарушениями.

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

Проверка не гарантирует, что переставит подразделения по-вашему. Если после неё запись по-прежнему падает с Зацикливание уровней, возвращайтесь к ручному исправлению — оно надёжнее.

Сводная таблица ошибок иерархии

СимптомВероятная причинаЧто делать
Зацикливание уровней при записи подразделенияВыбранный родитель — потомок этого же элементаВыбрать другого родителя или сделать элемент корневым
Та же ошибка в протоколе обменаПетля пришла из базы-источника или из несовпадения структурИсправить в источнике, затем синхронизировать
Подразделение «пропало» из дерева, но сотрудники по нему числятсяЭлемент в петле и не связан с корнемОткрыть список без иерархии, разорвать петлю
Ошибка при переносе из ЗУП 2.5Неполная или повторная загрузка структурыПроверить обработкой из способа 2 и исправить
Обработка обновления не завершается на подразделенияхОтложенный обработчик спотыкается о зацикленный элементИсправить петлю и перезапустить обработку данных
Отчёты по подразделениям выводят итоги «в никуда»Часть ветки выпала из иерархииНайти элементы без пути к корню и расставить по местам

Профилактика: права, обмен и порядок реорганизации

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

Права. Изменять подразделения должны 1–2 ответственных. Настраивается это в Администрирование → Настройки пользователей и прав → Группы доступа: у профиля рядового расчётчика право менять структуру предприятия лучше убрать, оставить только чтение.

Обмен. Решите, где «главная» структура: в ЗУП или в учётной системе. Подразделения правят только там. В настройках синхронизации проверьте, какие справочники и в какую сторону передаются — двусторонняя правка одного и того же справочника и рождает петли.

Реорганизация. Большие переносы веток делайте по одной, а не массово, и не одновременно с обменом. После переноса проверьте дерево: все ли подразделения на месте.

Перед реорганизацией структуры в ЗУП
Выполнено: 0 / 6

Если петлю разорвали, а ошибка осталась

Бывает, что после исправления запись по-прежнему падает. Проверьте по порядку:

  • 🔁 Петель было несколько. Повторно запустите обработку поиска: вторая петля могла сидеть в другой ветке.
  • 🌐 Обмен вернул старые данные. Посмотрите время последней синхронизации. Если она прошла после исправления, а источник не чинили, петля пришла снова.
  • 🗂 Ошибка в другом справочнике. Перечитайте текст: не ПодразделенияОрганизаций, а СтруктураПредприятия или иной объект — и ищите там.
  • 🧩 Доработанная конфигурация. Если подписка на событие или расширение при записи само переставляет родителя, оно и создаёт петлю. Временно отключите расширение на копии базы и проверьте запись.

Как обновления конфигурации связаны со структурой подразделений

Само по себе обновление ЗУП петлю не создаёт: типовые обработчики не меняют родителей у ваших подразделений. Но обновление часто её выявляет.

После перехода на новый релиз запускаются отложенные обработчики, которые перезаписывают объекты. Если среди них есть зацикленный элемент, обработчик упадёт с Зацикливание уровней, и программа сообщит, что обработка данных не завершена. Результаты обработки смотрите в разделе Администрирование → Обслуживание, в блоке про результаты обновления программы.

Что делать:

  1. По тексту ошибки обработчика определите справочник и элемент.
  2. Разорвите петлю одним из способов выше.
  3. Перезапустите обработку данных из того же раздела.

Отдельный случай — разные версии правил обмена. Если ЗУП обновили, а Бухгалтерию нет (или наоборот), структуры подразделений могут сопоставляться неправильно. Держите обе базы на релизах, совместимых по обмену, и после обновления одной из них делайте пробную синхронизацию на копии.

Перед крупным обновлением прогоните обработку поиска петель из способа 2. Это пара минут, зато отложенные обработчики пройдут без остановок.

Частые вопросы

Пострадают ли кадровые документы, если сменить родителя подразделения?
Нет. Приёмы, переводы и начисления ссылаются на само подразделение, а не на его место в дереве. Меняется только то, как структура выглядит в отчётах и в штатном расписании.
Можно ли просто удалить зацикленное подразделение?
Не стоит. На него ссылаются сотрудники, штатные единицы и документы. Удаление сломает ссылки, а петля разрывается куда проще — сменой родителя.
Почему ошибка не появляется в файловой копии базы, а в рабочей есть?
Скорее всего, копия снята до того, как петля возникла, или в копии не запускался обмен. Сравните поле «Родитель» у проблемных элементов в обеих базах.
Зацикливание уровней бывает только в подразделениях?
Нет, в любом иерархическом справочнике конфигурации. Подразделения просто чаще всего правят вручную и передают обменом, поэтому ошибка и ассоциируется с ними.
Нужен ли программист, чтобы исправить ошибку?
Для петли из 2–3 видимых элементов — нет, хватает формы. Если петель несколько или ошибка приходит из обмена, нужен человек с доступом к Конфигуратору и правилам синхронизации.