Почему зависает сравнение и объединение конфигураций в 1С на 0% и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

В процессе активной разработки и поддержки крупных информационных баз на платформе 1С:Предприятие 8.3 (особенно таких тяжелых решений, как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей) специалисты часто сталкиваются с крайне неприятной проблемой. При попытке выполнить сравнение и объединение конфигураций (например, при обновлении через меню Конфигурация — Поддержка — Настройка поддержки — Сравнить, объединить или при сравнении с внешним файлом .cf) процесс намертво застывает на отметке 0%.

При этом конфигуратор не выдает никаких ошибок, загрузка процессора на сервере может как отсутствовать, так и зашкаливать, а само ожидание может длиться часами без какого-либо результата. В этой статье мы подробно разберем, почему возникает эта техническая неполадка, проанализируем её глубокие системные причины и рассмотрим несколько проверенных способов решения проблемы.

Метод 1. Принудительная реструктуризация и обновление метаданных через Хранилище (Способ автора темы)

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

Для того чтобы заставить платформу принудительно и полностью переписать метаданные, выполним следующие шаги:

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

Почему это помогает? При получении изменений из Хранилища платформа 1С производит принудительное обновление конфигурации «сверху вниз», полностью перезаписывая внутренние индексы, кэш метаданных и выстраивая заново таблицы связей. После этой процедуры внутренний конфликт структуры устраняется, и процесс сравнения/объединения начинает работать в штатном режиме.

Метод 2. Очистка «хвостов» динамического обновления на уровне СУБД

Выясним истинную причину, почему сравнение зависает на 0% в клиент-серверном режиме. Очень часто виной всему становится злоупотребление механизмом динамического обновления (так называемым обновлением «на лету» или «демонами»). При частом применении этого метода в служебных таблицах СУБД накапливается мусор.

В базе данных SQL за хранение конфигурации отвечают таблицы dbo.Config (активная конфигурация) и dbo.ConfigSave (сохраняемая конфигурация). При некорректно завершенных динамических обновлениях в таблице Config зависают служебные записи со специальными именами. Платформа при попытке сравнения натыкается на эти записи, уходит в бесконечный цикл сопоставления версий и зависает.

Чтобы решить эту проблему напрямую через СУБД, выполним очистку данных таблиц с помощью SQL-скрипта (предварительно обязательно создав резервную копию базы данных в SQL Server Management Studio):


-- Очищаем таблицу редактируемой конфигурации, чтобы сбросить несохраненные сессии
DELETE FROM dbo.ConfigSave;

-- Удаляем зависшие записи транзакций динамического обновления из активной конфигурации
DELETE FROM dbo.Config WHERE FileName = 'commit';
DELETE FROM dbo.Config WHERE FileName = 'dynamicCommit';
DELETE FROM dbo.Config WHERE FileName = 'dbStruFinal';

После выполнения данного скрипта необходимо в обязательном порядке:

  1. Остановить службу сервера 1С:Предприятия (ragent).
  2. Очистить серверный кэш базы данных (удалить каталог snccntry и временные файлы в папке сервера приложений reg_1541).
  3. Запустить службу сервера 1С:Предприятия.
  4. Открыть Конфигуратор и запустить сравнение заново.

Метод 3. Борьба с ограничениями 32-разрядного конфигуратора и обновление платформы

Проанализируем технические характеристики серверов, указанные в обсуждении. На проблемном сервере была установлена платформа версии 8.3.15.1565, а на работающем — более свежая 8.3.15.1700. Разница в релизах платформы играет критическую роль.

Стоит помнить, что в старых версиях платформы 1С (включая ветку 8.3.15) клиентское приложение и сам Конфигуратор (1cv8.exe) являлись исключительно 32-разрядными программами, даже если серверная часть была 64-разрядной. Для 32-битного процесса операционная система может выделить максимум 2–3 ГБ оперативной памяти.

При сравнении тяжелых конфигураций (таких как ERP) конфигуратор пытается построить в оперативной памяти гигантское дерево метаданных двух конфигураций одновременно. Память мгновенно заполняется, процесс упирается в лимит, начинает бесконечно вызывать сборщик мусора (Garbage Collector) и фактически застывает на 0% прогресса.

Как решить эту проблему:

  1. Обновление платформы: Установим более современную версию платформы (рекомендуется переход на ветки 8.3.20 и выше), где присутствует полноценный 64-разрядный клиент. 64-битный конфигуратор не имеет ограничений по памяти и легко справляется со сравнением баз любого объема.
  2. Обходной файловый метод: Если обновить платформу на сервере прямо сейчас невозможно, выгрузим конфигурацию в файл .cf. Создадим локальную файловую базу на мощном компьютере разработчика, загрузим туда .cf, выполним сравнение и объединение локально. Полученный результат снова сохраним в .cf и просто загрузим в серверную базу через команду Конфигурация — Загрузить конфигурацию из файла.

Метод 4. Полная очистка серверного и локального кэша приложений

Кэш сервера приложений 1С и локальный кэш пользователя часто содержат устаревшие или поврежденные схемы метаданных. Разберем по шагам, как правильно произвести тотальную очистку кэша:

Шаг 1. Очистка локального кэша пользователя на компьютере, где запускается Конфигуратор:

  1. Закроем все запущенные сеансы 1С.
  2. Перейдем в каталоги временных файлов пользователя:
    • %USERPROFILE%\AppData\Local\1C\1Cv8
    • %USERPROFILE%\AppData\Roaming\1C\1Cv8
  3. Удалим все папки с длинными шестнадцатеричными именами (например, 8a4f3b2c-901d-...).

Шаг 2. Очистка серверного кэша на сервере 1С:Предприятия:

  1. Остановим службу сервера 1С.
  2. Перейдем в каталог реестра кластера серверов (по умолчанию это C:\Program Files\1cv8\srvinfo\reg_1541).
  3. Найдем папку с UID нашей базы данных и удалим внутри нее каталог snccntry (это кэш структур баз данных).
  4. Запустим службу сервера приложений.

Метод 5. Оптимизация сетевых настроек физического сервера

Сравнение объектов конфигурации генерирует колоссальное количество мелких сетевых запросов между сервером 1С и СУБД (SQL). Если сервер приложений 1С и сервер SQL разнесены на разные физические машины, сетевые задержки могут приводить к потере пакетов под высокой нагрузкой. Сервер 1С уходит в режим бесконечного ожидания ответа от СУБД, а шкала сравнения застревает на 0%.

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


netsh int tcp set global chimney=disabled

Эти меры значительно повысят стабильность передачи мелких пакетов данных между сервером приложений 1С и сервером баз данных SQL, предотвращая зависание сетевых сокетов процессов rphost во время выполнения тяжелых операций сравнения метаданных.

← На главную