Превышен лимит рекурсивных вызовов процедуры в 1С (Stack Overflow)
- Аварийное завершение рабочего процесса
rphostили аварийное закрытие тонкого клиента 1С. - Текст ошибки:
Превышен максимально допустимый уровень рекурсии (лимит стека вызовов). - В журнале ОС Windows регистрируется сбой в модуле
core83.dll(Exception code: 0xc00000fd). - 100% утилизация ядра процессора до момента падения сеанса.
1. Ограничение глубины рекурсии программным счетчиком
Добавьте во все рекурсивные алгоритмы параметр контроля глубины стека:
Процедура ОбойтиДеревоИерархии(Элемент, ТекущаяГлубина = 0)
МАКСИМАЛЬНАЯ_ГЛУБИНА = 200;
Если ТекущаяГлубина > МАКСИМАЛЬНАЯ_ГЛУБИНА Тогда
ВызватьИсключение "Обнаружено зацикливание иерархии для элемента: " + Строка(Элемент);
КонецЕсли;
Выборка = Справочники.Номенклатура.Выбрать(Элемент);
Пока Выборка.Следующий() Цикл
ОбойтиДеревоИерархии(Выборка.Ссылка, ТекущаяГлубина + 1);
КонецЦикла;
КонецПроцедуры2. Замена глубокой рекурсии стеком на базе массива
Стек = Новый Массив;
Стек.Добавить(КореньИерархии);
Пока Стек.Количество() > 0 Цикл
ТекущийУзел = Стек[Стек.Количество() - 1];
Стек.Удалить(Стек.Количество() - 1);
// Обработка узла
Для Каждого Подчиненный Из ПолучитьПодчиненные(ТекущийУзел) Цикл
Стек.Добавить(Подчиненный);
КонецЦикла;
КонецЦикла;3. Проверка циклических ссылок родителей в СУБД
Выполните поиск элементов, у которых Родитель равен самому себе или образует кольцевую зависимость (A -> B -> A).
Частые вопросы (FAQ)
Каков жесткий лимит глубины вызовов в платформе 1С:Предприятие?
В зависимости от разрядности платформы (x86 или x64) и объема стека ОС лимит составляет порядка 1000–2000 вложенных вызовов процедур.
Как найти процедуру, вызывающую Stack Overflow, если клиент падает без стека?
Включите сбор технологического журнала с событиями EXCP, CALL и SCALL с фильтром по процессу rphost, либо воспользуйтесь отладчиком с точкой останова в начале подозрительного модуля.
Может ли событие формы ПриИзменении вызвать переполнение стека?
Да, если внутри обработчика ПриИзменении программно меняется значение этого же реквизита или активируется связанный элемент без отключения обработки оповещений.
Поможет ли переход на 64-битную версию сервера 1С избавиться от ошибки?
Переход на x64 увеличит размер доступного адресного пространства, но не решит проблему бесконечного зацикливания — сервер упадет позже с исчерпанием ресурсов потока.