При разработке внешних обработок (файлы .epf) разработчики иногда сталкиваются с проблемой: реквизит или элемент, добавленный на форму в конфигураторе, не появляется при повторном открытии файла в режиме 1С:Предприятие. Изменения программного кода также не вступают в силу до полного перезапуска сеанса или очистки кэша. Проанализируем, почему возникает данный эффект и как его исправить.
Когда внешняя обработка открывается в сеансе 1С, платформа создает экземпляр объекта в оперативной памяти. После закрытия окна формы сборщик мусора платформы должен полностью удалить объект обработки из памяти. Однако если в коде возникли перекрестные (циклические) ссылки или глобальные переменные продолжают удерживать ссылки на форму, экземпляр обработки остается активным в памяти сеанса.
При повторном открытии файла с диска платформа видит уже существующий в памяти сеанса контекст и открывает его вместо считывания обновленного файла. Рассмотрим пример кода, приводящий к удержанию ссылки:
// В модуле формы обработки
ФормаПодбора = ЭтотОбъект.ПолучитьФорму("Подбор");
Если переменная ФормаПодбора является переменной модуля и не очищается перед закрытием формы, ссылка на подчиненную форму остается в памяти. Из-за этого сборщик мусора 1С не может уничтожить родительский объект обработки.
Другая распространенная причина «замерзания» обработки связано с некорректным помещением данных во временное хранилище. Рассмотрим пример кода в событии ПриОткрытии:
СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет("Схема");
URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор());
В этом примере в качестве второго параметра функции ПоместитьВоВременноеХранилище передается вновь созданный Новый УникальныйИдентификатор(), а не уникальный идентификатор самой формы. В результате данные помещаются в контекст сеанса, а не формы, и сохраняются в памяти до завершения работы пользователя. Платформа блокирует корректное пересоздание структуры внешней обработки при повторных вызовах.
Разберем по шагам действия, которые необходимо предпринять для устранения этой ошибки:
Исправьте вызов временного хранилища. Передавайте в функцию ПоместитьВоВременноеХранилище идентификатор текущей формы (ЭтаФорма.УникальныйИдентификатор или УникальныйИдентификатор), чтобы данные удалялись автоматически при закрытии окна:
СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет("Схема");
URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ЭтаФорма.УникальныйИдентификатор);
Очищайте ссылки при закрытии формы. В обработчиках событий ПриЗакрытии или ПередЗакрытием явным образом обнуляйте ссылки на другие формы, структуры и контекстные переменные:
Процедура ПриЗакрытии()
ФормаПодбора = Неопределено;
КонецПроцедуры
Используйте ключ запуска для очистки кэша. На время активной разработки и отладки внешней обработки добавьте параметр /ClearCache в настройки запуска информационной базы в окне запуска 1С.
Временная отладка в составе конфигурации. Если внешняя обработка содержит сложную структуру реквизитов и форм, на время разработки встройте её в ветку Обработки основной конфигурации. Это позволит использовать динамическое обновление и исключит проблемы с кэшированием внешних файлов .epf.