Не запускаются обмены в РИБ после обновления УТ 11.3: разбираем причины и восстанавливаем работу базы по шагам

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

После обновления конфигураций на платформе 1С:Предприятие 8.3 (особенно тяжелых решений, таких как «Управление торговлей», «Комплексная автоматизация» или «ERP») администраторы и разработчики часто сталкиваются со сбоями в работе распределенных информационных баз (РИБ). Типичный сценарий: обновление конфигурации прошло успешно, но при выполнении отложенных обработчиков обновления в фоновом режиме происходит сбой. Попытка решить проблему «простым» путем — например, очисткой служебных констант — приводит к полной остановке автоматического обмена данными без видимых сообщений об ошибках.

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

Проанализируем детально причины возникновения этих ошибок и методы их устранения.

---

Почему сброс константы блокирует обмены в РИБ? Разберем механизмы БСП

В современных конфигурациях 1С процесс обновления базы данных разделен на два этапа:

  1. Быстрое (монопольное) обновление. Выполняется при первом запуске базы после обновления конфигурации. Оно перестраивает критически важные структуры данных, без которых работа пользователей невозможна.
  2. Отложенное (фоновое) обновление. Выполняется параллельно с работой пользователей с помощью фоновых заданий. На этом этапе обрабатываются большие массивы данных, заполняются новые регистры, пересчитываются старые аналитики (например, календарь оплат, взаиморасчеты и т.д.).

Для управления очередью отложенного обновления БСП использует служебную константу ДанныеДляОтложенногоОбновления и регистр сведений ОбработчикиОбновления. Если в системе остаются незавершенные обработчики или фоновые задания завершились аварийно, БСП применяет встроенную защиту:

БСП принудительно блокирует автоматический запуск регламентных заданий обмена данными (РИБ).

Это необходимо для того, чтобы недообновленные или некорректные данные из главного узла не мигрировали в подчиненные узлы РИБ, что могло бы вызвать глобальный рассинхрон и разрушение ссылочной целостности всей распределенной системы.

Когда администратор вручную сбрасывает или очищает константу ДанныеДляОтложенногоОбновления, он совершает грубую ошибку. Система «ослепляет» саму себя: очередь фоновых задач очищается, но маркеры успешного завершения обновления (такие как константа ОтложенноеОбновлениеЗавершеноУспешно) не принимают значение Истина, а в регистре ОбработчикиОбновления зависают ошибочные статусы. В итоге обмены РИБ по расписанию просто не стартуют, при этом ручной запуск обмена может проходить без явных ошибок на клиенте.

---

Природа ошибки «В данной транзакции уже происходили ошибки!»

При анализе журнала регистрации или монитора регламентных заданий часто обнаруживается ошибка:

В данной транзакции уже происходили ошибки!

Выясним причину этой ошибки на уровне платформы 1С и СУБД:

Именно эта вторичная ошибка записывается в журнал регистрации, маскируя реальную причину сбоя (конфликт блокировок при заполнении Календаря оплат).

---

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

Рассмотрим подробнее шаги, которые позволят локализовать конфликт блокировок, восстановить структуру метаданных БСП и запустить регламентные обмены.

Шаг 1. Точная диагностика через журнал регистрации

Для того чтобы увидеть первопричину ошибки, откроем Журнал регистрации в режиме «1С:Предприятие»:

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

Шаг 2. Временное переключение обновления в один поток

По умолчанию БСП пытается выполнять отложенные обновления параллельно в несколько потоков (обычно до 8 потоков фоновых заданий). При обновлении тяжелых регистров (таких как Календарь оплат) потоки начинают блокировать друг друга на уровне СУБД.

Попробуем временно перевести обновление в однопоточный режим. Для этого запустим базу данных в режиме «1С:Предприятие» с параметром командной строки:

/C ЧислоПотоковОбновления=1

Также мы можем жестко задать это значение программно, выполнив в консоли кода следующий фрагмент:


// Установка однопоточного режима обновления для предотвращения взаимных блокировок
Константы.КоличествоПотоковОбновленияИнформационнойБазы.Установить(1);

Шаг 3. Восстановление метаданных БСП и перезапуск обновления

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

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

Шаг 4. Ручная корректировка статусов обработчиков (быстрое решение)

Если обновление Календаря оплат для вашей специфики работы в данный момент не является критически важным, а восстановить обмены в РИБ требуется незамедлительно, мы можем принудительно изменить статус зависших обработчиков на «Выполнен».

Для этого воспользуемся встроенным механизмом «Функции для технического специалиста» (в старых версиях — «Все функции»):

  1. Откроем регистр сведений ОбработчикиОбновления.
  2. Найдем запись обработчика, отвечающего за заполнение календаря оплат (его статус будет равен «Ошибка» или «Выполняется»).
  3. Создадим внешнюю обработку (или запустим код через групповую обработку реквизитов) для программного изменения статусов. Напишем следующий код:

// Программный сброс зависших обработчиков обновления БСП
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Обработчики.ИмяОбработчика КАК ИмяОбработчика
    |ИЗ
    |	РегистрСведений.ОбработчикиОбновления КАК Обработчики
    |ГДЕ
    |	Обработчики.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыОбработчиковОбновления.Ошибка), 
    |                         ЗНАЧЕНИЕ(Перечисление.СтатусыОбработчиковОбновления.Выполняется))";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    МенеджерЗаписи = РегистрыСведений.ОбработчикиОбновления.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.ИмяОбработчика = Выборка.ИмяОбработчика;
    МенеджерЗаписи.Прочитать();
    Если МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.Статус = Перечисления.СтатусыОбработчиковОбновления.Выполнен;
        МенеджерЗаписи.Записать();
        
        ВызватьИсключение "Принудительно завершен обработчик: " + Выборка.ИмяОбработчика; // Опционально для лога
    КонецЕсли;
КонецЦикла;

// Разблокируем механизмы обмена БСП, установив финальную константу в Истина
Константы.ОтложенноеОбновлениеЗавершеноУспешно.Установить(Истина);

После выполнения данного кода механизмы БСП увидят, что все обработчики успешно завершены, снимут внутреннюю блокировку, и регламентные задания обмена РИБ автоматически возобновят свою работу по расписанию.

---

Глубокий анализ блокировок через Технологический журнал

Если конфликт блокировок при обновлении базы продолжает воспроизводиться, нам потребуется настроить Технологический журнал (ТЖ) на сервере 1С:Предприятия. Это единственный способ узнать, какой именно пользовательский сеанс или фоновое задание конкурирует с процессом обновления календаря оплат.

Для этого создадим текстовый файл конфигурации logcfg.xml и поместим его в каталог настроек сервера 1С (обычно C:\Program Files\1cv8\conf\). Содержимое файла должно быть следующим:


<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\v8_logs" history="24">
        <event>
            <eq property="Name" value="TTIMEOUT"/>
        </event>
        <event>
            <eq property="Name" value="TDEADLOCK"/>
        </event>
        <event>
            <eq property="Name" value="EXCP"/>
        </event>
        <property name="all"/>
    </log>
</config>

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

На основе этих данных мы сможем принять решение о временном завершении активных сеансов конкретных пользователей или отключении конфликтующих фоновых заданий на время выполнения процедур обновления.

---

Резюме и рекомендации

Подводя итоги, сформулируем основные правила при возникновении сбоев отложенного обновления в РИБ:

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