Почему пропадают части кода при обновлении конфигурации 1С и как это исправить

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

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

Разберем механизмы кэширования: почему система «не видит» новый код

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

  1. Локальный кэш пользователя. Это временные файлы на компьютере, с которого запускается Конфигуратор. Если вы подключаетесь к базе с разных рабочих мест, Конфигуратор на одном компьютере может считать данные из локальных файлов, которые не синхронизировались с актуальным состоянием базы данных.
  2. Серверный кэш (каталог srvinfo). В серверном варианте работы конфигурация компилируется в бинарный вид и сохраняется в рабочих папках кластера (например, в каталоге reg_1541). При сбоях или некорректном завершении процессов сервер может продолжать отдавать старые скомпилированные модули, игнорируя новые данные в SQL-таблицах.

Выясним, как правильно «продуть» кэш. Для клиентского кэша самым надежным способом является удаление базы из списка и её повторное добавление. Для серверного кэша иногда требуется полная остановка службы 1C:Enterprise 8.3 Server Agent и очистка содержимого папок с идентификаторами баз внутри каталога srvinfo (за исключением файлов конфигурации кластера).

Проанализируем проблему «демонического» (динамического) обновления

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

В базе данных SQL за хранение конфигурации отвечают таблицы Config (основная) и ConfigSave (та, куда записываются изменения при нажатии кнопки «Сохранить»). Когда мы нажимаем F7 (Обновить конфигурацию базы данных), данные из ConfigSave должны перетечь в Config. При динамическом обновлении создается дополнительная «слойность» метаданных.

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

Инструкция по безопасному внесению изменений

Чтобы избежать потери данных, особенно на старых релизах платформы (таких как 8.3.10), рекомендуем придерживаться строгого регламента. Рассмотрим последовательность действий:

  1. Откажитесь от динамических обновлений в пользу полных. Если внизу окна Конфигуратора вы видите синий восклицательный знак — это признак того, что конфигурации базы данных и поставщика разошлись динамически.
  2. Перед серьезными изменениями всегда делайте выгрузку файла конфигурации (CF). Это не только бэкап, но и способ заставить систему «собрать» конфигурацию воедино.
  3. Если вы заметили странное поведение системы, выполните команду «Конфигурация — Загрузить конфигурацию из файла», выбрав ваш свежий CF. Это принудительно перезапишет таблицы метаданных.
  4. В критических случаях используйте механизм выгрузки конфигурации в файлы (через XML) и последующей загрузки. Это полностью пересобирает структуру модулей, устраняя «мусор» в таблицах Config.

Посмотрим на программные способы проверки целостности

Если код пропадает в конкретных процедурах, проанализируем ситуацию с помощью тестирования и исправления (ТиИ). Нам важны пункты «Проверка логической целостности» и «Проверка ссылочной целостности». В ряде случаев полезно использовать метод очистки настроек пользователей, если код связан с интерфейсными формами.

Для диагностики того, какой именно код исполняется на сервере в данный момент, можно использовать временные вставки для логирования. Например:


Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Временный код для проверки версии модуля
    ЗаписьЖурналаРегистрации("ПроверкаВерсии", УровеньЖурналаРегистрации.Информационный, , , "Работает версия от 25.05.2024");
    
    // Ваш основной код
КонецПроцедуры

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

Выясним роль фоновых заданий и блокировок

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

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

Подведем итог

Исчезновение кода — это почти всегда результат рассинхронизации между отображаемым состоянием (ConfigSave) и исполняемым (Config). Для минимизации рисков мы рекомендуем всегда выгружать CF-файл перед обновлением, избегать динамических обновлений («обновить конфигурацию базы данных» только при отсутствии активных сеансов) и регулярно чистить серверный кэш при проведении регламентных работ.

← На главную