Чем заменить COM-соединение при переносе базы 1С в облако?

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

При переносе информационной базы 1С в облачный сервис многие разработчики сталкиваются с проблемой: привычный механизм COM-соединения (v83.COMConnector) перестает работать. Выясним причину этого ограничения и подробно разберем современные альтернативы для получения данных из облачной базы.

Почему COM-соединение не работает в облаке?

Разберем основные технические причины, по которым COM-технология недоступна при работе с облачными сервисами 1С:

  1. Сетевой протокол: COM-соединение работает по прямому TCP-протоколу через порты кластера серверов 1С (1540, 1541 и др.). Облачные базы публикуются на веб-серверах (Apache или IIS) и предоставляют доступ исключительно по защищенному протоколу HTTP/HTTPS (порты 80/443).
  2. Зависимость от ОС Windows: Технология COM является компонентом Microsoft Windows. Если серверная инфраструктура облака развернута на Linux, использование COM-соединения невозможно на аппаратном уровне.
  3. Безопасность и изоляция: В облачных сервисах и SaaS-решениях прямые порты кластера закрыты межсетевыми экранами для обеспечения безопасности данных пользователей.

Вариант 1. Использование стандартного REST API (интерфейс OData)

Рассмотрим наилучший вариант в ситуации, когда облачная конфигурация типовая и её нельзя менять или снимать с поддержки. Платформа 1С 8.3 содержит встроенный автоматический REST-интерфейс (OData).

Преимущества подхода:

  1. Не требуется изменять конфигурацию базы-источника.
  2. Доступ к данным справочников, документов и регистров предоставляется по протоколу HTTP/HTTPS.
  3. Поддерживается обращение к виртуальным таблицам (например, выборка среза последних для регистров сведений или остатков регистров накопления).

Для работы по интерфейсу OData необходимо, чтобы в облаке была включена публикация HTTP-сервисов, а учетной записи 1С были назначены права на чтение соответствующих объектов.

Вариант 2. Разработка HTTP-сервиса в расширении конфигурации (.cfe)

Проанализируем ситуация, когда штатных возможностей OData недостаточно или требуется выполнять сложные запросы с предварительной обработкой данных на стороне облачной базы. В этом случае создается расширение конфигурации.

Использование расширения позволяет оставить основной типовой программный продукт на полной поддержке. Разберем порядок действий по шагам:

  1. В расширение добавляется объект типа HTTP-сервис с нужным шаблоном URL и методом (например, GET).
  2. В обработчике метода формируется стандартный запрос 1С к виртуальным таблицам остатков и оборотов за нужный период.
  3. Результат запроса сериализуется в формат JSON и отправляется в ответе клиенту.

Посмотрим на пример кода обработки HTTP-запроса внутри расширения облачной базы:


Функция ПолучитьОстатки(Запрос)
    
    // Выполняем запрос к остаткам
    Запрос1С = Новый Запрос;
    Запрос1С.Текст = 
        "ВЫБРАТЬ
        |   ТоварыНаСкладахОстатки.Номенклатура.Наименование КАК Товар,
        |   ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки";
        
    ТаблицаДанных = Запрос1С.Выполнить().Выгрузить();
    
    // Преобразуем результат в массив структур для JSON
    МассивРезультата = Новый Массив;
    Для Каждого Стр Из ТаблицаДанных Цикл
        СтруктураСтр = Новый Структура;
        СтруктураСтр.Вставить("Товар", Стр.Товар);
        СтруктураСтр.Вставить("Количество", Стр.Количество);
        МассивРезультата.Добавить(СтруктураСтр);
    КонецЦикла;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, МассивРезультата);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
    
    Возврат Ответ;
    
КонецФункции

Как получить данные в локальной базе-приемнике

Посмотрим, как переписать код в локальной базе, которая ранее подключалась через COMConnector. Для выполнения HTTP-запросов используются встроенные объекты 1С: HTTPСоединение, HTTPЗапрос и HTTPОтвет.

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


// Параметры подключения к облаку
Сервер = "cloud.1c.ru"; // Адрес облачного сервера
ИмяПользователя = "Интеграция";
Пароль = "SecretPassword123";

// Настройка SSL-соединения для HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, ИмяПользователя, Пароль, , 30, ЗащищенноеСоединение);

Запрос = Новый HTTPЗапрос("/my_base/hs/custom_api/v1/get_balances");
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
    ДанныеОстатков = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Обработка полученных данных
    Для Каждого Элемент Из ДанныеОстатков Цикл
        Сообщить("Товар: " + Элемент.Товар + " | Остаток: " + Строка(Элемент.Количество));
    КонецЦикла;
Иначе
    Сообщить("Ошибка получения данных: " + Строка(Ответ.КодСостояния));
КонецЕсли;

Вариант 3. Выгрузка данных через регламентное задание и файл

Если прямой доступ по HTTP/HTTPS ограничен политикой безопасности облачного провайдера, можно настроить фоновый обмен файлами:

  1. В облачной базе создается регламентное задание, которое по расписанию формирует файл с остатками и оборотами (в формате JSON или XML).
  2. Файл выгружается на доступный внешне ресурс (FTP-сервер, облачное хранилище или веб-сервис).
  3. База-приемник по расписанию скачивает файл и загружает данные к себе.

Итоги

Переход базы в облако требует отказа от устаревшего COM-соединения. Для интеграции следует выбирать **REST API (OData)**, если конфигурацию нельзя редактировать, либо разрабатывать **HTTP-сервис в расширении**, если требуется высокая скорость работы и точный контроль передаваемых данных.

← На главную