Как обрабатывать REST-запросы в 1С:Предприятие 8.2 и 8.3?

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

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

Архитектурные ограничения платформы 1С 8.2 и способы их обхода

В платформе 1С 8.2 полностью отсутствует нативная поддержка REST-архитектуры. В данной версии нет объекта метаданных HTTP-сервисы, не поддерживается протокол OData, а также нет встроенных объектов для сериализации и десериализации данных в формат JSON (таких как ЧтениеJSON и ЗаписьJSON). Штатно платформа 8.2 умеет работать только с SOAP веб-сервисами (объекты ветки метаданных Web-сервисы, работающие по протоколу XML/WSDL).

Если информационная база функционирует на платформе 8.2 и перевод на версию 8.3 невозможен, проанализируем доступные пути решения задачи:

  1. Использование промежуточного шлюза (микросервиса). Создадим внешний сервис на любом удобном стеке (Python, Node.js, PHP, C#). Сторонние приложения отправляют стандартные REST/JSON-запросы на этот шлюз, а он транслирует команды в 1С через COM-соединение с помощью объекта V82.COMConnector либо вызывает штатный SOAP веб-сервис 1С.
  2. Парсинг JSON средствами операционной системы. Для разбора JSON-строк внутри 1С 8.2 разработчики применяют системный COM-объект Windows MSScriptControl.ScriptControl с языком выполнения JScript, внешние компоненты или регулярные выражения.

Штатные механизмы REST в платформе 1С 8.3

Начиная с версии 8.3.5, фирма «1С» предоставила полноценный инструментарий для создания и обработки REST-запросов. Выясним разницу между двумя ключевыми механизмами:

  1. Автоматический REST-интерфейс (OData). Позволяет быстро опубликовать базу и предоставить внешний доступ к справочникам, документам и регистрам без написания программного кода. Состав публикуемых объектов регулируется функцией УстановитьСоставСтандартногоИнтерфейсаOData(). Главный недостаток OData — жестко заданная структура ответов и невозможность выполнять нестандартную бизнес-логику со сложными проверками перед проведением документов.
  2. Собственные HTTP-сервисы. Это специализированные объекты конфигурации (ветка «Общие — HTTP-сервисы»). Они обеспечивают полный контроль над входящими запросами: мы сами определяем структуру URL-адресов, принимаем любые HTTP-методы (GET, POST, PUT, DELETE, PATCH), парсим тело запроса и формируем произвольный HTTP-ответ с необходимыми кодами состояния (200, 201, 400, 404, 500).

Создание и обработка входящего HTTP-сервиса в 1С 8.3

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

  1. В дереве метаданных перейдем в ветку Общие — HTTP-сервисы и добавим новый сервис. Зададим ему имя (например, ОбменДанными) и Корневой URL (например, api).
  2. Внутри сервиса создадим Шаблон URL. В свойствах укажем шаблон пути, например, /orders или /orders/{Идентификатор} для получения конкретного объекта.
  3. Для созданного шаблона добавим Метод HTTP. Выберем необходимый HTTP-метод (GET для отдачи данных, POST для создания новых записей).
  4. В свойствах метода укажем имя функции-обработчика и перейдем в модуль сервиса.

Посмотрим на пример функции-обработчика метода POST, принимающей JSON с заказом и возвращающей результат обработки:


Функция ordersPOST(Запрос)
    
    // Получаем тело входящего запроса в виде строки
    СтрокаJSON = Запрос.ПолучитьТелоКакСтроку("UTF-8");
    
    // Выполняем чтение JSON
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(СтрокаJSON);
    
    Попытка
        ДанныеЗаказа = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        
        // В случае ошибки парсинга возвращаем код 400 Bad Request
        Ответ = Новый HTTPСервисОтвет(400);
        Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
        Ответ.УстановитьТелоИзСтроки("{""error"": ""Некорректный формат JSON""}", "UTF-8");
        Возврат Ответ;
    КонецПопытки;
    
    // Здесь выполняем прикладную обработку полученных данных
    // Например, поиск контрагента, создание документа "Заказ покупателя" и т.д.
    
    // Формируем успешный ответ клиенту с кодом 200 OK
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    Результат = Новый Структура;
    Результат.Вставить("status", "success");
    Результат.Вставить("message", "Заказ успешно принят к обработке");
    
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, Результат);
    СтрокаОтвета = Запись.Закрыть();
    
    Ответ.УстановитьТелоИзСтроки(СтрокаОтвета, "UTF-8");
    
    Возврат Ответ;
    
КонецФункции

Отправка исходящих REST-запросов из 1С

Если нам требуется отправить номенклатуру или заказы во внешнюю систему либо в другую базу 1С, используем объект HTTPСоединение и объект HTTPЗапрос. Рассмотрим пример отправки POST-запроса с телом в формате JSON:


Сервер = "api.mysite.com";
Порт = 443;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// Инициализируем защищенное подключение
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , 30, ЗащищенноеСоединение);

// Подготавливаем данные для отправки
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Артикул", "A-10293");
СтруктураДанных.Вставить("Наименование", "Стол офисный");
СтруктураДанных.Вставить("Цена", 15400);

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, СтруктураДанных);
ТелоЗапроса = Запись.Закрыть();

// Формируем запрос
АдресРесурса = "/v1/products";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, "UTF-8");

// Отправляем данные и получаем ответ
Попытка
    ОтветСервера = Соединение.ОтправитьДляОбработки(Запрос);
    КодСостояния = ОтветСервера.КодСостояния;
    ТелоОтвета = ОтветСервера.ПолучитьТелоКакСтроку("UTF-8");
    
    Если КодСостояния = 200 Или КодСостояния = 201 Тогда
        // Обработка успешного ответа
    Иначе
        // Обработка ошибки удаленного сервиса
    КонецЕсли;
Исключение
    // Обработка сетевого сбоя или недоступности сервера
КонецПопытки;

Публикация сервиса на веб-сервере и нюансы лицензирования

Для того чтобы внешние клиенты могли обращаться к HTTP-сервисам базы 1С, ее необходимо опубликовать на веб-сервере (обычно это IIS или Apache). Настройка выполняется через конфигуратор по пути Администрирование — Публикация на веб-сервере. В процессе публикации конфигуратор создает файл дескриптора с именем default.vrd.

При настройке публикации важно помнить о следующих ключевых нюансах:

  1. Флаг публикации сервисов. В окне публикации необходимо убедиться, что отмечен флаг «Публиковать HTTP сервисы», а также отмечен конкретный созданный нами сервис.
  2. Расход клиентских лицензий. Каждый входящий вызов сервиса по умолчанию инициализирует сеанс 1С и занимает клиентскую лицензию на время своей работы. При некорректной настройке веб-сервера частые запросы приведут к исчерпанию доступных лицензий в кластере.
  3. Настройка пула соединений. Для высоконагруженных обменов рекомендуется настраивать параметры пула сеансов в файле default.vrd (параметры poolsize, wait_timeout). Это позволяет повторно использовать уже открытые сеансы 1С, значительно снижая накладные расходы на постоянную авторизацию и инициализацию контекста при каждом HTTP-вызове.
← На главную