Как устранить конфликты блокировок в 1С:Документообороте 2.1 при создании задач и рассылке уведомлений?

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

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

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

Причина возникновения конфликтов в регистре кеша

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

Разберем типичный сценарий возникновения дедлока:

  1. Пользователь или регламентное задание инициирует старт бизнес-процесса. Система начинает транзакцию записи задачи.
  2. В рамках этой транзакции срабатывают подписки на события и дополнительные обработчики (например, те, что закрывают задачи или меняют исполнителя).
  3. Параллельно работает фоновое задание «Рассылка уведомлений». Чтобы сформировать текст уведомления, оно считывает данные о задаче и предмете из того же регистра КешИнформацииОбОбъектах.
  4. Возникает ситуация, когда первый поток (создание задачи) хочет установить исключительную блокировку (X) для записи данных, а второй поток (уведомления) уже удерживает разделяемую блокировку (S) для чтения, или наоборот. Если порядок обращения к объектам в коде этих процессов различается — происходит взаимная блокировка.

Анализ стека вызова ошибки

Выясним причину, опираясь на технические данные. В сообщениях об ошибке часто фигурирует следующий стек:


{ОбщийМодуль.БизнесПроцессыИЗадачиСервер.Модуль(1668)}: Блокировка.Заблокировать();
{ОбщийМодуль.БизнесПроцессыИЗадачиСобытия.Модуль(126)}: БизнесПроцессыИЗадачиСервер.ПриЗаписиЗадачиСервер(Источник);
{ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: БизнесПроцесс.Старт();
{ОбщийМодуль.БизнесСобытияВызовСервера.Модуль(779)}: СтартоватьПроцесс(БизнесПроцесс);

Этот фрагмент кода указывает на то, что ошибка происходит в процедуре ПриЗаписиЗадачиСервер. Рассмотрим подробнее, что там происходит. Система пытается программно установить управляемую блокировку на ресурс (задачу) перед обновлением кеша. Если в этот момент транзакция неоправданно затянута из-за «тяжелых» дополнительных обработчиков, вероятность столкновения с параллельным процессом уведомлений возрастает многократно.

Как дополнительные обработчики влияют на ситуацию

Проанализируем ситуацию с добавлением обработчиков. Даже если код внутри обработчика «ничего не делает» в конкретном случае, сам факт его наличия внутри транзакции записи увеличивает время удержания блокировок. В 1С:ДО 2.1 механизм дополнительных обработчиков событий встроен в общую цепочку выполнения. Если один обработчик закрывает задачу, а другой меняет исполнителя, система может выполнять повторную запись объектов, что провоцирует каскадное обновление КешИнформацииОбОбъектах и регистра ДанныеВнутреннихДокументов.

Важный момент: Конфликты в ДанныеВнутреннихДокументов часто возникают, когда при создании задачи программно меняется состояние документа (например, установка флага «На согласовании»). Если один поток блокирует сначала Кеш, а потом ДанныеДокументов, а второй поток делает это в обратном порядке — дедлок неизбежен.

Методика диагностики через Технологический журнал

Поскольку ошибку невозможно отловить отладчиком, нам необходимо настроить сбор логов Технологического журнала (ТЖ) на сервере 1С. Нам нужно событие TDEADLOCK. Посмотрим на пример настройки файла logcfg.xml:


<config xmlns="http://v8.1c.ru/7.1/v8tm">
  <log location="C:\LOGS\DEADLOCKS" history="24">
    <event>
      <eq property="name" value="TDEADLOCK"/>
    </event>
    <event>
      <eq property="name" value="TTIMEOUT"/>
    </event>
    <property name="all"/>
  </log>
</config>

После возникновения ошибки в логах появится запись, которая покажет:

Это позволит точно определить, какой именно кусок кода в фоновом задании уведомлений конфликтует с записью задачи.

Рекомендации по решению проблемы

Рассмотрим несколько стратегий решения проблемы блокировок в 1С:Документообороте:

  1. Оптимизация транзакций: Постараемся вынести тяжелую логику из обработчиков «При записи» в механизм Бизнес-событий с отложенной обработкой. Это позволит основной транзакции создания задачи завершиться максимально быстро.
  2. Анализ порядка блокировок: Проверим, чтобы во всех кастомных обработчиках обращение к регистрам происходило в том же порядке, что и в типовом коде. Обычно это: ДанныеДокументов -> КешИнформацииОбОбъектах.
  3. Обновление конфигурации: В релизах 2.1.15 и выше компания «1С» внесла ряд исправлений в общий модуль БизнесПроцессыИЗадачиСервер, оптимизируя работу с блокировками кеша. Если ваша версия ниже, рассмотрите возможность обновления.
  4. Использование разделения уведомлений: Настройте рассылку уведомлений с небольшой задержкой. Если уведомление будет пытаться уйти не мгновенно, а через 1-2 минуты после события, транзакция создания задачи гарантированно успеет завершиться.

Выясним причину конфликта в коде уведомлений. Часто бывает полезно обернуть чтение данных для уведомлений в блок Попытка...Исключение с небольшим количеством повторов при возникновении конфликта блокировок. Это позволит фоновому заданию не «падать», а просто подождать освобождения ресурса.

Резюме: Проблема дедлоков в 1С:ДО 2.1 — это почти всегда вопрос времени жизни транзакции и порядка доступа к общим регистрам кеша. Используйте Технологический журнал для подтверждения гипотезы и старайтесь минимизировать объем действий внутри стандартных обработчиков событий записи задач.

← На главную