Как передать данные в 1С через HTTP-сервис и получить ответ в одном запросе?

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

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

Основы взаимодействия: почему POST может возвращать данные

Часто у начинающих разработчиков возникает заблуждение, что протокол HTTP жестко разделяет методы: POST только для записи, а GET только для чтения. На самом деле, согласно стандартам, любой HTTP-запрос (включая POST, PUT, DELETE) может содержать тело ответа. Проанализируем ситуацию: когда мы отправляем данные в базу-приемник, сервер обрабатывает запрос и формирует объект HTTPСервисОтвет. В этот объект мы можем поместить любую информацию, которая будет передана обратно вызывающей стороне.

Рассмотрим стандартную последовательность действий:

  1. База-источник формирует HTTPЗапрос и отправляет его методом POST.
  2. База-приемник принимает запрос в методе-обработчике HTTP-сервиса.
  3. Сервер обрабатывает данные (например, записывает документ).
  4. Сервер формирует ответ, записывает в его тело нужные параметры и возвращает его.
  5. База-источник получает ответ и читает данные из тела сообщения.

Реализация обработчика на стороне сервера (база-приемник)

Разберем, как изменить код стандартного метода POST, чтобы он возвращал номер созданного документа. Предположим, у нас есть процедура в общем модуле, которая отвечает за загрузку данных. Для того чтобы получить из нее результат, мы можем использовать параметры, передаваемые по ссылке, или превратить процедуру в функцию.

Рассмотрим вариант с использованием параметров процедуры. Проанализируем следующий пример кода в модуле HTTP-сервиса:


Функция ИмяМетодаPOST(Запрос)
    
    // Создаем объект ответа со статусом 200 (ОК)
    Ответ = Новый HTTPСервисОтвет(200);
    
    // Получаем входящие данные из тела запроса
    СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
    
    // Переменная для хранения возвращаемого номера
    НомерДокумента = "";
    
    // Вызываем логику загрузки, передавая переменную для получения номера
    КД_Обмен.ЗагрузитьОПЗСJSON(СтрокаJSON, НомерДокумента);
    
    // Устанавливаем номер документа в тело ответа
    Ответ.УстановитьТелоИзСтроки(НомерДокумента);
    
    // Важно указать тип контента, чтобы клиент понимал, как читать данные
    Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
    
    Возврат Ответ;
    
КонецФункции

В самой процедуре ЗагрузитьОПЗСJSON логика будет выглядеть следующим образом:


Процедура ЗагрузитьОПЗСJSON(ДанныеJSON, Номер) Экспорт
    
    // ... логика десериализации и создания документа ...
    НовыйДокумент = Документы.ОтчетПроизводстваЗаСмену.СоздатьДокумент();
    // Заполнение полей...
    НовыйДокумент.Записать();
    
    // Возвращаем номер через параметр
    Номер = НовыйДокумент.Номер;
    
КонецПроцедуры

Обработка ответа на стороне клиента (база-источник)

Теперь выясним, как правильно принять этот ответ в базе, которая инициировала запрос. Для этого мы используем метод ОтправитьДляОбработки объекта HTTPСоединение, который возвращает объект HTTPОтвет.

Разберем пример кода на стороне клиента:


// Настройка соединения и запроса
Соединение = Новый HTTPСоединение("server_address", , "user", "password");
Запрос = Новый HTTPЗапрос("/v1/exchange/create_doc");
Запрос.УстановитьТелоИзСтроки(ДанныеДляОтправки);

// Отправляем данные и получаем объект ответа
Результат = Соединение.ОтправитьДляОбработки(Запрос);

// Проверяем код состояния
Если Результат.КодСостояния = 200 Тогда
    // Читаем номер документа из тела ответа
    НомерСозданногоДокумента = Результат.ПолучитьТелоКакСтроку();
    Сообщить("Документ успешно создан. Номер в базе-приемнике: " + НомерСозданногоДокумента);
Иначе
    Сообщить("Ошибка при обмене. Код состояния: " + Результат.КодСостояния);
КонецЕсли;

Передача набора параметров через JSON

Если нам нужно вернуть не одно значение (номер), а целый набор данных (например, ссылку, дату, статус и массив ошибок), использование простых строк становится неудобным. В этом случае мы рекомендуем оперировать структурами и переводить их в формат JSON. Это является стандартом современной разработки.

Рассмотрим, как упаковать структуру в ответ сервера:


// Формируем структуру с результатами
РезультатОбработки = Новый Структура;
РезультатОбработки.Вставить("Успешно", Истина);
РезультатОбработки.Вставить("Номер", НовыйДокумент.Номер);
РезультатОбработки.Вставить("ID", Строка(НовыйДокумент.Ссылка.УникальныйИдентификатор()));

// Сериализуем структуру в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, РезультатОбработки);
СтрокаОтветаJSON = ЗаписьJSON.Закрыть();

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

На стороне клиента мы выполним обратную операцию — чтение JSON в структуру:


ОтветСервера = Результат.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветСервера);
ДанныеРезультата = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Если ДанныеРезультата.Успешно Тогда
    Сообщить("Создан документ №" + ДанныеРезультата.Номер);
КонецЕсли;

Лучшие практики и технические нюансы

Для создания надежного и профессионального обмена данными, проанализируем несколько важных аспектов, которые часто упускаются из виду:

  1. Корректные HTTP-статусы: Не ограничивайтесь только кодом 200. Если данные в запросе некорректны, используйте код 400 (Bad Request). Если произошла критическая ошибка в коде 1С, оберните выполнение в блок Попытка...Исключение и возвращайте код 500 (Internal Server Error) вместе с текстом ошибки. Это позволит вызывающей системе правильно реагировать на сбои.
  2. MIME-типы (Content-Type): Всегда указывайте правильный тип контента в заголовках. Если вы передаете JSON, используйте application/json. Если простой текст — text/plain. Это помогает избежать проблем с кодировками и интерпретацией данных.
  3. Безопасность: Помните, что при использовании базовой авторизации логин и пароль передаются в заголовке в открытом виде (Base64). Обязательно используйте протокол HTTPS для шифрования трафика при передаче через публичные сети.
  4. Отладка: Настройка отладки HTTP-сервисов требует включения отладки на сервере 1С по протоколу HTTP. В конфигураторе необходимо в параметрах отладки установить флаг "Автоматическое подключение: HTTP-сервисы". Для предварительного тестирования запросов без написания кода в 1С удобно использовать сторонние инструменты, такие как Postman.
  5. Работа с большими данными: Если объем возвращаемых данных велик, вместо УстановитьТелоИзСтроки рассмотрите возможность работы с потоками через УстановитьТелоИзПотока. Это позволит системе более эффективно распоряжаться оперативной памятью сервера.

Таким образом, мы выяснили, что HTTP-сервисы в 1С предоставляют гибкий инструмент для двустороннего обмена данными в рамках одного вызова. Использование формата JSON и грамотная обработка кодов состояний позволяют создавать стабильные и масштабируемые интеграционные решения.

← На главную