В современной экосистеме автоматизации бизнеса задача интеграции 1С с внешними системами (сайтами, мобильными приложениями, сторонними сервисами) становится одной из приоритетных. Одним из самых эффективных и быстрых способов взаимодействия является использование HTTP-сервисов. В рамках данной статьи мы подробно разберем, как создать собственный сервис, настроить его методы и обеспечить корректный обмен данными в формате JSON.
Прежде чем переходить к написанию кода, давайте разберем, из каких компонентов состоит HTTP-сервис в платформе 1С. Мы работаем с объектом метаданных HTTP-сервисы. Основными элементами здесь являются:
/get_balance/{INN}).Проанализируем процесс создания. При разработке важно понимать, что 1С выступает в роли сервера, который ожидает входящее соединение, обрабатывает его в специальном модуле и возвращает результат в виде HTTP-ответа.
Рассмотрим пошагово процесс создания. В дереве конфигурации найдем ветку Общие -> HTTP-сервисы и добавим новый объект. Назовем его, например, ОбменДанными. В поле "Корневой URL" укажем exchange. Теперь наш сервис будет доступен по адресу вида http://server/base/hs/exchange/.
Далее создадим "Шаблон URL". Если мы хотим передавать данные о товарах, назовем шаблон GetItems и укажем путь /items/*. Звездочка означает, что мы можем принимать любые параметры после слеша.
Разберем ситуацию, когда внешней системе нужно получить список номенклатуры из 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.
Рассмотрим более сложную ситуацию: внешняя система присылает нам данные (например, заказ клиента) методом 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);
Возврат Ответ;
КонецФункции
Использование метода ПолучитьТелоКакСтроку позволяет нам быстро извлечь данные. Однако, если передаваемый объем данных велик (несколько мегабайт), рекомендуется использовать ПолучитьТелоКакПоток для экономии оперативной памяти.
Часто нам требуется передать конкретный идентификатор в самом адресе, например: /items/000001. В 1С это реализуется через шаблоны. Если в шаблоне указано /items/{Articul}, то внутри функции мы можем обратиться к этому параметру через свойство Запрос.ПараметрыURL.
Разберем по шагам, как это выглядит в коде:
Артикул = Запрос.ПараметрыURL.Получить("Articul");
Если Артикул <> Неопределено Тогда
// Ищем товар по артикулу
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоНаименованию(Артикул);
КонецЕсли;
Это делает наши API более человекочитаемыми и соответствующими стандартам REST.
Важный момент: по умолчанию HTTP-сервисы требуют авторизации. Выясним, как правильно настроить доступ. При обращении к сервису необходимо передавать заголовок Authorization (Basic Auth), который содержит логин и пароль пользователя 1С в кодировке Base64. У этого пользователя должны быть роли, дающие право на использование конкретного HTTP-сервиса.
Для обеспечения безопасности мы рекомендуем:
HTTPS для защиты передаваемых данных.Отладка может вызвать затруднения, так как сервис запускается в контексте сеанса веб-сервера (Apache или IIS). Чтобы точка останова сработала, необходимо выполнить следующие действия:
-debug).HTTP-сервис.Проанализируем типичную ситуацию: запрос уходит, но 1С не реагирует. В этом случае стоит проверить настройки публикации на веб-сервере. Убедитесь, что при публикации флажок "Публиковать HTTP-сервисы" установлен.
Мы рассмотрели полный цикл работы с HTTP-сервисами: от проектирования структуры в конфигураторе до обработки сложных POST-запросов с использованием JSON. Данный механизм является наиболее производительным для обмена данными "на лету". Помните о необходимости обработки исключений (блок Попытка...Исключение), чтобы ваш сервис не возвращал ошибку 500 при любом некорректном вводе, а отдавал информативные сообщения вызывающей стороне.