Разработчики 1С часто сталкиваются с ситуацией: в код внешней обработки внесены правки, файл сохранен, но при программном запуске система упорно открывает старую версию. Это сбивает с толку, заставляя сомневаться в правильности написанного кода или исправности платформы. Разберем подробно технические причины этого поведения и способы их устранения.
Одной из самых распространенных причин является специфика работы метода ВнешниеОбработки.Подключить(). Когда мы регистрируем обработку в текущей сессии, платформа запоминает её под определенным внутренним именем. Если при повторном вызове метода мы передаем то же самое ИмяПодключения, 1С проверяет, есть ли уже в памяти объект с таким идентификатором. Если есть, система может проигнорировать изменения в физическом файле и вернуть ссылку на уже существующий в памяти экземпляр.
Проанализируем решение этой проблемы. Чтобы гарантировать открытие актуальной версии, необходимо генерировать уникальное имя для каждого подключения. Рассмотрим пример кода:
// Генерируем уникальное имя для регистрации обработки в сеансе
ИмяПодключения = "Обработка_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
ПутьКФайлу = "C:\ExternalReports\MyReport.epf";
// Подключаем файл с уникальным именем
ИмяЗарегистрированнойОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, ИмяПодключения, Ложь);
// Открываем форму
ОткрытьФорму("ВнешняяОбработка." + ИмяЗарегистрированнойОбработки + ".Форма.Форма");
Использование УникальныйИдентификатор заставляет платформу каждый раз заново считывать файл и компилировать модуль, обходя внутренние механизмы оптимизации, которые в данном случае работают против разработчика.
Если работа ведется в конфигурации на базе Библиотеки стандартных подсистем (БСП), и обработка запускается из справочника Дополнительные отчеты и обработки, важно понимать механизм её хранения. Платформа не работает с файлом на вашем диске напрямую — она хранит двоичные данные файла в хранилище значений внутри базы данных.
При запуске система выгружает этот файл во временный каталог пользователя. Если вы редактируете файл .epf на диске, но не обновляете его в элементе справочника, программа продолжит запускать ту версию, которая была загружена в базу ранее. Выясним алгоритм действий для этого случая:
Только после этого обновленные двоичные данные попадут в базу, и при следующем запуске система выгрузит актуальную версию.
В клиент-серверном варианте работы скомпилированные модули могут сохраняться в памяти рабочего процесса сервера rphost. Даже если физический файл на сервере обновился, процесс может продолжать исполнять старый байт-код модуля до тех пор, пока сеанс не будет завершен или процесс не перезапустится. Особенно часто это проявляется при выполнении серверных методов обработки или фоновых заданий.
Разберем способы борьбы с этим явлением:
-debug часто заставляет систему более внимательно следить за актуальностью модулей.ВнешниеОбработки.Создать(ПутьКФайлу) на стороне сервера обычно работает стабильнее, так как выполняет прямое чтение файла.Иногда причина кроется в операционной системе. При программном открытии платформа создает копию файла в папке Local/Temp. Если файл заблокирован антивирусом или другим процессом 1С, новая копия не может перезаписать старую. Платформа при этом не всегда выдает ошибку, продолжая работать с тем, что уже лежит в папке.
Также проанализируем ситуацию с «зацикленными ссылками». Если в форме обработки есть реквизит, который хранит ссылку на саму эту форму или на объект обработки, объект может не удаляться из памяти после закрытия формы. При повторном открытии система находит «живой» объект в памяти и предъявляет его пользователю вместо создания нового из измененного файла.
Если ваша обработка построена на базе СКД, причина «неизменности» может быть в сохраненных настройках. Платформа кэширует варианты отчетов и пользовательские настройки. Даже если вы изменили запрос в схеме компоновки данных, старые настройки, хранящиеся в базе данных для вашего пользователя, могут перекрывать новые параметры схемы.
В этом случае рекомендуется выполнить сброс настроек до стандартных непосредственно в режиме «1С:Предприятие» в меню настроек отчета или программно очистить кэш настроек пользователя для данной обработки.
Чтобы убедиться, что вы действительно открываете нужную версию, используйте следующие приемы:
Подключить.ПутьКФайлу действительно указывает на тот файл, который вы только что сохранили в конфигураторе. Часто разработчики путаются в похожих именах файлов в разных папках.