Содержание:
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. Не выполнять вручную ту работу, которую может выполнить компилятор.
Специалист компании «Кодерлайн»
Марина Анапольская
Переполнение стека встроенного языка на сервере |
Я |
09.07.21 — 08:10
Доброго дня.
При создании/копировании прав доступа пользователя возникает такая ошибка.
Переполнение стека встроенного языка на сервере
{Справочник.Пользователи.Форма.ФормаЭлемента.Форма(1713)}: Записать(ПараметрыЗаписи);
{mngcore/MessageBox.clf(4)}: Close(-100);
по причине:
Переполнение стека встроенного языка на сервере
по причине:
Справочник.Пользователи.Форма.ФормаЭлемента.Форма : 403 : МодульУправлениеДоступомСлужебный.ПриКопированииПравНовомуПользователю(Источник, Приемник);
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 1964 : УправлениеДоступом.ВключитьПрофильПользователю(Приемник, Выборка.Профиль);
ОбщийМодуль.УправлениеДоступом.Модуль : 562 : ВключитьОтключитьПрофильПользователя(Пользователь, Профиль, Истина);
ОбщийМодуль.УправлениеДоступом.Модуль : 3105 : ГруппаДоступаОбъект.Записать();
…
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 225 : ЗапретитьИспользованиеУдаляемыхОбъектов(Источник, Отказ);
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 1044 : Если Не ПроверятьИспользованиеУдаляемыхОбъектов() Тогда
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 1533 : ЭтоМодельСервиса = ОбщегоНазначения.РазделениеВключено();
ОбщийМодуль.ОбщегоНазначения.Модуль : 0
по причине:
Переполнение стека встроенного языка на сервере
Подскажите пожалуйста, может быть кто-то сталкивался с такой ошибкой и как исправить.
Я пробовала.
-копировать модули из другой конфигурации, к сожалению ошибка продолжает возникать.
-Пробовала обновить конфигурацию, может из более старой версии стоит попробовать обновить.
-Также пробовала делать тестирование конфигурации
пока что нет результата.
1 — 09.07.21 — 08:14
Данные кривые, где-то циклическая ссылка.
2 — 09.07.21 — 08:20
(0) Присоединяюсь к (1) если есть база с той же версией конфигурации, в которой ошибки нет, проблема в данных.
3 — 09.07.21 — 08:21
(1)
Денис, а каким образом её найти??
Пользователь сохраняется, а вот кода пытаюсь назначить ему права, доступ по организациям, то выскакивает ошибка.
4 — 09.07.21 — 08:24
замер производительности — и смотреть в каком участке кода дикое количество проходов
5 — 09.07.21 — 08:32
(4)
Подскажите пожалуйста, а если ошибка всё же в данных- замер производительности поможет или нет? И поможет ли в таком случае перенос данных в справочник.ГруппыДоступа или в РегистрыСведений.ТаблицыГруппДоступа??
6 — 09.07.21 — 08:38
(5) Замер покажет только в каком участке кода возможно происходит сваливание в бесконечную рекурсию
7 — 09.07.21 — 09:26
(6)
Я сделала замер производительности.
К сожалению, я раньше никогда этим инструментом не пользовалась.
Как найти то, что уходит в рекурсию??
8 — 09.07.21 — 09:40
(4) это колонка кол.??
А если 8 или 9, то это много или может быть??
9 — 09.07.21 — 09:47
(7) Косвенно, по количеству проходов (колонка «Кол» в Замере)
(8) Не похоже. У меня ошибка на 937 проходах (каких-то конкретных значений я не знаю)
Причем если открыть стек вызовов, наглядно видно, как он «растет» при каждом вызове проблемной функции.
10 — 09.07.21 — 10:23
(9)
А как добавить что-либо в стек вызовов??
11 — 09.07.21 — 10:29
(10) что значит добавить? Оно само добавляется при новом вызове функции/процедуры. Через стек можно наглядно увидеть, что если одна и та же процедура повторяется — то это рекурсивный вызов.
12 — 09.07.21 — 10:40
не добавляется ничего в стек вызовов
стек пустой, в замере производительности не изменилось количество
13 — 09.07.21 — 11:13
(12) Ну просто отладчиком пройдись и смотри когда отвалится
14 — 09.07.21 — 11:21
Думаю, тут без программиста не обойтись
15 — 09.07.21 — 11:33
(14)
Форум для того и существует, если люди не знают чего-то, то они спрашивают.
И с некоторыми вещами люди сталкиваются впервые.
16 — 09.07.21 — 11:35
(15) Извините, просто по вопросу показалось что Вы просто пользователь
17 — 09.07.21 — 11:37
18 — 09.07.21 — 11:37
(15)
я работала с отладчиком в конкретной процедуре и форме, там, где у меня были ошибки. Я смотрела в табло значения переменных.
Но когда касается общего модуля или вызова из других модулей, то мне сложно понять, в каком месте запустить отладчик.
19 — 09.07.21 — 11:46
(18) ну видимо, где то здесь
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 225 : ЗапретитьИспользованиеУдаляемыхОбъектов(Источник, Отказ);
А у тебя назначенные группы профилей, кстати, не помечены, случайно?
20 — 09.07.21 — 11:54
(19)
нет, они не помечены на удаление.
А вот кстати перенести права пользователей с помощью обработки переноса данных получилось и они всталив нужном (новом) пользователе. Я выгрузила нужные данные из регистра сведений ТаблицаГруппДоступа и загрузила для того пользователя, у кого не было.
Только это конечно же не вариант.Знаю об этом, что нужно исправлять в базе
21 — 09.07.21 — 11:57
(19)
Благодарю Вас за подсказку, сейчас попробую в этом месте сделать отладку.
22 — 09.07.21 — 13:36
(20) не получилось перенести. Права просто у старого пользователя затёрлись
23 — 09.07.21 — 16:49
Поняла свою ошибку.
Отладка-остановка по ошибке нужно было добавить, и тогда в стеке вызовов отобразятся данные, которые прерывают выполнение кода.
Анастасия_85
24 — 16.07.21 — 08:12
Доброго утра.
Мне помогли найти ошибку.
Было дело в расширениях- при помощи отладки и обработки ОбновлениеВспомогательныхДанных.epf мы нашли, что ошибка была в расширениях. Возможно, что произошли изменения в ролях пользователей, которые конфликтуют с основной конфигурацией
Содержание:
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. Не выполнять вручную ту работу, которую может выполнить компилятор.
Специалист компании «Кодерлайн»
Марина Анапольская
Переполнение стека встроенного языка на сервере |
Я |
Анастасия_85
09.07.21 — 08:10
Доброго дня.
При создании/копировании прав доступа пользователя возникает такая ошибка.
Переполнение стека встроенного языка на сервере
{Справочник.Пользователи.Форма.ФормаЭлемента.Форма(1713)}: Записать(ПараметрыЗаписи);
{mngcore/MessageBox.clf(4)}: Close(-100);
по причине:
Переполнение стека встроенного языка на сервере
по причине:
Справочник.Пользователи.Форма.ФормаЭлемента.Форма : 403 : МодульУправлениеДоступомСлужебный.ПриКопированииПравНовомуПользователю(Источник, Приемник);
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 1964 : УправлениеДоступом.ВключитьПрофильПользователю(Приемник, Выборка.Профиль);
ОбщийМодуль.УправлениеДоступом.Модуль : 562 : ВключитьОтключитьПрофильПользователя(Пользователь, Профиль, Истина);
ОбщийМодуль.УправлениеДоступом.Модуль : 3105 : ГруппаДоступаОбъект.Записать();
…
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 225 : ЗапретитьИспользованиеУдаляемыхОбъектов(Источник, Отказ);
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 1044 : Если Не ПроверятьИспользованиеУдаляемыхОбъектов() Тогда
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 1533 : ЭтоМодельСервиса = ОбщегоНазначения.РазделениеВключено();
ОбщийМодуль.ОбщегоНазначения.Модуль : 0
по причине:
Переполнение стека встроенного языка на сервере
Подскажите пожалуйста, может быть кто-то сталкивался с такой ошибкой и как исправить.
Я пробовала.
-копировать модули из другой конфигурации, к сожалению ошибка продолжает возникать.
-Пробовала обновить конфигурацию, может из более старой версии стоит попробовать обновить.
-Также пробовала делать тестирование конфигурации
пока что нет результата.
ДенисЧ
1 — 09.07.21 — 08:14
Данные кривые, где-то циклическая ссылка.
WhiteDragon93
2 — 09.07.21 — 08:20
(0) Присоединяюсь к (1) если есть база с той же версией конфигурации, в которой ошибки нет, проблема в данных.
Анастасия_85
3 — 09.07.21 — 08:21
(1)
Денис, а каким образом её найти??
Пользователь сохраняется, а вот кода пытаюсь назначить ему права, доступ по организациям, то выскакивает ошибка.
youalex
4 — 09.07.21 — 08:24
замер производительности — и смотреть в каком участке кода дикое количество проходов
Анастасия_85
5 — 09.07.21 — 08:32
(4)
Подскажите пожалуйста, а если ошибка всё же в данных- замер производительности поможет или нет? И поможет ли в таком случае перенос данных в справочник.ГруппыДоступа или в РегистрыСведений.ТаблицыГруппДоступа??
youalex
6 — 09.07.21 — 08:38
(5) Замер покажет только в каком участке кода возможно происходит сваливание в бесконечную рекурсию
Анастасия_85
7 — 09.07.21 — 09:26
(6)
Я сделала замер производительности.
К сожалению, я раньше никогда этим инструментом не пользовалась.
Как найти то, что уходит в рекурсию??
Анастасия_85
8 — 09.07.21 — 09:40
(4) это колонка кол.??
А если 8 или 9, то это много или может быть??
youalex
9 — 09.07.21 — 09:47
(7) Косвенно, по количеству проходов (колонка «Кол» в Замере)
(8) Не похоже. У меня ошибка на 937 проходах (каких-то конкретных значений я не знаю)
Причем если открыть стек вызовов, наглядно видно, как он «растет» при каждом вызове проблемной функции.
Анастасия_85
10 — 09.07.21 — 10:23
(9)
А как добавить что-либо в стек вызовов??
youalex
11 — 09.07.21 — 10:29
(10) что значит добавить? Оно само добавляется при новом вызове функции/процедуры. Через стек можно наглядно увидеть, что если одна и та же процедура повторяется — то это рекурсивный вызов.
Анастасия_85
12 — 09.07.21 — 10:40
не добавляется ничего в стек вызовов
стек пустой, в замере производительности не изменилось количество
youalex
13 — 09.07.21 — 11:13
(12) Ну просто отладчиком пройдись и смотри когда отвалится
1Сергей
14 — 09.07.21 — 11:21
Думаю, тут без программиста не обойтись
Анастасия_85
15 — 09.07.21 — 11:33
(14)
Форум для того и существует, если люди не знают чего-то, то они спрашивают.
И с некоторыми вещами люди сталкиваются впервые.
1Сергей
16 — 09.07.21 — 11:35
(15) Извините, просто по вопросу показалось что Вы просто пользователь
rozer76
17 — 09.07.21 — 11:37
Анастасия_85
18 — 09.07.21 — 11:37
(15)
я работала с отладчиком в конкретной процедуре и форме, там, где у меня были ошибки. Я смотрела в табло значения переменных.
Но когда касается общего модуля или вызова из других модулей, то мне сложно понять, в каком месте запустить отладчик.
youalex
19 — 09.07.21 — 11:46
(18) ну видимо, где то здесь
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 225 : ЗапретитьИспользованиеУдаляемыхОбъектов(Источник, Отказ);
А у тебя назначенные группы профилей, кстати, не помечены, случайно?
Анастасия_85
20 — 09.07.21 — 11:54
(19)
нет, они не помечены на удаление.
А вот кстати перенести права пользователей с помощью обработки переноса данных получилось и они всталив нужном (новом) пользователе. Я выгрузила нужные данные из регистра сведений ТаблицаГруппДоступа и загрузила для того пользователя, у кого не было.
Только это конечно же не вариант.Знаю об этом, что нужно исправлять в базе
Анастасия_85
21 — 09.07.21 — 11:57
(19)
Благодарю Вас за подсказку, сейчас попробую в этом месте сделать отладку.
Анастасия_85
22 — 09.07.21 — 13:36
(20) не получилось перенести. Права просто у старого пользователя затёрлись
Анастасия_85
23 — 09.07.21 — 16:49
Поняла свою ошибку.
Отладка-остановка по ошибке нужно было добавить, и тогда в стеке вызовов отобразятся данные, которые прерывают выполнение кода.
Анастасия_85
24 — 16.07.21 — 08:12
Доброго утра.
Мне помогли найти ошибку.
Было дело в расширениях- при помощи отладки и обработки ОбновлениеВспомогательныхДанных.epf мы нашли, что ошибка была в расширениях. Возможно, что произошли изменения в ролях пользователей, которые конфликтуют с основной конфигурацией
Владислаучык 3 / 3 / 7 Регистрация: 21.03.2013 Сообщений: 637 |
||||
1 |
||||
Переполнение стека встроенного языка на сервере21.09.2017, 17:00. Показов 15415. Ответов 6 Метки нет (Все метки)
Добрый день, вот такая ошибка
Подскажите плз, в чем проблема может быть?
__________________ 0 |
841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
|
21.09.2017, 17:05 |
2 |
При вызове метода СкомпоноватьРезультат выполняется обработчик события ПриКомпоновкеРезультата. Получается бесконечная рекурсия. 0 |
3 / 3 / 7 Регистрация: 21.03.2013 Сообщений: 637 |
|
21.09.2017, 17:26 [ТС] |
3 |
Tklwegsd, Так а как это обойти? 0 |
841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
|
21.09.2017, 17:29 |
4 |
Очень просто. Не надо вызывать метод СкомпоноватьРезультат() внутри обработчика события ПриКомпоновкеРезультата. 0 |
3 / 3 / 7 Регистрация: 21.03.2013 Сообщений: 637 |
|
21.09.2017, 17:40 [ТС] |
5 |
Tklwegsd, Вот убрал это, и просто ничего не выводится, одна оболочка таблицы Добавлено через 36 секунд Добавлено через 9 минут 0 |
434 / 305 / 92 Регистрация: 28.05.2014 Сообщений: 1,247 |
|
21.09.2017, 17:50 |
6 |
Документ Результат это реквизит отчета с типом Табличный Документ 0 |
3 / 3 / 7 Регистрация: 21.03.2013 Сообщений: 637 |
|
21.09.2017, 17:53 [ТС] |
7 |
Да, это у уточнял. 0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
21.09.2017, 17:53 |
Помогаю со студенческими работами здесь Переполнение стека переполнение стека! Переполнение стека пишу программу, в ней достаточно много массивов, процедур и есть рекурсия…. Переполнение стека uses graph;… Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 7 |
Коллеги, добрый день! Ошибка возникает при открытии пакета «СФ (на авнс)», на вкладке «Для отправки».
Подскажите в чем может быть проблема?
Переполнение стека встроенного языка на сервере
{(1)}:ОткрытьФорму(ИмяФормы, ПараметрыФормы, Владелец, , , , ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна)
{ВнешняяОбработка.КонтурЭДО.Форма.Модуль_СинхронныеМодальныеВызовы.Форма(392)}: Выполнить(«ОткрытьФорму(ИмяФормы, ПараметрыФормы, Владелец, , , , ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна)»);
{ВнешняяОбработка.КонтурЭДО.Форма.ФормаУправляемая.Форма(347)}: смв().смв_ОткрытьФорму(ПутьКФормам + мИмяФормы, ПараметрыФормы, мВладелецФормы, , , , ОписаниеОповещения, РежимБлокирования);
{ВнешняяОбработка.КонтурЭДО.Форма.ФормаУправляемая.Форма(2114)}: ОткрытьФормуДиадокМодально(«ФормаПакетаУправляемая», ЭтаФорма, ПараметрыФормы);
{ВнешняяОбработка.КонтурЭДО.Форма.ФормаУправляемая.Форма(2083)}: ОткрытьФормуПакета(ВыбраннаяСтрока);
по причине:
Переполнение стека встроенного языка на сервере
по причине:
ВнешняяОбработка.КонтурЭДО.Форма.ФормаПакетаУправляемая.Форма : 220 : Пакет = Модуль_ЯдроНаСервере().Пакеты_ПодготовитьПакет(СтрокаСписка, Ложь);
по причине:
Переполнение стека встроенного языка на сервере
Переполнение стека встроенного языка на сервере
Ошибка прерывает работу и является критической.
Быстрый переход
- Ситуация:
- Причина:
- Исправление:
Ситуация:
Управляемая формы, при открытии формы вышло сообщение об ошибке «Переполнение стека встроенного языка на сервере», событие «Ошибка выполнения»
Причина:
Реализованная пару лет назад (Платформа 8.3.1.531) система защиты от зацикливания, требуется найти рекурсивный вызов функций или процедур.
Исправление:
Действительно, не в ту процедуру воткнул вызов родительской процедуры.
Одно рекламное объявление стоит больше, чем сорок передовиц.
При регистрации документа производства выходит ошибка
Решение:
Обычно такая ошибка возникает из-за неправильного заполнения спецификаций (зацикливания). И при условии, что в настройках на вкладке «Расширенные настройки», «Производство» у вас стоит Иерархический автоподбор материалов.
-
Зайдите в документ производства
-
Откройте вкладку «Списываемые материалы»
-
Скопируйте название сырья.
-
Зайдите в меню «Ещё».
-
Выберите пункт «Спецификации».
-
Вставьте название в окно поиска.
-
Дважды щелкните на выпавшую продукцию в поле «Наименование».
-
Скопируйте название сырья в поле «Материал» из Спецификации.
-
Снова вставьте название в окно поиска.
-
Дважды щелкните на выпавшую продукцию в поле «Наименование».
-
Мы видим, что название спецификации совпадает с тем, что мы вводили ранее.
Один и тот же материал не может дважды повторяться, поэтому удалите одну из спецификаций, выбрав нужную, затем нажав кнопку «Ещё» и «Удалить».
Далее «Записать и закрыть».
Анастасия Никулина.