Обновление крупных конфигураций, таких как 1С:Комплексная автоматизация (КА) или 1С:ERP Управление предприятием, — это сложный и ресурсоемкий процесс. Переход между крупными релизами (например, с версии 2.2 на 2.4) часто сопровождается длительным выполнением дополнительных обработок данных в режиме «1С:Предприятие».
В процессе такого обновления администраторы и разработчики нередко сталкиваются с ситуацией, когда процесс визуально «зависает». При этом в журнале регистрации фиксируются постоянные, ежесекундные обращения к константе СведенияОбОбновленииИБ, процессор загружен на максимум, но видимого прогресса нет. В этой статье мы подробно разберем, почему возникает эта проблема, как провести ее глубокую диагностику и какими методами можно ускорить или принудительно завершить зависший процесс обновления.
---
Для начала выясним причину странного поведения системы, при котором журнал регистрации переполняется записями об изменении одной и той же константы. Константа СведенияОбОбновленииИБ в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) играет ключевую роль. В ней хранится объект типа ХранилищеЗначения, содержащий дерево всех обработчиков обновления (как интерактивных, так и отложенных фоновых).
Во время обновления БСП запускает специальный диспетчер фоновыми заданиями. Этот диспетчер циклически выполняет следующие действия:
СведенияОбОбновленииИБ.Если один из обработчиков падает с ошибкой, уходит в бесконечный цикл из-за некорректных данных в информационной базе или блокируется СУБД, диспетчер БСП пытается перезапустить его. При каждом цикле проверки и перезапуска константа обновляется заново. Именно это постоянное «теребление» константы мы и видим в журнале регистрации. Само по себе это поведение нормально, но если оно продолжается двое или трое суток без изменения общего прогресса — это явный признак зацикливания или критического зависания одного из потоков.
---
Выполнение обновления тяжелых конфигураций в файловом режиме работы (база данных формата .1CD) — крайне рискованное мероприятие. Рассмотрим основные причины, почему процесс может длиться бесконечно:
8.3.13) присутствуют зарегистрированные ошибки, связанные с некорректной работой механизма распараллеливания фоновых обработчиков обновления. В результате потоки блокируют друг друга.---
Если ваше обновление «зависло» на этапе выполнения обработчиков в режиме «1С:Предприятие», выполним последовательно следующие шаги для локализации и устранения проблемы.
Прежде чем прерывать процесс, нам необходимо понять, зависла ли система полностью или она все же медленно выполняет полезную работу. Для этого воспользуемся встроенным отчетом БСП:
Для баз данных «1С:Комплексная автоматизация» объемом более 2-3 Гб настоятельно рекомендуем проводить процедуру обновления исключительно на СУБД (MS SQL Server, PostgreSQL и т.д.). Разберем, как быстро перенести процесс:
1cv8.exe). Не беспокойтесь за целостность данных, если у вас сделана резервная копия (бэкап) перед началом обновления — а ее нужно делать всегда!.dt (или просто скопируем файл 1Cv8.1CD).Если перенос на SQL-сервер не помог и процесс все равно зависает на конкретном обработчике, проведем отладку на копии базы данных:
ОбновлениеИнформационнойБазыСлужебный в процедурах запуска обработчиков).В случаях, когда сбойный обработчик отвечает за заполнение устаревших или неиспользуемых аналитик (например, архивных данных пятилетней давности), и его зависание блокирует работу всей компании, мы можем принудительно пометить данный обработчик как выполненный.
Для этого напишем и запустим простую внешнюю обработку, которая напрямую модифицирует дерево обработчиков в константе СведенияОбОбновленииИБ. Рассмотрим пример программного кода для реализации этого метода:
// Процедура для принудительной пометки обработчика как выполненного
Процедура ОбойтиЗависшийОбработчик(ИмяОбработчика) Экспорт
// Получаем структуру данных из хранилища значения константы
ДанныеОбновления = Константы.СведенияОбОбновленииИБ.Получить();
Если ДанныеОбновления = Неопределено Тогда
Предупреждение("Константа СведенияОбОбновленииИБ пуста!");
Возврат;
КонецЕсли;
ДеревоОбработчиков = ДанныеОбновления.Получить();
// Осуществляем поиск строки с зависшим обработчиком по его имени
СтрокаОбработчика = ДеревоОбработчиков.Строки.Найти(ИмяОбработчика, "ИмяПроцедуры", Истина);
Если СтрокаОбработчика <> Неопределено Тогда
// Меняем статус обработчика на "Выполнен"
СтрокаОбработчика.Статус = "Выполнено";
СтрокаОбработчика.КоличествоПопыток = 0;
// Записываем измененное дерево обратно в константу
Константы.СведенияОбОбновленииИБ.Установить(Новый ХранилищеЗначения(ДеревоОбработчиков));
Сообщить("Статус обработчика " + ИмяОбработчика + " успешно изменен на 'Выполнено'.");
Иначе
Сообщить("Обработчик с именем " + ИмяОбработчика + " не найден в дереве.");
КонецЕсли;
КонецПроцедуры
Важное предупреждение: Использовать данный метод следует с осторожностью и только тогда, когда вы точно понимаете, за что отвечает пропускаемый обработчик. Пропуск критически важных обработчиков (например, по расчету себестоимости или регистров накопления) может привести к расхождению движений и ошибкам в учете в дальнейшем.
---
Проанализировав проблему зависания обновлений в конфигурациях уровня 1С:КА 2 и ERP, мы можем резюмировать следующее:
СведенияОбОбновленииИБ — это стандартный механизм логирования БСП, сигнализирующий о том, что диспетчер обновлений активен и пытается выполнить задачи.