Работа с HTTP-сервисами в платформе «1С:Предприятие» существенно отличается от привычной разработки в тонком или толстом клиенте. Часто разработчики сталкиваются с ситуацией, когда проверенный код, работающий на сервере, внезапно выдает ошибки при вызове через HTTP. В этой статье мы подробно разберем, в каком контексте выполняются методы сервиса, почему возникают ошибки инициализации библиотек и как правильно обрабатывать входящие данные, если это не JSON.
Для начала проанализируем, что происходит в системе, когда на ваш URL приходит запрос. В отличие от обычного пользователя, который заходит в базу, HTTP-сервис работает в рамках специального типа сеанса — «HTTP-соединение». Разберем его ключевые особенности:
Сообщить(), Предупреждение() или обращение к Клиентским модулям, приведут к немедленному аварийному завершению метода.УстановкаПараметровСеанса в Модуле сеанса.Если вы получаете ошибку «Ошибка инициализации библиотеки модулей», в первую очередь необходимо проверить Модуль сеанса. Выясним причину: часто там содержится код, который пытается определить параметры окружения клиента или обращается к объектам, на которые у пользователя, под которым запущен HTTP-сервис, нет прав.
Эта ошибка является одной из самых коварных, так как она возникает еще до того, как управление передается в ваш метод GET или POST. Проанализируем типичные причины:
Во-первых, проверьте права доступа. Пользователь, указанный в публикации vrs (или под которым происходит авторизация), должен иметь права на запуск HTTP-сервиса и на все объекты метаданных, к которым идет обращение в УстановкаПараметровСеанса.
Во-вторых, обратите внимание на общие модули. Если в общем модуле стоит флаг Сервер, но в коде модуля вне процедур (в области инициализации) есть вызовы функций, недоступных в фоновых заданиях или HTTP-соединениях, модуль не будет скомпилирован. Рассмотрим правильный подход к оформлению таких модулей:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
// Код, который может выполняться на сервере
#КонецЕсли
Использование инструкций препроцессора гарантирует, что «лишний» код не попытается выполниться в контексте HTTP.
Часто разработчики совершают ошибку, пытаясь прочитать любое тело запроса через ЧтениеJSON. Однако, если данные приходят, например, из Bitrix24 или других веб-систем через стандартные HTML-формы, формат данных будет x-www-form-urlencoded. Выглядит он как строка параметров: параметр1=значение1&параметр2=значение2.
Посмотрим на пример строки, которую невозможно прочитать стандартным парсером JSON:
event=ONVOXIMPLANTCALLINIT&data%5BCALL_ID%5D=de6338ab6a1317c...
Для обработки такой строки в 1С необходимо выполнить ручной парсинг. Разберем по шагам, как это реализовать:
&.=.URL-формата (убрать спецсимволы типа %5B).Рассмотрим пример функции для правильного разбора таких данных:
Функция РазобратьДанныеФормы(Знач ВходящаяСтрока) Экспорт
Результат = Новый Структура;
// Разбиваем строку на пары ключ=значение
МассивПар = СтрРазделить(ВходящаяСтрока, "&");
Для Каждого ПараСтроки Из МассивПар Цикл
ПозицияРазделителя = СтрНайти(ПараСтроки, "=");
Если ПозицияРазделителя > 0 Тогда
Ключ = Лев(ПараСтроки, ПозицияРазделителя - 1);
Значение = Сред(ПараСтроки, ПозицияРазделителя + 1);
// Важно: декодируем строку из URL-представления
Ключ = РаскодироватьСтроку(Ключ, СпособКодированияСтроки.URLКомпонент);
Значение = РаскодироватьСтроку(Значение, СпособКодированияСтроки.URLКомпонент);
Результат.Вставить(Ключ, Значение);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Чтобы функции из общих модулей были доступны в контексте HTTP-сервиса, необходимо убедиться, что у модуля установлены флаги «Сервер» и «Вызов сервера». Однако, даже при наличии этих флагов, вы можете столкнуться с проблемами, если модуль пытается использовать ПараметрыСеанса, которые не были инициализированы для HTTP-соединения.
Проанализируем ситуацию: в обычном приложении вы заполняете ТекущийПользователь в параметрах сеанса при запуске. Для HTTP-сервиса нужно убедиться, что в УстановкаПараметровСеанса прописана логика инициализации этих параметров именно для этого типа подключения. Выясним, как это проверить программно:
Если ИмяПриложения() = "HTTPServiceConnection" Тогда
// Инициализация специфичных параметров для HTTP-запросов
КонецЕсли;
Поскольку HTTP-сервис выполняется на стороне сервера в отдельном сеансе, обычная кнопка «Отладка» не сработает. Разберем алгоритм настройки отладки:
-debug.Postman или браузер).Важный момент: Если используется автоматическая настройка отладки, 1С попытается перехватить запрос. Если точка останова не срабатывает, проверьте, совпадает ли пользователь, под которым запущена служба сервера 1С, и пользователь, имеющий права на отладку.
Для оптимизации производительности 1С может не завершать сеанс после каждого запроса, а оставлять его в «пуле». Это настраивается в файле default.vrd.
Это накладывает определенные обязательства на разработчика: нельзя хранить состояние между запросами в глобальных переменных или параметрах сеанса, рассчитывая на их неизменность. Каждый запрос должен быть атомарным и самодостаточным. Если ваша логика зависит от предыдущего шага, передавайте идентификатор состояния (например, GUID) в параметрах запроса и сохраняйте данные в базе данных или кеше (например, в Регистре Сведений).
Таким образом, для стабильной работы HTTP-сервиса необходимо четко разделять логику обработки данных и логику инициализации сеанса, всегда проверять формат входящего тела запроса и использовать инструменты отладки, специфичные для серверных вызовов.