В современных релизах конфигураций 1С:Комплексная автоматизация (начиная с 2.5.23) и 1С:ERP актуализация взаиморасчетов переведена на механизм очередей через регистр сведений Задания к распределению взаиморасчетов. При проведении документа, требующего распределения, система автоматически инициирует управляющий поток, порождающий параллельные фоновые задания. Разберем распространенную проблему: если у оператора, проводящего первичный документ, нет полных прав на зависимые объекты (например, есть доступ к заказам, но нет прав на банковские выписки), фоновые потоки намертво зависают из-за ограничений прав доступа и механизма RLS, а очередь заданий лавинообразно увеличивается.
Выясним причину такого поведения платформы и детально рассмотрим варианты исправления ситуации.
Проанализируем работу методов платформы ФоновыеЗадания.Выполнить() и библиотечных функций ДлительныеОперации.ВыполнитьПроцедуру или ДлительныеОперации.ЗапуститьВыполнениеВФоне. Платформа 1С:Предприятие 8.3 не позволяет передать произвольного пользователя параметром при программном старте дочернего фонового задания из клиентской сессии. Фоновое задание гарантированно стартует под учетной записью того пользователя, который запустил процесс, полностью наследуя его параметры RLS и набор доступных ролей.
Единственным штатным объектом метаданных, позволяющим зафиксировать конкретного пользователя для фонового выполнения, является РегламентноеЗадание. В его свойствах можно жестко задать системного пользователя с полными административными правами.
Рассмотрим самый надежный способ исключить влияние ограниченных прав менеджеров на работу механизма взаиморасчетов. Решением является разделение оперативного проведения документов и этапа расчета взаиморасчетов.
Разберем типичное заблуждение: попытку включить УстановитьПривилегированныйРежим(Истина) в исходном коде перед передачей процедуры в подсистему длительных операций. Привилегированный режим родительской сессии не наследуется создаваемым фоновым заданием. Поток стартует в стандартном непривилегированном режиме пользователя.
Чтобы заставить фоновое задание работать без проверок RLS под текущим пользователем, проанализируем следующие архитектурные требования:
Процедура ВыполнитьАктуализациюВзаиморасчетов(Параметры) Экспорт
УстановитьПривилегированныйРежим(Истина);
// Алгоритм распределения взаиморасчетов и формирования движений
ОбработатьЗаданияОчереди(Параметры);
КонецПроцедуры
Обратите внимание: если управляющий поток порождает вложенные фоновые задания, включение привилегированного режима необходимо повторить в точке входа каждого дочернего обработчика.
Посмотрим, почему система порождает именно до четырех параллельных потоков и где это регулируется. Параллельная обработка очереди опирается на справочник Виды неоперативных заданий (доступен через форму «Регламентные операции по закрытию месяца» по кнопке «Еще» — «Неоперативная очередь заданий»).
Количество параллельных потоков и объем порций зависят от следующих параметров:
Если в регистре Задания к распределению взаиморасчетов накопились десятки тысяч записей из-за сбойных гранул, проанализируем штатный механизм локализации ошибок:
Задания к распределению взаиморасчетов и запустить регламентную операцию закрытия месяца с полными правами, что пересчитает этап взаиморасчетов корректно без падений дочерних потоков.