Ситуация, когда написанный накануне код бесследно исчезает после обновления конфигурации или перезагрузки сервера, способна вызвать панику у любого разработчика. Кажется, что система живет своей жизнью: вы вносили изменения, тестировали их, они работали, но утром база возвращается к состоянию «позавчерашнего дня». Проанализируем причины этого коварного поведения платформы 1С:Предприятие 8.3 и разберем по шагам, как защитить свои разработки от «пожирания» системой.
Одной из самых частых причин отката изменений является работа механизмов кэширования. Платформа 1С активно использует кэш для ускорения работы, и иногда этот кэш становится «протухшим». Рассмотрим, какие виды кэша могут влиять на видимость кода:
reg_1541). При сбоях или некорректном завершении процессов сервер может продолжать отдавать старые скомпилированные модули, игнорируя новые данные в SQL-таблицах.Выясним, как правильно «продуть» кэш. Для клиентского кэша самым надежным способом является удаление базы из списка и её повторное добавление. Для серверного кэша иногда требуется полная остановка службы 1C:Enterprise 8.3 Server Agent и очистка содержимого папок с идентификаторами баз внутри каталога srvinfo (за исключением файлов конфигурации кластера).
Динамическое обновление — это механизм, позволяющий вносить изменения в конфигурацию без выгона пользователей. Однако именно оно чаще всего становится причиной рассинхронизации. Рассмотрим внутреннее устройство этого процесса:
В базе данных SQL за хранение конфигурации отвечают таблицы Config (основная) и ConfigSave (та, куда записываются изменения при нажатии кнопки «Сохранить»). Когда мы нажимаем F7 (Обновить конфигурацию базы данных), данные из ConfigSave должны перетечь в Config. При динамическом обновлении создается дополнительная «слойность» метаданных.
Проблема заключается в следующем: если в момент обновления произошел микросбой или какое-то фоновое задание «держало» старую версию модуля, транзакция может завершиться формально успешно, но фактически в таблице Config останется старый код. Конфигуратор при этом будет показывать вам новый код (так как он берет его из ConfigSave), создавая иллюзию выполненной работы. После перезагрузки сервера или очистки кэша Конфигуратор обращается к реальному состоянию таблицы Config, и ваш код исчезает.
Чтобы избежать потери данных, особенно на старых релизах платформы (таких как 8.3.10), рекомендуем придерживаться строгого регламента. Рассмотрим последовательность действий:
Config.Если код пропадает в конкретных процедурах, проанализируем ситуацию с помощью тестирования и исправления (ТиИ). Нам важны пункты «Проверка логической целостности» и «Проверка ссылочной целостности». В ряде случаев полезно использовать метод очистки настроек пользователей, если код связан с интерфейсными формами.
Для диагностики того, какой именно код исполняется на сервере в данный момент, можно использовать временные вставки для логирования. Например:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Временный код для проверки версии модуля
ЗаписьЖурналаРегистрации("ПроверкаВерсии", УровеньЖурналаРегистрации.Информационный, , , "Работает версия от 25.05.2024");
// Ваш основной код
КонецПроцедуры
Если после обновления вы не видите этой записи в журнале регистрации, значит, сервер продолжает исполнять старую версию кэша, несмотря на то, что в Конфигураторе вы видите новый текст. В такой ситуации поможет только перезагрузка службы сервера 1С с предварительным удалением файлов из srvinfo.
На релизах ветки 8.3.10 часто наблюдались ошибки, когда активные РегламентныеЗадания блокировали обновление определенных объектов. Перед обновлением конфигурации базы данных крайне желательно:
БлокировкаУстановкиСоединений.Config.Важный момент: если вы работаете в хранилище конфигурации, убедитесь, что при помещении объектов не произошло конфликта версий. Иногда кажется, что код сохранен, но из-за ошибки связи с сервером хранилища изменения не были зафиксированы в основной базе, хотя локально они отображались.
Исчезновение кода — это почти всегда результат рассинхронизации между отображаемым состоянием (ConfigSave) и исполняемым (Config). Для минимизации рисков мы рекомендуем всегда выгружать CF-файл перед обновлением, избегать динамических обновлений («обновить конфигурацию базы данных» только при отсутствии активных сеансов) и регулярно чистить серверный кэш при проведении регламентных работ.