При проектировании механизмов интеграции между базами 1С или внешними системами часто возникает задача не просто отправить данные (например, создать документ), но и сразу получить результат этой операции — номер созданного объекта, уникальный идентификатор или статус обработки. В этой статье мы подробно разберем, как правильно организовать обмен данными через HTTP-сервисы, почему для этого достаточно одного POST-запроса и как передавать сложные структуры данных.
Часто у начинающих разработчиков возникает заблуждение, что протокол HTTP жестко разделяет методы: POST только для записи, а GET только для чтения. На самом деле, согласно стандартам, любой HTTP-запрос (включая POST, PUT, DELETE) может содержать тело ответа. Проанализируем ситуацию: когда мы отправляем данные в базу-приемник, сервер обрабатывает запрос и формирует объект HTTPСервисОтвет. В этот объект мы можем поместить любую информацию, которая будет передана обратно вызывающей стороне.
Рассмотрим стандартную последовательность действий:
HTTPЗапрос и отправляет его методом POST.Разберем, как изменить код стандартного метода 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. Это является стандартом современной разработки.
Рассмотрим, как упаковать структуру в ответ сервера:
// Формируем структуру с результатами
РезультатОбработки = Новый Структура;
РезультатОбработки.Вставить("Успешно", Истина);
РезультатОбработки.Вставить("Номер", НовыйДокумент.Номер);
РезультатОбработки.Вставить("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.Закрыть();
Если ДанныеРезультата.Успешно Тогда
Сообщить("Создан документ №" + ДанныеРезультата.Номер);
КонецЕсли;
Для создания надежного и профессионального обмена данными, проанализируем несколько важных аспектов, которые часто упускаются из виду:
200. Если данные в запросе некорректны, используйте код 400 (Bad Request). Если произошла критическая ошибка в коде 1С, оберните выполнение в блок Попытка...Исключение и возвращайте код 500 (Internal Server Error) вместе с текстом ошибки. Это позволит вызывающей системе правильно реагировать на сбои.application/json. Если простой текст — text/plain. Это помогает избежать проблем с кодировками и интерпретацией данных.Postman.УстановитьТелоИзСтроки рассмотрите возможность работы с потоками через УстановитьТелоИзПотока. Это позволит системе более эффективно распоряжаться оперативной памятью сервера.Таким образом, мы выяснили, что HTTP-сервисы в 1С предоставляют гибкий инструмент для двустороннего обмена данными в рамках одного вызова. Использование формата JSON и грамотная обработка кодов состояний позволяют создавать стабильные и масштабируемые интеграционные решения.