Как получить остатки из другой базы 1С 8.3 через HTTP-сервис?

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

Интеграция между двумя базами 1С на платформе «1С:Предприятие 8.3» часто требует оперативного получения данных в режиме реального времени. Переход от устаревшего и платформенно-зависимого COM-соединения к архитектуре REST API с использованием встроенных HTTP-сервисов позволяет построить надежный, кроссплатформенный и быстродействующий обмен. Разберем по шагам, как настроить HTTP-сервис в базе-источнике для отдачи остатков и как правильно отправить к нему запрос из базы-приемника.

Архитектура взаимодействия двух баз

Процесс получения данных строится по классической клиент-серверной схеме:

  1. База-источник (сервер): содержит опубликованный HTTP-сервис. При поступлении входящего GET-запроса модуль сервиса выполняет запрос к базе данных (к регистрам накопления), упаковывает результат в структурированный формат (обычно JSON) и возвращает HTTP-ответ со статусом 200.
  2. База-приемник (клиент): с помощью объектов HTTPСоединение и HTTPЗапрос формирует сетевой вызов к опубликованному адресу, считывает тело ответа и десериализует полученные данные для дальнейшей обработки.

Шаг 1. Реализация HTTP-сервиса в базе-источнике

В конфигурации базы, из которой требуется забирать остатки, создадим новый объект метаданных ветки HTTP-сервисы.

Зададим следующие параметры:

  1. Корневой URL: например, stocks.
  2. Шаблон URL: добавим шаблон со строкой /get_balance.
  3. Метод: создадим метод 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.Закрыть();
    
КонецФункции

Шаг 2. Публикация HTTP-сервиса на веб-сервере

Чтобы сервис стал доступен по сети, конфигурацию базы-источника необходимо опубликовать на веб-сервере (IIS или Apache):

  1. В конфигураторе откроем меню Администрирование → Публикация на веб-сервере....
  2. Укажем имя публикации (например, base_source) и веб-сервер.
  3. На вкладке HTTP-сервисы обязательно установим флаг напротив нашего созданного сервиса.
  4. Нажмем кнопку Опубликовать.

После публикации конечный URL метода будет иметь вид: http://имя_сервера/base_source/hs/stocks/get_balance.

Шаг 3. Отправка запроса и получение данных в базе-приемнике

Рассмотрим, как выполнить подключение к опубликованному сервису из базы-клиента. Для этого используем объекты платформы 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Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
    
КонецПроцедуры

Шаг 4. Чтение и десериализация JSON в базе-приемнике

Полученную строку JSON не требуется разбирать вручную строковыми методами. Платформа 1С предоставляет удобный инструмент десериализации — функцию ПрочитатьJSON(), которая преобразует JSON-строку в массив структур 1С.

Посмотрим на пример обработки полученного ответа:


&НаСервере
Процедура ОбработатьПолученныеДанные(Знач СтрокаJSON)
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
    
    ДанныеОстатков = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // ДанныеОстатков теперь содержит массив структур
    Для Каждого Элемент Из ДанныеОстатков Цикл
        ТоварНаименование = Элемент.tovar;
        Артикул = Элемент.article;
        Остаток = Элемент.ostatok;
        
        // Выполняем дальнейшую логику (сопоставление номенклатуры, заполнение ТЗ или запись в регистр)
    КонецЦикла;
    
КонецПроцедуры

Важные нюансы и рекомендации по оптимизации

  1. Передача параметров и фильтрация: не выгружайте полную базу остатков без необходимости. Передавайте параметры отбора (например, код склада или список артикулов) через параметры строки запроса (Query String, например /get_balance?sklad=Основной). В коде сервиса параметры считываются через коллекцию Запрос.ПараметрыЗапроса.Получить("sklad").
  2. Безопасность и права доступа: для работы интеграции в базе-источнике создайте отдельного служебного пользователя без административных прав. Назначьте ему отдельную роль, содержащую права исключительно на запуск HTTP-сервиса и чтение используемых в запросе регистров.
  3. Установка таймаута соединения: обязательно задавайте параметр Таймаут в конструкторе HTTPСоединение. Это предотвратит зависание сеансов в базе-приемнике при временной недоступности сетевого узла или сервера источника.
  4. Альтернатива через OData: если в базе-источнике не требуется сложная кастомная логика сборки данных, можно использовать стандартный интерфейс OData. Достаточно опубликовать OData и разрешить доступ к таблице остатков регистра, после чего получать JSON стандартным GET-запросом к интерфейсу OData без написания дополнительного кода HTTP-сервиса.
← На главную