Многие разработчики сталкиваются с пугающей ситуацией: после внесения правок в конфигурацию, успешного сохранения и даже динамического обновления, свеженаписанный код бесследно исчезает. Иногда пропадает код, написанный пять минут назад, а иногда — фрагменты недельной давности. Проанализируем причины этого странного поведения платформы 1С:Предприятие 8.3 (особенно часто проявляющегося на версиях 8.3.10 и выше) и выработаем надежную стратегию защиты данных.
Основным виновником проблемы является механизм динамического обновления (в среде разработчиков часто называемый «демоническим»). Рассмотрим, что происходит под капотом. При динамическом обновлении платформа не перезаписывает основную конфигурацию полностью, а создает новую «версию» (поколение) измененных объектов в таблице Config базы данных SQL. Старые версии при этом могут оставаться в базе некоторое время.
Проблема возникает, когда кэш сервера 1С или кэш клиентского приложения начинает конфликтовать с записями в SQL. Разберем ситуацию: вы внесли изменения, нажали «Обновить конфигурацию базы данных», но из-за сбоя в версионировании система продолжает отдавать старый прекомпилированный код из кэша. Хуже того, при следующем «полном» (нединамическом) обновлении платформа может ошибочно посчитать ваши изменения «мусорными» и откатить состояние модуля к предыдущему стабильному поколению.
Рассмотрим самый надежный способ избежать потери кода. Разработка напрямую в «продуктивной» (боевой) базе — это огромный риск. Проанализируем правильный рабочий процесс:
Поместить в хранилище.Конфигурация – Хранилище конфигурации – Обновить конфигурацию из хранилища.Практика показывает, что при обновлении через хранилище вероятность сбоя кэша минимальна, так как механизм получения изменений из хранилища работает иначе, чем ручная правка модуля в открытом конфигураторе. Если же вы все-таки вынуждены делать динамическое обновление, никогда не делайте два динамических обновления подряд без перезапуска конфигуратора или проверки результата.
Посмотрим на интересную особенность, замеченную опытными разработчиками. В старых версиях 1С после обновления часто предлагалось перезапустить конфигуратор. В новых версиях 8.3 этого нет, но потребность осталась. Выясним алгоритм безопасного обновления:
Ctrl+S (сохранение текста), затем F7 (обновление конфигурации БД).Если код все же отображается как старый, нам поможет принудительная очистка кэша. Но будьте осторожны: очистки просто пользовательских папок %AppData% часто недостаточно. Проанализируем необходимость очистки серверного кэша. Для этого на сервере 1С необходимо остановить службу 1C:Enterprise 8.3 Server Agent и очистить содержимое папки snacc (кэш прекомпилированных модулей) внутри каталога сеансов базы.
Иногда платформа 1С ошибочно полагает, что модуль не изменился, если объем правок слишком мал (например, изменился один символ). Платформа сравнивает хэш-суммы старого и нового текста и, если они совпали из-за ошибки алгоритма, не фиксирует транзакцию в SQL. Посмотрим, как принудительно заставить 1С сохранить код.
Если вы видите, что код не сохраняется, попробуйте добавить в модуль «значимый мусор» — например, большой блок комментариев:
// ПРИНУДИТЕЛЬНОЕ ОБНОВЛЕНИЕ ХЭША МОДУЛЯ
// Добавляем много текста, чтобы платформа точно зафиксировала
// изменения в таблице Config и создала новое поколение объекта.
// Код ниже:
Процедура МояПроцедура()
// Ваш реальный код здесь
КонецПроцедуры
После этого выполните сохранение. Большой объем новых данных гарантированно изменит хэш и заставит платформу обновить запись в базе данных SQL.
В исключительных случаях проблема кроется в «битой» таблице Config. Разберем шаги для системного администратора или ведущего разработчика. Если база клиент-серверная, необходимо проверить наличие незавершенных транзакций или дедлоков (deadlocks) в SQL Server Management Studio. Попробуйте выполнить следующие действия:
.dt и последующую загрузку (это полностью пересоберет таблицы конфигурации).Config средствами SQL. Особое внимание обратите на запись dbnames — если она повреждена, конфигуратор будет некорректно сопоставлять объекты метаданных.Проанализируем итоговый список правил, которые помогут сберечь ваши нервы и результаты труда:
.cf. Перед каждым обновлением, даже небольшим, сохраняйте копию модуля или всей конфигурации.8.3.10.2466. В более современных ветках (8.3.12 и выше) многие ошибки работы с shared_cache были исправлены.Помните, что стабильность системы важнее скорости внесения правок. Протирка монитора и молитвы Ктулху — это забавно, но работа через Хранилище конфигурации и регулярный перезапуск рабочих процессов сервера 1С помогают гораздо эффективнее.