Каждый администратор больших баз данных на платформе 1С:Предприятие рано или поздно сталкивается с ситуацией, когда система внезапно перестает отвечать на запросы. Это проявляется лавинообразно: пользователи жалуются на зависание при попытке авторизации, фоновые задания (как регламентные по расписанию, так и запущенные вручную) «застревают» в памяти, а консоль кластера серверов 1С полностью перестает реагировать на любые команды. Обычные меры — такие как очистка локального кэша, перезапуск службы сервера или даже перезагрузка физического сервера — дают лишь временный эффект или не помогают вовсе.
В этой статье мы подробно разберем, почему возникает подобный сбой, проанализируем его внутренние механизмы взаимодействия платформы 1С и СУБД (на примере MS SQL Server), а также изучим детальные инструкции по диагностике и полному устранению проблемы как через прямые SQL-запросы, так и штатными средствами платформы.
Для того чтобы понять природу этой критической ошибки, рассмотрим логику работы платформы 1С при обновлении конфигурации. Платформа поддерживает механизм так называемого «динамического» (или в обиходе — «демонического») обновления. Этот режим позволяет обновлять конфигурацию базы данных без отключения активных пользователей. В момент применения динамического обновления в служебных таблицах СУБД создаются специальные маркеры, сигнализирующие платформе о том, что структура метаданных была изменена «на лету».
Главным признаком такого обновления является запись со значением DynamicallyUpdated в поле FileName служебной таблицы Config (для платформы 8.2) или таблицы Params (начиная с версии платформы 8.3).
Когда этот маркер присутствует в базе данных, логика обращения платформы к таблицам конфигурации кардинально меняется. В штатном (обычном) режиме работы для получения структуры объектов метаданных платформа выполняет точечные, быстрые и оптимизированные запросы к конкретным записям конфигурации. Пример стандартного системного запроса выглядит так:
SELECT DataSize FROM Config WHERE FileName = @P1
Однако, как только платформа считывает признак динамического обновления DynamicallyUpdated, она переходит в режим постоянной проверки актуальности кэша метаданных. При каждом новом обращении, запуске сеанса или старте фонового задания платформа начинает проверять, не появились ли новые временные файлы обновлений. Для этого генерируется тяжелый поисковый запрос с использованием оператора сравнения по маске (wildcard):
SELECT FileName, Creation, Modified, Attributes, DataSize FROM Config WHERE FileName LIKE @P1
В качестве параметра @P1 СУБД передает шаблоны поиска (например, _dynupdate% или аналогичные маски). Именно этот запрос становится источником катастрофического падения производительности всей системы.
Давайте проанализируем, к каким последствиям приводит выполнение запроса с оператором LIKE к служебной таблице конфигурации:
FileName. SQL-сервер вынужден каждый раз полностью сканировать огромную таблицу Config для поиска подходящих строк.Config хранит конфигурацию всей системы в виде сжатых бинарных данных и XML-структур. Ее физический размер в зависимости от масштаба конфигурации может составлять от нескольких сотен мегабайт до десятков гигабайт. Постоянное чтение всей таблицы с диска в оперативную память вызывает 100% утилизацию дисковой подсистемы и процессора сервера СУБД.Config. СУБД блокирует строки, а затем и всю таблицу целиком, выстраивая запросы в бесконечную очередь. В результате этого база данных полностью зависает («ложится»), переставая отвечать даже на попытки входа администратора через консоль кластера.Данные маркеры динамического обновления должны автоматически удаляться платформой после того, как все пользователи перезапустили свои сеансы и произошло монопольное слияние конфигураций. Однако на практике маркеры «застревают» в СУБД навсегда в следующих случаях:
Если вы столкнулись с подобным поведением системы, наиболее надежным и быстрым способом решения проблемы является прямое удаление устаревших служебных записей из таблиц базы данных СУБД.
Важное предупреждение: Любые операции прямого изменения данных в СУБД в обход платформы 1С потенциально опасны. Перед началом выполнения инструкций обязательно сделайте полную резервную копию (бэкап) базы данных! Все действия должны выполняться строго при остановленной службе сервера 1С:Предприятие (или при полностью отключенных сеансах пользователей).
Рассмотрим по шагам процесс очистки таблиц базы данных в среде MS SQL Server.
Шаг 1. Поиск «зависших» маркеров динамического обновления
Откройте MS SQL Server Management Studio (SSMS), создайте новый запрос к вашей проблемной базе данных и выполните следующий скрипт для обнаружения проблемных записей:
SELECT * FROM Config WHERE FileName = 'DynamicallyUpdated';
SELECT * FROM Params WHERE FileName = 'DynamicallyUpdated';
SELECT * FROM Config WHERE FileName IN ('commit', 'dynamicCommit', 'dbStruFinal');
SELECT * FROM Config WHERE FileName LIKE '%dynupdate%';
Если данные запросы вернули строки (особенно первая или вторая строки поиска DynamicallyUpdated), это однозначно подтверждает наличие проблемы «демонического» обновления.
Шаг 2. Очистка системных таблиц от мусора
Для удаления записей, блокирующих нормальную работу СУБД, выполните следующий транзакционный запрос:
-- Начинаем транзакцию для безопасности
BEGIN TRANSACTION;
-- Удаляем маркер динамического обновления из основной таблицы конфигурации
DELETE FROM Config WHERE FileName = 'DynamicallyUpdated';
-- Удаляем маркер из таблицы параметров конфигурации (актуально для 8.3)
DELETE FROM Params WHERE FileName = 'DynamicallyUpdated';
-- Удаляем следы временных файлов динамического обновления
DELETE FROM Config WHERE FileName LIKE '%dynupdate%';
-- Удаляем маркеры незавершенных транзакций фиксации изменений
DELETE FROM Config WHERE FileName IN ('commit', 'dynamicCommit', 'dbStruFinal');
-- Очищаем таблицу ConfigSave (хранилище несохраненной конфигурации)
-- Это действие отменит несохраненные изменения в Конфигураторе, вернув структуру к стабильной версии
DELETE FROM ConfigSave;
-- Если все прошло успешно, фиксируем транзакцию
COMMIT TRANSACTION;
Если при выполнении возникли ошибки, выполните команду ROLLBACK TRANSACTION; для отката изменений.
Шаг 3. Очистка серверного и клиентского кэша
После удаления записей на уровне SQL-сервера критически важно очистить кэш, так как сервер 1С и клиентские приложения могут хранить старые метаданные локально, что приведет к повторному возникновению ошибок.
1C:Enterprise 8.x Server Agent).C:\Program Files\1cv8\srvinfo\ или C:\Program Data\1C\1cv8\).reg_1541), зайдите в нее, найдите папку с идентификатором вашей базы данных и удалите внутри нее все кэш-каталоги (такие как snccntry, config).%LocalAppData%\1C\1Cv8\%AppData%\1C\1Cv8\Если у вас нет прав доступа к СУБД или вы опасаетесь вносить изменения напрямую в таблицы баз данных, вы можете заставить платформу самостоятельно провести реструктуризацию и очистить служебные маркеры штатными средствами конфигуратора. Для этого выполните следующие действия:
DynamicallyUpdated и очистит временные файлы обновлений автоматически.После этого снимите блокировку сеансов и регламентных заданий в консоли кластера. Система вернется к штатной работе без зависаний.
Для того чтобы избежать повторения подобной критической ситуации, мы рекомендуем придерживаться нескольких простых правил администрирования: