Как организовать обмен данными в 1С на Linux без использования COM-объектов?

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

Перевод серверной инфраструктуры 1С на операционную систему Linux (например, Ubuntu или Astra Linux) — это отличный шаг в сторону оптимизации затрат и повышения стабильности системы. Однако при такой миграции разработчики неизбежно сталкиваются с серьезным аппаратным ограничением: полным отсутствием поддержки технологии COM/OLE на уровне операционной системы Linux. Такие привычные инструменты, как V83.COMConnector, V83.Application или Excel.Application, запущенные на сервере под Linux, больше работать не будут.

Давайте подробно разберем, как преодолеть это ограничение, и рассмотрим современные, гораздо более надежные и быстрые альтернативы COM-соединениям, которые позволят вашим базам данных обмениваться информацией «в один клик».

Решение 1. HTTP-сервисы — самый быстрый и гибкий инструмент интеграции

Как совершенно верно отметили участники обсуждения на форуме, использование Web- и HTTP-сервисов — это современный стандарт интеграции систем. В отличие от тяжеловесного COM-соединения, которое при каждом вызове инициализирует полноценный сеанс во второй базе (что расходует оперативную память и лицензии), HTTP-запросы работают практически мгновенно. Для настройки регулярного выполнения такого обмена по расписанию применяется программа для автоматизации обмена данными через веб-сервисы.

Проанализируем ситуацию: нам нужно по нажатию кнопки в базе-приемнике оперативно получить данные из базы-источника. Давайте пошагово разберем, как это реализовать. Если базы имеют схожую структуру, для получения информации используется обработка для переноса данных между похожими конфигурациями 1С с настройкой произвольных полей поиска.

Шаг 1. Создание HTTP-сервиса в базе-источнике

В конфигураторе базы-источника добавим новый объект метаданных HTTPСервис (например, с именем ExchangeService). Определим шаблон URL, например, /get_data/, и добавим метод GET, который будет вызывать экспортную функцию в модуле сервиса.

Рассмотрим пример кода в модуле HTTP-сервиса, который формирует ответ в формате JSON:


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

После этого базу-источник необходимо опубликовать на веб-сервере (Apache или Nginx) под управлением Linux.

Шаг 2. Запрос данных из базы-приемника

В базе-приемнике мы пишем код, который обращается к нашему HTTP-сервису, получает JSON-пакет и разбирает его. Это происходит мгновенно по нажатию кнопки пользователем.


Процедура ЗагрузитьДанныеИзИсточника() Экспорт

    // Настройки подключения к веб-серверу базы-источника
    Сервер = "192.168.1.100";
    Порт = 80;
    БазаИсточника = "SourceBase";
    ИмяПользователя = "Admin";
    Пароль = "SecretPassword";
    
    // Создаем соединение
    НТТРСоединение = Новый HTTPСоединение(Сервер, Порт, ИмяПользователя, Пароль);
    
    // Формируем запрос
    АдресРесурса = "/" + БазаИсточника + "/hs/ExchangeService/get_data/";
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
    
    Попытка
        HTTPОтвет = НТТРСоединение.Получить(HTTPЗапрос);
        Если HTTPОтвет.КодСостояния = 200 Тогда
            
            СтрокаОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
            
            // Читаем JSON
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
            Данные = ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            
            // Обрабатываем полученные данные
            Если Данные.Статус = "Успешно" Тогда
                Для Каждого СтрокаТовара Из Данные.Товары Цикл
                    // Здесь пишем логику создания/обновления элементов в нашей базе
                    // Например: Справочники.Номенклатура.СоздатьЭлемент() и т.д.
                КонецЦикла;
                Сообщить("Данные успешно загружены!");
            КонецЕсли;
            
        Иначе
            ВызватьИсключение "Ошибка сервера 1С: Код ответа " + HTTPОтвет.КодСостояния;
        КонецЕсли;
    Исключение
        ЗаписатьЛогТранзакции(ОписаниеОшибки());
        ВызватьИсключение "Не удалось получить данные по HTTP: " + ОписаниеОшибки();
    КонецПопытки;

КонецПроцедуры

Решение 2. Стандартный интерфейс OData (REST API от 1С)

Если вам не хочется писать программный код для создания HTTP-сервисов в базе-источнике, платформа 1С предоставляет готовый мощнейший инструмент — автоматический интерфейс OData. Его называют «убийцей COM-соединений».

Выясним, как быстро запустить этот механизм:

  1. Опубликуйте базу-источник на веб-сервере. В окне публикации обязательно установите флаг «Публиковать стандартный интерфейс OData».
  2. Настройте состав публикуемых объектов. Нам не обязательно открывать всю базу. Мы можем ограничить доступ программно, используя метод УстановитьСоставСтандартногоИнтерфейсаOData().
  3. Теперь вы можете читать данные любого разрешенного справочника или документа с помощью обычных HTTP-запросов GET. Например, чтобы получить список контрагентов, достаточно отправить запрос по адресу: http://server/base/odata/standard.odata/Catalog_Контрагенты?$format=json.

Этот способ позволяет полностью отказаться от COM-соединений, не написав ни одной строчки кода на стороне базы-источника.

Решение 3. Внешние источники данных (Прямое подключение к СУБД)

Очень часто COM-соединение использовалось как средство быстрого чтения «тяжелых» данных напрямую из таблиц другой СУБД (например, MS SQL Server, PostgreSQL или MySQL). На Linux эту задачу решает стандартный механизм платформы — Внешние источники данных.

Рассмотрим, как это настроить на Linux-сервере:

  1. На сервере под управлением Linux необходимо установить менеджер драйверов баз данных unixODBC.
  2. Установите ODBC-драйвер для целевой СУБД (например, postgresql-odbc или драйвер MS SQL для Linux).
  3. В конфигураторе 1С добавьте новый объект в ветку «Внешние источники данных», настройте строку подключения, используя установленный драйвер, и выберите нужные таблицы.

После этого вы сможете работать с таблицами другой базы данных с помощью обычных запросов 1С. Это работает в десятки раз быстрее, чем COM, и не требует запуска фоновых сеансов 1С.

Решение 4. Событийно-ориентированная интеграция и Брокеры сообщений

Если ваши базы требуют гарантированной доставки сообщений и вы хотите избежать ситуации, когда падение или зависание одной базы «вешает» вторую при попытке синхронного вызова, рассмотрите внедрение брокеров сообщений (RabbitMQ, Apache Kafka) или специализированного решения «1С:Шина». Для реализации такой схемы можно использовать расширение для организации обменов между базами 1С через брокеры сообщений.

Как работает данная схема:

Решение 5. Работа с файлами Microsoft Office (Excel/Word) без COM-объектов

Еще одна частая проблема при переходе на Linux — это падение серверного кода, который формировал печатные формы в Word или выгружал сложные отчеты в Excel с помощью Excel.Application.

Рассмотрим, как решить эту проблему на Linux без потери функционала:

Резюмируя наш анализ: отказ от устаревшей технологии COM-соединений при переходе сервера 1С на Linux — это не ограничение, а отличный повод перевести вашу систему на современные, быстрые и кроссплатформенные рельсы интеграции. Использование HTTP-сервисов и технологии OData решит любые задачи оперативного обмена данными без каких-либо неудобств для конечных пользователей. В сценариях с закрытыми системами без API для переноса информации внедряется платформа для создания программных роботов, имитирующая действия пользователя в интерфейсе.

← На главную