При обновлении конфигурации «Бухгалтерия государственного учреждения 2.0» (БГУ 2.0) пользователи часто сталкиваются с прерыванием процесса и сообщением об ошибке: «Найдена циклическая ссылка». Эта проблема стала особенно актуальной после перехода на платформу 1С:Предприятие версии 8.3.17.1851 и выше. В этой статье мы подробно разберем, почему возникает эта ситуация, проанализируем механизмы работы платформы и рассмотрим пошаговые инструкции по устранению ошибки.
Прежде всего, выясним причину. Начиная с версии 8.3.17, разработчики платформы 1С внедрили строгий механизм контроля целостности данных в оперативной памяти. Теперь платформа автоматически отслеживает наличие «петель» в таких структурах, как Массив, Структура, ТаблицаЗначений и Соответствие. Если один элемент коллекции (напрямую или через цепочку других объектов) ссылается сам на себя, возникает циклическая ссылка.
В контексте БГУ 2.0 ошибка чаще всего проявляется в общем модуле УправлениеДоступомСлужебный в процедуре ДобавитьВложение. Проблема кроется в механизмах Библиотеки стандартных подсистем (БСП), которая отвечает за расчет прав доступа. Если в справочниках пользователей, групп доступа или иерархии подразделений допущена логическая ошибка (например, группа «А» входит в группу «Б», а группа «Б» — в группу «А»), система при попытке обхода дерева прав попадает в бесконечный цикл. Ранее платформа могла игнорировать такие ситуации, что приводило к утечкам памяти, но теперь она принудительно прерывает выполнение операции для защиты ресурсов сервера.
Если обновление необходимо завершить в кратчайшие сроки, мы можем воспользоваться технической возможностью отключения проверки циклических ссылок на уровне всей платформы. Рассмотрим этот процесс по шагам:
C:\Program Files\1cv8\conf.conf.cfg. Если его нет, создадим текстовый файл с таким названием.IgnoreCyclicReferences=1
Важно: Этот метод является временным «костылем». Рассмотрим ситуацию подробнее: при отключенной проверке платформа перестает тратить ресурсы процессора на поиск циклов, что может даже незначительно ускорить работу. Однако, если цикл в данных действительно существует, сборщик мусора не сможет корректно очистить память, что со временем приведет к разрастанию процесса rphost и падению сервера. Поэтому после успешного обновления настройку крайне рекомендуется вернуть в исходное состояние (IgnoreCyclicReferences=0 или удалить строку).
Поскольку ошибка локализована в модуле управления доступом, проанализируем состояние регистров, отвечающих за права. Часто «Тестирование и исправление» не находит ошибок, так как логическая целостность структуры прав проверяется только при их расчете.
Выполним следующие действия в режиме «1С:Предприятие»:
НаборыЗначенийДоступаТаблицыГруппДоступаРазберем ситуацию с точки зрения кода. В релизах БГУ, начиная с 2.0.87, разработчики 1С внесли изменения в процедуру ДобавитьВложение. Посмотрим на пример логики, которая помогает избежать ошибки:
// Пример защитного механизма в коде
Если ТипЗнч(Значение) = Тип("Структура") Тогда
НовоеЗначение = Новый Структура;
Для Каждого Элемент Из Значение Цикл
// Вместо передачи ссылки выполняется копирование или проверка
НовоеЗначение.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
КонецЕсли;
Проанализируем, что можно сделать без изменения кода основной конфигурации:
УправлениеДоступомСлужебный.Выясним, стоит ли бояться снижения производительности при отключении проверки. Существует мнение, что проверка циклических ссылок замедляет систему. Это правда лишь отчасти. Сама проверка потребляет ресурсы, но она предотвращает катастрофическое потребление памяти. Если вы столкнулись с ошибкой именно при обновлении, это сигнал о том, что в ваших данных (в справочнике ГруппыДоступа или ГруппыПользователей) есть некорректная иерархия.
Итоговый алгоритм действий:
IgnoreCyclicReferences=1 в conf.cfg для обхода блокировки.conf.cfg в штатный режим.Рассмотренные методы позволяют успешно преодолеть технический барьер платформы 8.3.17 и обеспечить корректную работу актуальных релизов БГУ 2.0.