Почему фоновые задания вешают базу данных 1С и как решить проблему зависания из-за динамического обновления

Системный администратор IT и автоматизация бизнеса
← На главную

Каждый администратор больших баз данных на платформе 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 к служебной таблице конфигурации:

  1. Полное сканирование таблицы (Full Table Scan / Clustered Index Scan): Использование масок в условиях поиска делает невозможным эффективное использование индексов СУБД по полю FileName. SQL-сервер вынужден каждый раз полностью сканировать огромную таблицу Config для поиска подходящих строк.
  2. Огромный объем данных: Таблица Config хранит конфигурацию всей системы в виде сжатых бинарных данных и XML-структур. Ее физический размер в зависимости от масштаба конфигурации может составлять от нескольких сотен мегабайт до десятков гигабайт. Постоянное чтение всей таблицы с диска в оперативную память вызывает 100% утилизацию дисковой подсистемы и процессора сервера СУБД.
  3. Конкуренция и эскалация блокировок (Lock Escalation): Каждое фоновое задание при старте инициализирует собственный сеанс и начинает читать конфигурацию. Когда одновременно запускаются несколько заданий (например, регламентные обмены, закрытие месяца, заполнение индексов), они генерируют параллельные тяжелые запросы чтения к таблице Config. СУБД блокирует строки, а затем и всю таблицу целиком, выстраивая запросы в бесконечную очередь. В результате этого база данных полностью зависает («ложится»), переставая отвечать даже на попытки входа администратора через консоль кластера.

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

Пошаговая инструкция по устранению проблемы через SQL

Если вы столкнулись с подобным поведением системы, наиболее надежным и быстрым способом решения проблемы является прямое удаление устаревших служебных записей из таблиц базы данных СУБД.

Важное предупреждение: Любые операции прямого изменения данных в СУБД в обход платформы 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С и клиентские приложения могут хранить старые метаданные локально, что приведет к повторному возникновению ошибок.

  1. Остановите службу сервера 1С:Предприятие (1C:Enterprise 8.x Server Agent).
  2. Перейдите в каталог расположения данных сервера (по умолчанию для Windows это C:\Program Files\1cv8\srvinfo\ или C:\Program Data\1C\1cv8\).
  3. Найдите папку вашего кластера (обычно называется reg_1541), зайдите в нее, найдите папку с идентификатором вашей базы данных и удалите внутри нее все кэш-каталоги (такие как snccntry, config).
  4. Запустите службу сервера 1С:Предприятие.
  5. Очистите кэш у пользователей на рабочих станциях. Для этого можно воспользоваться штатными возможностями удаления базы из списка запуска и ее повторного добавления, либо вручную удалить папки кэша по путям:
    • %LocalAppData%\1C\1Cv8\
    • %AppData%\1C\1Cv8\

Альтернативный штатный метод решения (без использования SQL)

Если у вас нет прав доступа к СУБД или вы опасаетесь вносить изменения напрямую в таблицы баз данных, вы можете заставить платформу самостоятельно провести реструктуризацию и очистить служебные маркеры штатными средствами конфигуратора. Для этого выполните следующие действия:

  1. Установите монопольный режим работы с базой данных. Для этого в консоли кластера 1С заблокируйте начало новых сеансов и запустите блокировку регламентных (фоновых) заданий.
  2. Завершите все активные сеансы пользователей.
  3. Запустите систему в режиме Конфигуратор.
  4. Внесите любое минимальное, незначительное изменение в метаданные. Например, откройте наименее используемый общий модуль (или создайте новый пустой вспомогательный модуль), добавьте один пробел или комментарий в текст кода, после чего сохраните изменения.
  5. Выполните обновление конфигурации базы данных, нажав клавишу F7.
  6. Поскольку все пользователи отключены, платформа выполнит полноценное монопольное обновление конфигурации. В ходе этого процесса система выполнит слияние таблиц, удалит записи DynamicallyUpdated и очистит временные файлы обновлений автоматически.
  7. Удалите внесенное временное изменение (верните конфигурацию в исходное состояние) и снова обновите базу данных по кнопке F7.

После этого снимите блокировку сеансов и регламентных заданий в консоли кластера. Система вернется к штатной работе без зависаний.

Рекомендации по предотвращению проблемы в будущем

Для того чтобы избежать повторения подобной критической ситуации, мы рекомендуем придерживаться нескольких простых правил администрирования:

← На главную