Содержание:
1. Что такое стек в конфигурации программы 1С?
2. Для чего нужен стек и откуда появляется ошибка переполнения стека?
3. Причины, вызывающие переполнение стека в системе программы 1С: Предприятие
1. Что такое стек в конфигурации программы 1С?
При работе в конфигурации системы 1С, после обновления конфигурации или платформы, или по каким-то другим причинам, все мы сталкиваемся с различными всплывающими ошибками. Разберемся сегодня, что можно сделать, если столкнуться с ошибкой – «Переполнение стека встроенного языка на сервере». Разберемся, что вызывает эту ошибку:
Переполнение стека возникает, когда в стек помещается больше элементов, чем он может вместить.
Стек – это по сути стопка элементов, в которой эти элементы «укладываются» один поверх другого. Работает этот механизм по принципу LIFO (Last In, First Out – последним вошел/первым вышел). Поэтому добраться мы можем в первую очередь до того элемента, который положили последним, потом предпоследним, и т.д.
2. Для чего нужен стек и откуда появляется ошибка переполнения стека?
Главное назначение стека - чтобы организовать команду вызова подпрограмм удобным образом. Например, вызывается «функция1» с определенными переменными, и которая при этом передает определенные параметры и вызывает «функцию2» со своими переменными. В свою очередь «функция2» передает свои параметры и вызывает «функцию3», и т.д. Все эти параметры и переменные нужно сохранять (куда-то складывать), и затем по порядку вызывать. Для этого как раз удобно использовать стек.
Если рассматривать стек абстрактно – это «безразмерный склад» для 1С хранения информации. Но фактически – это не так.
Появляется подобная ошибка именно от того, что стек по своей сути имеет границы, и его объем, а точнее память, выделенная под стек, ограничена. И поскольку стек организует команду вызова функций, при его переполнении функции уже не могут вызываться.
3. Причины, вызывающие переполнение стека в системе программы 1С: Предприятие
1. Самый распространенный вариант – это рекурсия. И если происходит бесконечная рекурсия, то прерывается она таким образом.
Выглядит это условно так:
Процедура ИмяПроцедурыВызываемойРекурсивно()
...
ИмяПроцедурыВызываемойРекурсивно();
...
КонецПроцедуры
2. Локальные переменные, которые требуют себе большого объема оперативной памяти. Это может быть, например, массив из какого-нибудь миллиона локальных переменных или элементов. Вызывая функцию с таким массивом, можно легко получить в ответ переполнение стека.
Переполнение стека - фатальная ошибка, чаще всего встречающаяся в программах, программный код 1С, которых имеет рекурсивные функции. Либо, даже если вы не используете рекурсию, программа содержит множество локальных переменных или есть ошибки в ручном выделении в стеке оперативной памяти. Актуальны все классические правила:
1. Если есть возможность – не используем в работе рекурсию.
2. Не выполнять вручную ту работу, которую может выполнить компилятор.
Специалист компании "Кодерлайн"
Марина Анапольская