Глюк в 1С 8 с зависанием (кешированием/буферизированием) обработки в памяти (не обновляется код)

31.01.18

Разработка - Механизмы платформы 1С

Описание глюка с зависанием (кешированием/буфферизированием) обработки/формы в памяти (не обновляется код)

Ключевые слова: баг, глюк, фича, не обновляется код, циклические ссылки

1С:Предприятие 8.2 (8.2.13.219), Win XP, Win Seven
Из-за незнания этого бага я потратил пол дня: чистил кэши, перустановил несколько раз 1С на самый последний релиз, переустановил Windows, и эксерементировал с разными базами, разным обработками пытаясь вычислить в чем причина следующей проблемы: есть внешняя обработка, после ее выполнения закрываю ее, но 1С не закрываю, после этого что то меняем в коде, запускаем ее и пытаюсь выполнить новый код. Но не тут-то было!!! Обработка не видит новый код! Даже в отладчике становяь на нужный код я получаю что если передана например переменная - то ее проверка через "Вычислить выражение" показывает что переменной просто нет. Ощущение что обработка вызывается из виртуальной памяти, а не с диска. Эксперименты выявили что это происходит если в модуле обработки открыть произвольную форму данной обработки, например:
Форма = ПолучитьФорму("ДопФорма");
Форма.Открыть();

И все! Обработка с данным именем зависла в памяти! Если ее переименовать или перезапустить сеанс 1С то все нормально пока этот код не отработает
Если тот же код запустить из формы (пробоавал ту что по умолчанию) то все нормально будет.
Самое интересное однако дальше! Если сократить код в модуле обработке до такого:
ПолучитьФорму("ДопФорма").Открыть();
То все тоже будет нормально. Итак приходим к выводу что виновата переменная "Форма", и действительно стоит ее обнулить, и все опять нормально! Вот так:
Форма = ПолучитьФорму("ДопФорма");
Форма.Открыть();
Форма = "";

Удивительно что в 1С приходится следить за чисткой переменных после работы, даже Бэйсик в этом плане работает лучше. Похожее на это я встречал на 7.7 при использовании внешних компонент, но на это претензий нет, т.к. вроде бесплатно и не от производителя, к тому-же часто авторы говорят что созданные объекты нужно обнулять.

Дальше эксперемент выявил что если закрыть обработку, но не закрыть  открытую форму (т.к. мы ей не установили владельца то она не закроется вместе с обработкой), то даже обнуление формы ничего не дает. Изменения в обработке вступят в силу только если закрыть данную форму, зато не нужно перезапускать сеанс или переименовывать обработку.

Кстати с данной ошибкой я познакомился впервые в продукте "АСДОБ v.1.0.26" от фирмы ООО "Аудит - новые технологии" в одной газовой компании. Пока еще не копался глубоко, но если она не в закрытом модуле то попробую исправить и вышлю разработчикам информацию об этом.

Продолжение от 30.05.2015:

Неожиданно вопрос повторился, на этот раз на грабли наступил более именитый разработчик "1С-Рарус" в своей обработке "Загрузка данных в "Бухгалтерия предприятия редакция 2.0" версий 2.0" - аналогично завели экспортные переменные "ФормаПараметров" и "ФормаСоответстий".

Итог: разработчики обнуляйте переменные с формами хотя бы в обработчике ПриЗакрытии()


Благодаря помощи сообщества, а именно пользователя Lara.Builova установлено что данная проблема описана в разделе ИТС "Методические рекомендации по конфигурированию" (46) из подраздела "Прочие", (50) - "Встроенный язык".

Вот выдержки присланные Lara.Builova:
Методика решения проблемы с открытием старой версии внешней обработки
В процессе разработки конфигураций иногда может возникнуть следующая ситуация.

В конфигураторе создается внешняя обработка. В режиме 1С:Предприятие (в режиме отладки или нет) она проверяется. В конфигураторе в обработку вносятся некоторые изменения. В режиме 1С:Предприятие обработка закрывается и открывается заново, для проверки внесенных изменений. Начиная с определенного момента вносимые изменения перестают появляться, то есть в режиме 1С:Предприятие открывается старая версия внешней обработки. Проблема решается только перегрузкой 1С:Предприятия.

Причина возникновения проблемы
Причина возникновения подобной проблемы заключается в самой обработке. Она возникает в том случае, если разработчик допустил возникновение циклических ссылок.

Рассмотрим ситуацию несколько подробнее. В режиме исполнения (1С:Предприятие) объект обработка существует в памяти в качестве реквизита формы обработки. При закрытии формы обработка прекращает свое существование.

Данная схема нарушается в двух случаях. На саму обработку возникла дополнительная ссылка, либо ссылка возникла на форму, в этом случае закрытие окна формы не означает уничтожение объекта - формы. Соответственно, остается в памяти и обработка.

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

Рекомендации по предотвращению возникновения проблемы
В процессе разработки следует учитывать ссылки, возникающие между различными объектами, и избегать прямых или косвенных взаимных ссылок. Например, поскольку форма ссылается на обработку (через реквизит), обработка не должна ссылаться на форму, т.е. форму нельзя помещать в реквизит обработки или нелокальную переменную ее модуля. Разумеется, нельзя допускать и ссылок объекта на самого себя, например поместить форму в ее собственный реквизит или переменную модуля.

Если "обратная связь" между обработкой и формой все же необходима, следует явным образом позаботиться о ее разрыве. Это можно сделать, например, в обработчике закрытия формы.

Методика устранения проблемы
Даже следование всем рекомендациям не может застраховать от возникновения подобной проблемы.

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

Еще про циклические ссылки с ИТС:

Особенности хранения значений в переменных модулей объектов и форм
В платформе 1С:Предприятие 8 используется стратегия управления временем жизни объектов, основанная на подсчете ссылок на объекты - reference counting. Данная стратегия заключается в следующем. Каждый объект платформы содержит счетчик ссылок. При появлении ссылки на объект (объект присваивается какой-либо переменной) происходит увеличение счетчика на единицу, при уничтожении подобной ссылки - значение счетчика на единицу уменьшается. Объект автоматически уничтожается, и память, занимаемая им, освобождается в момент, когда счетчик ссылок объекта становится равен нулю.

Особенностью подсчета ссылок на объекты является возможность организации "циклической ссылки". Циклическая ссылка возникает, когда объекты начинают ссылаться друг на друга. Это приводит к ситуации, при которой ни один из объектов, участвующих в циклической ссылке, не будет уничтожен. В свою очередь это является причиной возникновения утечек памяти (memory leaks).

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

Полный перечень случаев возникновения циклической ссылки привести невозможно, приведем лишь некоторые примеры:

хранение в переменной модуля объекта (набора записей, формы) ссылки на данный объект (набор записей, форму) - ситуация приводит к появлению циклической ссылки - объект (набор записей, форма) никогда не будет уничтожен;
хранение ссылки на владеемый объект в объекте-владельце и ссылки на объект-владелец во владеемом объекте - оба объекта никогда не будут уничтожены.
Следует обратить внимание, что, помимо переменных модулей, ссылки на объекты могут образовываться при передаче их в методы встроенного языка. Например, добавление в список значений нового значения - этого же списка значений, приведет к появлению циклической ссылки.

Ссылки в тему:
//infostart.ru/public/63392 - Кольцевые ссылки в скриптах 1С 

 

ЧАСТЬ 2.

Продолжения приключений Буратино в Стране Дураков

или зацикливание формы при ее программном переоткрытии

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

Шаг 1. обычно переоткрытие делается в форме обработке, поэтому мы сначала должны закрыть саму форму:

Закрыть();

Шаг 2. после закрытия открываем ту же самую форму той же самой обработки (слава богу обработка хранит в себе полное имя своего файла). Вроде очевидно что нужно делать так как делают сами разработчики 1С. В популярнейшей конфигурации Управление торговлей ред.10.3 самый очевидный пример мы найдем в механизме подключаемых внешних обработок/отчетов: Справочник.ВнешниеОбработки.Форма.ФормаСписка.Форма.Модуль в процедуре СправочникСписокВыбор() видим:

ИмяФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные = ВыбраннаяСтрока.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
Если ЭтоОбработка Тогда
	Форма = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
Иначе
	Форма = ВнешниеОтчеты.ПолучитьФорму(ИмяФайла);
КонецЕсли;
Если Не Форма = Неопределено Тогда
	Форма.Открыть(); // ВОТ ОНО! Получение в переменную формы и открытие ее!
Иначе // дальше нас не интересует, но переменная Форма не обнуляется и дальше вы поймете почему

Переработав получаем вот такой компактный вариант:

ВнешниеОбработки.ПолучитьФорму(ИспользуемоеИмяФайла).Открыть();

Вроде соблюли условие чтобы не было переменной во избежание зацикливания и буферизации формы. Однако при проверке результат отрицательный! Вариант то не рабочий! В случае с внешними обработками он подходит т.к. обратите внимание что имя файла генерируется всегда новое при помощи метода ПолучитьИмяВременногоФайла(), что позволяет пренебрегать тем что после заполнения переменной она зависает в памяти (кстати вспоминается упоминание 1С: "происходит потеря памяти"- занятно однако), при повторном использовании мы откроем новый экземпляр и все.

Итак пример 1С-ков не позволяет получить новый экземпляр обработки.

Однако выход тут есть и очень простой - используем 2-й вариант обращения к обработке - сначала создадим ее, а потом уже получим форму (опять таки обойдемся без переменных, хотя это и не критично):

ВнешниеОбработки.Создать(ИспользуемоеИмяФайла).ПолучитьФорму().Открыть(); 

Проверяем и вуаля! Все работает!

ВЫВОД: забудьте про метод ПолучитьФорму() для внешних обработок/отчетов т.к. создание обработки все равно происходит (хотя ожидаешь что этого и не произойдет - должна же быть разница в работе методов раз они разные!) в чем легко убедится написав любое оповещение в модуле обработки. От него только проблемы и никакого толку (буду рад если кто-то аргументированно поправит меня)

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4512    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5289    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8819    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15984    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
77. integragirl 22.02.12 08:09 Сейчас в теме
Столько обсуждений! а КАК бороться то с этим??
Не могу работать, внешняя обработка не обновляется и все, хоть убей.

А вообще, у нас этот глюк легко парируется загрузкой обработки/отчёта в справочник "Внешние..", благо он сейчас почти везде в той или иной форме бывает, и запуском оттуда. Глюк исчезает напрочь. Ну и версификация, написанная прямо в заголовке формы, чтоб проверить, с кем имеешь дело в данном запуске - наше всё при отладке.

Ничего подобного, ничего парируется.

Циклические ссылки

господи, куда? если это открытие обычной внешней обработки, просто из файл-открыть.

Помогите, кто решил этот бредовый трабл?
78. CaSH_2004 372 23.02.12 07:09 Сейчас в теме
(77)Странно что у вас какие-то проблемы остались, все же разжованно. Уточните ситуацию, попробую помочь, для начала хотя бы следующее: у вас после перезапуска базы появляются измненения? Или вы о чем то другом?
79. integragirl 26.02.12 20:46 Сейчас в теме
(78) После перезапуска изменения не появляются. Уже и пробовали чистить кэш, справочник внешние отчеты, циклические ссылки (если я правильно поняла что это такое, то таковых не имеется)... ничего из вышеперечисленного не помогло.
Сейчас приходиться извращаться через сервер и основную конфу =( что вообще неудобно, не мне одной нужен конфигуратор в конторе.
80. CaSH_2004 372 27.02.12 14:53 Сейчас в теме
(79) Попробуйте с другого ПК зайти в базу, или скопируйте базу и в ней проверьте, если не помогло - значит вы не то что-то редактируете, бывает что вносиш код не в то место которое используеш
82. integragirl 28.02.12 20:56 Сейчас в теме
(80) вот с другого пк все работает, давно проверенный факт.
значит вы не то что-то редактируете, бывает что вносиш код не в то место которое используешь

ой, я Вас умоляю )))))
81. zhleonid8 27.02.12 17:06 Сейчас в теме
возникает чувство, что мы можем 1С как линукс сами сделать удаленно собрать и ошибки исправить, будет работать , а фирма не может уже много лет...
83. Гость 24.03.12 17:33
Спасибо, обработка хорошая, пока не применяли, но думаю в дальнейшем пригодится.
86. AlexO 135 17.10.13 11:37 Сейчас в теме
А вот вопрос все равно остается:
Почему при закрытии самой внешней обработки/отчета - не происходит его уничтожение как ранее открытого и "зацикленного" объекта (сиречь зацикленного через вызов Формы этого же объекта в модуле объекта в данном случае)?
Так как по-факту мы-то "родительский" объект "очистили" выходом из него, и, следовательно, "вызывающий" указатель тоже должен обнулиться, что должно вызвать сброс счетчика ссылок на объект, и в итоге полное уничтожение этого объекта.
Т.е. закрытие объекта - не влечет за собой уничтожение его ссылочных указателей, и платформа всегда считает, что количество ссылок равно +1 и отлично от 0 (если была одна переменная с зацикленной ссылкой), "не видя", что вызов указателя (увеличение счетчика ссылок) генерирует сам уничтожаемый объект.
Так что на лицо - полнейший глюк и недоработка, а никакая не "фича" работы платформы.
1Свитер; +1 Ответить
108. AVK_Alex 4 13.01.14 11:56 Сейчас в теме
А вот я с таким сталкивался пару месяцев назад. Причем, на одном компе глюк проявлялся (база на SQL), а на другом - нет (файловая). Подниму, пожалуй, архивы - посмотрю, связано ли это с циклической ссылкой / формой обработки...

P.S. За тему спасибо!
109. Maximysis 9 30.10.14 08:49 Сейчас в теме
Тоже сталкивался с этой проблемой, правда нашел в чем дело часа за два)))
110. sanches 256 19.03.15 11:20 Сейчас в теме
Вот еще способ получить проблему зависания обработки в памяти. В модуле обработки пишем код. Проверял на платформе 8.2.19.130
Сообщение = Новый СообщениеПользователю;
	Сообщение.Поле = "";
	Сообщение.УстановитьДанные(ЭтотОбъект)
111. infostart user 20 18.08.15 17:22 Сейчас в теме
аналогичная трабла, уже третий час сижу, XP SP3, 8.3.5.1625, УТ 2.3.24.3, файловая база, внешняя обработка, открываю программно форму обработки, открывается нормально несколько раз, потом проходит время, минута-две, еще на фоне (обработчик ожидания) автообмен типовой выполняется, открываю снова - получаю просто форму с элементами, заполнение не происходит! протестил на 8.2.19.130 - все ок.
112. CaSH_2004 372 18.08.15 21:03 Сейчас в теме
(111) Не очень понятно насчет "заполнение не происходит" - что за заполнение и почему оно должно происходить?
Вроде как обработка открывается программно через обработчик ожидания? а дальше неясно.
Разберешься - отпишись в чем дело то.
113. infostart user 20 19.08.15 11:27 Сейчас в теме
(112) нет нет, все ок. я просто говорю, что в УТ 2.3.24.3 еще обмен какой-то типовой на фоне работает, думал может это может быть причиной.
а в моей внешней обработке, кроме основной формы еще есть дополнительная форма для сопоставления реквизитов, в ней формируется дерево реквизитов при открытии. открываю ее так: Фомра = ПоулчитьФорму();
Формы.Рек1 = Рек1;
Форма.Открыть();
Так вот при открытии иногда форма заполняется, а иногда - нет, хотя должна заполнятся всегда. Не понятно с чем связанно, если отладчиком проходить, то, в том случае когда ничего не заполняется, отладчик даже в форму не заходит и форма просто открывается и на ней ничего не происходит.

ПС сегодня еще на 8.3.6.1977 проверил, все нормально работает. походу, это глюк платформы 8.3.5.1625
114. DemetrKlim 157 09.11.18 18:27 Сейчас в теме
Проблема решилась быстро и просто. Я переименовал отчет) Сразу все изменения "прописались"))
115. fjay69 32 27.09.19 14:07 Сейчас в теме
В платформу 1С 8.3.10 добавили средства выявления циклических ссылок. Это проверка наличия циклических ссылок при работе приложения (флажок «Проверка циклических ссылок встроенного языка» (Сервис – Параметры – Запуск 1С: Предприятия – Дополнительные) и метод ПроверитьЦиклическиеСсылкиВстроенногоЯзыка.
Оставьте свое сообщение