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

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

Разберем классическую ситуацию, с которой сталкиваются многие разработчики, особенно при переходе с других языков программирования на 1С. Вы вносите изменения во внешнюю обработку, сохраняете файл, загружаете его в справочник Дополнительные отчеты и обработки, нажимаете «Записать и закрыть», но при запуске программа упорно выдает старую ошибку или исполняет старый алгоритм. При этом, если открыть тот же файл через меню Файл — Открыть, всё работает идеально.

Давайте проанализируем, почему механизм 1С может вести себя подобным образом, и рассмотрим пошагово все способы решения этой проблемы — от самых простых до глубоких технических манипуляций с серверным кэшем.

Причина 1. Путаница с копиями файлов и путями

Рассмотрим самую банальную, но наиболее часто встречающуюся причину — человеческий фактор. Как показывает практика, часто разработчик правит одну копию обработки, а загружает в систему другую. Проанализируем ситуацию: в Конфигураторе может быть открыто несколько файлов с одинаковыми именами из разных папок (например, из папки проекта и из папки «Загрузки»).

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

  1. Закроем все окна в Конфигураторе.
  2. Перейдем в меню Файл — Открыть и выберем именно тот файл, который мы собираемся загружать.
  3. Внесем в него заведомо заметное изменение (например, добавим Сообщить("Версия 2.0"); в начало процедуры).
  4. Сохраним файл и закроем Конфигуратор.
  5. В режиме 1С:Предприятие при обновлении через справочник выберем именно этот проверенный файл.

Причина 2. Особенности работы временных файлов (каталог Temp)

Выясним, как платформа 1С запускает внешние обработки из справочника. В отличие от прямого открытия файла, при запуске из «Дополнительных отчетов и обработок» система выгружает двоичные данные из базы данных во временный каталог пользователя на локальном диске (обычно это %USERPROFILE%\AppData\Local\Temp). Затем платформа выполняет запуск этого временного файла.

Иногда возникают ситуации, когда старый файл в папке Temp блокируется антивирусом или правами доступа, и система не может его перезаписать. В результате 1С «видит», что файл с таким именем уже есть, и просто запускает старую версию, не обновляя её.

Для решения этой проблемы попробуем очистить временные файлы:

  1. Закроем все сеансы 1С.
  2. Перейдем в папку временных файлов пользователя Windows.
  3. Удалим всё содержимое, имеющее отношение к 1С (папки вида v8_XXXX).
  4. Попробуем повторно запустить обработку из интерфейса.

Причина 3. Кэширование повторно используемых значений

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

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


// Сброс кэша повторно используемых значений для текущего сеанса
ОбновитьПовторноИспользуемыеЗначения();

Этот метод ОбновитьПовторноИспользуемыеЗначения помогает, если логика обработки завязана на параметры сеанса или общие модули, которые «запомнили» старое состояние внешней обработки.

Причина 4. Сеансовый кэш на сервере (rphost)

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

Рассмотрим алгоритм действий в этом случае:

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

Причина 5. Игнорирование обновления из-за версии в СведенияОВнешнейОбработке

Механизм БСП при загрузке файла анализирует функцию СведенияОВнешнейОбработке(), которая находится в модуле объекта обработки. Рассмотрим, как это выглядит в коде:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2");
    // ... настройки регистрации
    ПараметрыРегистрации.Версия = "1.0.1"; // Вот этот параметр важен
    Возврат ПараметрыРегистрации;
КонецФункции

Некоторые версии систем автоматизации могут игнорировать фактическое обновление двоичных данных, если поле Версия осталось прежним. Рекомендуется всегда инкрементировать (увеличивать) номер версии в коде перед загрузкой файла в базу. Это служит сигналом для системы, что объект действительно изменился.

Причина 6. Радикальный метод: Переподключение объекта

Если ни очистка кэша, ни изменение версии не помогают, проанализируем ситуацию с точки зрения уникальных идентификаторов (GUID). Каждая запись в справочнике имеет свой внутренний ID. Если система «зациклилась» на старых данных, попробуем следующее:

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

Этот метод часто помогает, когда проблема кроется в некорректных связях внутри служебных таблиц БСП, которые хранят настройки запуска внешних объектов.

Итог: правильный алгоритм обновления

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

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

← На главную