Почему после получения объекта из хранилища код изменился в конфигураторе, но программа работает по-старому?

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

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

Различие между основной конфигурацией и конфигурацией базы данных

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

  1. Основная конфигурация: Это то, что мы редактируем в конфигураторе. Именно сюда попадают изменения, когда мы нажимаем «Получить из хранилища».
  2. Конфигурация базы данных: Это исполняемая конфигурация, с которой работают пользователи. Пока изменения из основной конфигурации не перенесены в конфигурацию БД, система будет работать по старым алгоритмам.

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

Механизм «фиктивного» изменения для принудительного обновления

Если вы столкнулись с тем, что код изменился, а кнопка F7 неактивна, первым делом попробуем заставить конфигуратор «увидеть» изменения. Разберем по шагам, как это сделать:

  1. Откроем модуль, в котором были внесены изменения.
  2. В любом месте (лучше в конце процедуры или в области комментариев) поставим пробел.
  3. Удалим этот пробел. Система пометит объект как измененный (в заголовке окна появится символ «звездочка»).
  4. Сохраним изменения (Ctrl + S).

После этой простой манипуляции флаг модифицированности конфигурации должен обновиться, и кнопка обновления конфигурации БД станет активной. Нажмем ее и дождемся принятия изменений.

Влияние кэширования на исполнение кода

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

  1. Локальный кэш пользователя: Хранится на компьютере разработчика или пользователя. Если он «протух», конфигуратор может показывать новый текст кода, а исполняющая среда — использовать старый байт-код.
  2. Серверный кэш: В клиент-серверном варианте работы сервер приложений 1С:Предприятия тоже кэширует скомпилированные модули. Иногда он «зависает» на старой версии модуля, особенно если часто использовалось динамическое обновление.
  3. Кэш сеанса: Возникает при так называемом «демоническом» (динамическом) обновлении.

Как правильно почистить кэш

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

Способ 1. Параметр запуска /ClearCache

Этот способ самый безопасный и быстрый. Его следует использовать в настройках запуска конкретной информационной базы в списке стартера 1С. В поле «Дополнительные параметры запуска» пропишем команду:

/ClearCache

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

Способ 2. Удаление базы из списка

Если /ClearCache не помог, воспользуемся проверенным методом «перерегистрации» базы. Посмотрим, как это работает:

  1. Запомним путь к базе (или параметры сервера).
  2. Удалим информационную базу из списка в окне запуска 1С.
  3. Добавим её заново под тем же именем.

При удалении базы из списка 1С не удаляет саму БД, но стирает все временные папки, связанные с её внутренним идентификатором (GUID). При новом добавлении будет создан чистый кэш.

Способ 3. Ручная очистка папок

Для полной уверенности можно вручную очистить содержимое папок, где 1С хранит временные данные. Обычно они располагаются по следующим путям (вместо "User" будет ваше имя пользователя):

  1. %AppData%\Local\1C\1Cv8\
  2. %AppData%\Roaming\1C\1Cv8\

Внутри этих папок находятся подпапки с длинными именами из букв и цифр (GUID-ы баз). Можно смело удалять все содержимое этих папок, когда 1С закрыта. При следующем запуске платформа пересоберет необходимые данные.

Проблема динамического обновления

Рассмотрим ситуацию, которую часто называют «демоническим обновлением». Это когда изменения применяются без выгона пользователей. В этот момент в базе создается «хвост» из старых версий метаданных. Если вы получили изменения из хранилища в базу, которая до этого многократно обновлялась динамически, может возникнуть серьезный рассинхрон.

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

  1. Выгнать всех пользователей из базы.
  2. В конфигураторе выполнить команду «Конфигурация — Конфигурация базы данных — Вернуться к конфигурации БД». Это сбросит все незакрепленные изменения в основной конфигурации.
  3. Снова получить объекты из хранилища.
  4. Выполнить стандартное обновление (F7).

Проверка через отладку

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

  1. Установим точку останова на строке, где значение меняется с 2 на 3.
  2. Запустим отладку (F5).
  3. Когда выполнение остановится, выделим переменную или реквизит и нажмем Shift + F9 (Вычислить выражение).

Если в окне конфигуратора вы видите Реквизит = 3, а отладчик в «Табло» показывает, что значение равно 2, значит, исполняется старый скомпилированный код. Это 100% признак того, что нужно чистить серверный кэш или перезапускать службу 1C:Enterprise 8 Server (в случае клиент-серверного варианта).

Резюме

Работа с хранилищем требует дисциплины. Чтобы избежать подобных «фантомных» изменений, старайтесь:

← На главную