Динамическое обновление конфигурации (так называемое «обновление на лету») — это удобный, но крайне рискованный механизм платформы 1С:Предприятие. Несмотря на то что он позволяет вносить изменения без выгона пользователей из системы, именно он часто становится причиной критических сбоев. В этой статье мы подробно разберем, почему «слетает» база, как интерпретировать ошибку «Удаленный хост принудительно разорвал соединение» и какими методами можно восстановить работоспособность системы.
Для начала проанализируем внутренний механизм этого процесса. Когда мы нажимаем «Обновить конфигурацию базы данных» и соглашаемся на динамическое обновление, 1С не заменяет основную конфигурацию мгновенно. Вместо этого в системной таблице Config создается новая версия метаданных, а старая помечается как активная для текущих сеансов.
Проблема кроется в рассинхронизации. Рабочий процесс сервера (rphost) кэширует структуру метаданных. Если при обращении пользователя к какому-либо объекту (например, общему модулю или форме) сервер обнаруживает несоответствие между тем, что лежит в его локальном кэше, и тем, что записано в таблицах базы данных на SQL-сервере, происходит критическая ошибка. Рабочий процесс просто «падает» (аварийно завершается), что на стороне клиента выглядит как внезапный разрыв соединения.
Как справедливо отмечено в обсуждении, иногда систему можно «протолкнуть» повторным обновлением. Если конфигуратор еще открывается и позволяет вносить правки, попробуем восстановить целостность транзакции обновления программным способом.
Разберем этот алгоритм по шагам:
F7 (Обновить конфигурацию базы данных).Этот метод заставляет платформу пересчитать контрольные суммы объектов метаданных и может корректно закрыть «зависшую» транзакцию предыдущего обновления.
Если повторное обновление не помогает, значит, битый кэш «застрял» на стороне сервера приложений 1С. Простой перезапуск службы 1C:Enterprise 8.3 Server Agent помогает редко, так как временные файлы при этом не удаляются. Проанализируем процесс глубокой очистки.
Выполним следующие действия:
services.msc.C:\Program Files\1cv8\srvinfo.reg_). Внутри них находятся папки с GUID информационных баз.snacc и conf внутри папки конкретной базы. Также рекомендуется очистить папку temp.После этих действий сервер будет вынужден заново считать структуру Config из SQL-таблиц, игнорируя старые (возможно, поврежденные) локальные копии метаданных.
Если база данных не дает зайти в конфигуратор и выдает ошибку сразу при старте, придется прибегнуть к хирургическому вмешательству на уровне СУБД. Рассмотрим работу с таблицей Config. Перед выполнением любых запросов обязательно сделайте бэкап базы данных средствами SQL!
Часто причиной сбоя является наличие записи commit в таблице конфигурации, которая указывает на незавершенный процесс обновления. Рассмотрим пример SQL-запроса для очистки проблемных состояний:
-- Проверяем наличие 'зависших' записей
SELECT * FROM dbo.Config WHERE FileName = 'commit'
-- Если запись найдена, удаляем её для отката состояния
DELETE FROM dbo.Config WHERE FileName = 'commit'
-- Также очищаем таблицу временных изменений конфигурации
TRUNCATE TABLE dbo.ConfigSave
После удаления записи commit система будет считать, что динамическое обновление не было завершено, и «откатится» к стабильному состоянию основной конфигурации. После этого рекомендуется зайти в конфигуратор и выполнить полное (не динамическое) обновление.
В самых тяжелых случаях динамическое обновление повреждает таблицу DBNames, в которой хранится карта соответствия объектов метаданных (например, Справочник.Номенклатура) именам таблиц в SQL (например, _Reference25). Если эта таблица повреждена, база перестает понимать свою структуру.
Рассмотрим способы решения этой ситуации:
.dt и загрузить ее обратно. При загрузке 1С полностью пересоздает структуру таблиц и файл DBNames формируется заново.DBNames, которые сопоставляют структуру метаданных из файла конфигурации с физическими таблицами (это требует высокой квалификации специалиста).Проанализируем правила «гигиены» при разработке в 1С, которые помогут избежать клуба любителей «упавших» баз:
Вызов сервера. Это гарантированный способ получить ошибку у пользователей в момент обращения к функциям модуля.Подводя итог, можно сказать: динамическое обновление — это инструмент для экстренных исправлений опечаток в коде, а не для полноценной разработки. Если же беда случилась, начните с очистки кэша и только потом переходите к манипуляциям с SQL-таблицами.