При интенсивной работе высокой нагрузки в базе 1С часто возникает ситуация, когда фоновые или регламентные задания пытаются обработать документы, с которыми в этот же момент работают интерактивные пользователи или внешние веб-сервисы. В результате регламентные процессы уходят в длительное ожидание блокировки, накапливаются сеансы, и вся система начинает тормозить или полностью зависать.
Выясним, существует ли в платформе «1С:Предприятие» возможность выставить регламентному заданию высокий приоритет, и какие есть проверенные способы решения конфликтов блокировок данных.
Проанализируем работу платформы на уровне механизмов блокировок. В платформе 1С не существует встроенного механизма приоритетов для регламентных или фоновых заданий. Все сеансы — интерактивные пользователи, подключения через HTTP/SOAP веб-сервисы и фоновые процессы — имеют абсолютно одинаковые права при захвате ресурсов СУБД.
Принцип работы блокировок предельно прост: кто первым заблокировал объект или таблицу, тот и удерживает ресурс. Если пользователь открыл и начал редактировать документ, он накладывает блокировку. Фоновое задание, попытавшись перезаписать этот же документ, не сможет сбросить пользовательскую блокировку, а будет дожидаться её освобождения либо завершится по таймауту с ошибкой.
Тем не менее, решить проблему зависания регламентных заданий можно с помощью алгоритмических и организационных доработок.
Наиболее эффективный способ предотвратить зависание фонового процесса — не блокировать всю цепочку обработки из-за одного занятого документа. Для этого обработку каждого отдельного объекта необходимо оборачивать в конструкцию Попытка ... Исключение.
Рассмотрим пример реализации безопасной записи документа в регламентном задании:
Для Каждого СсылкаДокумента Из МассивДокументов Цикл
Попытка
ДокументОбъект = СсылкаДокумента.ПолучитьОбъект();
// Устанавливаем минимальный таймаут ожидания блокировки
ЗаблокироватьДанныеДляРедактирования(СсылкаДокумента);
// Выполняем необходимую обработку
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Исключение
// Объект заблокирован пользователем или веб-сервисом.
// Пропускаем его и переходим к следующему, не останавливая регламентное задание.
ЗаписьЖурналаРегистрации("ОбработкаДокументов",
УровеньЖурналаРегистрации.Информация,
,,
"Документ " + Строка(СсылкаДокумента) + " заблокирован и будет обработан в следующем цикле.");
КонецПопытки;
КонецЦикла;
При таком подходе регламентное задание не упадет и не зависнет надолго. Оно обработает все свободные документы, а занятые пропустит до следующего запуска по расписанию.
Разберем по шагам, как уменьшить вероятности пересечения фоновых процессов с активностью пользователей:
Удерживание транзакции в течение долей секунды вместо минут снижает риск возникновения взаимных блокировок (Deadlocks) практически до нуля.
Если конфигурация использует автоматический режим управления блокировками, СУБД (MS SQL, PostgreSQL) часто эскалирует блокировки со строки на целый диапазон или таблицу. Из-за этого регламентное задание может блокировать документы, которые пользователи даже не открывали.
Перевод базы на управляемый режим блокировок (свойство конфигурации РежимУправленияБлокировкойДанных) позволяет накладывать точечные блокировки исключительно на те ссылки и записи, которые обрабатываются в данный момент, оставляя остальные данные доступными для работы пользователей и веб-сервисов.
Если типовая конфигурация находится на поддержке и вносить изменения в основной код нельзя, используйте **расширения конфигурации** (файл .cfe). С их помощью можно:
&Вместо или &После;Попытка ... Исключение;Если проблемы связаны с высокой нагрузкой на аппаратные ресурсы сервера при выполнении фоновых задач, разделим потоки обработки на уровне кластера серверов 1С:
rphost.Это позволит гарантировать, что выполнение регламентных задач не будет отбирать вычислительные ресурсы (процессор и оперативную память) у активных пользовательских сеансов.