Ошибка «Зацикливание уровней» в подразделениях ЗУП: разрываем петлю иерархии
Содержание
Ошибка Зацикливание уровней в 1С ЗУП означает, что в иерархическом справочнике (чаще всего — подразделения организации) элемент оказался подчинён сам себе: напрямую или через цепочку «А в Б, Б в В, В в А». Лечится это одним действием — у одного элемента из петли очищают поле «Родитель» или ставят правильное верхнее подразделение. Сложность только в том, чтобы найти этот элемент: в дереве он не виден.
Чаще всего ошибка всплывает при записи подразделения, при загрузке данных обмена из Бухгалтерии или ERP и при переносе данных из старой ЗУП 2.5. Кадровые документы при исправлении не страдают: меняется только место элемента в дереве.
Откуда в базе берётся циклическая ссылка на родителя
Платформа 1С хранит иерархию просто: у каждого элемента есть ссылка на родителя. Когда вы переносите подразделение мышкой в другую ветку, платформа проверяет, не кладёте ли вы элемент внутрь его же потомка. При обычной работе в форме петлю создать нельзя — запись остановится с этой самой ошибкой.
Петля возникает, когда данные пишутся в обход привычной проверки или по частям:
- 🔄 Обмен данными с БП 3.0, ERP или КА. Правила обмена загружают элементы по одному. Если в базе-источнике структура менялась, а в приёмнике осталась старая, после загрузки части элементов цепочка может замкнуться.
- 📦 Перенос из ЗУП 2.5 или загрузка из файла. Данные пишутся в режиме загрузки, когда часть проверок отключена ради скорости.
- 👥 Параллельная реорганизация. Один кадровик переносит «Склад» в «Логистику», второй в это же время переносит «Логистику» в «Склад». При неудачном совпадении обе записи проходят.
- 🛠 Доработки и внешние обработки. Обработка массовой смены родителя, написанная без проверки, легко создаёт петлю.
- 💾 Сбой при записи или восстановление части таблиц из копии — редкий, но реальный случай.
Как выглядит петля на примере
Возьмём структуру: «Администрация» → «Логистика» → «Склад». Кадровик переносит «Администрацию» внутрь «Склада». Получилось бы: «Склад» подчинён «Логистике», «Логистика» — «Администрации», а «Администрация» — «Складу». Пройти от любого из трёх элементов вверх до корня невозможно: путь ходит по кругу.
В форме такую запись платформа не даст сделать. Но если те же три изменения пришли пакетом обмена, причём «Администрация» пришла раньше остальных, каждая отдельная запись выглядит допустимой — а итог замкнутый.
Элементы из петли не связаны с корнем дерева. Поэтому в иерархическом просмотре справочника они просто пропадают — пользователь видит, что подразделение «исчезло», хотя оно есть и по нему даже числятся сотрудники.
Как найти зацикленные подразделения: журнал регистрации и список
Текст ошибки и где он появляется
Типичное сообщение выглядит так:
Ошибка при вызове метода контекста (Записать)
Зацикливание уровней
Перед ним обычно стоит имя объекта: Справочник.ПодразделенияОрганизаций или Справочник.СтруктураПредприятия. По имени понятно, в каком справочнике искать. Если ошибка пришла из обмена, в протоколе синхронизации будет ещё и наименование загружаемого элемента — это первый кандидат.
Журнал регистрации
Если ошибка возникла у пользователя, а вы видите её уже потом, откройте журнал:
- В ЗУП 3.1:
Администрирование → Обслуживание, ссылка «Журнал регистрации». В Конфигураторе:Администрирование → Журнал регистрации. - Установите отбор по уровню «Ошибка» и по периоду, когда случился сбой.
- Найдите события с текстом «Зацикливание уровней» и посмотрите колонку «Данные» — там ссылка на элемент, который не записался.
- Рядом ищите события «Данные. Изменение» по тому же справочнику: кто и когда менял родителей у соседних подразделений.
Если в журнале видно, что прямо перед ошибкой шла загрузка сообщения обмена, причину надо искать в базе-источнике, а не в действиях кадровика.
Как увидеть «пропавшие» элементы
Переключите форму списка подразделений из дерева в обычный список. В формах БСП это делается командой «Ещё»: найдите там переключатель режима просмотра (иерархический / список). В режиме списка видны все элементы, включая выпавшие из дерева. Добавьте колонку «Родитель» и отсортируйте по ней — петлю видно по парам, где элементы ссылаются друг на друга.
Исправление иерархии вручную и обработкой
Перед исправлением сделайте резервную копию базы . Изменение родителя подразделения не трогает кадровые документы, но если ошибиться элементом, структура в отчётах и штатном расписании поедет.
Способ 1. Через форму подразделения
Подходит, если в петле 2–3 элемента и вы их уже нашли.
- Откройте в режиме списка любой элемент из петли — лучше тот, что по смыслу должен быть верхним.
- Очистите поле «Родитель» (элемент станет корневым) или выберите правильное вышестоящее подразделение, которое точно не входит в петлю.
- Запишите элемент. Цепочка разорвана, остальные элементы снова появятся в дереве.
- Переключитесь в иерархический просмотр и расставьте подразделения так, как должно быть.
Если при записи снова выходит Зацикливание уровней, значит, выбранный родитель тоже в петле. Сделайте элемент корневым — пустой родитель петлю не создаёт никогда.
Способ 2. Внешняя обработка для поиска петель
Когда подразделений сотни, а ошибка пришла из обмена, вручную петлю не найти. Создайте в Конфигураторе внешнюю обработку
(Файл → Новый → Внешняя обработка), добавьте форму и команду, а в модуле — код. Он проходит вверх по родителям от каждого элемента и сообщает, если вернулся к самому себе.
&НаСервере
Процедура НайтиПетлиНаСервере()
Выборка = Справочники.ПодразделенияОрганизаций.Выбрать();
Пока Выборка.Следующий() Цикл
Текущий = Выборка.Родитель;
Шаг = 0;
Пока ЗначениеЗаполнено(Текущий) И Шаг < 100 Цикл
Если Текущий = Выборка.Ссылка Тогда
Сообщить("Петля: " + Выборка.Наименование + " (код " + Выборка.Код + ")");
Прервать;
КонецЕсли;
Текущий = Текущий.Родитель;
Шаг = Шаг + 1;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Ограничение в 100 шагов защищает от бесконечного цикла: реальная структура глубже 10–15 уровней почти не бывает. Каждый элемент петли попадёт в список, так что вы увидите её целиком.
Чтобы разорвать петлю программно, у одного найденного элемента очистите родителя:
Объект = Ссылка.ПолучитьОбъект();
Объект.Родитель = Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
Объект.Записать();
Для справочника «Структура предприятия» замените имя на Справочники.СтруктураПредприятия. Запускать обработку нужно под пользователем с полными правами.
Не меняйте родителя у всех найденных элементов сразу. Хватит одного — остальные останутся на своих местах, и вы потом вручную поставите разорванный элемент куда нужно.
Способ 3. Повторная загрузка из базы-источника
Если подразделения ведутся в Бухгалтерии или ERP, а в ЗУП приходят обменом, правильнее починить структуру там, где она главная. Проверьте её в источнике тем же способом, исправьте и выполните синхронизацию. Иначе следующий обмен вернёт петлю обратно.
Тестирование и исправление информационной базы
Если петля появилась после сбоя записи или восстановления, есть смысл прогнать штатную проверку базы. В Конфигураторе: Администрирование → Тестирование и исправление.
Отметьте:
- ✅ «Проверка логической целостности информационной базы»;
- ✅ «Проверка ссылочной целостности информационной базы»;
- ✅ «Реиндексация таблиц информационной базы» — если подозреваете повреждение индексов.
Режим — «Тестирование и исправление», а не только тестирование. Результат проверки выводится в окне сообщений: по нему видно, какие таблицы и объекты были с нарушениями.
Тестирование и исправление требует монопольного доступа: все пользователи должны выйти из базы, их сеансы будут завершены. Запускайте вечером или в выходной, только после резервной копии.
Проверка не гарантирует, что переставит подразделения по-вашему. Если после неё запись по-прежнему падает с Зацикливание уровней, возвращайтесь к ручному исправлению — оно надёжнее.
Сводная таблица ошибок иерархии
| Симптом | Вероятная причина | Что делать |
|---|---|---|
Зацикливание уровней при записи подразделения | Выбранный родитель — потомок этого же элемента | Выбрать другого родителя или сделать элемент корневым |
| Та же ошибка в протоколе обмена | Петля пришла из базы-источника или из несовпадения структур | Исправить в источнике, затем синхронизировать |
| Подразделение «пропало» из дерева, но сотрудники по нему числятся | Элемент в петле и не связан с корнем | Открыть список без иерархии, разорвать петлю |
| Ошибка при переносе из ЗУП 2.5 | Неполная или повторная загрузка структуры | Проверить обработкой из способа 2 и исправить |
| Обработка обновления не завершается на подразделениях | Отложенный обработчик спотыкается о зацикленный элемент | Исправить петлю и перезапустить обработку данных |
| Отчёты по подразделениям выводят итоги «в никуда» | Часть ветки выпала из иерархии | Найти элементы без пути к корню и расставить по местам |
Профилактика: права, обмен и порядок реорганизации
Петля почти всегда — следствие того, что структуру правят несколько человек или несколько механизмов сразу. Отсюда и меры.
Права. Изменять подразделения должны 1–2 ответственных. Настраивается это в Администрирование → Настройки пользователей и прав → Группы доступа: у профиля рядового расчётчика право менять структуру предприятия лучше убрать, оставить только чтение.
Обмен. Решите, где «главная» структура: в ЗУП или в учётной системе. Подразделения правят только там. В настройках синхронизации проверьте, какие справочники и в какую сторону передаются — двусторонняя правка одного и того же справочника и рождает петли.
Реорганизация. Большие переносы веток делайте по одной, а не массово, и не одновременно с обменом. После переноса проверьте дерево: все ли подразделения на месте.
Если петлю разорвали, а ошибка осталась
Бывает, что после исправления запись по-прежнему падает. Проверьте по порядку:
- 🔁 Петель было несколько. Повторно запустите обработку поиска: вторая петля могла сидеть в другой ветке.
- 🌐 Обмен вернул старые данные. Посмотрите время последней синхронизации. Если она прошла после исправления, а источник не чинили, петля пришла снова.
- 🗂 Ошибка в другом справочнике. Перечитайте текст: не
ПодразделенияОрганизаций, аСтруктураПредприятияили иной объект — и ищите там. - 🧩 Доработанная конфигурация. Если подписка на событие или расширение при записи само переставляет родителя, оно и создаёт петлю. Временно отключите расширение на копии базы и проверьте запись.
Как обновления конфигурации связаны со структурой подразделений
Само по себе обновление ЗУП петлю не создаёт: типовые обработчики не меняют родителей у ваших подразделений. Но обновление часто её выявляет.
После перехода на новый релиз запускаются отложенные обработчики, которые перезаписывают объекты. Если среди них есть зацикленный элемент, обработчик упадёт с Зацикливание уровней, и программа сообщит, что обработка данных не завершена. Результаты обработки смотрите в разделе Администрирование → Обслуживание, в блоке про результаты обновления программы.
Что делать:
- По тексту ошибки обработчика определите справочник и элемент.
- Разорвите петлю одним из способов выше.
- Перезапустите обработку данных из того же раздела.
Отдельный случай — разные версии правил обмена. Если ЗУП обновили, а Бухгалтерию нет (или наоборот), структуры подразделений могут сопоставляться неправильно. Держите обе базы на релизах, совместимых по обмену, и после обновления одной из них делайте пробную синхронизацию на копии.
Перед крупным обновлением прогоните обработку поиска петель из способа 2. Это пара минут, зато отложенные обработчики пройдут без остановок.