Почему зависает обновление 1С:Комплексная автоматизация 2.2 и как решить эту проблему?

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

Обновление крупных конфигураций, таких как 1С:Комплексная автоматизация (КА) или 1С:ERP Управление предприятием, — это сложный и ресурсоемкий процесс. Переход между крупными релизами (например, с версии 2.2 на 2.4) часто сопровождается длительным выполнением дополнительных обработок данных в режиме «1С:Предприятие».

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

---

Почему 1С постоянно перезаписывает константу «Сведения об обновлении ИБ»?

Для начала выясним причину странного поведения системы, при котором журнал регистрации переполняется записями об изменении одной и той же константы. Константа СведенияОбОбновленииИБ в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) играет ключевую роль. В ней хранится объект типа ХранилищеЗначения, содержащий дерево всех обработчиков обновления (как интерактивных, так и отложенных фоновых).

Во время обновления БСП запускает специальный диспетчер фоновыми заданиями. Этот диспетчер циклически выполняет следующие действия:

  1. Опрашивает статус выполнения каждого запущенного фонового потока (обработчика).
  2. Фиксирует процент выполнения задач.
  3. Записывает актуальную структуру со статусами обратно в константу СведенияОбОбновленииИБ.

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

---

Причины зависания обновления в файловом режиме

Выполнение обновления тяжелых конфигураций в файловом режиме работы (база данных формата .1CD) — крайне рискованное мероприятие. Рассмотрим основные причины, почему процесс может длиться бесконечно:

  1. Ограничения файловой СУБД по параллелизму. В файловой версии все фоновые задания эмулируются последовательно в рамках одного сеанса или выполняются в один поток. Вся мощь многопоточности БСП здесь полностью нивелируется.
  2. Проблемы конкретных версий платформы. На некоторых релизах платформы (например, в ветке 8.3.13) присутствуют зарегистрированные ошибки, связанные с некорректной работой механизма распараллеливания фоновых обработчиков обновления. В результате потоки блокируют друг друга.
  3. Проблема размера таблиц. База данных объемом более 4 Гб в файловом режиме близка к технологическому пределу. В процессе реструктуризации и выполнения запросов временные таблицы могут превысить лимит в 4 Гб на одну таблицу, что приводит к критическому падению производительности и зависанию СУБД 1С без вывода ошибок.
  4. Некорректные данные (битые ссылки, дубли). Обработчики документов и регистров (например, по распределению партий или формированию движений) при наличии дублирующих ключей аналитики или пустых реквизитов могут уходить в вечный цикл, безуспешно пытаясь обработать «проблемный» документ.

---

Пошаговый алгоритм диагностики и решения проблемы

Если ваше обновление «зависло» на этапе выполнения обработчиков в режиме «1С:Предприятие», выполним последовательно следующие шаги для локализации и устранения проблемы.

Шаг 1. Анализ прогресса отложенного обновления

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

  1. Если монопольный режим позволяет, откроем дополнительный сеанс под правами администратора.
  2. Перейдем в раздел НСИ и администрирование -> Обслуживание -> Обновление программы.
  3. Откроем гиперссылку Результаты обновления и отложенные данные (или запустим отчет «Прогресс отложенного обновления»).
  4. Проанализируем список обработчиков. Обратим внимание на те, которые имеют статус «Выполняется» или «Запущено», а также на количество попыток выполнения. Если количество попыток у какого-то обработчика постоянно растет, а процент выполнения равен нулю — именно он является виновником зависания.

Шаг 2. Перенос базы данных в клиент-серверный вариант (рекомендуемый метод)

Для баз данных «1С:Комплексная автоматизация» объемом более 2-3 Гб настоятельно рекомендуем проводить процедуру обновления исключительно на СУБД (MS SQL Server, PostgreSQL и т.д.). Разберем, как быстро перенести процесс:

  1. Принудительно завершим зависший процесс в диспетчере задач (сняв задачу 1cv8.exe). Не беспокойтесь за целостность данных, если у вас сделана резервная копия (бэкап) перед началом обновления — а ее нужно делать всегда!
  2. Выгрузим информационную базу в файл резервной копии .dt (или просто скопируем файл 1Cv8.1CD).
  3. Развернем базу на временном или тестовом сервере СУБД.
  4. Запустим обновление на сервере. В клиент-серверном варианте БСП задействует все доступные ядра процессора и выполнит отложенные обработчики в несколько параллельных потоков. Процесс, который в файловой базе длился трое суток, на SQL-сервере обычно завершается за несколько часов.
  5. В консоли кластера серверов 1С или с помощью встроенных инструментов СУБД (например, SQL Server Profiler) мы сможем четко увидеть, какой именно SQL-запрос выполняется в данный момент и не заблокирована ли таблица транзакцией.
  6. После успешного завершения всех обработчиков обновления выгрузим базу обратно в файловый вариант (при необходимости).

Шаг 3. Отладка и локализация сбойного обработчика

Если перенос на SQL-сервер не помог и процесс все равно зависает на конкретном обработчике, проведем отладку на копии базы данных:

  1. Развернем копию базы данных.
  2. Запустим конфигуратор, перейдем в параметры отладки и установим флаг Отладка фоновых заданий.
  3. Установим точку останова в общем модуле, где выполняются процедуры обновления БСП (например, в модуле ОбновлениеИнформационнойБазыСлужебный в процедурах запуска обработчиков).
  4. Запустим отладку. При остановке на контрольной точке мы сможем по шагам отследить, на каком именно документе или записи регистра обработчик уходит в бесконечный цикл. Часто проблема кроется в незаполненном реквизите или битой ссылке в старых документах прошлых периодов.

Шаг 4. Программный обход зависшего обработчика

В случаях, когда сбойный обработчик отвечает за заполнение устаревших или неиспользуемых аналитик (например, архивных данных пятилетней давности), и его зависание блокирует работу всей компании, мы можем принудительно пометить данный обработчик как выполненный.

Для этого напишем и запустим простую внешнюю обработку, которая напрямую модифицирует дерево обработчиков в константе СведенияОбОбновленииИБ. Рассмотрим пример программного кода для реализации этого метода:


// Процедура для принудительной пометки обработчика как выполненного
Процедура ОбойтиЗависшийОбработчик(ИмяОбработчика) Экспорт
    
    // Получаем структуру данных из хранилища значения константы
    ДанныеОбновления = Константы.СведенияОбОбновленииИБ.Получить();
    Если ДанныеОбновления = Неопределено Тогда
        Предупреждение("Константа СведенияОбОбновленииИБ пуста!");
        Возврат;
    КонецЕсли;
    
    ДеревоОбработчиков = ДанныеОбновления.Получить();
    
    // Осуществляем поиск строки с зависшим обработчиком по его имени
    СтрокаОбработчика = ДеревоОбработчиков.Строки.Найти(ИмяОбработчика, "ИмяПроцедуры", Истина);
    
    Если СтрокаОбработчика <> Неопределено Тогда
        // Меняем статус обработчика на "Выполнен"
        СтрокаОбработчика.Статус = "Выполнено";
        СтрокаОбработчика.КоличествоПопыток = 0;
        
        // Записываем измененное дерево обратно в константу
        Константы.СведенияОбОбновленииИБ.Установить(Новый ХранилищеЗначения(ДеревоОбработчиков));
        Сообщить("Статус обработчика " + ИмяОбработчика + " успешно изменен на 'Выполнено'.");
    Иначе
        Сообщить("Обработчик с именем " + ИмяОбработчика + " не найден в дереве.");
    КонецЕсли;
    
КонецПроцедуры

Важное предупреждение: Использовать данный метод следует с осторожностью и только тогда, когда вы точно понимаете, за что отвечает пропускаемый обработчик. Пропуск критически важных обработчиков (например, по расчету себестоимости или регистров накопления) может привести к расхождению движений и ошибкам в учете в дальнейшем.

---

Выводы и рекомендации

Проанализировав проблему зависания обновлений в конфигурациях уровня 1С:КА 2 и ERP, мы можем резюмировать следующее:

← На главную