Почему не обновляется внешняя обработка в 1С при внесении изменений в конфигураторе

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Основная причина: зависание объектов в памяти и циклические ссылки

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

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


// В модуле формы обработки
ФормаПодбора = ЭтотОбъект.ПолучитьФорму("Подбор");

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

Зависание контекста при работе с временным хранилищем

Другая распространенная причина «замерзания» обработки связано с некорректным помещением данных во временное хранилище. Рассмотрим пример кода в событии ПриОткрытии:


СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет("Схема");
URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор());

В этом примере в качестве второго параметра функции ПоместитьВоВременноеХранилище передается вновь созданный Новый УникальныйИдентификатор(), а не уникальный идентификатор самой формы. В результате данные помещаются в контекст сеанса, а не формы, и сохраняются в памяти до завершения работы пользователя. Платформа блокирует корректное пересоздание структуры внешней обработки при повторных вызовах.

Как решить проблему и предотвратить зависание обработки

Разберем по шагам действия, которые необходимо предпринять для устранения этой ошибки:

  1. Исправьте вызов временного хранилища. Передавайте в функцию ПоместитьВоВременноеХранилище идентификатор текущей формы (ЭтаФорма.УникальныйИдентификатор или УникальныйИдентификатор), чтобы данные удалялись автоматически при закрытии окна:

    
    СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет("Схема");
    URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ЭтаФорма.УникальныйИдентификатор);
    
  2. Очищайте ссылки при закрытии формы. В обработчиках событий ПриЗакрытии или ПередЗакрытием явным образом обнуляйте ссылки на другие формы, структуры и контекстные переменные:

    
    Процедура ПриЗакрытии()
        ФормаПодбора = Неопределено;
    КонецПроцедуры
    
  3. Используйте ключ запуска для очистки кэша. На время активной разработки и отладки внешней обработки добавьте параметр /ClearCache в настройки запуска информационной базы в окне запуска 1С.

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

← На главную