В современной корпоративной среде часто возникает задача интеграции разнородных систем. Типичный сценарий: новая или вспомогательная база работает на современной платформе 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С 7.7 является файловой (а это наиболее частый случай для этой платформы), то вся её структура и данные хранятся в наборе файлов с расширением DBF. Платформа 1С 8.3 на уровне ядра сервера под Linux полноценно поддерживает работу с DBF-файлами посредством стандартного объекта встроенного языка XBase.
Проанализируем пошагово процесс реализации этого метода:
mount (протокол SMB/CIFS). Например:
mount -t cifs -o username=Администратор,password=Пароль //windows-server/1c77_db /mnt/1c77
1Cv7.DD, который находится в каталоге базы 1С 7.7. С его помощью мы сможем сопоставить физические имена DBF-файлов (например, SC142.DBF) с конкретными справочниками или документами (например, справочник "Контрагенты"). Также ключевые транзакционные данные хранятся в общем журнале документов 1SJOURN.DBF.
// Пример прямого чтения журнала документов 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).
Если нам необходимо не просто пассивно забирать данные, а организовать полноценный двусторонний обмен или оперативно реагировать на изменения в 1С 7.7, мы можем использовать HTTP-сервисы. В этом сценарии база 1С 8.3 выступает в роли HTTP-сервера, а база 1С 7.7 на Windows отправляет запросы с данными.
Рассмотрим пошагово, как это реализовать:
HTTP-сервисы (например, с именем Exchange77). Настраиваем шаблон URL (например, /v1/send_data) и метод POST.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.
Если инициатором обмена должно выступать исключительно регламентное задание 1С 8.3 на Linux (например, сбор информации строго каждые 10 минут), а изменять конфигурацию 1С 7.7 крайне нежелательно, мы можем построить архитектуру с промежуточным микросервисом-посредником. В качестве основы такого сервиса подойдёт Python-коннектор для работы с 1С через COM и HTTP.
Проанализируем архитектуру этого подхода:
GET /get_stock?item=123), микросервис локально на Windows-машине инициализирует COM-соединение с 1С 7.7 посредством объекта V1CEnterprise.Application (так как вызов происходит внутри ОС Windows, он отрабатывает без каких-либо ошибок).Рассмотрим, как будет выглядеть запрос из регламентного задания 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-сервере.
Платформа 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С, использовать эти таблицы в отчетах СКД, динамических списках и формах, как если бы это были родные справочники конфигурации.
Если синхронность данных и скорость в секундах не критичны, самым стабильным и проверенным решением остается периодическая выгрузка файлов обмена (XML или JSON) во временную папку.
Алгоритм работы схемы:
"C:\Program Files\1Cv77\bin\1cv7.exe" enterprise /D"C:\db77" /N"РоботОбмена" /P"Пароль" /C"ЗапуститьВыгрузку"
exchange.json и сохраняет в общую папку на сервере.Перенос сервера приложений 1С:Предприятие 8.3 на операционную систему Linux закрывает возможность прямого использования устаревшей Windows-технологии COM для интеграции со старыми базами 1С 7.7. Тем не менее, это не является непреодолимым препятствием.
Мы проанализировали несколько надежных архитектурных подходов:
XBase.