Интеграция 1С с внешними системами (интернет-магазины, маркетплейсы, CRM-системы, сервисы доставки) — одна из самых частых задач, встающих перед разработчиком. Современным стандартом обмена данными является использование протокола HTTP (REST API) и формата JSON. Несмотря на кажущуюся простоту, при реализации возникают нюансы: настройка защищенного соединения (SSL), правильное формирование заголовков и корректная обработка ответов сервера.
Разберем детально, как реализовать полный цикл обмена данными: от создания соединения до парсинга ответа, используя штатные механизмы платформы 1С:Предприятие 8.3. Мы проанализируем различные методы отправки данных (GET и POST) и рассмотрим работу с сериализацией JSON.
Для начала работы с любым веб-сервером необходимо инициировать соединение. В 1С для этого используется объект HTTPСоединение. Важно понимать, что создание объекта еще не отправляет запрос, а лишь настраивает параметры "туннеля", через который мы будем общаться с сервером.
Рассмотрим базовый конструктор. Нам понадобятся адрес сервера (хост) и, возможно, порт. Обратите внимание, что хост указывается без протокола (без "https://").
Критический момент, на котором часто спотыкаются разработчики, — это работа по защищенному протоколу HTTPS. Если целевой ресурс работает через HTTPS (что сейчас является стандартом), нам необходимо использовать защищенное соединение. В 1С за это отвечает объект ЗащищенноеСоединениеOpenSSL.
Посмотрим на пример инициализации соединения:
// Определяем параметры подключения
Сервер = "api.example.com";
Порт = 443; // Стандартный порт для HTTPS
Пользователь = "admin";
Пароль = "secretKey123";
// Настраиваем защищенное соединение
// Если сертификат сервера валидный и от доверенного центра, параметры можно не указывать
// В тестовых средах иногда требуется игнорировать ошибки сертификатов (не рекомендуется для продакшена)
Ссл = Новый ЗащищенноеСоединениеOpenSSL(неопределено, неопределено);
// Создаем соединение
Попытка
Соединение = Новый HTTPСоединение(
Сервер,
Порт,
Пользователь,
Пароль,
,
50, // Таймаут в секундах
Ссл
);
Исключение
// Обработка ошибки инициализации, например, если сервер недоступен по DNS
ЗаписьЖурналаРегистрации("HTTP.ОшибкаПодключения", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат;
КонецПопытки;
Важные нюансы при создании соединения:
HTTPСоединение, как показано в примере выше. Платформа сама закодирует их в Base64 и добавит заголовок Authorization.После создания соединения нам нужно подготовить сам запрос. В 1С это делается через объект HTTPЗапрос. В конструкторе мы указываем адрес ресурса (путь относительно домена).
Одна из распространенных ошибок — отсутствие правильных заголовков. Веб-сервер должен понимать, в каком формате мы присылаем данные и в каком формате ждем ответ. Для JSON-обмена стандартом является заголовок Content-Type: application/json.
Разберем пример подготовки запроса:
// Указываем ресурс (endpoint)
АдресРесурса = "/v1/orders/create";
// Создаем объект запроса
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса);
// Добавляем обязательные заголовки
ЗапросHTTP.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ЗапросHTTP.Заголовки.Вставить("Accept", "application/json");
// Если требуется авторизация по токену (не Basic)
Токен = "eyJhbGciOiJIUzI1NiIsInR5cCI6Ik...";
ЗапросHTTP.Заголовки.Вставить("Authorization", "Bearer " + Токен);
Перед отправкой данных (например, при создании заказа через POST-запрос) нам нужно преобразовать данные 1С (структуры, массивы) в строку формата JSON.
В платформе 8.3 для этого предусмотрен мощный объект ЗаписьJSON. Проанализируем, как правильно сформировать сложную структуру и превратить ее в строку.
// Подготовим данные 1С. Обычно это Структура или Соответствие.
ДанныеЗаказа = Новый Структура;
ДанныеЗаказа.Вставить("number", "00001");
ДанныеЗаказа.Вставить("date", Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddTHH:mm:ss"));
ДанныеЗаказа.Вставить("customer", "Иванов И.И.");
МассивТоваров = Новый Массив;
СтрокаТовара = Новый Структура("product_id, quantity, price", "sku-123", 2, 1500);
МассивТоваров.Добавить(СтрокаТовара);
ДанныеЗаказа.Вставить("items", МассивТоваров);
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина); // Компактный вид, экранирование
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
// Используем глобальный метод ЗаписатьJSON
ЗаписатьJSON(ЗаписьJSON, ДанныеЗаказа);
// Получаем итоговую строку
ТекстJSON = ЗаписьJSON.Закрыть();
После того как строка JSON получена, ее необходимо поместить в тело нашего HTTP-запроса. Обратите внимание на кодировку: стандарт для JSON — UTF-8.
// Устанавливаем тело запроса
ЗапросHTTP.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Теперь у нас все готово для отправки. Мы используем методы объекта HTTPСоединение. В зависимости от задачи выбираем метод:
Получить(ЗапросHTTP) — для GET-запросов (получение данных).ОтправитьДляОбработки(ЗапросHTTP) — для POST-запросов (создание/изменение данных).Записать(ЗапросHTTP) — для PUT-запросов.Удалить(ЗапросHTTP) — для DELETE-запросов.Рассмотрим выполнение POST-запроса и обработку кода состояния:
Попытка
// Выполняем POST запрос
ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
Исключение
// Ошибки сети, разрыва соединения
Сообщить("Ошибка отправки запроса: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Проверяем HTTP статус ответа
КодСостояния = ОтветHTTP.КодСостояния;
Если КодСостояния = 200 Или КодСостояния = 201 Тогда
// Успешный запрос, обрабатываем данные
ОбработатьУспешныйОтвет(ОтветHTTP);
Иначе
// Логируем ошибку, читаем тело ответа для понимания причины (там часто лежит описание ошибки от API)
ТелоОшибки = ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Сообщить("Сервер вернул ошибку " + КодСостояния + ": " + ТелоОшибки);
КонецЕсли;
Сервер, как правило, возвращает ответ также в формате JSON. Нам нужно прочитать его и превратить обратно в объекты 1С (Структуры и Массивы) для дальнейшей обработки.
Для этого используем объект ЧтениеJSON. Давайте посмотрим, как безопасно прочитать ответ:
Процедура ОбработатьУспешныйОтвет(ОтветHTTP)
// Получаем строку из ответа
СтрокаОтвета = ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если ПустаяСтрока(СтрокаОтвета) Тогда
Возврат;
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
// Десериализация
// Второй параметр Истина позволяет читать дату как дату 1С, если формат совпадает,
// но надежнее читать как строку и преобразовывать вручную при необходимости.
Попытка
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON, Ложь);
// ДанныеОтвета теперь содержат Структуру или Массив
Исключение
Сообщить("Некорректный JSON в ответе сервера");
КонецПопытки;
ЧтениеJSON.Закрыть();
// Пример работы с полученными данными
Если ТипЗнч(ДанныеОтвета) = Тип("Структура") И ДанныеОтвета.Свойство("id") Тогда
Сообщить("Создан заказ с ID: " + ДанныеОтвета.id);
КонецЕсли;
КонецПроцедуры
При реализации интеграций мы часто сталкиваемся с типовыми проблемами. Рассмотрим способы их диагностики и устранения.
Проблема: Ошибка работы с криптографией или SSL.
Часто возникает, если сертификат сервера устарел, самоподписанный или корневой сертификат отсутствует в хранилище сертификатов сервера, где установлен сервер 1С.
Решение: В тестовой среде можно обновить платформу до актуальной версии (где обновлены корневые сертификаты) или экспортировать сертификат сайта через браузер и добавить его в файл cacert.pem платформы 1С.
Проблема: Ответ приходит в виде "крякозябр".
Решение: Всегда явно указывайте кодировку при чтении тела ответа: ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8). Если сервер использует специфическую кодировку (например, windows-1251), укажите её соответственно.
Проблема: Метод ПрочитатьJSON не может разобрать дату.
Стандарт JSON не имеет типа "Дата", это всегда строка. Форматы бывают разными (ISO 8601, Microsoft format и др.).
Решение: Используйте функцию восстановления (третий параметр в ПрочитатьJSON) или читайте все как строки, а затем преобразуйте функцией XMLЗначение(Тип("Дата"), СтрокаДаты), если формат соответствует ISO.
Часто в GET-запросах необходимо передавать параметры фильтрации в самой строке адреса (Query String). Не рекомендуется формировать строку вручную склеиванием, так как можно нарушить структуру URL спецсимволами (пробелы, амперсанды).
Для корректного формирования используйте кодирование строк:
БазовыйУРЛ = "/v1/products/search";
ПараметрПоиска = "Молоко & Хлеб"; // Содержит спецсимволы
ЗакодированныйПараметр = КодироватьСтроку(ПараметрПоиска, СпособКодированияСтроки.КодировкаURL);
ПолныйПуть = БазовыйУРЛ + "?query=" + ЗакодированныйПараметр + "&limit=10";
ЗапросHTTP = Новый HTTPЗапрос(ПолныйПуть);
Используя эти методы, мы можем построить надежную и отказоустойчивую систему обмена данными с любым современным API. Главное — внимательно следить за документацией API, с которым вы интегрируетесь, корректно обрабатывать коды ошибок HTTP (400, 401, 403, 500) и логировать все этапы обмена для быстрой отладки.