Почему возникает ошибка "Пользователь не авторизован" при работе с Системой взаимодействия в фоне и как ее решить?

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

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

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

Выясним причину ошибки в фоновом задании

Для начала давайте посмотрим на то, как платформа 1С обрабатывает фоновые и регламентные задания. Если при настройке или программном запуске фонового задания явно не указан пользователь информационной базы, под которым оно должно выполняться, платформа запускает его в специальном системном контексте. В таком "безликом" сеансе текущий пользователь имеет значение Неопределено.

Сервер взаимодействия 1С спроектирован таким образом, что для любой операции (будь то создание обсуждения или отправка сообщения) он жестко требует привязки к конкретному авторизованному пользователю информационной базы. Если мы пытаемся обратиться к объекту СистемаВзаимодействия из сеанса без пользователя, сервер не понимает, от чьего имени совершается действие, и закономерно возвращает ошибку авторизации.

Способ 1: Интерактивная регистрация пользователя (ручной метод)

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

  1. Откроем список регламентных заданий в режиме Предприятия (или через консоль регламентных заданий).
  2. Найдем наше задание, откроем его карточку и найдем поле Имя Пользователя.
  3. Укажем в этом поле конкретного пользователя, например, администратора с полными правами.
  4. Критически важный шаг: Сервер взаимодействия еще не знает об этом пользователе, если он ни разу не работал с чатами. Нам необходимо интерактивно зайти в клиентское приложение 1С под выбранным пользователем. В момент входа платформа автоматически зарегистрирует его на сервере взаимодействия.
  5. После этого нужно зайти в раздел Пользователи Системы взаимодействия и проверить, что наш аккаунт успешно там зарегистрирован.

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

Способ 2: Программная регистрация служебного пользователя (Best Practice)

Отправлять системные уведомления от имени живого человека (например, администратора) — это плохая практика, которая может запутать конечных пользователей. Разберем более профессиональный подход. Создадим отдельного виртуального пользователя, назовем его, например, "Системный робот" или "Уведомитель", и назначим его нашему регламентному заданию.

Чтобы не заходить под этим "роботом" в 1С вручную (тем более, что у служебных пользователей часто отключена возможность интерактивного входа), мы можем зарегистрировать его в Системе взаимодействия программно.

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


// Получаем ссылку на служебного пользователя ИБ
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("СистемныйРобот");

Если ПользовательИБ <> Неопределено Тогда
    УстановитьПривилегированныйРежим(Истина);
    
    // Программная регистрация в Системе взаимодействия
    ПользовательСВ = СистемаВзаимодействия.СоздатьПользователя(ПользовательИБ);
    ПользовательСВ.Записать();
    
    УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;

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

Поможет ли простое включение привилегированного режима?

Среди разработчиков часто возникает спор: можно ли решить ошибку пустого контекста, просто обернув отправку сообщения в вызов УстановитьПривилегированныйРежим(Истина)? Проанализируем этот момент.

Сам по себе привилегированный режим не решает проблему пустого пользователя в регламентном задании. Дело в том, что привилегированный режим отключает проверку прав доступа на уровне записей (RLS) внутри самой базы 1С. Однако Сервер взаимодействия — это внешняя по отношению к базе подсистема, которая использует собственные механизмы проверки токенов и идентификаторов.

Если в текущем сеансе пользователь равен Неопределено, то, какие бы права мы ни повышали внутри платформы, для Системы взаимодействия мы все равно останемся "никем". Поэтому назначение конкретного пользователя регламентному заданию обязательно.

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

Подведем итоги

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

  1. Убедимся, что в настройках регламентного задания явно указан пользователь (желательно служебный виртуальный аккаунт).
  2. Обязательно зарегистрируем этого пользователя в Системе взаимодействия (один раз зайдем интерактивно или используем программный метод регистрации).
  3. Не будем полагаться исключительно на УстановитьПривилегированныйРежим для обхода ошибки авторизации — этот метод служит для других целей.

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

← На главную