Глюк в 1С 8 с зависанием (кешированием/буферизированием) обработки в памяти (не обновляется код)
Разработка - Механизмы платформы 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-й вариант обращения к обработке - сначала создадим ее, а потом уже получим форму (опять таки обойдемся без переменных, хотя это и не критично):
ВнешниеОбработки.Создать(ИспользуемоеИмяФайла).ПолучитьФорму().Открыть();
Проверяем и вуаля! Все работает!
ВЫВОД: забудьте про метод ПолучитьФорму() для внешних обработок/отчетов т.к. создание обработки все равно происходит (хотя ожидаешь что этого и не произойдет - должна же быть разница в работе методов раз они разные!) в чем легко убедится написав любое оповещение в модуле обработки. От него только проблемы и никакого толку (буду рад если кто-то аргументированно поправит меня)
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45630 TitanLuchs 109
Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)
Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.
19.06.2025 18639 zeegin 15
Механизмы платформы 1С Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).
03.02.2025 26015 bayselonarrend 127
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.
30.01.2025 33249 user2122906 10
Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 Бесплатно (free)
Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.
17.01.2025 55694 user2122906 13
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46754 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26433 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40423 bayselonarrend 24
Есть ещё одна ошибка, которую не пишут. Иногда при открытии формы (отчета, справочника, документов и т.д.) она не выводится на экран. В списке окон появляется, на панели окон тоже. Но можно тыкать на название до посинения, но ничего не появится. Пока не нажмешь правой кнопкой на названии окна в панели окон и не выберешь пункт "Восстановить положение".
Другой вопрос: если надо просто открыть форму, зачем создавать промежуточную переменную? Для красоты?
ПолучитьФорму("ФормаБлаБла").Открыть() - никакого подвисания не вызовет.
Тут больше баг "чистых одноэснегов", вообще плохо представляющих как работает память.
Если просто открываем форму, то имеем при раскладе, описанном у автора:
Форма=ПолучитьФорму("ФормаБлаБла"); // получили беспонтновый указатель, который и будем хранить неизвестно зачем (и, как выяснилось, неизвестно сколько)
Если он нам еще может понадобиться - куда ни шло, а если только для Форма.Открыть() - просто расточительное программирование.
_______________________________
В сухом остатке:
За то, что автор разобрался в чем дело - плюс.
За что что ему вообще пришло в голову использовать конструкцию
Форма=ПолучитьФорму(); Форма.Открыть() - минус.
Итого: нейтралитет ;)
Получили (и запомнили )указатель в системе, после закрытия обработки указатель не подчистился (это уж разработчиков косяк), так и завис
В явном виде Форма=""; чистит этот указатель после Форма.Открыть(), ссылок не остается, и все ОК.
Чистит при Форма="" - понятно. Но если её объявить явно - что будет? Или в модуле обработки написать и вызывать функцию, а в ней уже делать вызов ПолучитьФорму() - должно, вроде, зачистить при завершении функции. Или - нет?
Процедура ОткрытьМоюФорму()
Перем Форма; // эта переменная локальная внутри процедуры
Форма=ПолучитьФорму("Форма1");
Форма.Открыть();
КонецПроцедуры
Сообщить("РазДваТри555666");// а это, чтобы проверять, что код меняется...
ОткрытьМоюФорму();
____________________
Вот так (тоже прогнозируемо) - переменная чистится, зависания нет
И еще интереснее: можно в процедуре и не объявлять переменную, т.е просто убрать там Перем Форма;
Вывод: не надо баловаться с переменными в теле модуля, они могут и не подчиститься, а вот внутри процедур модуля - сколько угодно.
Странный ты спец! Я же ясно написал что это пример, ситуация была такая что это потребовалось, если любопытно то я делал для своей обработки аналог из типовых ЗУП ред.2.5 и КА ред.последняя "Обработка.СообщенияВыполняемыхДействий".
Abadonna пишет: ПолучитьФорму("ФормаБлаБла").Открыть() - никакого подвисания не вызовет.
Именно это я и расписал в статье
Abadonna пишет: Тут больше баг "чистых одноэснегов", вообще плохо представляющих как работает память.
Если так подходить то можно требовать от любого водителя знания как чинить мотрор машины и знание всех принципов машиностроения, а так я могу сказать что лучше езжу на машение чем авто-слесарь, так же как он лучше меня чинит ее. Это разделение обязанностей. 1С для того и придумали чтобы могли пользоваться люди которые не собираются кодить в 0-м цикле распределяя память и чистя все за собой:)
Abadonna пишет: Форма=ПолучитьФорму("ФормаБлаБла"); // получили беспонтновый указатель, который и будем хранить неизвестно зачем (и, как выяснилось, неизвестно сколько)
Если он нам еще может понадобиться - куда ни шло, а если только для Форма.Открыть() - просто расточительное программирование.
Спасибо что тут признал что ВОЗМОЖНО это мне нужно, а не просто фигней страдаю:)
Я и не утверждал, что ты это НЕ писал.
А вот действительно ли
Может действительно "фигней страдаешь"?
А то я не знаю как копипастят "классический код"!
А его студентики корябали ;)
Вообще-то я не конкретно про тебя писал
_______________
Вот когда ездили те, кто знал, как чинить мотор, можно было еще ездить. А сейчас на дорогах одни лодочники итальянские
:D Вот как раз сейчас из окна смотрю: как же можно было умудриться на регулируемом пешеходном переходе столкнуться под углом 90 градусов?
Всё, пробочка гарантирована
Удивительно, что ты именно на меня имеешь какие-то обиды. На того, кто последовательно как раз и защищает мысль, что это баг 1С
В отличие от:
На первые два лично я как раз бы жестоко оскорбился.
Воистину: ни одно доброе дело не останется безнаказанным! :D
Почему-то все думают раз разговор происходит не в реале, можно спокойно друг-друга оскорблять, типа анонимно это не так болезненно другой стороне, но так же приятно и безопасно нам.
Ладно это все лирика, размышления вслух.
(46) Действительно, повидимому все есть. Виноват, не читалю ИТС, хотя и есть они, код действительно содержит ситуацию описанную в ИТС, и повидимому попадает под понятие "возникновение циклических ссылок", я отмечу это в посте чтобы другим таким же "гениям" как я было легче найти проблему.
Есть же такие трудолюбивые спецы которые читают все что написано на ИТС, и помнят и понимают все что там написано! Завидую вам от души
В платформе 1С:Предприятие 8 используется стратегия управления временем жизни объектов, основанная на подсчете ссылок на объекты - reference counting. Данная стратегия заключается в следующем. Каждый объект платформы содержит счетчик ссылок. При появлении ссылки на объект (объект присваивается какой-либо переменной) происходит увеличение счетчика на единицу, при уничтожении подобной ссылки - значение счетчика на единицу уменьшается. Объект автоматически уничтожается, и память, занимаемая им, освобождается в момент, когда счетчик ссылок объекта становится равен нулю.
Особенностью подсчета ссылок на объекты является возможность организации "циклической ссылки". Циклическая ссылка возникает, когда объекты начинают ссылаться друг на друга. Это приводит к ситуации, при которой ни один из объектов, участвующих в циклической ссылке, не будет уничтожен. В свою очередь это является причиной возникновения утечек памяти (memory leaks).
Необходимо, по возможности, избегать появления циклических ссылок. Соблюдение достаточно простых правил при разработке конфигураций позволит избежать проблем связанных с циклическими ссылками. В случае появления подобной ссылки необходимо определить момент для ее разрыва, чтобы объекты могли быть уничтожены нормальным образом.
Полный перечень случаев возникновения циклической ссылки привести невозможно, приведем лишь некоторые примеры:
хранение в переменной модуля объекта (набора записей, формы) ссылки на данный объект (набор записей, форму) - ситуация приводит к появлению циклической ссылки - объект (набор записей, форма) никогда не будет уничтожен;
хранение ссылки на владеемый объект в объекте-владельце и ссылки на объект-владелец во владеемом объекте - оба объекта никогда не будут уничтожены.
Следует обратить внимание, что, помимо переменных модулей, ссылки на объекты могут образовываться при передаче их в методы встроенного языка. Например, добавление в список значений нового значения - этого же списка значений, приведет к появлению циклической ссылки.
Если циклические ссылки не случайны, а необходимы по замыслу разработчика, то переменные нужно очищать, но при этом
Да, офигеть! Они и ЖКК, наверное, читают :D
Знавал я одного такого читальца - выгнали за профнепригодность.
Иногда у меня впечатление - что платформу пишут одни "студенты", а потом более опытные описывают работу такой платформы на ИТС - с багами, как обойти, что делать, чтобы "не вляпаться"... Но, видимо, или "более опытных" не подпускают к разработке платформы и исправлению всех этих косяков, и дают им "порезвиться" только в статьях на ИТС, или первые махнули рукой на вторых - "пусть делают, что хотят, это уже клиника".
А справку к платформе, похоже,
Думаю стоит иметь ввиду мировую практику, а именно: бывают голые теоретики и есть практики. Это как и любой перегиб ведет к проблемам, но если использовать таланты людей правильно то результат неплохой. Сходу не приведу примеры т.к. не компьютер, но есть же много открытий которые сделаны теоретиками но внедрены практиками, так что каждая работа важна, а чем заниматься самому - на то и дана жизнь, чтобы разобраться как получить от нее кайф! Прыгать как ямакаси по домам с риском для шеи или изучать космос. На мой взглаяд это дело каждого - лишбы была хоть какая-то отдача, а не просто паразитическое существование.
Но: покажи-ка на пальцах чего тут циклического? Обе формы закрылись, ничего не ругнулось.
В каком адресном пространстве заторчала эта ссылка? Почему после закрытия всех форм обработки она не самоликвидировалась?
А ДОЛЖНА была
/13/ читал?
Когда я проверял, они у меня и случайно не была объявлена, и специально потом объявлял. Без разницы - висняк. Время жизни - до перевключения 1С.
Внутри процедуры - благополучно дохнет, как и должна
2.1с не может удалить объект, если у него есть ссылка на подчиненные себе объекты, конкретно как это реализуется у 1С надо смотреть ИТС.
Еще раз повторю: всякая уважающая себя прога (обработка) ОБЯЗАНА чистить за собой. Если не чистит - баг
(33) И про машинки верно - вот не стукнись они не заработают люди денег а если все будут по правилам ездить? На чем производителям зарабатывать? У кого нефть отнимать чтоб ездить? Есть мнение что вечные вещи - убьют мир. Так вот 1С с её глюками и недоделками - прям свеча зажигания экономики - прогеры не так мало зарабатывают жеж.
(0) Ну вот теперь более мощный сервер тебе не светит - 1С же не виснет ;)
Совсем недавно:
- В такой-то накладной неверно посчитан НДС!
-?
Смотрим: точно, блин, не тот, что должен быть.
Оказалось: франь, который работал до нас, приделал кнопку "Убрать автоматические скидки"
Скидки обнуляются, потом стоит:
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(...)
А про то, что надо бы еще:
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(...) он "забыл"
Полтора года (!!!) они так работали, пока какой-то покупатель их носом не ткнул.
Благо эту кнопку не так часто нажимали, однако за 8 месяцев документов 80 набралось.
Хм... Да я ж всегда и утверждал, что все МЫ (одноэснеги) - беспонтовая хрень, существующая благодаря идиотской политике государства.
Ничего не производим, плодим баги, исправляем свои и чужие и т.д...
От нас, бухов и налоговиков обществу пользы ноль. Зато все при деле и при бабках ;)
Пришла Лора и сразу все проблемы решила.
Дело-то, оказывается, в имени переменной, а вовсе не в том, что тут все дурачки написали.
Для справки особо одаренным: когда я тестил, эта переменная у меня называлась "Ф".
Это тоже зарезервировано?
Надо написать в 1С, а то что они, дурачки, не следуют твоим рекомендациям?:
Открыть (Open)
Синтаксис:
Открыть()
Описание:
Открывает форму и делает ее окно активным.
Доступность:
Толстый клиент.
Пример:
Форма = Справочники.Номенклатура.ПолучитьФормуСписка();
Форма.Открыть();
Товары = Справочники.Номенклатура;
ФормаСписка= Товары.ПолучитьФорму("ФормаСписка");
Если Не ФормаСписка.Открыта() Тогда
ФормаСписка.Открыть();
КонецЕсли;
Клиенты = Справочники.Контрагенты;
НовыйКлиент= Клиенты.СоздатьЭлемент();
НовыйКлиент.ПолучитьФорму().Открыть(); И получить форму списка:
Товары = Справочники.Номенклатура;
ФормаСписка= Товары.ПолучитьФормуСписка();
Если Не ФормаСписка.Открыта() Тогда
ФормаСписка.Открыть();
КонецЕсли;
Ни в одном примере не встретилось объявление переменной "Форма". Может плохо искала.
А я просто не выбираю имена переменных из списка зарезервированных системой.
Да что же вы все так вцепились в то что я написал как ПРИМЕР!!! В рабочей ситуации все работает совсем по другому, совсем другие условия, другие переменные, только смысл тот-же.
Что касается самой статьи:
Ситуация описана на ИТС как последствие циклической ссылки. Простите за простынь:
В процессе разработки конфигураций иногда может возникнуть следующая ситуация.
В конфигураторе создается внешняя обработка. В режиме 1С:Предприятие (в режиме отладки или нет) она проверяется. В конфигураторе в обработку вносятся некоторые изменения. В режиме 1С:Предприятие обработка закрывается и открывается заново, для проверки внесенных изменений. Начиная с определенного момента вносимые изменения перестают появляться, то есть в режиме 1С:Предприятие открывается старая версия внешней обработки. Проблема решается только перегрузкой 1С:Предприятия.
Причина возникновения проблемы
Причина возникновения подобной проблемы заключается в самой обработке. Она возникает в том случае, если разработчик допустил возникновение циклических ссылок.
Рассмотрим ситуацию несколько подробнее. В режиме исполнения (1С:Предприятие) объект обработка существует в памяти в качестве реквизита формы обработки. При закрытии формы обработка прекращает свое существование.
Данная схема нарушается в двух случаях. На саму обработку возникла дополнительная ссылка, либо ссылка возникла на форму, в этом случае закрытие окна формы не означает уничтожение объекта - формы. Соответственно, остается в памяти и обработка.
Следует заметить, что данная ситуация не является уникальной особенность внешних обработок, просто в этом случае она проявляется наиболее явным образом. При открытии внешней обработки платформа пытается найти уже существующую и открывает старый вариант. В случае форм других объектов проблема не столь заметна, однако, как минимум, происходит потеря памяти.
Рекомендации по предотвращению возникновения проблемы
В процессе разработки следует учитывать ссылки, возникающие между различными объектами, и избегать прямых или косвенных взаимных ссылок. Например, поскольку форма ссылается на обработку (через реквизит), обработка не должна ссылаться на форму, т.е. форму нельзя помещать в реквизит обработки или нелокальную переменную ее модуля. Разумеется, нельзя допускать и ссылок объекта на самого себя, например поместить форму в ее собственный реквизит или переменную модуля.
Если "обратная связь" между обработкой и формой все же необходима, следует явным образом позаботиться о ее разрыве. Это можно сделать, например, в обработчике закрытия формы.
Методика устранения проблемы
Даже следование всем рекомендациям не может застраховать от возникновения подобной проблемы.
В первую очередь следует проанализировать алгоритм исполнения обработки на предмет циклических ссылок. Иногда источник проблемы не очевиден. Циклы могут носить достаточно сложный характер, да и возникновение проблемы можно заметить не сразу. ...
Так что может лучше проанализировать код еще раз... :oops:
В /13/ код проанализирован, показано, что именно такой код, но со временем жизни переменной в пределах процедуры никаких проблем не вызывает.
А они тебе так и будут талдычить про "проанализировать".
(48) Да я без обид конкретно на тебя, т.к. ты не один такой, вы все тут как с одной сковородки слезли :) ошпаренные какие-то
// Процедура расшифровки показателя "Количество неисполненных заказов покупателей"
//
Процедура Заказы_НеисполненныеЗаказыПокупателейРасшифровка(Параметры)
Расшифровка = Параметры["Расшифровка"];
.......................
Форма = ОтчетРасшифровка.ПолучитьФорму();
Форма.ОбновитьОтчет();
Форма.Открыть();
КонецПроцедуры // Заказы_НеисполненныеЗаказыПокупателейРасшифровка()
Правда, как и в /13/, внутри процедуры.
Что как раз и подтверждает то, что я (в жизни не читавший никаких ИТС-ов) изложил:
Но баг неочевидный, согласен - я тож ИТС не читаю... :D
В общем сейчас невольно воспроизвел этот баг.
Беру стандартный отчет "Продажи" из конфигурации (УТ 10.3, платформа 8.2.14.519), сохраняю как внешний отчет, открываю его в конфигураторе, делаю маленькую приписку - новый показатель, рассчитывающийся по некоей формуле с использованием переменной в запросе. Ну и, как полагается, косячу (куда уж без этого)- устанавливаю построителю отчета значение переменной уже после того, как отчет, собственно формируется и выводится в форму отчета. Запускаю предприятие, проверяю отчет - бабах выскакивает ошибка. Екарный бабай, надо же было такую ошибку сделать. Перехожу в конфигуратор (он все еще открыт в соседнем окне, обработка тоже не закрыта, в предприятии ни на какие кнопки в окне с ошибкой отчета не нажимал - пусть висит, не мешает же). Исправляю ошибку, сохраняю отчет. Понятное дело, без перезапуска запускается все та же старая косячная версия. Перезапускаю предприятие. Чу! Все та же ошибка выскакивает! Ладно, выхожу из предприятия, выхожу из конфигуратора, снова захожу в конфигуратор и предприятие. И опять та же самая ошибка!
Теперь внимание, самое главное - открываю мой отчет в конфигураторе и вуаля! В этом отчете ОТСУТСТВУЮТ последние изменения, связанные с исправлением косяка в коде! Снова правлю отчет, сохраняю, опять выхожу из предприятия и захожу снова, запускаю отчет - работает!
А вы говорите - формы, формы. Тут какой-то комплексный косяк платформы.
Вчера было еще хлеще, мудрил несколько часов с отчетом (тоже работающим от универсального), так когда сохранял, сначала файл отчета был со всеми доработками, все работало качественно, потом тыркнул на расшифровку отчета, естесственно вывалилась ошибка, после этого я что-то там разбирал и пересохранил отчет => в файле после этого был код, словно я вообще не приступал к работе!
Ужос, товарищи. На 13 версии платформы достаточно редко встречалось примерное такое (по крайней мере, у меня), и то это было связано с отладкой - тоже какой-то древний баг, когда в режиме отладки версия отчета или обработки не совпадает с версией, сохраненной в файл в конфигураторе. Но чтобы постоянно, да еще и файл сохранялся неведомо какой (не иначе, из кеша в файл, а не из открытой в конфигураторе внешней обработкой/отчетом), такого не припомню. Перехимичили с увеличением производительности в 8.2, не иначе.
Извиняюсь за стиль написания, уставший малость. Последние комментарии не читал, извиняюсь также если кто-то подобное уже описал ранее.
А вообще, у нас этот глюк легко парируется загрузкой обработки/отчёта в справочник "Внешние..", благо он сейчас почти везде в той или иной форме бывает, и запуском оттуда. Глюк исчезает напрочь. Ну и версификация, написанная прямо в заголовке формы, чтоб проверить, с кем имеешь дело в данном запуске - наше всё при отладке.
Абсолютно все пользователи работают в терминале. Временные файлы юзверей на отдельном логическом диске, судя по объему чистятся каждую ночь.
Было бы ни при чем, если бы проблема (точнее, комбинация описанной в теме проблемы с описанной мной) не начала повторяться с таким упорством как раз после перехода на указанную выше версию платформы. Режим совместимости с 8.1 на 8.2 меняли еще на 13 релизе, насколько я помню. До этого года 1,5-2 на платформе 8.1 все работало отлично, уж таких выкрутасов не замечал.
А насчет работы без терминалки :) кто-то тут где-то на полном серьезе советовал не сохранять (динамично) изменения при работе в базе других пользователей, типа конфа может не обновиться у тех. На мой взгляд - это то же самое что не выходить на улицу, а вдруг машина переедет!
Ребята от всего не убережешся, можно констатировать глюк, но жить и работать надо, а не рассказывать друг-другу страшные сказки что с кем приключилось.
Вообще-то, правильно советовали - это может привести (и очень часть приводит) к ошибкам в работе вплоть до краха структуры конфы. Т.к. работа с временными файлами (которые пользуются активно 1С везде и всюду - и при сохранении/обновлении конфигурации в том числе) до сих пор не освоена 1С даже до уровня "чтоб работало".
Все-таки, динмическое обновление не зря называют "демоническим", и его использование - почти всегда выходит боком. Особенно на платформе 8.2 и всех остальных.
Если исходить из рекомендаций типа - "это опасно так не делайте", то:
1. нельзя во первых пользоватся 1С - можно потерять базу
2. нельзя пользоватся ПК - можно потерять все данные
3. нельзя пить, курить, и все такое - можно повредить здоровью
Ну а вывод: нельзя жить - это смертельно - никто еще не выжил :)
Так на каком "нельзя" остановится? Я предпочитаю смотреть по ситуации - насколько это критично. Если для меня важнее внести изменения динамически, то и фиг с ними рисками - если они этак 0,0001%, если будет 1% я подумаю, если 10% я перестрахуюсь полюбому
да, не прав, потому как машина движется намного быстрее, и оценка "она еще далеко" может быть очень субъективна. А вообще лучше всегда дожидаться "своего" света светофора. И брать пример в этом с немцев.
Прехожу почти в гордом одиночестве в хвосте "быстроперебегающих-недождавшихся" зеленого сигнала.
Вот кто бы прислушался, а не к агитации 1С...
Для этого есть сервера, резервное копирвоание, ИБП и прочая, и прочая.
Ну это совсем к 1С не имеет отношения. Даже косвенного :)
Вот именно такой лозунг надо повесить на всех продуктах 1С :)
Дело не в процентах, а в недоработках "любимой фирмы": бьются временные файлы, отслеживания их корректности и правильности структуры нет и не было, в результате - вне зависимсоти от процента изменений портится вся конфа с данными, так как все идет одним куском.
Уважаемый - не передергивайте, я специально указал что МАШИН НЕТУ чтобы вы не придрались, вы благоволучно это проигнорировали
Являясь водителем в густонаселенном городе (3-й в России по количесту машин на 1000 чел.) и ездя бстрее среднего я со своей СУБЪЕКТИВНОСТЬЮ умудряюсь рассчитать время реакции до 1 сек. другого водителя, и спокойно уворачиваюсь от некоторых "неадекватных" поэтому ходя пешком я прекрасно знаю на что способна машина и на что способен я. Случайно на вас может упасть кирпич с крыши дома т.к. вы ее не видите когда идете рядом, но переехать случайно машина не может если вы смотрите по сторонам и при этом думаете чтобы под нее не попасть.
Опять же вернусь к машинам (люблю сравнивать) - они тоже бьются, водители пассажиры умирают в авариях! Вас интересует процент смертельных и других случаях когда вы едете на своей машине или вас подвозят пасажиром? Сомневаюсь. Думаю спокойно ездите не учитывая тот факт что через секунду вы можете лишится ноги или руки в результате того что "неадекват" с соседней полосы заболтался по телефону и решил перестроится не посмотрев есть ли для него место.
Так же и я спокойно делаю динамическое обновление и радуюсь жизни не обращая внимание на грозные причитания "перестраховщиков по жизни". Бэкапы делаются, от всего не перестрахуешся - так чего настаивать на усложнении жизни?
База у Вас маленькая? Иначе бы не рассуждали так радужно, если в альтернативе - несколько часов грузить базу из архива, да плюс потерянные часы набранных документов, за которые тоже кто-то должен нести ответственность.
Для SQL - да, для файлового возможно и нет - 2-3 Гб.
Ну так я про то и говорю в который раз что все зависит от СИТУАЦИИ - а вы говорите про ВООБЩЕ. А потом начинаете на нюансы ссылатся. Это неверно в корне.
Уважаю немцев за их четкость (по слухам), однако у кажжой нации свои плюсы. Войну с ними (и другими) мы выиграли именно потому что плевали на все, в том числе и на слово "нельзя" и "невозможно". Просто делаем и все. А если бы сильно задумывались то наверно и не делали бы этого, и не выиграли бы там где все проигрывали.
Им просто надо было подождать несколько десятилетий, и сейчас бы им продали все и вся. Даже без всякой войны.
(92)
Нюанс как раз у Вас. Что не отменяет разрушительного действия ДО. У нас даже кэш пользователя - и то бьется без всяких причин. Просто так, 1С, видите ли...
(93)
И я все время говорю о том же - только про неудачный пример "как не надо писать программы, а, тем более - платформы". А так полностью солидарен - абсолютно неправильный подход к программированию, в том числе - и при внесении изменений.
(94)
Думаю, Вы льстите себе, а мне - приписываете лишком много.
Именно, что проблемы и ПРОБЛЕМЫ в 1С лично мне встречаются на каждом шагу, практически всегда не давая сделать нормально, корректно и правильно, а только через одно место.
А вот Вы как раз хвалите и оправдываете 1С при любом удобном случае.
Наверное, Вам не с чем сравнивать?
А вот Вы как раз хвалите и оправдываете 1С при любом удобном случае.
Как это мне знакомо: я как раз рассуждал так же года 4 назад. Однако сейчас все труднсти позади - все глюки изучены и уже не мешают на каждом шагу как раньше, может помогло следующее:
- опыт позволяет предвидеть кучу всяких проблем и предотвращать их
- стараюсь не ставить ничего лишнего и нового - это всегда новый гиморой который ни мне ни клиенту не нужен
- если делаю разработку - стараюсь делать универсально и продаю всем или переделываю с незначительными модификациями, очень экономит время
- никуда не езжу, не трачу время на пробки, все по телефону и удаленно - ну 90%
- работаю часто через агентов - они получают свое, я свое, за это они часто утрясают корнфликты с клиентами
Собственно для избежания постоянных динамичных сохранений делаю подсистему "Динамика" которая позволяет менять практически все в конфигурации не внося изменения в исходный код - все перехватчики ставятся один раз и все, остальное хранится в виде данных в базе
Интересно это только я вижу тут противоречие?
Кстати хвалю 1С за то удобство что она дает, за то что я благодаря ей имею в жизни все что мне нужно, а это немало - запросы у меня нескромные.
Основная проблема в работе не 1С - а клиенты, человеческий фактор. Если я знаю глюк 1С, то я его могу предвидеть и обойти. А вот клиенты часто выкидывают такое что если таких игнорировать то и клиентов не останется - приходится делать психологическую разгрузку.
Думайте оптимистичнее.
Ну не знаю, у меня в клиентах были и "КраснодарКрайГаз" (дочка Газпрома), в постоянном обслуживании самые мелкиеи и достаточно крупные игроки в торговле различной направленности. Качеством все довольны, недовольство вызывает только оперативность (сильно загружен т.к. берусь почти за все). Клиентов активных порядка 30 со 100 базами (таких что каждый месяц по несколько раз), неактивных еще в 2 раза больше.
Глюков всяких перевидал, хотя думаю их еще больше, но желания увидеть их все что-то нет. Помошников почти нет, все в основном сам делаю.
Как думаете есть мне с чем сравнивать? Или опыт маловат и кругозор узенький?
У вас прямо какой-то заповедник 1С там :))
Вы - первый и единственный, кому опыт позволяет ПРЕДВИДЕТЬ проблемы клиента, даже не видя ни самого клиента, ни его базы.
У вас просто чудесные клиенты, которые не ставят ничего нового от 1С, кому не требуется обновлений платформ и конфигруаций (и вообще - чураются ставить что-либо от 1С), и покорно ждут, когда в 1С все утрясется. а вы разрешите обновить их базы ))
У вас, видимо, великолпный тайм-менеджемент - еще никому не удавалось делать быстро, качественно и универсально ВСЕ и ВСЯ в 1С.
Ну, повторюсь - великолепные клиенты, которые не жаждут вас видеть лично вовсе, а удовлетворены вполне удаленным общением.
Ну, говорю же, - спецзона 1С: клиенты все покорные, личного присутствия чураются, да еще и агентов полно, которые разруливают вопросы с клиентами!
Ну, я уже не удивляюсь - что клиенты позволяют вносить в свои базы фрилансеру (!) такие серьезные изменения, им, наверняка, совсем непонятные.
Уникальные экосистемы: в Москве не знают, сколько платить, поэтому платят, сколько унесешь; у вас - программистов 1С носят на руках и считают не меньше родственников раджи. И где-то близко к исполнительной госструктуре.
Ну тогда вам и в 1С не повезет. Ведь что казино, что 1С - везде русская рулетка и вера в чудо "но мне-то повезет сорвать куш!".
Хотя если 1С - это даже не однорукий, а безрукий бандит, то и ставки намного выше, чем в казино ))
Опять собственные домыслы выставляем за факты? Продолжайте в том же духе, а мне как-то надоело общатся когда вместо внятного диалога вы ведете какой-то монолог высказывая домыслы и доказывая зачем то их мне когда они априори не соответствуют действительности.
Или не работайте с 1С, а выбирите свой идеал чтобы получать удовольствие от работы.
Уважаемый, вы где тут москвичей нашли? Или москвичи перед вами так провинились что вы всех неугодных так именуете? Это какой то новый вид расизма - городизм что-ли :)
Я из Краснодара, может слыхали? город такой в одноименном крае, с Сочи под боком
Ладно тот хоть политик, а ты кто?
- соскакивание с темы которую не можеш внятно закрыть и вместо нее поднимание новой темы, желательно такой чтобы перекрыть предыдущую
- игнорирование неудобных вопросов и собственных промашек
Собственно диалог тихо скатывается к типа "сам дурак". Давай завершим его. Не нравится и нет желания конструктивно говорить - поставь минус и не заходи больше сюда.
да, особенно невнятно получается на фоне оппонента, который от аргументов быстро перешел к "тыканью". Наверняка, такая практика складывалась годами от ответов на удобные вопросы и неимения собственных промашек.
например, при изменении флажков, переключателей и полей ввода на форме (не элементы управления табличного поля!).
Вы можете в этом убедиться, поставив точку останова в приложенной обработке до изменения состояния флажка в процедуре:
Процедура ТабличноеПоле1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
1С мне ответить не пожелала, может кто-то объяснить как обойти сие?
Abadonna чётко ответил, ему + :) Есть "косяк" похуже - для заполненного табличного поля всегда вызываются события ...ПриПолученииДанных(), ...ПриВыводеСтроки() тогда как этого и не требуется,
например, при изменении флажков, переключателей и полей ввода на форме (не элементы управления табличного поля!).
Вы можете в этом убедиться, поставив точку останова в приложенной обработке до изменения состояния флажка в процедуре:
Процедура ТабличноеПоле1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
1С мне ответить не пожелала, может кто-то объяснить как обойти сие?
При этом в синтаксис-помощнике сказано, что обработка оповещения срабатывает только для закрытых форм. Не тут то было! Проверка самым простым способом - ЭтаФорма.Открыта(); - показывает что процедура выполняется даже если форма закрыта.
Спасибо автору - решила заодно и проблему с оповещением и облегчила себе жизнь - каждый раз перезапускать предприятие чтобы протестить измененную обработку достало однако))
Не могу работать, внешняя обработка не обновляется и все, хоть убей.
Ничего подобного, ничего парируется.
господи, куда? если это открытие обычной внешней обработки, просто из файл-открыть.
Помогите, кто решил этот бредовый трабл?
Сейчас приходиться извращаться через сервер и основную конфу =( что вообще неудобно, не мне одной нужен конфигуратор в конторе.
ой, я Вас умоляю )))))
Почему при закрытии самой внешней обработки/отчета - не происходит его уничтожение как ранее открытого и "зацикленного" объекта (сиречь зацикленного через вызов Формы этого же объекта в модуле объекта в данном случае)?
Так как по-факту мы-то "родительский" объект "очистили" выходом из него, и, следовательно, "вызывающий" указатель тоже должен обнулиться, что должно вызвать сброс счетчика ссылок на объект, и в итоге полное уничтожение этого объекта.
Т.е. закрытие объекта - не влечет за собой уничтожение его ссылочных указателей, и платформа всегда считает, что количество ссылок равно +1 и отлично от 0 (если была одна переменная с зацикленной ссылкой), "не видя", что вызов указателя (увеличение счетчика ссылок) генерирует сам уничтожаемый объект.
Так что на лицо - полнейший глюк и недоработка, а никакая не "фича" работы платформы.
P.S. За тему спасибо!
Сообщение = Новый СообщениеПользователю;
Сообщение.Поле = "";
Сообщение.УстановитьДанные(ЭтотОбъект)
Вроде как обработка открывается программно через обработчик ожидания? а дальше неясно.
Разберешься - отпишись в чем дело то.
а в моей внешней обработке, кроме основной формы еще есть дополнительная форма для сопоставления реквизитов, в ней формируется дерево реквизитов при открытии. открываю ее так: Фомра = ПоулчитьФорму();
Формы.Рек1 = Рек1;
Форма.Открыть();
Так вот при открытии иногда форма заполняется, а иногда - нет, хотя должна заполнятся всегда. Не понятно с чем связанно, если отладчиком проходить, то, в том случае когда ничего не заполняется, отладчик даже в форму не заходит и форма просто открывается и на ней ничего не происходит.
ПС сегодня еще на 8.3.6.1977 проверил, все нормально работает. походу, это глюк платформы 8.3.5.1625
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 89283
Создание 03.09.11 22:40
Обновление 31.01.18 01:34
Просмотры 42482
Загрузки 0
Рейтинг
110
Комментарии 114
Код открыт Да
Рубрики Механизмы платформы 1С
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Windows
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)