Как программно настроить и использовать HTTP-сервисы в 1С 8.3 для интеграции

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

В современной экосистеме автоматизации бизнеса задача интеграции 1С с внешними системами (сайтами, мобильными приложениями, сторонними сервисами) становится одной из приоритетных. Одним из самых эффективных и быстрых способов взаимодействия является использование HTTP-сервисов. В рамках данной статьи мы подробно разберем, как создать собственный сервис, настроить его методы и обеспечить корректный обмен данными в формате JSON.

Основы архитектуры HTTP-сервисов в 1С

Прежде чем переходить к написанию кода, давайте разберем, из каких компонентов состоит HTTP-сервис в платформе 1С. Мы работаем с объектом метаданных HTTP-сервисы. Основными элементами здесь являются:

  1. Корневой URL: Базовый адрес, по которому будет доступен наш сервис.
  2. Шаблоны URL: Определяют структуру пути после корневого URL (например, /get_balance/{INN}).
  3. Методы: Конкретные HTTP-операции (GET, POST, PUT, DELETE), которые привязаны к шаблонам.

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

Шаг 1: Создание объекта в конфигураторе

Рассмотрим пошагово процесс создания. В дереве конфигурации найдем ветку Общие -> HTTP-сервисы и добавим новый объект. Назовем его, например, ОбменДанными. В поле "Корневой URL" укажем exchange. Теперь наш сервис будет доступен по адресу вида http://server/base/hs/exchange/.

Далее создадим "Шаблон URL". Если мы хотим передавать данные о товарах, назовем шаблон GetItems и укажем путь /items/*. Звездочка означает, что мы можем принимать любые параметры после слеша.

Шаг 2: Реализация метода GET

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


Функция GetItemsGet(Запрос)
    
    // Подготовим структуру для ответа
    ДанныеОтвета = Новый Структура;
    ДанныеОтвета.Вставить("Статус", "Успех");
    ДанныеОтвета.Вставить("Товары", Новый Массив);
    
    ЗапросКБД = Новый Запрос;
    ЗапросКБД.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 10
    |	Номенклатура.Наименование КАК Наименование,
    |	Номенклатура.Код КАК Код
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура";
    
    Результат = ЗапросКБД.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        Товар = Новый Структура("Name, Code", Результат.Наименование, Результат.Код);
        ДанныеОтвета.Товары.Добавить(Товар);
    КонецЦикла;
    
    // Сериализация в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ДанныеОтвета);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    // Формируем HTTP-ответ
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Ответ.Заголовки.Вставить("Content-Type", "application/json");
    
    Возврат Ответ;
    
КонецФункции

В данном примере мы использовали объект HTTPСервисЗапрос, который платформа передает в функцию автоматически. Обратите внимание на установку заголовка Content-Type — это критически важно для того, чтобы вызывающая система поняла, что мы вернули именно JSON.

Шаг 3: Обработка входящих данных через POST

Рассмотрим более сложную ситуацию: внешняя система присылает нам данные (например, заказ клиента) методом POST. Нам нужно прочитать тело запроса, десериализовать его и создать документ в 1С. Выясним причину возможных ошибок на этом этапе: часто они связаны с неверной кодировкой или некорректным форматом JSON.

Посмотрим на пример обработки входящего POST-запроса:


Функция CreateOrderPost(Запрос)
    
    // Читаем тело запроса
    СтрокаJSON = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
    
    Попытка
        ДанныеЗаказа = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
    Исключение
        ЧтениеJSON.Закрыть();
        Возврат Новый HTTPСервисОтвет(400); // Bad Request
    КонецПопытки;
    
    // Проанализируем полученные данные и создадим документ
    // Предположим, в JSON есть поле "Customer" и "Amount"
    
    НовыйЗаказ = Документы.ЗаказКлиента.СоздатьДокумент();
    НовыйЗаказ.Дата = ТекущаяДата();
    // Логика поиска контрагента и заполнения ТЧ...
    // НовыйЗаказ.Записать();
    
    Ответ = Новый HTTPСервисОтвет(201); // Created
    Ответ.УстановитьТелоИзСтроки("Заказ успешно создан", КодировкаТекста.UTF8);
    
    Возврат Ответ;
    
КонецФункции

Использование метода ПолучитьТелоКакСтроку позволяет нам быстро извлечь данные. Однако, если передаваемый объем данных велик (несколько мегабайт), рекомендуется использовать ПолучитьТелоКакПоток для экономии оперативной памяти.

Работа с параметрами URL

Часто нам требуется передать конкретный идентификатор в самом адресе, например: /items/000001. В 1С это реализуется через шаблоны. Если в шаблоне указано /items/{Articul}, то внутри функции мы можем обратиться к этому параметру через свойство Запрос.ПараметрыURL.

Разберем по шагам, как это выглядит в коде:


Артикул = Запрос.ПараметрыURL.Получить("Articul");
Если Артикул <> Неопределено Тогда
    // Ищем товар по артикулу
    СсылкаНаТовар = Справочники.Номенклатура.НайтиПоНаименованию(Артикул);
КонецЕсли;

Это делает наши API более человекочитаемыми и соответствующими стандартам REST.

Безопасность и авторизация

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

Для обеспечения безопасности мы рекомендуем:

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

Отладка может вызвать затруднения, так как сервис запускается в контексте сеанса веб-сервера (Apache или IIS). Чтобы точка останова сработала, необходимо выполнить следующие действия:

  1. Убедиться, что в настройках веб-сервера включена отладка (параметр -debug).
  2. В конфигураторе зайти в меню Отладка -> Подключение и выбрать нужный сеанс типа HTTP-сервис.
  3. Установить точку останова в коде метода.

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

Заключение

Мы рассмотрели полный цикл работы с HTTP-сервисами: от проектирования структуры в конфигураторе до обработки сложных POST-запросов с использованием JSON. Данный механизм является наиболее производительным для обмена данными "на лету". Помните о необходимости обработки исключений (блок Попытка...Исключение), чтобы ваш сервис не возвращал ошибку 500 при любом некорректном вводе, а отдавал информативные сообщения вызывающей стороне.

← На главную