Каждый администратор крупных информационных систем на базе «1С:Предприятие» рано или поздно сталкивается с ситуацией, когда сервер СУБД MS SQL Server внезапно начинает потреблять до 100% ресурсов процессора (CPU). При этом со стороны пользователей жалоб на тяжелые отчеты или групповые обработки может не поступать, а технологический журнал не показывает явных длительных транзакций. Монитор ресурсов демонстрирует, что основную нагрузку генерируют рабочие процессы сервера приложений 1С (rphost), которые непрерывно засыпают SQL-сервер тяжелыми запросами.
В этой статье мы подробно разберем одну из самых коварных причин такого поведения систем — зависшее («мертвое») динамическое обновление конфигурации. Мы изучим механизм возникновения этой проблемы, научимся диагностировать её с помощью встроенных инструментов СУБД и рассмотрим детальный пошаговый алгоритм её устранения на уровне таблиц базы данных.
Прежде чем переходить к радикальным мерам и выполнению запросов к таблицам базы данных, нам необходимо локализовать проблему и убедиться, что причина кроется именно в СУБД и сервере 1С, а не во внешних факторах. Проанализируем ситуацию последовательно:
sqlservr.exe и rphost.exe делят между собой практически все ресурсы CPU, а дисковая очередь при этом остается минимальной, это первый признак зацикливания логики выполнения запросов.Config с выборкой больших объемов данных, это главный симптом повреждения конфигурации.Рассмотрим детально, почему штатный механизм платформы 1С приводит к столь разрушительным последствиям для производительности СУБД.
Динамическое обновление (в среде разработчиков известное как «демоническое») позволяет вносить изменения в программный код модулей без монопольного выгона пользователей из базы данных. Платформа при этом не реструктуризирует физические таблицы данных, а производит запись обновленных метаданных и бинарных файлов конфигурации непосредственно в системную таблицу СУБД с именем Config.
В процессе штатного обновления СУБД задействует две основные таблицы:
Config — хранит актуальную рабочую конфигурацию базы данных.ConfigSave — используется для сохранения конфигурации в процессе редактирования в Конфигураторе.Когда администратор запускает динамическое обновление, в таблице Config создаются специальные служебные записи (маркеры), сигнализирующие системе о начале процесса фиксации изменений. После успешного завершения транзакции эти маркеры удаляются. Однако, если в момент сохранения конфигурации происходит сбой — например, сетевое прерывание связи между сервером приложений и СУБД, аварийное завершение процесса rphost или принудительное закрытие Конфигуратора пользователем — транзакция завершается некорректно.
В результате в таблице Config остаются «зависшие» записи незавершенного обновления. При следующем обращении любого пользователя или фонового задания сервер приложений 1С обнаруживает несоответствие локального кэша метаданных и информации в СУБД. Платформа пытается разрешить эту коллизию и начинает бесконечно запрашивать конфигурацию из базы данных. Поскольку файлы конфигурации современных решений (таких как ERP, Комплексная автоматизация или Управление торговлей) весят сотни мегабайт, SQL-сервер моментально утилизирует все ресурсы процессора на бесконечное чтение тяжелых бинарных объектов (BLOB) из таблицы Config. Возникает так называемая «петля синхронизации».
Если мы столкнулись с описанной проблемой, её решение лежит в плоскости ручной корректировки таблиц конфигурации на уровне СУБД. Разберем этот процесс по шагам.
Важное предупреждение: Любые операции прямого изменения данных в СУБД в обход платформы 1С крайне опасны. Перед началом работ обязательно сделайте резервную копию базы данных (резервную копию SQL или средствами выгрузки в .dt)!
Для предотвращения блокировок таблиц и исключения записи некорректных данных в момент очистки, нам необходимо перевести базу в однопользовательский режим или временно остановить службу сервера приложений 1С.
Остановим службу 1C:Enterprise 8.3 Server Agent через оснастку «Службы» (services.msc) или с помощью командной строки:
net stop "1C:Enterprise 8.3 Server Agent"
Откроем среду SSMS, выберем нашу проблемную базу данных и создадим новый запрос. Нам необходимо выполнить очистку таблицы незавершенных сохранений ConfigSave и удалить маркеры динамического обновления из таблицы Config.
Проанализируем и выполним следующий SQL-скрипт:
-- Шаг 2.1. Полностью очищаем таблицу ConfigSave от незавершенных сохранений
TRUNCATE TABLE dbo.ConfigSave;
-- Шаг 2.2. Удаляем служебные маркеры блокировок и обновлений из таблицы Config
DELETE FROM dbo.Config
WHERE FileName IN ('commit', 'dbStruFinal', 'dynamicCommit', 'DynamicallyUpdated');
Рассмотрим, за что отвечают удаляемые маркеры в поле FileName:
commit — маркер начала транзакции записи конфигурации.dbStruFinal — признак завершения реструктуризации базы.dynamicCommit и DynamicallyUpdated — служебные флаги платформы 1С версии 8.3, указывающие на наличие незавершенных или активных сессий динамического обновления.После успешного выполнения скрипта таблицы базы данных СУБД приходят в согласованное состояние, соответствующее конфигурации до момента начала сбойного обновления.
Если мы просто запустим сервер 1С после очистки таблиц в SQL, высока вероятность, что рабочие процессы сервера приложений продолжат использовать старый кэш метаданных, хранящийся на диске сервера. Это может спровоцировать повторное зацикливание или вызвать у пользователей критическую ошибку «Ошибка формата потока» при запуске сеанса.
Выполним очистку кэша на сервере приложений 1С по следующей схеме:
usr1cv8).C:\Users\usr1cv8\AppData\Local\1C\1Cv8 (или в папке Roaming).ConfigConfigSaveDBNameCacheSICacheПосле удаления серверного кэша запустим службу сервера приложений 1С обратно:
net start "1C:Enterprise 8.3 Server Agent"
Также рекомендуется очистить локальный кэш на компьютерах пользователей, у которых наблюдались проблемы с запуском системы после сбоя. Самый простой способ сделать это — удалить базу из списка запуска в стартере 1С и добавить её заново (при этом папка кэша с UUID пересоздастся автоматически).
Для того чтобы минимизировать риски возникновения подобных аварийных ситуаций, советуем придерживаться нескольких простых правил администрирования:
Config и Params) и проводите дефрагментацию индексов. Это поможет СУБД строить оптимальные планы запросов и снизит нагрузку на дисковую подсистему.