Разберем классическую ситуацию, с которой сталкиваются многие разработчики, особенно при переходе с других языков программирования на 1С. Вы вносите изменения во внешнюю обработку, сохраняете файл, загружаете его в справочник Дополнительные отчеты и обработки, нажимаете «Записать и закрыть», но при запуске программа упорно выдает старую ошибку или исполняет старый алгоритм. При этом, если открыть тот же файл через меню Файл — Открыть, всё работает идеально.
Давайте проанализируем, почему механизм 1С может вести себя подобным образом, и рассмотрим пошагово все способы решения этой проблемы — от самых простых до глубоких технических манипуляций с серверным кэшем.
Рассмотрим самую банальную, но наиболее часто встречающуюся причину — человеческий фактор. Как показывает практика, часто разработчик правит одну копию обработки, а загружает в систему другую. Проанализируем ситуацию: в Конфигураторе может быть открыто несколько файлов с одинаковыми именами из разных папок (например, из папки проекта и из папки «Загрузки»).
Чтобы исключить этот вариант, выполним следующие действия:
Файл — Открыть и выберем именно тот файл, который мы собираемся загружать.Сообщить("Версия 2.0"); в начало процедуры).Выясним, как платформа 1С запускает внешние обработки из справочника. В отличие от прямого открытия файла, при запуске из «Дополнительных отчетов и обработок» система выгружает двоичные данные из базы данных во временный каталог пользователя на локальном диске (обычно это %USERPROFILE%\AppData\Local\Temp). Затем платформа выполняет запуск этого временного файла.
Иногда возникают ситуации, когда старый файл в папке Temp блокируется антивирусом или правами доступа, и система не может его перезаписать. В результате 1С «видит», что файл с таким именем уже есть, и просто запускает старую версию, не обновляя её.
Для решения этой проблемы попробуем очистить временные файлы:
v8_XXXX).В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) активно используется механизм кэширования модулей. Если ваша обработка содержит серверные вызовы или функции, результаты которых кэшируются, система может подтягивать старое состояние контекста.
Проанализируем программный способ сброса такого кэша. В 1С существует специальный метод, который заставляет систему пересчитать закэшированные данные. Рассмотрим пример кода, который можно выполнить в консоли кода или через небольшую обработку:
// Сброс кэша повторно используемых значений для текущего сеанса
ОбновитьПовторноИспользуемыеЗначения();
Этот метод ОбновитьПовторноИспользуемыеЗначения помогает, если логика обработки завязана на параметры сеанса или общие модули, которые «запомнили» старое состояние внешней обработки.
Если мы работаем в клиент-серверном варианте, скомпилированный модуль внешней обработки может оставаться в памяти рабочего процесса сервера rphost. Даже если данные в справочнике обновились, сервер может продолжать исполнять старый байт-код для активного пользователя.
Рассмотрим алгоритм действий в этом случае:
Механизм БСП при загрузке файла анализирует функцию СведенияОВнешнейОбработке(), которая находится в модуле объекта обработки. Рассмотрим, как это выглядит в коде:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2");
// ... настройки регистрации
ПараметрыРегистрации.Версия = "1.0.1"; // Вот этот параметр важен
Возврат ПараметрыРегистрации;
КонецФункции
Некоторые версии систем автоматизации могут игнорировать фактическое обновление двоичных данных, если поле Версия осталось прежним. Рекомендуется всегда инкрементировать (увеличивать) номер версии в коде перед загрузкой файла в базу. Это служит сигналом для системы, что объект действительно изменился.
Если ни очистка кэша, ни изменение версии не помогают, проанализируем ситуацию с точки зрения уникальных идентификаторов (GUID). Каждая запись в справочнике имеет свой внутренний ID. Если система «зациклилась» на старых данных, попробуем следующее:
Этот метод часто помогает, когда проблема кроется в некорректных связях внутри служебных таблиц БСП, которые хранят настройки запуска внешних объектов.
Чтобы избежать подобных проблем в будущем, давайте выработаем надежный регламент обновления внешних обработок:
СведенияОВнешнейОбработке.МояОбработка_v2.epf).ОбновитьПовторноИспользуемыеЗначения(); через консоль или просто перезапустите сеанс 1С.Соблюдение этого порядка действий минимизирует влияние кэша и исключает ошибки, связанные с «кривизной» платформы, на которую часто сетуют разработчики, привыкшие к прямой компиляции кода в других средах разработки.