Интеграция между двумя базами 1С на платформе «1С:Предприятие 8.3» часто требует оперативного получения данных в режиме реального времени. Переход от устаревшего и платформенно-зависимого COM-соединения к архитектуре REST API с использованием встроенных HTTP-сервисов позволяет построить надежный, кроссплатформенный и быстродействующий обмен. Разберем по шагам, как настроить HTTP-сервис в базе-источнике для отдачи остатков и как правильно отправить к нему запрос из базы-приемника.
Процесс получения данных строится по классической клиент-серверной схеме:
GET-запроса модуль сервиса выполняет запрос к базе данных (к регистрам накопления), упаковывает результат в структурированный формат (обычно JSON) и возвращает HTTP-ответ со статусом 200.HTTPСоединение и HTTPЗапрос формирует сетевой вызов к опубликованному адресу, считывает тело ответа и десериализует полученные данные для дальнейшей обработки.В конфигурации базы, из которой требуется забирать остатки, создадим новый объект метаданных ветки HTTP-сервисы.
Зададим следующие параметры:
stocks./get_balance.GET с обработчиком в модуле сервиса.Посмотрим на пример кода в модуле HTTP-сервиса базы-источника. Процедура считывает остатки из базы данных с помощью запроса, сериализует массив структур в формат JSON и отправляет его клиенту:
Функция ОсновнойGET(Запрос)
ТекстJSON = ПолучитьОстаткиJSON();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
Функция ПолучитьОстаткиJSON()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура.Наименование КАК Товар,
| ТоварыНаСкладахОстатки.Номенклатура.Артикул КАК Артикул,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки";
Выборка = Запрос.Выполнить().Выбрать();
ОтветМассив = Новый Массив;
Пока Выборка.Следующий() Цикл
СтрокаДанных = Новый Структура;
СтрокаДанных.Вставить("tovar", Выборка.Товар);
СтрокаДанных.Вставить("article", Выборка.Артикул);
СтрокаДанных.Вставить("ostatok", Выборка.Остаток);
ОтветМассив.Добавить(СтрокаДанных);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ОтветМассив);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Чтобы сервис стал доступен по сети, конфигурацию базы-источника необходимо опубликовать на веб-сервере (IIS или Apache):
base_source) и веб-сервер.После публикации конечный URL метода будет иметь вид: http://имя_сервера/base_source/hs/stocks/get_balance.
Рассмотрим, как выполнить подключение к опубликованному сервису из базы-клиента. Для этого используем объекты платформы HTTPСоединение, HTTPЗапрос и HTTPОтвет.
&НаСервере
Процедура ЗагрузитьОстаткиИзСоседнейБазы()
Сервер = "192.168.1.50"; // Имя или IP-адрес сервера
Порт = 80;
Пользователь = "WebServiceUser";
Пароль = "SecretPass123";
Таймаут = 30; // Таймаут в секундах
// Создаем объект соединения
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, Пользователь, Пароль, , Таймаут);
// Формируем путь к ресурсу
ОтносительныйURL = "/base_source/hs/stocks/get_balance";
HTTPЗапрос = Новый HTTPЗапрос(ОтносительныйURL);
HTTPЗапрос.Заголовки.Вставить("Accept", "application/json");
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Исключение
ВызватьИсключение "Ошибка сетевого взаимодействия: " + ОписаниеОшибки();
КонецПопытки;
// Анализируем статус ответа
Если HTTPОтвет.КодСостояния = 200 Тогда
СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
ОбработатьПолученныеДанные(СтрокаJSON);
Иначе
ВызватьИсключение СтрШаблон("Ошибка при обращении к сервису! Код состояния: %1. Ответ: %2",
HTTPОтвет.КодСостояния,
HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;
КонецПроцедуры
Полученную строку JSON не требуется разбирать вручную строковыми методами. Платформа 1С предоставляет удобный инструмент десериализации — функцию ПрочитатьJSON(), которая преобразует JSON-строку в массив структур 1С.
Посмотрим на пример обработки полученного ответа:
&НаСервере
Процедура ОбработатьПолученныеДанные(Знач СтрокаJSON)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеОстатков = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// ДанныеОстатков теперь содержит массив структур
Для Каждого Элемент Из ДанныеОстатков Цикл
ТоварНаименование = Элемент.tovar;
Артикул = Элемент.article;
Остаток = Элемент.ostatok;
// Выполняем дальнейшую логику (сопоставление номенклатуры, заполнение ТЗ или запись в регистр)
КонецЦикла;
КонецПроцедуры
/get_balance?sklad=Основной). В коде сервиса параметры считываются через коллекцию Запрос.ПараметрыЗапроса.Получить("sklad").Таймаут в конструкторе HTTPСоединение. Это предотвратит зависание сеансов в базе-приемнике при временной недоступности сетевого узла или сервера источника.