Перевод серверной инфраструктуры 1С на операционную систему Linux (например, Ubuntu или Astra Linux) — это отличный шаг в сторону оптимизации затрат и повышения стабильности системы. Однако при такой миграции разработчики неизбежно сталкиваются с серьезным аппаратным ограничением: полным отсутствием поддержки технологии COM/OLE на уровне операционной системы Linux. Такие привычные инструменты, как V83.COMConnector, V83.Application или Excel.Application, запущенные на сервере под Linux, больше работать не будут.
Давайте подробно разберем, как преодолеть это ограничение, и рассмотрим современные, гораздо более надежные и быстрые альтернативы COM-соединениям, которые позволят вашим базам данных обмениваться информацией «в один клик».
Как совершенно верно отметили участники обсуждения на форуме, использование 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: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Если вам не хочется писать программный код для создания HTTP-сервисов в базе-источнике, платформа 1С предоставляет готовый мощнейший инструмент — автоматический интерфейс OData. Его называют «убийцей COM-соединений».
Выясним, как быстро запустить этот механизм:
УстановитьСоставСтандартногоИнтерфейсаOData().http://server/base/odata/standard.odata/Catalog_Контрагенты?$format=json.Этот способ позволяет полностью отказаться от COM-соединений, не написав ни одной строчки кода на стороне базы-источника.
Очень часто COM-соединение использовалось как средство быстрого чтения «тяжелых» данных напрямую из таблиц другой СУБД (например, MS SQL Server, PostgreSQL или MySQL). На Linux эту задачу решает стандартный механизм платформы — Внешние источники данных.
Рассмотрим, как это настроить на Linux-сервере:
unixODBC.postgresql-odbc или драйвер MS SQL для Linux).После этого вы сможете работать с таблицами другой базы данных с помощью обычных запросов 1С. Это работает в десятки раз быстрее, чем COM, и не требует запуска фоновых сеансов 1С.
Если ваши базы требуют гарантированной доставки сообщений и вы хотите избежать ситуации, когда падение или зависание одной базы «вешает» вторую при попытке синхронного вызова, рассмотрите внедрение брокеров сообщений (RabbitMQ, Apache Kafka) или специализированного решения «1С:Шина». Для реализации такой схемы можно использовать расширение для организации обменов между базами 1С через брокеры сообщений.
Как работает данная схема:
Еще одна частая проблема при переходе на Linux — это падение серверного кода, который формировал печатные формы в Word или выгружал сложные отчеты в Excel с помощью Excel.Application.
Рассмотрим, как решить эту проблему на Linux без потери функционала:
.xlsx и .docx). Платформа умеет программно распаковывать эти файлы (которые являются zip-архивами), подменять маркеры на реальные данные из 1С и запаковывать обратно без использования MS Office.ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Он генерирует полноценные и корректные файлы Excel «из коробки» на любой операционной системе.pandas или openpyxl). Сервер 1С на Linux подготавливает данные в формате JSON, сохраняет их во временную папку, запускает скрипт через метод ЗапуститьПриложение(), а скрипт мгновенно генерирует необходимый сложный документ.Резюмируя наш анализ: отказ от устаревшей технологии COM-соединений при переходе сервера 1С на Linux — это не ограничение, а отличный повод перевести вашу систему на современные, быстрые и кроссплатформенные рельсы интеграции. Использование HTTP-сервисов и технологии OData решит любые задачи оперативного обмена данными без каких-либо неудобств для конечных пользователей. В сценариях с закрытыми системами без API для переноса информации внедряется платформа для создания программных роботов, имитирующая действия пользователя в интерфейсе.