Интеграция 1С со сторонними системами (веб-сайтами, мобильными приложениями, WMS или другими базами данных) чаще всего строится на архитектуре REST с передачей данных в формате JSON. Однако при реализации таких интеграций разработчики нередко сталкиваются с вопросом совместимости версий платформы. Рассмотрим подробно, как организовать обработку REST-запросов в 1С:Предприятии, какие технические ограничения существуют в версии 8.2 и как правильно использовать штатные механизмы платформы 8.3.
В платформе 1С 8.2 полностью отсутствует нативная поддержка REST-архитектуры. В данной версии нет объекта метаданных HTTP-сервисы, не поддерживается протокол OData, а также нет встроенных объектов для сериализации и десериализации данных в формат JSON (таких как ЧтениеJSON и ЗаписьJSON). Штатно платформа 8.2 умеет работать только с SOAP веб-сервисами (объекты ветки метаданных Web-сервисы, работающие по протоколу XML/WSDL).
Если информационная база функционирует на платформе 8.2 и перевод на версию 8.3 невозможен, проанализируем доступные пути решения задачи:
V82.COMConnector либо вызывает штатный SOAP веб-сервис 1С.MSScriptControl.ScriptControl с языком выполнения JScript, внешние компоненты или регулярные выражения.Начиная с версии 8.3.5, фирма «1С» предоставила полноценный инструментарий для создания и обработки REST-запросов. Выясним разницу между двумя ключевыми механизмами:
УстановитьСоставСтандартногоИнтерфейсаOData(). Главный недостаток OData — жестко заданная структура ответов и невозможность выполнять нестандартную бизнес-логику со сложными проверками перед проведением документов.Разберем по шагам процесс создания собственного сервиса для приема данных (например, информации о заказах или номенклатуре):
ОбменДанными) и Корневой URL (например, api)./orders или /orders/{Идентификатор} для получения конкретного объекта.Посмотрим на пример функции-обработчика метода 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");
Возврат Ответ;
КонецФункции
Если нам требуется отправить номенклатуру или заказы во внешнюю систему либо в другую базу 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.
При настройке публикации важно помнить о следующих ключевых нюансах:
default.vrd (параметры poolsize, wait_timeout). Это позволяет повторно использовать уже открытые сеансы 1С, значительно снижая накладные расходы на постоянную авторизацию и инициализацию контекста при каждом HTTP-вызове.