Как правильно настроить контекст выполнения и обработку данных в HTTP-сервисах 1С

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

Работа с HTTP-сервисами в платформе «1С:Предприятие» существенно отличается от привычной разработки в тонком или толстом клиенте. Часто разработчики сталкиваются с ситуацией, когда проверенный код, работающий на сервере, внезапно выдает ошибки при вызове через HTTP. В этой статье мы подробно разберем, в каком контексте выполняются методы сервиса, почему возникают ошибки инициализации библиотек и как правильно обрабатывать входящие данные, если это не JSON.

Понимание контекста выполнения: Сеанс HTTP-соединения

Для начала проанализируем, что происходит в системе, когда на ваш URL приходит запрос. В отличие от обычного пользователя, который заходит в базу, HTTP-сервис работает в рамках специального типа сеанса — «HTTP-соединение». Разберем его ключевые особенности:

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

Если вы получаете ошибку «Ошибка инициализации библиотеки модулей», в первую очередь необходимо проверить Модуль сеанса. Выясним причину: часто там содержится код, который пытается определить параметры окружения клиента или обращается к объектам, на которые у пользователя, под которым запущен HTTP-сервис, нет прав.

Разбор ошибки «Ошибка инициализации библиотеки модулей»

Эта ошибка является одной из самых коварных, так как она возникает еще до того, как управление передается в ваш метод GET или POST. Проанализируем типичные причины:

Во-первых, проверьте права доступа. Пользователь, указанный в публикации vrs (или под которым происходит авторизация), должен иметь права на запуск HTTP-сервиса и на все объекты метаданных, к которым идет обращение в УстановкаПараметровСеанса.

Во-вторых, обратите внимание на общие модули. Если в общем модуле стоит флаг Сервер, но в коде модуля вне процедур (в области инициализации) есть вызовы функций, недоступных в фоновых заданиях или HTTP-соединениях, модуль не будет скомпилирован. Рассмотрим правильный подход к оформлению таких модулей:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
    // Код, который может выполняться на сервере
#КонецЕсли

Использование инструкций препроцессора гарантирует, что «лишний» код не попытается выполниться в контексте HTTP.

Обработка входящих данных: Формат application/x-www-form-urlencoded

Часто разработчики совершают ошибку, пытаясь прочитать любое тело запроса через ЧтениеJSON. Однако, если данные приходят, например, из Bitrix24 или других веб-систем через стандартные HTML-формы, формат данных будет x-www-form-urlencoded. Выглядит он как строка параметров: параметр1=значение1&параметр2=значение2.

Посмотрим на пример строки, которую невозможно прочитать стандартным парсером JSON:

event=ONVOXIMPLANTCALLINIT&data%5BCALL_ID%5D=de6338ab6a1317c...

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

  1. Получить тело запроса как строку.
  2. Разделить строку по символу &.
  3. Каждую полученную часть разделить по символу =.
  4. Декодировать значения из URL-формата (убрать спецсимволы типа %5B).

Рассмотрим пример функции для правильного разбора таких данных:


Функция РазобратьДанныеФормы(Знач ВходящаяСтрока) Экспорт
    Результат = Новый Структура;
    
    // Разбиваем строку на пары ключ=значение
    МассивПар = СтрРазделить(ВходящаяСтрока, "&");
    
    Для Каждого ПараСтроки Из МассивПар Цикл
        ПозицияРазделителя = СтрНайти(ПараСтроки, "=");
        Если ПозицияРазделителя > 0 Тогда
            Ключ = Лев(ПараСтроки, ПозицияРазделителя - 1);
            Значение = Сред(ПараСтроки, ПозицияРазделителя + 1);
            
            // Важно: декодируем строку из URL-представления
            Ключ = РаскодироватьСтроку(Ключ, СпособКодированияСтроки.URLКомпонент);
            Значение = РаскодироватьСтроку(Значение, СпособКодированияСтроки.URLКомпонент);
            
            Результат.Вставить(Ключ, Значение);
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Особенности работы с общими модулями

Чтобы функции из общих модулей были доступны в контексте HTTP-сервиса, необходимо убедиться, что у модуля установлены флаги «Сервер» и «Вызов сервера». Однако, даже при наличии этих флагов, вы можете столкнуться с проблемами, если модуль пытается использовать ПараметрыСеанса, которые не были инициализированы для HTTP-соединения.

Проанализируем ситуацию: в обычном приложении вы заполняете ТекущийПользователь в параметрах сеанса при запуске. Для HTTP-сервиса нужно убедиться, что в УстановкаПараметровСеанса прописана логика инициализации этих параметров именно для этого типа подключения. Выясним, как это проверить программно:


Если ИмяПриложения() = "HTTPServiceConnection" Тогда
    // Инициализация специфичных параметров для HTTP-запросов
КонецЕсли;

Настройка отладки HTTP-сервисов

Поскольку HTTP-сервис выполняется на стороне сервера в отдельном сеансе, обычная кнопка «Отладка» не сработает. Разберем алгоритм настройки отладки:

  1. Убедитесь, что сервер 1С запущен с ключом -debug.
  2. В конфигураторе перейдите в меню: Отладка -> Подключение.
  3. Нажмите кнопку «Настройка» и убедитесь, что в списке флажков выбран пункт «HTTP-соединения».
  4. Установите точку останова в тексте метода вашего сервиса.
  5. Отправьте запрос (например, через Postman или браузер).

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

Использование Пула соединений (Session Pooling)

Для оптимизации производительности 1С может не завершать сеанс после каждого запроса, а оставлять его в «пуле». Это настраивается в файле default.vrd.

Это накладывает определенные обязательства на разработчика: нельзя хранить состояние между запросами в глобальных переменных или параметрах сеанса, рассчитывая на их неизменность. Каждый запрос должен быть атомарным и самодостаточным. Если ваша логика зависит от предыдущего шага, передавайте идентификатор состояния (например, GUID) в параметрах запроса и сохраняйте данные в базе данных или кеше (например, в Регистре Сведений).

Таким образом, для стабильной работы HTTP-сервиса необходимо четко разделять логику обработки данных и логику инициализации сеанса, всегда проверять формат входящего тела запроса и использовать инструменты отладки, специфичные для серверных вызовов.

← На главную