Переполнение стека встроенного языка на сервере 1с исправить ошибку

Содержание:

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.      Не выполнять вручную ту работу, которую может выполнить компилятор. 

Специалист компании «Кодерлайн»
Марина Анапольская

Переполнение стека встроенного языка на сервере

Ошибка прерывает работу и является критической.

Быстрый переход

  • Ситуация:
  • Причина:
  • Исправление:

Ситуация:

Управляемая формы, при открытии формы вышло сообщение об ошибке «Переполнение стека встроенного языка на сервере», событие «Ошибка выполнения»

Причина:

Реализованная пару лет назад (Платформа 8.3.1.531) система защиты от зацикливания, требуется найти рекурсивный вызов функций или процедур.

Исправление:

Действительно, не в ту процедуру воткнул вызов родительской процедуры.

Как описываются машины в рекламных проспектах? Волнующие, эффектные, изящные, грациозные, обтекаемой формы. Прямо не знаешь, куда их вести — в гараж или в номер мотеля.

Переполнение стека встроенного языка на сервере

Я
   Анастасия_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 мы нашли, что ошибка была в расширениях. Возможно, что произошли изменения в ролях пользователей, которые конфликтуют с основной конфигурацией

Переполнение стека встроенного языка на сервере

Автор MuI_I_Ika, 17 ноя 2016, 14:54

0 Пользователей и 1 гость просматривают эту тему.

Вниз
Страницы1


MuI_I_Ika

  • Гончаров Михаил
  • *****
  • Регистрация: 2012-08-15
  • Сообщений: 7,150
    1. Skype: MuI_I_Ika
  • Профессия: Программист 1С
  • РЕПУТАЦИЯ: 886

Переполнение стека встроенного языка на сервере




17 ноя 2016, 14:54


Как правило данная ошибка возникает в ситуации, когда в программном коде допущена ошибка. А точнее происходит зацикливание, когда обработчик уходит в бесконечный цикл.

Исправить ошибку можно только исправив ошибку в коде.

* 2016-11-17 14.50.12.png

8.1 КБ, 303×108
просмотров: 8060


Вверх
Страницы1

Теги:

  • Форум База

  • Wiki

  • Общетематические материалы

  • Ошибки 1С:Предприятия

  • Переполнение стека встроенного языка на сервере

Опции…

Похожие темы (1)

55575


Недостаточно свободной памяти на сервере

Автор MuI_I_Ika

Рейтинг@Mail.ru

Rambler's Top100

Поиск

 


Простой
Google

Владислаучык

3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 638

1

Переполнение стека встроенного языка на сервере

21.09.2017, 17:00. Показов 16134. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день, вот такая ошибка

Переполнение стека встроенного языка на сервере

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    ЗначениеПараметраПодразделение = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Подразделение"));
    Если ЗначениеПараметраПодразделение <> Неопределено Тогда
        ЗначениеПараметраПодразделение.Значение = Подразделение;
        ЗначениеПараметраПодразделение.Использование = Истина;
    КонецЕсли;
    
    //ТиповыеОтчеты.ОбновитьПараметрыПериодаПоФорме(КомпоновщикНастроек, ЭтаФорма);
    табДокумент = Новый ТабличныйДокумент;
    ЭтотОбъект.СкомпоноватьРезультат(табДокумент);
    
    МакетЗаголовокПодвал = ПолучитьМакет("Макет");
    ОбластьЗаголовок = МакетЗаголовокПодвал.ПолучитьОбласть("Заголовок");
    ОбластьЗаголовок.Параметры.Организация = Справочники.Организации.НайтиПоКоду("000000001");
    ОбластьЗаголовок.Параметры.Период = ПредставлениеПериода(НачалоПериода, КонецДня(КонецПериода));
    
    ОбластьПодразделение = МакетЗаголовокПодвал.ПолучитьОбласть("Подразделение");
    ОбластьПодразделение.Параметры.Подразделение = Подразделение;
    
        
    
    ДокументРезультат.Очистить();
    ДокументРезультат.АвтоМасштаб = Истина;
    ДокументРезультат.Вывести(ОбластьЗаголовок);
      Если ЗначениеЗаполнено(Подразделение) Тогда        
        ДокументРезультат.Вывести(ОбластьПодразделение);
    КонецЕсли;          
    
    ДокументРезультат.Вывести(табДокумент);
КонецПроцедуры

Подскажите плз, в чем проблема может быть?



0



Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

21.09.2017, 17:05

2

При вызове метода СкомпоноватьРезультат выполняется обработчик события ПриКомпоновкеРезультата. Получается бесконечная рекурсия.



0



3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 638

21.09.2017, 17:26

 [ТС]

3

Tklwegsd, Так а как это обойти?



0



Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

21.09.2017, 17:29

4

Очень просто. Не надо вызывать метод СкомпоноватьРезультат() внутри обработчика события ПриКомпоновкеРезультата.



0



3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 638

21.09.2017, 17:40

 [ТС]

5

Tklwegsd, Вот убрал это, и просто ничего не выводится, одна оболочка таблицы

Добавлено через 36 секунд
Tklwegsd, Хотя должно, при тех-же данных в обычной форме все выводится

Добавлено через 9 минут
ДокументРезультат — Это как я понимаю, мой Результат, который на форме создался?



0



Эксперт 1С

434 / 305 / 92

Регистрация: 28.05.2014

Сообщений: 1,247

21.09.2017, 17:50

6

Документ Результат это реквизит отчета с типом Табличный Документ



0



3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 638

21.09.2017, 17:53

 [ТС]

7

Да, это у уточнял.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

21.09.2017, 17:53

Помогаю со студенческими работами здесь

Переполнение стека
Всем привет. Помогите, пожалуйста с решением одной проблемы. Мне нужно в программе обрабатывать…

переполнение стека!
вот кодprocedure TForm1.CheckBox7Click(Sender: TObject);
begin
if checkbox7.Checked=false then…

Переполнение стека
Всем привет!

пишу программу, в ней достаточно много массивов, процедур и есть рекурсия….

Переполнение стека
Всем привет. Вобщем почему-то пишет переполнение стека, в чем проблема воот листинг:

uses graph;…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

7

  • Перепишите текст исправив орфографические ошибки после оплаты начальной подписки вы получаете
  • Переплет сделался неотъемлемой деталью комнатного убранства ошибка
  • Перепишите текст исправив орфографические ошибки исполнитель получает вечный доступ
  • Переплата зарплаты счетная ошибка
  • Перепишите программу на языке паскаль исправив ошибки program primer var a b integer begin