Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

Превышен лимит рекурсивных вызовов процедуры в 1С (Stack Overflow)

Обновлено: 25.08.2026  ·  Официальная база знаний
  • Аварийное завершение рабочего процесса rphost или аварийное закрытие тонкого клиента 1С.
  • Текст ошибки: Превышен максимально допустимый уровень рекурсии (лимит стека вызовов).
  • В журнале ОС Windows регистрируется сбой в модуле core83.dll (Exception code: 0xc00000fd).
  • 100% утилизация ядра процессора до момента падения сеанса.

1. Ограничение глубины рекурсии программным счетчиком

Добавьте во все рекурсивные алгоритмы параметр контроля глубины стека:

Процедура ОбойтиДеревоИерархии(Элемент, ТекущаяГлубина = 0)
    
    МАКСИМАЛЬНАЯ_ГЛУБИНА = 200;
    
    Если ТекущаяГлубина > МАКСИМАЛЬНАЯ_ГЛУБИНА Тогда
        ВызватьИсключение "Обнаружено зацикливание иерархии для элемента: " + Строка(Элемент);
    КонецЕсли;
    
    Выборка = Справочники.Номенклатура.Выбрать(Элемент);
    Пока Выборка.Следующий() Цикл
        ОбойтиДеревоИерархии(Выборка.Ссылка, ТекущаяГлубина + 1);
    КонецЦикла;
    
КонецПроцедуры

2. Замена глубокой рекурсии стеком на базе массива

Стек = Новый Массив;
Стек.Добавить(КореньИерархии);

Пока Стек.Количество() > 0 Цикл
    ТекущийУзел = Стек[Стек.Количество() - 1];
    Стек.Удалить(Стек.Количество() - 1);
    
    // Обработка узла
    Для Каждого Подчиненный Из ПолучитьПодчиненные(ТекущийУзел) Цикл
        Стек.Добавить(Подчиненный);
    КонецЦикла;
КонецЦикла;

3. Проверка циклических ссылок родителей в СУБД

Выполните поиск элементов, у которых Родитель равен самому себе или образует кольцевую зависимость (A -> B -> A).

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

Частые вопросы (FAQ)

Каков жесткий лимит глубины вызовов в платформе 1С:Предприятие?

В зависимости от разрядности платформы (x86 или x64) и объема стека ОС лимит составляет порядка 1000–2000 вложенных вызовов процедур.

Как найти процедуру, вызывающую Stack Overflow, если клиент падает без стека?

Включите сбор технологического журнала с событиями EXCP, CALL и SCALL с фильтром по процессу rphost, либо воспользуйтесь отладчиком с точкой останова в начале подозрительного модуля.

Может ли событие формы ПриИзменении вызвать переполнение стека?

Да, если внутри обработчика ПриИзменении программно меняется значение этого же реквизита или активируется связанный элемент без отключения обработки оповещений.

Поможет ли переход на 64-битную версию сервера 1С избавиться от ошибки?

Переход на x64 увеличит размер доступного адресного пространства, но не решит проблему бесконечного зацикливания — сервер упадет позже с исчерпанием ресурсов потока.