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