При интеграции 1С со сторонними веб-приложениями, мобильными клиентами и внешними сервисами разработчики часто сталкиваются с требованием предоставить REST API. Однако стандартный автоматический REST-интерфейс платформы 1С не всегда подходит: сторонним системам зачастую требуется строго определенная структура JSON, агрегированные данные из нескольких таблиц или инициация бизнес-логики (проведение документов, запись логов, регистрация событий), а не прямое чтение таблиц базы данных.
Выясним причину таких ограничений и подробно рассмотрим, какими средствами платформы 1С реализуется полноценный кастомный REST-сервис.
В платформе 1С существует два основных способа предоставить доступ к данным по протоколу HTTP:
$select, $filter, $top, $skip. Главный недостаток — жесткая привязка к структуре метаданных 1С. В нем нельзя за один запрос собрать кастомную иерархическую структуру данных или выполнить сложный произвольный алгоритм без изменения объектов.GET, POST, PUT, DELETE, PATCH) и полностью контролировать формат входящих и исходящих данных, а также логику их обработки на сервере 1С.Таким образом, концепция REST в 1С для нестандартных задач реализуется именно через механизм HTTP-сервисов.
Разберем по шагам процесс создания и настройки кастомного REST-интерфейса в конфигураторе 1С.
api/v1)./orders/{Идентификатор} или /products.GET для получения данных и метод POST для приема запросов на изменение или выполнение операций.Посмотрим на пример функции-обработчика, которая принимает запрос, извлекает параметры, выполняет произвольный запрос к базе 1С и возвращает клиенту данные в формате JSON:
Функция ОбработатьЗапросGET(Запрос)
// Получаем параметры из URL или строки запроса
Идентификатор = Запрос.ПараметрыURL.Получить("Идентификатор");
// Выполняем произвольную выборку данных
ЗапросКБД = Новый Запрос;
ЗапросКБД.Текст =
"ВЫБРАТЬ
| Товары.Ссылка КАК Идентификатор,
| Товары.Наименование КАК Наименование,
| Товары.Артикул КАК Артикул,
| Товары.Цена КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Товары
|ГДЕ
| НЕ Товары.ЭтоГруппа";
РезультатЗапроса = ЗапросКБД.Выполнить().Выгрузить();
// Формируем структуру ответа
СписокТоваров = Новый Массив;
Для Каждого Стр Из РезультатЗапроса Цикл
ТоварСтруктура = Новый Структура("id,name,sku,price",
Строка(Стр.Идентификатор.УникальныйИдентификатор()),
Стр.Наименование,
Стр.Артикул,
Стр.Цена);
СписокТоваров.Добавить(ТоварСтруктура);
КонецЦикла;
// Сериализуем данные в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СписокТоваров);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Формируем ответ HTTP-сервиса
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
Если стороннему сервису нужно передать данные в 1С (создать документ, зафиксировать факт обращения или запустить обработку), используем метод POST. Внутри функции-обработчика мы можем прочитать тело запроса, разобрать входящий JSON и записать данные в регистр или документ:
Функция ОбработатьЗапросPOST(Запрос)
ТелоСтрокой = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоСтрокой);
ДанныеЗапроса = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Регистрируем вызов или создаем объект в 1С
Попытка
НовыйДокумент = Документы.ЗаказПокупателя.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДатаСеанса();
НовыйДокумент.Комментарий = "Заказ создан через REST API сторонней системы";
// Заполнение реквизитов из структуры ДанныеЗапроса
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
ОтветСтруктура = Новый Структура("status,orderId", "success", Строка(НовыйДокумент.Ссылка.УникальныйИдентификатор()));
КодСтатуса = 201;
Исключение
ОтветСтруктура = Новый Структура("status,error", "error", ОписаниеОшибки());
КодСтатуса = 400;
КонецПопытки;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ОтветСтруктура);
СтрокаОтвета = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(КодСтатуса);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
Проанализируем ключевые моменты, которые необходимо учитывать при развертывании REST API на базе 1С:
default.vrd.Authorization из коллекции Запрос.Заголовки.ФоновыеЗадания.Выполнить(), верните статус 202 Accepted с идентификатором задания и предусмотрите отдельный метод для проверки статуса готовности результата.