Методика решения проблемы с открытием старой версии внешней обработки

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

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

Причина возникновения проблемы

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

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

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

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

Рекомендации по предотвращению возникновения проблемы

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

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

Методика устранения проблемы

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

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

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

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

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

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

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