Как в 1С реализовать передачу данных на веб-сервер с помощью POST-запроса в формате JSON?

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

Интеграция 1С с внешними веб-сервисами — одна из самых частых задач современного разработчика. В рамках данной статьи мы подробно разберем процесс выгрузки данных (на примере справочника Номенклатура) из 1С на внешний API. Мы пройдем весь путь: от формирования структуры данных в формате JSON до настройки защищенного соединения и обработки возможных ошибок сервера.

Шаг 1. Подготовка данных и формирование JSON

Прежде чем отправить данные, их необходимо собрать и преобразовать в формат, понятный веб-серверу. Чаще всего используется JSON. Рассмотрим, как правильно подготовить структуру данных в 1С. Для этого мы будем использовать объекты Запрос, Структура, Массив и специализированный объект ЗаписьJSON.

Проанализируем пример кода для сбора данных о номенклатуре:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    Номенклатура.Код КАК code1c,
|    Номенклатура.Представление КАК name
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    НЕ Номенклатура.ЭтоГруппа
|    И НЕ Номенклатура.ПометкаУдаления";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

МассивОбъектов = Новый Массив;
Пока Выборка.Следующий() Цикл 
    Данные = Новый Структура;
    Данные.Вставить("code1c", Выборка.code1c); 
    Данные.Вставить("name", Выборка.name); 
    МассивОбъектов.Добавить(Данные);
КонецЦикла;

// Поместим массив в корневую структуру, если того требует API
КорневаяСтруктура = Новый Структура;
КорневаяСтруктура.Вставить("items", МассивОбъектов);

Теперь преобразуем полученную структуру в строку JSON. Обратите внимание на использование параметров записи JSON — это позволяет избежать проблем с кодировкой и форматом строк.


ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);  
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, КорневаяСтруктура);
СтрокаJSON = ЗаписьJSON.Закрыть();

Важный нюанс: если вы планируете передавать огромные объемы данных (десятки тысяч позиций), использование строк может привести к переполнению памяти. В таких случаях мы рекомендуем использовать потоковую запись прямо в файл с помощью метода ЗаписьJSON.ОткрытьФайл().

Шаг 2. Настройка защищенного соединения (SSL)

Большинство современных ресурсов работают по протоколу HTTPS (порт 443). Для работы с ними в 1С необходимо инициализировать объект ЗащищенноеСоединениеOpenSSL. Если ваш сервер использует стандартный сертификат, достаточно передать параметры Неопределено.

Разберем создание объекта соединения:


АдресСервера = "api.mysite.ru"; // Только доменное имя, без http/https
Порт = 443;
ИспользоватьSSL = Истина;

Если ИспользоватьSSL Тогда
    Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
    Соединение = Новый HTTPСоединение(АдресСервера, Порт, , , , 60, Защита);
Иначе
    Соединение = Новый HTTPСоединение(АдресСервера, 80, , , , 60);
КонецЕсли;

Посмотрим на параметр Таймаут (в примере указано 60 секунд). Рекомендуется всегда устанавливать его явно, чтобы сеанс пользователя не «завис» при ожидании ответа от медленного сервера.

Шаг 3. Создание и настройка HTTP-запроса

Теперь нам нужно создать сам объект HTTPЗапрос. Здесь критически важно правильно заполнить заголовки, чтобы сервер понимал, какой тип данных мы передаем.

  1. Указываем адрес ресурса (путь на сервере).
  2. Устанавливаем заголовок Content-Type как application/json.
  3. Если требуется авторизация, добавляем соответствующий заголовок (например, API Key или Bearer Token).

ЗапросHTTP = Новый HTTPЗапрос();
ЗапросHTTP.АдресРесурса = "/v1/nomenclature/sync";
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json");
ЗапросHTTP.Заголовки.Вставить("Accept", "application/json"); // Сообщаем, что ждем JSON в ответ

// Если API требует ключ
// ЗапросHTTP.Заголовки.Вставить("X-API-KEY", "ваш_секретный_ключ");

// Передаем сформированную ранее JSON-строку в тело запроса
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Обратите внимание на ИспользованиеByteOrderMark.НеИспользовать. Некоторые веб-серверы (особенно на базе PHP или Python) некорректно воспринимают маркер BOM в начале строки и выдают ошибку парсинга JSON.

Шаг 4. Отправка запроса и обработка ответа

После настройки всех параметров вызываем метод ОтправитьДляОбработки() (для POST-запроса). Выясним, как правильно интерпретировать ответ сервера, так как даже при технически успешной отправке сервер может вернуть ошибку бизнес-логики.


Попытка
    Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
    
    КодСостояния = Ответ.КодСостояния;
    СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
    
    Если КодСостояния >= 200 И КодСостояния < 300 Тогда
        Сообщить("Данные успешно переданы! Код: " + КодСостояния);
        // Здесь можно распарсить ответ через ЧтениеJSON, если сервер вернул ID созданных записей
    Иначе
        Сообщить("Сервер вернул ошибку: " + КодСостояния);
        Сообщить("Текст ответа: " + СтрокаОтвета);
    КонецЕсли;
    
Исключение
    Сообщить("Ошибка сетевого соединения: " + ОписаниеОшибки());
КонецПопытки;

Типичные проблемы и их решение

Проанализируем ситуацию, с которой столкнулись пользователи в обсуждении. При попытке отправить запрос на адрес с www сервер вернул ошибку 301 Moved Permanently.

Причина: Веб-сервер настроен на переадресацию с одного домена на другой (например, с www.site.ru на site.ru). Объект HTTPСоединение в 1С автоматически не следует по редиректам для POST-запросов в целях безопасности.

Решение: Всегда указывайте конечный актуальный адрес API в конструкторе HTTPСоединение, минуя посредников и редиректы. Если сервер переместил ресурс, измените АдресСервера в коде.

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

Рассмотренная методика является базовой для работы с REST-интерфейсами. Понимая эти принципы, вы сможете легко реализовать и другие методы взаимодействия, такие как PUT (для обновления) или DELETE, используя метод ВызватьHTTPМетод().

← На главную