Почему при программном открытии внешней обработки в 1С открывается старая версия кода?

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

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

Механизм кэширования имен при использовании метода Подключить

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

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


// Генерируем уникальное имя для регистрации обработки в сеансе
ИмяПодключения = "Обработка_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
ПутьКФайлу = "C:\ExternalReports\MyReport.epf";

// Подключаем файл с уникальным именем
ИмяЗарегистрированнойОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, ИмяПодключения, Ложь);

// Открываем форму
ОткрытьФорму("ВнешняяОбработка." + ИмяЗарегистрированнойОбработки + ".Форма.Форма");

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

Особенности кэширования в «Дополнительных отчетах и обработках» (БСП)

Если работа ведется в конфигурации на базе Библиотеки стандартных подсистем (БСП), и обработка запускается из справочника Дополнительные отчеты и обработки, важно понимать механизм её хранения. Платформа не работает с файлом на вашем диске напрямую — она хранит двоичные данные файла в хранилище значений внутри базы данных.

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

  1. Внесите изменения во внешний файл через конфигуратор и сохраните его.
  2. Зайдите в справочник «Дополнительные отчеты и обработки».
  3. Найдите нужную запись и нажмите кнопку «Обновить из файла».
  4. Запишите изменения в справочнике.

Только после этого обновленные двоичные данные попадут в базу, и при следующем запуске система выгрузит актуальную версию.

Серверное кэширование модулей и процессы rphost

В клиент-серверном варианте работы скомпилированные модули могут сохраняться в памяти рабочего процесса сервера rphost. Даже если физический файл на сервере обновился, процесс может продолжать исполнять старый байт-код модуля до тех пор, пока сеанс не будет завершен или процесс не перезапустится. Особенно часто это проявляется при выполнении серверных методов обработки или фоновых заданий.

Разберем способы борьбы с этим явлением:

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

Иногда причина кроется в операционной системе. При программном открытии платформа создает копию файла в папке Local/Temp. Если файл заблокирован антивирусом или другим процессом 1С, новая копия не может перезаписать старую. Платформа при этом не всегда выдает ошибку, продолжая работать с тем, что уже лежит в папке.

Также проанализируем ситуацию с «зацикленными ссылками». Если в форме обработки есть реквизит, который хранит ссылку на саму эту форму или на объект обработки, объект может не удаляться из памяти после закрытия формы. При повторном открытии система находит «живой» объект в памяти и предъявляет его пользователю вместо создания нового из измененного файла.

Особенности системы компоновки данных (СКД)

Если ваша обработка построена на базе СКД, причина «неизменности» может быть в сохраненных настройках. Платформа кэширует варианты отчетов и пользовательские настройки. Даже если вы изменили запрос в схеме компоновки данных, старые настройки, хранящиеся в базе данных для вашего пользователя, могут перекрывать новые параметры схемы.

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

Практические советы для отладки

Чтобы убедиться, что вы действительно открываете нужную версию, используйте следующие приемы:

  1. Визуальный контроль: Добавьте в заголовок формы номер версии или текущее время (например, «Обработка v.1.02»). Если после сохранения и запуска заголовок остался старым — значит, сработало кэширование.
  2. Очистка кэша: Полный выход из базы и повторный вход гарантированно очищает сеансовый кэш имен, зарегистрированных через Подключить.
  3. Проверка пути: Убедитесь с помощью отладчика, что переменная ПутьКФайлу действительно указывает на тот файл, который вы только что сохранили в конфигураторе. Часто разработчики путаются в похожих именах файлов в разных папках.
← На главную