Переход с операционной системы Windows на Linux в экосистеме 1С приносит множество преимуществ, таких как стабильность и экономия на лицензиях, однако он также сопряжен с рядом технических ограничений. Одной из самых распространенных проблем является невозможность использования COM-соединения (COMConnector) для прямой связи между информационными базами. В этой статье мы подробно разберем, почему это происходит, и рассмотрим альтернативные, более современные способы интеграции в среде Linux.
Разберем первопричину проблемы. Технология COM (Component Object Model) является проприетарным решением корпорации Microsoft. Она глубоко интегрирована в ядро Windows и реестр системы. На платформе 1С для Windows библиотека comcntrv8.dll позволяет одной базе буквально «зайти в гости» к другой, используя ресурсы операционной системы.
В серверной версии 1С для Linux аналогичной библиотеки с расширением .so попросту не существует. Платформа 1С на Linux не поддерживает COM-объекты. Поэтому при попытке выполнить код Новый COMОбъект("V83.COMConnector") на стороне Linux-сервера система всегда будет выдавать ошибку о том, что класс не зарегистрирован. Это фундаментальное ограничение, которое невозможно обойти установкой дополнительных пакетов. Нам необходимо менять саму архитектуру взаимодействия.
Это самый рекомендуемый и надежный способ для Linux-инфраструктуры. Вместо того чтобы пытаться подключиться к файлам или процессам другой базы, мы будем обращаться к ней как к веб-сайту. Рассмотрим этот процесс по шагам.
Шаг 1: Публикация базы. На сервере под управлением Linux (например, Ubuntu или Centos) должен быть установлен веб-сервер (Apache или Nginx). С помощью утилиты webinst или через конфигуратор 1С (если есть доступ к GUI) необходимо опубликовать информационную базу. После этого база станет доступна по HTTP-протоколу.
Шаг 2: Использование SOAP или REST. Проанализируем, какой тип веб-сервиса нам подходит. Если мы используем типовые конфигурации (например, ЗКГУ 3.1 или БСП), в них уже встроены механизмы обмена через веб-сервисы. В базе-приемнике достаточно указать адрес публикации, логин и пароль.
Если же мы пишем свою интеграцию, мы можем создать объект ОпределенияWS. Посмотрим на пример кода для подключения к веб-сервису другой базы:
Определения = Новый WSОпределения("http://server_name/base_name/ws/ExchangeData?wsdl", "Администратор", "Пароль");
Прокси = Новый WSПрокси(Определения, "http://www.1c.ru/Exchange", "ExchangeData", "ExchangeDataSoap");
Результат = Прокси.ВыполнитьВыгрузкуДанных(ПараметрыОбмена);
Такой подход полностью независим от операционной системы и работает одинаково хорошо как на Windows, так и на Linux.
Если нам нужно просто прочитать данные или быстро записать их в другую базу без написания сложных веб-сервисов, проанализируем возможности OData. Это автоматический REST-интерфейс, который 1С предоставляет «из коробки».
Чтобы включить его, необходимо выполнить публикацию базы с флагом «Публиковать стандартный интерфейс OData». После этого мы можем получать данные из любой таблицы базы простым HTTP-запросом. Например, чтобы получить список сотрудников из ЗКГУ, мы можем отправить GET запрос. Рассмотрим пример кода на стороне базы-источника:
Соединение = Новый HTTPСоединение("server_name", , "Login", "Password");
Запрос = Новый HTTPЗапрос("/base_name/odata/standard.odata/Catalog_Сотрудники?$format=json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обрабатываем JSON с данными
КонецЕсли;
Если использование веб-серверов по каким-то причинам невозможно, остается классический обмен через файлы (XML или JSON). Однако на Linux программисты часто сталкиваются с ошибкой «Extra content at the end of the document» или «Ошибка разбора XML». Разберем причины этой ситуации.
/Home/Exchange/ и /home/exchange/ — это две разные папки. Если в коде зашит жесткий путь или он передается с ошибкой в регистре, файл не будет найден.usr1cv8. Если файл обмена создается другим процессом (например, FTP-сервером), то у 1С может не быть прав на чтение или удаление этого файла. Необходимо убедиться, что права установлены как 775 или 777.C:/Users/.... На Linux таких путей не существует. Выясним причину: скорее всего, код пытается использовать клиентский временный каталог на сервере. Всегда используйте функцию КаталогВременныхФайлов(), которая на Linux вернет путь в папку /tmp/.Ошибка «Extra content at the end of the document» (Лишние данные в конце документа) обычно означает, что XML-файл поврежден. Проанализируем ситуацию: это часто происходит, если файл открывается на дозапись вместо перезаписи, и в итоге в одном файле оказывается два заголовка <?xml version="1.0" ?>. Чтобы этого избежать, перед записью нового файла обмена всегда проверяйте его наличие и удаляйте старый файл:
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
УдалитьФайлы(ПутьКФайлу);
КонецЕсли;
// Теперь создаем новый текстовый документ или запись XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");
Если ваша конфигурация построена на Библиотеке Стандартных Подсистем (БСП), рассмотрим, как правильно настроить синхронизацию. В БСП при настройке обмена данными есть выбор: «Прямое подключение» или «Синхронизация через файл / веб-сервис».
Важно: При работе на Linux в мастере настройки обмена никогда не выбирайте вариант «Прямое подключение к информационной базе», так как он по умолчанию ищет COM-соединение. Выбирайте «Синхронизация через интернет» (это и есть Web-сервис) или «Синхронизация через файл».
Если вы выбрали файловый обмен, помните, что путь к каталогу должен быть указан в формате Linux (например, /mnt/exchange/). Этот каталог должен быть смонтирован на сервере, где крутится служба ragent.
Рассмотрим современный стандарт обмена — EnterpriseData. Фирма «1С» активно переводит все типовые решения на этот формат. Его главное преимущество для Linux-систем заключается в том, что он изначально спроектирован для работы через HTTP-сервисы.
При использовании EnterpriseData взаимодействие происходит асинхронно и через стандартные веб-протоколы. Это избавляет разработчика от необходимости следить за правами на папки или регистром имен файлов, так как данные передаются в теле HTTP-пакетов.
Подведем итоги: для успешного подключения одной базы 1С к другой на сервере Linux необходимо отказаться от устаревшей технологии COM. Рассмотрим переход на публикацию баз через веб-сервер и использование Web-сервисов или OData. Если же используется файловый путь, необходимо строго следить за правами пользователя usr1cv8 и корректностью путей в стиле POSIX.