Каждый опытный разработчик или администратор баз данных «1С:Предприятие» рано или поздно сталкивается с мистической на первый взгляд ситуацией. Вы провели вечер за доработкой конфигурации, сохранили изменения, выполнили обновление базы данных, тщательно всё протестировали — всё работает идеально. Однако на следующее утро пользователи жалуются на старые ошибки, а открыв Конфигуратор, вы обнаруживаете, что все ваши вчерашние труды исчезли без следа, будто их «корова языком слизала».
В этой статье мы подробно разберем, почему происходит этот самопроизвольный откат метаданных, как устроен механизм «демонического» динамического обновления и какие практические шаги необходимо предпринять, чтобы навсегда устранить эту проблему.
Динамическое обновление (обновление конфигурации базы данных «на лету», когда в системе работают пользователи) — крайне удобный, но в то же время самый опасный инструмент администрирования 1С. В среде разработчиков его не зря называют «демоническим».
Давайте рассмотрим, как устроен этот механизм изнутри. Когда мы запускаем обычное монопольное обновление, платформа полностью блокирует базу данных, считывает новые метаданные, проводит реструктуризацию таблиц СУБД, обновляет конфигурацию в основной таблице Config и очищает устаревшие версии метаданных. Все пользователи при этом гарантированно получают обновленную версию при следующем входе.
При динамическом обновлении ситуация принципиально иная:
В этот момент возникает состояние раздвоения (или даже «растроения») конфигурации. Сервер 1С начинает путаться в версиях метаданных, хранящихся в кэше. Если цепочка динамических обновлений за день была длинной (более 3–5 обновлений подряд), вероятность сбоя механизма адресации версий стремится к 100%.
Проанализировав практику эксплуатации систем на платформе «1С:Предприятие 8.3» (особенно на релизах ветки 8.3.10, таких как 8.3.10.2580), можно выделить несколько ключевых причин, из-за которых изменения могут «откатиться» назад.
Вся конфигурация 1С хранится в СУБД (например, Microsoft SQL Server) в системных таблицах базы данных. Основная конфигурация лежит в таблице Config, а редактируемая конфигурация разработчика — в ConfigSave. Во время динамического обновления платформа использует маркерные записи, такие как commit, dynamicCommit и dbStruFinal.
Если в процессе сохранения метаданных произошел сетевой сбой, нехватка оперативной памяти на сервере или аварийно перезапустился рабочий процесс rphost, транзакция записи этих маркеров зависает. Внешне Конфигуратор может рапортовать об успешном обновлении, но на уровне СУБД данные не консолидируются. При первом же утреннем перезапуске службы сервера 1С или регламентном обслуживании SQL-сервера система обнаруживает некорректное состояние транзакций и автоматически выполняет откат (rollback) к последней стабильной монопольной версии конфигурации.
Для ускорения работы сервер 1С активно кэширует скомпилированные модули и метаданные в своих рабочих каталогах (папка srvinfo). При динамическом обновлении новые версии модулей должны подгружаться в кэш процессов rphost, вытесняя старые. Однако на практике часто происходит сбой синхронизации: процесс rphost продолжает удерживать старую версию кэша в памяти. При закрытии Конфигуратора или перезапуске процессов старый кэш перезаписывает новые данные, возвращая конфигурацию к исходному вечернему состоянию.
В ряде релизов платформы 1С v8.3 присутствует неприятный баг работы Конфигуратора с кэшем метаданных. Выглядит это следующим образом: программист вносит изменения в форму или модуль, нажимает кнопку «Обновить конфигурацию базы данных» (F7). Затем, не закрывая окно Конфигуратора, он продолжает работу, закрывает измененный объект и открывает его снова. Визуально изменения внутри Конфигуратора пропадают! Система считает, что объект не менялся.
Однако если полностью закрыть Конфигуратор и открыть его заново — изменения возвращаются. Опасность здесь кроется в том, что если разработчик не заметил этот визуальный «откат» и поверх него внес другие изменения, кэш окончательно разрушается, и при следующем обновлении метаданные затрутся реальным мусором.
При динамическом обновлении критически важно, чтобы в системе не выполнялись тяжелые регламентные задания (например, закрытие месяца, расчет себестоимости или извлечение текстов). Если в момент фиксации динамического обновления фоновое задание обращается к метаданным, платформа блокирует таблицы СУБД, прерывая процесс обновления на полушаге. Конфигурация оказывается в «разорванном» состоянии.
Иногда корень проблемы лежит на уровне операционной системы. Современные антивирусные программы (или защитник Windows Defender) могут без явного уведомления администратора запустить Конфигуратор 1С (файл 1cv8.exe) в так называемой «песочнице» (sandbox). В течение дня разработчик сохраняет изменения, запускает отладку, видит результат — все работает, потому что песочница эмулирует запись на диск во временное виртуальное пространство. Но ночью, при перезапуске компьютера или очистке временных файлов антивирусом, виртуальный диск песочницы полностью обнуляется, возвращая систему к исходному состоянию.
Для того чтобы исключить пропадание изменений конфигурации и навести порядок в обновлении баз данных, рекомендуем придерживаться следующего алгоритма.
Если вы столкнулись с эффектом «пропадания» изменений, первым делом необходимо очистить кэш. Кэш нужно чистить как на стороне сервера приложений 1С, так и локально у разработчика.
Для очистки серверного кэша выполните следующие действия:
1C:Enterprise 8.3 Server Agent).C:\Program Files\1cv8\srvinfo или C:\Program Files (x86)\1cv8\srvinfo).reg_1541).14be7d94-8a41-4c12-b103-7a98bc653d10).snmp, Config и ConfigSave (в них хранится кэш метаданных). Внимание! Никогда не удаляйте папку 1Cv8Log, так как в ней содержится журнал регистрации вашей базы данных!Для автоматизации этой процедуры (например, для выполнения её каждую ночь) мы рекомендуем создать командный файл (батник) следующего содержания:
@echo off
set serviceName="1C:Enterprise 8.3 Server Agent"
set srvInfoPath="C:\Program Files\1cv8\srvinfo"
echo Останавливаем службу сервера 1С...
net stop %serviceName%
timeout /t 5 /nobreak
echo Очищаем серверный кэш метаданных...
for /d %%p in ("%srvInfoPath%\reg_1541\*") do (
for /d %%c in ("%%p\*") do (
if exist "%%c\snmp" rmdir /s /q "%%c\snmp"
if exist "%%c\Config" rmdir /s /q "%%c\Config"
if exist "%%c\ConfigSave" rmdir /s /q "%%c\ConfigSave"
)
)
echo Запускаем службу сервера 1С...
net start %serviceName%
echo Процедура очистки успешно завершена!
Если после чистки кэша Конфигуратор все еще ведет себя странно, проверим состояние базы данных на уровне MS SQL Server. Нам нужно убедиться, что в таблице редактируемой конфигурации нет зависших «хвостов».
Запустите SQL Server Management Studio (SSMS), выберите вашу базу данных и выполните следующий безопасный запрос на чтение:
-- Проверяем наличие временных несохраненных данных конфигурации
SELECT COUNT(*) FROM dbo.ConfigSave;
Если запрос возвращает количество строк больше нуля, это значит, что в базе есть несохраненные (или аварийно зависшие) изменения конфигурации разработчика. Если при этом в самом Конфигураторе у вас все закрыто и сохранено, это явный признак рассинхронизации. В таком случае (после обязательного создания резервной копии базы данных!) можно применить радикальную очистку таблицы редактируемой конфигурации:
-- Очистка зависшего кэша редактируемой конфигурации (выполнять строго на копии!)
TRUNCATE TABLE dbo.ConfigSave;
Если разработка ведется с использованием Хранилища конфигурации 1С, то при динамическом обновлении часто возникает рассинхронизация локальной версии разработчика, версии в Хранилище и версии в базе данных.
Для решения этой проблемы придерживайтесь правил совместной разработки:
.cf) и только затем при необходимости подключайте базу обратно к Хранилищу.Практика администрирования крупных систем показывает, что сервер 1С чувствует себя намного стабильнее, если выполнять его регулярную перезагрузку. Настройте в планировщике задач Windows ежедневный ночной перезапуск службы 1С (например, в 03:00 ночи, предварительно завершив все сеансы пользователей). Это гарантирует, что весь накопленный за день кэш метаданных будет сброшен, а память процессов rphost очистится от зависших динамических обновлений.
Чтобы минимизировать риски потери вашего программного кода, возьмите за правило соблюдать несколько простых рекомендаций:
.cf) или полное резервное копирование базы данных СУБД. Это убережет вас от потери результатов многочасовой работы.