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

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

В современных релизах конфигураций 1С:Комплексная автоматизация (начиная с 2.5.23) и 1С:ERP актуализация взаиморасчетов переведена на механизм очередей через регистр сведений Задания к распределению взаиморасчетов. При проведении документа, требующего распределения, система автоматически инициирует управляющий поток, порождающий параллельные фоновые задания. Разберем распространенную проблему: если у оператора, проводящего первичный документ, нет полных прав на зависимые объекты (например, есть доступ к заказам, но нет прав на банковские выписки), фоновые потоки намертво зависают из-за ограничений прав доступа и механизма RLS, а очередь заданий лавинообразно увеличивается.

Выясним причину такого поведения платформы и детально рассмотрим варианты исправления ситуации.

Ограничения платформы: запуск фонового задания от имени другого пользователя

Проанализируем работу методов платформы ФоновыеЗадания.Выполнить() и библиотечных функций ДлительныеОперации.ВыполнитьПроцедуру или ДлительныеОперации.ЗапуститьВыполнениеВФоне. Платформа 1С:Предприятие 8.3 не позволяет передать произвольного пользователя параметром при программном старте дочернего фонового задания из клиентской сессии. Фоновое задание гарантированно стартует под учетной записью того пользователя, который запустил процесс, полностью наследуя его параметры RLS и набор доступных ролей.

Единственным штатным объектом метаданных, позволяющим зафиксировать конкретного пользователя для фонового выполнения, является РегламентноеЗадание. В его свойствах можно жестко задать системного пользователя с полными административными правами.

Способ 1. Перевод обработки очереди на регламентное задание

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

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

Способ 2. Корректное использование привилегированного режима в фоне

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

Чтобы заставить фоновое задание работать без проверок RLS под текущим пользователем, проанализируем следующие архитектурные требования:

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

Процедура ВыполнитьАктуализациюВзаиморасчетов(Параметры) Экспорт
    УстановитьПривилегированныйРежим(Истина);
    
    // Алгоритм распределения взаиморасчетов и формирования движений
    ОбработатьЗаданияОчереди(Параметры);
КонецПроцедуры

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

Управление многопоточностью и порциями очереди

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

Количество параллельных потоков и объем порций зависят от следующих параметров:

  1. Размер порции: определяет объем гранул расчета, передаваемых в один поток. Нарезка на потоки активируется тогда, когда общее число заданий превышает произведение размера порции на количество потоков.
  2. Количество потоков: при отсутствии явных установок в константах и справочнике алгоритм рассчитывает число потоков программно, исходя из количества ядер процессора сервера «1С:Предприятие» (по умолчанию часто устанавливается базовое ограничение в 4 или 8 потоков).

Очистка и контроль зависших заданий в очереди

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

  1. Откроем форму закрытия месяца и перейдем в меню «Еще» — «Ошибки очередей заданий». При ошибках прав или блокировок гранула после 3 неудачных попыток помечается как выполненная с ошибкой.
  2. Пока в очереди зависает необработанный документ, управляющий поток блокирует расчет всех зависимых по хронологии документов по данному объекту расчетов (договору или заказу), дополняя очередь новыми зависимыми записями при каждом повторном проведении.
  3. Для восстановления нормального темпа работы следует отменить зависшие записи в регистре Задания к распределению взаиморасчетов и запустить регламентную операцию закрытия месяца с полными правами, что пересчитает этап взаиморасчетов корректно без падений дочерних потоков.
← На главную