Как подключиться из 1С 8.3 на Linux к базе 1С 7.7 на Windows без использования COM?

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

В современной корпоративной среде часто возникает задача интеграции разнородных систем. Типичный сценарий: новая или вспомогательная база работает на современной платформе 1С:Предприятие 8.3 под управлением сервера на Linux, в то время как исторические данные или оперативный учет до сих пор ведутся в старой, но надежной 1С:Предприятие 7.7, установленной на сервере под управлением Windows.

При попытке настроить прямое подключение из 1С 8.3 к 1С 7.7 с помощью привычного механизма OLE/COM на стороне сервера Linux мы неизбежно сталкиваемся с системной ошибкой: "COM-объекты поддерживаются только в операционных системах Windows". Это ограничение непреодолимо стандартными средствами, так как технология COM (Component Object Model) является проприетарным решением Microsoft и физически отсутствует в операционных системах семейства Linux. Объект встроенного языка Новый COMОбъект("V1CEnterprise.Application") на Linux-сервере работать не будет.

В этой статье мы подробно рассмотрим и разберем по шагам альтернативные архитектурные и технические решения, которые позволят организовать надежный и быстрый обмен данными между 1С 8.3 на Linux и 1С 7.7 на Windows без использования COM-соединения на стороне Linux.

Решение 1. Прямое чтение DBF-таблиц базы 1С 7.7 через объект XBase на Linux

Если база данных 1С 7.7 является файловой (а это наиболее частый случай для этой платформы), то вся её структура и данные хранятся в наборе файлов с расширением DBF. Платформа 1С 8.3 на уровне ядра сервера под Linux полноценно поддерживает работу с DBF-файлами посредством стандартного объекта встроенного языка XBase.

Проанализируем пошагово процесс реализации этого метода:

  1. Монтирование сетевого ресурса. Нам необходимо сделать файлы базы 1С 7.7 доступными для сервера Linux. Для этого сетевую папку на сервере Windows, где расположена база 7.7, нужно примонтировать в файловую систему Linux. Это делается с помощью утилиты mount (протокол SMB/CIFS). Например:

    mount -t cifs -o username=Администратор,password=Пароль //windows-server/1c77_db /mnt/1c77

  2. Определение структуры таблиц. Нам потребуется файл описания структуры базы данных 1Cv7.DD, который находится в каталоге базы 1С 7.7. С его помощью мы сможем сопоставить физические имена DBF-файлов (например, SC142.DBF) с конкретными справочниками или документами (например, справочник "Контрагенты"). Также ключевые транзакционные данные хранятся в общем журнале документов 1SJOURN.DBF.
  3. Написание кода чтения данных в 1С 8.3. Ниже рассмотрим пример кода регламентного задания в 1С 8.3, которое напрямую считывает данные из таблицы журнала документов 1С 7.7:

// Пример прямого чтения журнала документов 1С 7.7 из 1С 8.3 на Linux
ПутьКФайлу = "/mnt/1c77/1SJOURN.DBF";
ПутьКИндексу = "/mnt/1c77/1SJOURN.CDX"; // Индексный файл для ускорения поиска

Журнал77 = Новый XBase;
// Открываем индексный файл, чтобы иметь возможность быстро сортировать и искать данные
Журнал77.ОткрытьФайл(ПутьКФайлу, ПутьКИндексу, Истина); // Открываем в режиме "Только чтение"

Если Журнал77.Открыт() Тогда
    // Переходим к первой записи таблицы
    Журнал77.Первая();
    
    Пока Не Журнал77.ВКонце() Цикл
        // Проверяем пометку удаления записи в DBF (1С 7.7 физически не удаляет строки сразу)
        Если Не Журнал77.ЗаписьУдалена() Тогда
            
            // Получаем значения полей по их физическим именам в структуре 1С 7.7
            ИдентификаторДокумента = СокрЛП(Журнал77.ПолучитьЗначениеПоля("IDDOC"));
            ДатаДокумента = Журнал77.ПолучитьЗначениеПоля("DATE");
            НомерДокумента = СокрЛП(Журнал77.ПолучитьЗначениеПоля("DOCNO"));
            ТипДокументаID = СокрЛП(Журнал77.ПолучитьЗначениеПоля("IDDOCDEF"));
            
            // Здесь реализуем логику обработки или переноса полученных данных в 1С 8.3
            // Например, запись во временный регистр сведений или создание аналогичного документа
            
        КонецЕсли;
        
        // Переходим к следующей строке таблицы
        Журнал77.Следующая();
    КонецЦикла;
    
    // Обязательно закрываем файлы после завершения работы, чтобы не блокировать базу
    Журнал77.ЗакрытьФайл();
Иначе
    ВызватьИсключение "Не удалось открыть файл журнала документов 1С 7.7!";
КонецЕсли;

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

Недостатки: метод подходит только для чтения данных; запись данных напрямую в DBF-файлы крайне не рекомендуется, так как это нарушит целостность базы данных 1С 7.7 (индексы, итоги и подчиненные таблицы не обновятся корректно без бизнес-логики самой платформы 7.7).

Решение 2. Реализация HTTP-сервисов (Push-модель: инициатор 1С 7.7)

Если нам необходимо не просто пассивно забирать данные, а организовать полноценный двусторонний обмен или оперативно реагировать на изменения в 1С 7.7, мы можем использовать HTTP-сервисы. В этом сценарии база 1С 8.3 выступает в роли HTTP-сервера, а база 1С 7.7 на Windows отправляет запросы с данными.

Рассмотрим пошагово, как это реализовать:

  1. В конфигурации 1С 8.3 создаем новый объект метаданных HTTP-сервисы (например, с именем Exchange77). Настраиваем шаблон URL (например, /v1/send_data) и метод POST.
  2. В модуле HTTP-сервиса пишем обработчик, который принимает входящий JSON или XML, парсит его и выполняет необходимые действия в базе 8.3.
  3. На стороне 1С 7.7 создаем обработку выгрузки (ее можно запускать по расписанию через планировщик Windows или привязывать к событиям записи документов/справочников). Для отправки HTTP-запросов из 1С 7.7 используем системную библиотеку Windows MSXML2.ServerXMLHTTP.

Посмотрим на пример кода отправки данных из 1С 7.7 на встроенном языке:


// Пример отправки данных из 1С 7.7 на HTTP-сервис 1С 8.3
Процедура ОтправитьДанныеВ83(СтрокаДанныхJSON)
    
    // Создаем системный COM-объект для работы с HTTP-запросами на Windows-клиенте 7.7
    Попытка
        HttpСервис = СоздатьОбъект("MSXML2.ServerXMLHTTP");
    Исключение
        Предупреждение("Не удалось создать объект MSXML2.ServerXMLHTTP для отправки данных!");
        Возврат;
    КонецПопытки;
    
    // Настраиваем параметры подключения к нашему HTTP-сервису на Linux-сервере 1С 8.3
    АдресРесурса = "http://linux-1c-server/base_name/hs/Exchange77/v1/send_data";
    
    // Инициализируем POST запрос (0 - синхронный режим)
    HttpСервис.open("POST", АдресРесурса, 0);
    
    // Устанавливаем заголовки запроса для передачи JSON данных в кодировке UTF-8
    HttpСервис.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    
    // Отправляем сформированную строку JSON в тело запроса
    HttpСервис.send(СтрокаДанныхJSON);
    
    // Проверяем статус ответа сервера
    СтатусОтвета = HttpСервис.status;
    Если СтатусОтвета = 200 Тогда
        Сообщить("Данные успешно доставлены и обработаны в 1С 8.3");
    Иначе
        Сообщить("Ошибка обмена! Код ответа сервера: " + СтатусОтвета);
        Сообщить("Текст ошибки: " + HttpСервис.responseText);
    КонецЕсли;
    
КонецПроцедуры

Преимущества: современный стандарт интеграции (REST API), гарантированная обработка данных на стороне 1С 8.3 в реальном времени, возможность легкого масштабирования обмена. Для быстрой разработки и документирования входящих обработчиков можно использовать конструктор API для организации JSON-обмена в 1С 8.3.

Недостатки: требует доработки и изменения кода на стороне базы 1С 7.7, а также настройки веб-сервера (Apache или Nginx) для публикации базы 1С 8.3.

Решение 3. Создание промежуточного API-посредника на стороне Windows (Pull-модель)

Если инициатором обмена должно выступать исключительно регламентное задание 1С 8.3 на Linux (например, сбор информации строго каждые 10 минут), а изменять конфигурацию 1С 7.7 крайне нежелательно, мы можем построить архитектуру с промежуточным микросервисом-посредником. В качестве основы такого сервиса подойдёт Python-коннектор для работы с 1С через COM и HTTP.

Проанализируем архитектуру этого подхода:

  1. На сервере Windows, где развернута база 1С 7.7, устанавливается и запускается небольшое служебное приложение (демон/служба). Его можно написать на любом популярном языке программирования (Python, Go, Node.js).
  2. Этот микросервис слушает определенный TCP-порт и ожидает HTTP-запросы от сервера 1С 8.3 (Linux).
  3. При получении запроса от 1С 8.3 (например, GET /get_stock?item=123), микросервис локально на Windows-машине инициализирует COM-соединение с 1С 7.7 посредством объекта V1CEnterprise.Application (так как вызов происходит внутри ОС Windows, он отрабатывает без каких-либо ошибок).
  4. Микросервис запрашивает у 1С 7.7 необходимые данные через OLE, преобразует их в формат JSON и отправляет обратно в 1С 8.3 в качестве HTTP-ответа.

Рассмотрим, как будет выглядеть запрос из регламентного задания 1С 8.3 (на Linux) к нашему Windows-посреднику:


// Код регламентного задания в 1С 8.3 для получения данных через Windows-посредника
&НаСервере
Процедура ПолучитьДанныеИз77НаСервере()
    
    // Адрес Windows-сервера, где крутится наш вспомогательный микросервис
    СерверПосредник = "192.168.1.50"; 
    ПортПосредника = 8080;
    
    HTTPСоединение = Новый HTTPСоединение(СерверПосредник, ПортПосредника);
    
    // Формируем запрос на получение остатков номенклатуры
    HTTPЗапрос = Новый HTTPЗапрос("/get_data?type=stocks");
    
    Попытка
        HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
        
        Если HTTPОтвет.КодСостояния = 200 Тогда
            // Успешно получили данные в формате JSON
            СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
            
            // Читаем JSON встроенными средствами 1С 8.3
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
            ДанныеОстатков = ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            
            // Обрабатываем полученную структуру данных в базе 8.3
            // ...
        Иначе
            ЗаписатьЛогОшибок("Ошибка сервера-посредника. Код: " + HTTPОтвет.КодСостояния);
        КонецЕсли;
    Исключение
        ЗаписатьЛогОшибок("Не удалось подключиться к Windows-серверу посредника: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

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

Недостатки: необходимость развертывания и администрирования дополнительного программного обеспечения (микросервиса) на Windows-сервере.

Решение 4. Использование внешних источников данных (ВИД)

Платформа 1С 8.3 обладает встроенным механизмом работы с внешними реляционными базами данных (через ODBC-драйверы). Если база данных 1С 7.7 развернута на СУБД MS SQL Server, то мы можем подключить ее таблицы напрямую в дерево метаданных конфигурации 1С 8.3.

Для этого на сервере Linux, где работает сервер приложений 1С 8.3, необходимо установить и настроить драйвер unixODBC и драйвер FreeTDS (или Microsoft ODBC Driver для SQL Server на Linux). После успешной настройки на уровне операционной системы, в конфигураторе 1С 8.3 добавляется новый объект "Внешний источник данных", указывающий на таблицы SQL базы 1С 7.7.

После этого разработчик в 1С 8.3 получает возможность делать стандартные запросы к данным 1С 7.7 прямо на встроенном языке запросов 1С, использовать эти таблицы в отчетах СКД, динамических списках и формах, как если бы это были родные справочники конфигурации.

Решение 5. Пакетный файловый обмен по расписанию (классическая схема)

Если синхронность данных и скорость в секундах не критичны, самым стабильным и проверенным решением остается периодическая выгрузка файлов обмена (XML или JSON) во временную папку.

Алгоритм работы схемы:

  1. В планировщике задач Windows на сервере с 1С 7.7 настраивается регулярное задание, запускающее 1С 7.7 в пакетном режиме с параметрами запуска внешней обработки выгрузки:

    "C:\Program Files\1Cv77\bin\1cv7.exe" enterprise /D"C:\db77" /N"РоботОбмена" /P"Пароль" /C"ЗапуститьВыгрузку"

  2. Обработка выгрузки в 1С 7.7 локально собирает измененные данные, сериализует их в файл exchange.json и сохраняет в общую папку на сервере.
  3. Регламентное задание 1С 8.3 на Linux считывает этот файл из смонтированного каталога, загружает данные в базу 8.3 и переименовывает или удаляет обработанный файл во избежание повторного чтения.

Подведем итоги

Перенос сервера приложений 1С:Предприятие 8.3 на операционную систему Linux закрывает возможность прямого использования устаревшей Windows-технологии COM для интеграции со старыми базами 1С 7.7. Тем не менее, это не является непреодолимым препятствием.

Мы проанализировали несколько надежных архитектурных подходов:

← На главную