Как повысить приоритет регламентных заданий в 1С и решить проблемы с блокировками документов?

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

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

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

Особенность платформы: есть ли приоритеты у регламентных заданий?

Проанализируем работу платформы на уровне механизмов блокировок. В платформе 1С не существует встроенного механизма приоритетов для регламентных или фоновых заданий. Все сеансы — интерактивные пользователи, подключения через HTTP/SOAP веб-сервисы и фоновые процессы — имеют абсолютно одинаковые права при захвате ресурсов СУБД.

Принцип работы блокировок предельно прост: кто первым заблокировал объект или таблицу, тот и удерживает ресурс. Если пользователь открыл и начал редактировать документ, он накладывает блокировку. Фоновое задание, попытавшись перезаписать этот же документ, не сможет сбросить пользовательскую блокировку, а будет дожидаться её освобождения либо завершится по таймауту с ошибкой.

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

Способ 1. Обработка исключений и пропуск заблокированных объектов

Наиболее эффективный способ предотвратить зависание фонового процесса — не блокировать всю цепочку обработки из-за одного занятого документа. Для этого обработку каждого отдельного объекта необходимо оборачивать в конструкцию Попытка ... Исключение.

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


Для Каждого СсылкаДокумента Из МассивДокументов Цикл
    Попытка
        ДокументОбъект = СсылкаДокумента.ПолучитьОбъект();
        // Устанавливаем минимальный таймаут ожидания блокировки
        ЗаблокироватьДанныеДляРедактирования(СсылкаДокумента);
        
        // Выполняем необходимую обработку
        ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    Исключение
        // Объект заблокирован пользователем или веб-сервисом.
        // Пропускаем его и переходим к следующему, не останавливая регламентное задание.
        ЗаписьЖурналаРегистрации("ОбработкаДокументов",
            УровеньЖурналаРегистрации.Информация,
            ,,
            "Документ " + Строка(СсылкаДокумента) + " заблокирован и будет обработан в следующем цикле.");
    КонецПопытки;
КонецЦикла;

При таком подходе регламентное задание не упадет и не зависнет надолго. Оно обработает все свободные документы, а занятые пропустит до следующего запуска по расписанию.

Способ 2. Оптимизация расписания и порционная обработка данных

Разберем по шагам, как уменьшить вероятности пересечения фоновых процессов с активностью пользователей:

  1. Разделение по времени: Тяжелые регламентные задания, выполняющие массовое проведение или перезапись документов за длительный период, необходимо сместить на ночное время или часы минимальной активности пользователей.
  2. Частые короткие итерации: Задания, обрабатывающие текущие документы (например, каждые 30 секунд), должны обрабатывать данные небольшими порциями (пакетами по 20–50 документов), быстро фиксируя транзакцию после каждого пакета.

Удерживание транзакции в течение долей секунды вместо минут снижает риск возникновения взаимных блокировок (Deadlocks) практически до нуля.

Способ 3. Перевод конфигурации на управляемый режим блокировок

Если конфигурация использует автоматический режим управления блокировками, СУБД (MS SQL, PostgreSQL) часто эскалирует блокировки со строки на целый диапазон или таблицу. Из-за этого регламентное задание может блокировать документы, которые пользователи даже не открывали.

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

Способ 4. Использование расширений конфигурации

Если типовая конфигурация находится на поддержке и вносить изменения в основной код нельзя, используйте **расширения конфигурации** (файл .cfe). С их помощью можно:

Способ 5. Выделение фоновых заданий на отдельный рабочий сервер

Если проблемы связаны с высокой нагрузкой на аппаратные ресурсы сервера при выполнении фоновых задач, разделим потоки обработки на уровне кластера серверов 1С:

  1. В консоли администрирования кластера серверов 1С настройте Требования назначения функционала.
  2. Направьте сервис фоновых заданий на отдельный рабочий сервер или определенный процесс rphost.

Это позволит гарантировать, что выполнение регламентных задач не будет отбирать вычислительные ресурсы (процессор и оперативную память) у активных пользовательских сеансов.

← На главную