Настройка обмена между двумя информационными базами 1С с помощью технологии HTTP-сервисов — это эффективный и современный способ организации интеграции (удобно через синхронизацию через EnterpriseData между базами 1С). Однако на этапе разработки часто возникают сложности с сетевым соединением и форматами данных. В этой статье мы разберем пошагово, как правильно организовать обмен контрагентами между 1С:Бухгалтерия и 1С:Управление торговлей, а также устраним распространенные ошибки, такие как Couldn't resolve host name и проблемы с форматами потока.
Первым делом мы создаем 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);
Ответ.УстановитьТелоИзСтроки(Текст);
Возврат Ответ;
КонецФункции
Теперь рассмотрим, как корректно отправить запрос из второй базы. Основная проблема здесь заключается в правильном формировании объекта HTTPСоединение и HTTPЗапрос. Ошибка Couldn't resolve host name чаще всего возникает из-за некорректного указания адреса сервера в конструкторе HTTPСоединение.
Разберем рабочий алгоритм формирования соединения (для закрепления навыков рекомендуем пройти интерактивный курс по работе с HTTP-запросами):
JSON с помощью ЗаписьJSON.HTTPЗапрос мы передаем только путь к конкретному ресурсу (путь к нашему 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 Цикл
Сообщить(СтрокаТЗ.Наименование);
КонецЦикла;
КонецПроцедуры
При настройке обмена важно обратить внимание на следующие нюансы:
Couldn't resolve host name: Это сетевая проблема. Проверьте, что в HTTPСоединение передается корректное имя сервера или IP-адрес без протоколов (например, без http://) — исправить ошибки при передаче данных поможет логирование HTTP-запросов для быстрого поиска ошибок. Убедитесь, что сервер доступен по сети с того компьютера, где выполняется код.Ошибка формата потока: Возникает, если метод ЗначениеИзСтрокиВнутр() пытается обработать ответ, который не является результатом сериализации 1С. Проверьте в отладчике содержимое ТекстТЗ — возможно, сервер вернул сообщение об ошибке (например, 404 или 500) вместо ожидаемых данных.Выполнить(): Никогда не передавайте динамический код для выполнения в функции Выполнить(), если этот код приходит из внешнего запроса. Это создает критическую уязвимость безопасности. Используйте строго параметризованные запросы через Запрос.УстановитьПараметр().Использование JSON для обмена данными — это лучший стандарт в современной разработке на 1С. Хотя метод ЗначениеВСтрокуВнутр() работает быстро внутри платформы, при интеграции с другими системами или при обновлении версий платформы лучше переходить на JSON или XML, чтобы избежать проблем с несовместимостью форматов потока.
Теперь, когда мы разобрались с логикой настройки и устранили основные сетевые препятствия, обмен между базами будет работать стабильно. Всегда проверяйте доступность ресурсов с помощью инструментов диагностики сети, если соединение не устанавливается.