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

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

Настройка обмена между двумя информационными базами 1С с помощью технологии HTTP-сервисов — это эффективный и современный способ организации интеграции (удобно через синхронизацию через EnterpriseData между базами 1С). Однако на этапе разработки часто возникают сложности с сетевым соединением и форматами данных. В этой статье мы разберем пошагово, как правильно организовать обмен контрагентами между 1С:Бухгалтерия и 1С:Управление торговлей, а также устраним распространенные ошибки, такие как Couldn't resolve host name и проблемы с форматами потока.

Этап 1: Настройка HTTP-сервиса на стороне принимающей базы (БП)

Первым делом мы создаем HTTP-сервис, который будет принимать запросы, выполнять их и возвращать результат. В конфигураторе необходимо создать объект HTTP-сервис, определить его Корневой URL, например Exchange, и добавить Шаблон URL с методом POST — для этого подойдёт готовый HTTP-сервис для 1С:Бухгалтерия.

Важно грамотно написать обработчик метода — есть автоматизированная веб-интеграция между базами 1С. Рассмотрим пример реализации функции, которая получает данные в формате JSON, выполняет запрос к базе и возвращает результат в виде сериализованной таблицы значений.


Функция GetAnyRequestPOST(Запрос)
    // Получаем тело запроса в формате JSON
    JSON_Struktura = Запрос.ПолучитьТелоКакСтроку("UTF-8");
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(JSON_Struktura);
    ЗапросПараметры = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Инициализируем запрос к данным
    ЗапросКДанным = Новый Запрос;
    ЗапросКДанным.Текст = ЗапросПараметры.Запрос;
    
    // Устанавливаем параметры, переданные из внешней базы
    Для Каждого СтрСтр Из ЗапросПараметры.Параметры Цикл
        ЗапросКДанным.УстановитьПараметр(СтрСтр.Ключ, СтрСтр.Значение);
    КонецЦикла;
    
    // Выполняем запрос и сериализуем результат
    ТЗ = ЗапросКДанным.Выполнить().Выгрузить();
    Текст = ЗначениеВСтрокуВнутр(ТЗ);
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(Текст);
    Возврат Ответ;
КонецФункции

Этап 2: Организация запроса на стороне отправляющей базы (УТ)

Теперь рассмотрим, как корректно отправить запрос из второй базы. Основная проблема здесь заключается в правильном формировании объекта HTTPСоединение и HTTPЗапрос. Ошибка Couldn't resolve host name чаще всего возникает из-за некорректного указания адреса сервера в конструкторе HTTPСоединение.

Разберем рабочий алгоритм формирования соединения (для закрепления навыков рекомендуем пройти интерактивный курс по работе с HTTP-запросами):

  1. Формирование параметров: мы упаковываем текст запроса и его параметры в структуру, которую затем конвертируем в JSON с помощью ЗаписьJSON.
  2. Создание HTTP-запроса: в HTTPЗапрос мы передаем только путь к конкретному ресурсу (путь к нашему HTTP-сервису).
  3. Создание HTTP-соединения: в конструктор HTTPСоединение передается только адрес сервера (хост), а не полный URL с путем к ресурсу. Сходным образом работают и внешние инструменты, такие как Python-коннектор к 1С.

&НаСервере
Процедура ПолучитьНаСервере()
    // Формируем структуру запроса
    Стр = Новый Структура;
    Стр.Вставить("Запрос", "ВЫБРАТЬ ИНН, Наименование ИЗ Справочник.Контрагенты ГДЕ ИНН = &ИНН");
    Параметры1 = Новый Структура("ИНН", Объект.ИНН);
    Стр.Вставить("Параметры", Параметры1);
    
    // Сериализуем в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Стр);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    // Инициализируем запрос
    Запрос = Новый HTTPЗапрос("/BPdemo/hs/Exchange/GetAnyRequest");
    Запрос.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8");
    
    // Создаем соединение с сервером
    Соединение = Новый HTTPСоединение(Объект.ИмяКомпьютера, , "admin", "123");
    ОтветHTTP = Соединение.ОтправитьДляОбработки(Запрос);
    
    // Получаем результат
    ТекстТЗ = ОтветHTTP.ПолучитьТелоКакСтроку();
    ТЗ2 = ЗначениеИзСтрокиВнутр(ТекстТЗ);
    
    // Обрабатываем полученную таблицу значений
    Для Каждого СтрокаТЗ Из ТЗ2 Цикл
        Сообщить(СтрокаТЗ.Наименование);
    КонецЦикла;
КонецПроцедуры

Этап 3: Устранение типичных ошибок

При настройке обмена важно обратить внимание на следующие нюансы:

Использование JSON для обмена данными — это лучший стандарт в современной разработке на 1С. Хотя метод ЗначениеВСтрокуВнутр() работает быстро внутри платформы, при интеграции с другими системами или при обновлении версий платформы лучше переходить на JSON или XML, чтобы избежать проблем с несовместимостью форматов потока.

Теперь, когда мы разобрались с логикой настройки и устранили основные сетевые препятствия, обмен между базами будет работать стабильно. Всегда проверяйте доступность ресурсов с помощью инструментов диагностики сети, если соединение не устанавливается.

← На главную