При разработке и внедрении HTTP-сервисов в системе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда сервис, настроенный на работу без явной авторизации, возвращает ошибку инициализации сеанса. Типичное сообщение об ошибке гласит: "Невозможно установить параметры сеанса: пользователь не определен". Это происходит потому, что любой запрос к HTTP-сервису, даже анонимный, инициирует создание полноценного сеанса на сервере 1С, который требует выполнения стандартных процедур инициализации. В данной статье мы подробно разберем, почему возникает эта ошибка и какие существуют стратегии для ее устранения.
Рассмотрим внутреннюю логику работы платформы. Когда внешний клиент (браузер, мобильное приложение или другая учетная система) обращается к вашему HTTP-сервису, сервер 1С запускает процесс создания сеанса. Первым делом вызывается обработчик УстановкаПараметровСеанса в Модуле сеанса.
Проанализируем типичную ошибку: если ваша конфигурация построена на базе БСП (Библиотеки стандартных подсистем), то внутри этого обработчика наверняка вызываются функции инициализации текущего пользователя. Например, обращение к Пользователи.АвторизованныйПользователь() в момент анонимного HTTP-запроса приведет к исключению, так как система пытается найти соответствие между текущим соединением и записью в справочнике "Пользователи", которой в данном случае просто нет.
Выясним причину ошибки в коде. Чтобы избежать падения системы, нам необходимо научить Модуль сеанса корректно реагировать на запросы, приходящие через HTTP-сервисы. Для этого мы можем использовать метод ПолучитьТекущийСеанс().ИмяПриложения. Для обычных пользователей это будет 1CV8 или 1CV8C, а для запросов к веб-сервисам — HTTPServer.
Разберем пример кода, который позволит безопасно инициализировать параметры сеанса:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
// Проверим, откуда пришел запрос
ТекущееПриложение = ПолучитьТекущийСеанс().ИмяПриложения;
Если ТекущееПриложение = "HTTPServer" Тогда
// Если это HTTP-запрос и пользователь не авторизован
Если Не ЗначениеЗаполнено(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) Тогда
// Назначаем параметры сеанса по умолчанию для анонимного доступа
ПараметрыСеанса.ТекущийПользователь = Справочники.Пользователи.ПустаяСсылка();
// Здесь можно установить специально созданного пользователя "Аноним"
Возврат;
КонецЕсли;
КонецЕсли;
// Стандартная логика БСП для обычных пользователей
ПользователиСлужебный.УстановитьПараметрыСеанса(ТребуемыеПараметры);
КонецПроцедуры
Используя такой подход, мы разделяем потоки инициализации для обычных пользователей и для внешних сервисов. Это позволяет системе успешно стартовать сеанс, даже если авторизация не была передана в заголовках запроса.
Рассмотрим ситуацию, когда вам необходимо, чтобы HTTP-сервис работал без авторизации со стороны клиента, но при этом внутри 1С все действия выполнялись от имени конкретного пользователя. Вместо того чтобы менять код модуля сеанса, мы можем настроить параметры подключения в файле публикации default.vrd, который находится на вашем веб-сервере (IIS или Apache).
В строке соединения информационной базы ib можно явно прописать учетные данные. Проанализируем пример такой настройки:
До настройки: ib="Srvr="Server1C";Ref="Base1C";"
После настройки: ib="Srvr="Server1C";Ref="Base1C";usr="WebServiceUser";pwd="StrongPassword";"
Важные моменты этого способа:
Authorization.WebServiceUser.Если ваша конфигурация активно использует механизмы прав доступа на уровне записей (RLS), анонимный вход с пустой ссылкой на пользователя может привести к тому, что HTTP-сервис не увидит никаких данных. В этом случае рекомендуется создать в справочнике Пользователи специальный элемент, например, "Пользователь HTTP-сервисов".
Посмотрим на алгоритм реализации этого метода:
Пользователи (и, если нужно, в Пользователи информационной базы) техническую учетную запись.УстановкаПараметровСеанса, если обнаружено приложение HTTPServer и отсутствие авторизации, принудительно найдите этого пользователя в справочнике.ПараметрыСеанса.ТекущийПользователь = ТехническийПользовательСсылка;.Это обеспечит корректную работу всех стандартных отчетов, запросов и механизмов логирования (например, "Автор версии" в истории изменений), так как у каждого действия появится конкретный "автор".
Проанализируем ситуацию, упомянутую в обсуждении: когда HTTP-сервис запускает фоновое задание. Важно помнить, что фоновое задание, запущенное через ФоновыеЗадания.Выполнить(), наследует параметры сеанса того сеанса, который его породил.
Если в сеансе HTTP-сервиса пользователь был "Не определен", то и в фоновом задании ПараметрыСеанса.ТекущийПользователь будет пустым. Чтобы в поле "Автор" не подставлялось значение "Не назначенный", убедитесь, что вы инициализировали пользователя в родительском HTTP-сеансе ОДНИМ из вышеописанных способов. Если же вы используете регламентные задания, не забывайте, что в консоли регламентных заданий можно явно указать пользователя, под которым задание должно выполняться.
Мы выяснили, что корень проблемы кроется в автоматическом вызове обработчиков инициализации сеанса, которые не рассчитаны на отсутствие авторизационных данных. Для стабильной работы ваших интеграций мы рекомендуем:
ИмяПриложения в модуле сеанса.default.vrd с техническим пользователем, обладающим минимально необходимыми правами.HTTPServer.Правильная настройка параметров сеанса не только избавляет от ошибок, но и повышает безопасность вашей системы, позволяя четко разграничивать права доступа для внешних потребителей данных.