В процессе эксплуатации системы 1С:Документооборот 2.1 администраторы и разработчики часто сталкиваются с трудноуловимыми ошибками, возникающими при интенсивной работе пользователей. Одной из наиболее сложных проблем является неустранимый конфликт блокировок (Deadlock) в момент автоматического создания задач. Рассмотрим ситуацию, когда при старте бизнес-процесса система выдает ошибку, связанную с регистром КешИнформацииОбОбъектах, при этом стандартные средства отладки не позволяют поймать проблему в «прямом эфире».
В этой статье мы подробно проанализируем механизмы возникновения подобных конфликтов, выясним роль фоновых заданий в этом процессе и разберем по шагам, как локализовать и устранить причину сбоя.
Для начала проанализируем ситуацию: почему именно регистр КешИнформацииОбОбъектах становится «бутылочным горлышком»? В 1С:ДО этот регистр служит для хранения предварительно рассчитанных данных, которые используются для ускорения отображения списков, работы полнотекстового поиска и механизмов проверки прав доступа. Любое изменение состояния задачи или документа (создание, изменение исполнителя, старт процесса) неизбежно влечет за собой обновление записей в этом кеше.
Разберем типичный сценарий возникновения дедлока:
КешИнформацииОбОбъектах.Выясним причину, опираясь на технические данные. В сообщениях об ошибке часто фигурирует следующий стек:
{ОбщийМодуль.БизнесПроцессыИЗадачиСервер.Модуль(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.1 — это почти всегда вопрос времени жизни транзакции и порядка доступа к общим регистрам кеша. Используйте Технологический журнал для подтверждения гипотезы и старайтесь минимизировать объем действий внутри стандартных обработчиков событий записи задач.