При интеграции систем 1С программисты часто сталкиваются с классической архитектурной задачей: необходимо сравнить или перенести данные между двумя базами, которые физически находятся в абсолютно разных локальных сетях. Ситуация осложняется, когда доступ к каждой из баз осуществляется через свои закрытые каналы (например, разные RDP-подключения и различные VPN-клиенты вроде Cisco AnyConnect).
В этой статье мы подробно разберем, почему стандартное COM-соединение через COMConnector пасует в таких условиях, как правильно настроить сеть для его работы и какие современные альтернативные технологии позволят решить задачу быстрее, безопаснее и надежнее.
Давайте проанализируем техническую суть проблемы. Когда мы пишем в коде инициализацию COM-объекта:
Коннектор = Новый COMОбъект("V83.COMConnector");
и пытаемся вызвать метод подключения к серверной базе, нашему компьютеру требуется прямая сетевая видимость (L3-связность) с сервером приложений 1С. При этом используются специфические порты кластера 1С (по умолчанию порты 1540, 1541, а также диапазон рабочих процессов 1560–1591).
Если базы находятся в изолированных сетях, а подключение к ним происходит по очереди с помощью разных VPN-клиентов на рабочем столе, то в один момент времени ваш компьютер «видит» только одну сеть. Одновременно подключиться к двум изолированным сетям через пользовательские VPN-клиенты практически невозможно из-за конфликтов маршрутизации. Следовательно, запустить прямую сверку данных через COM-соединение «из коробки» не получится.
Рассмотрим рабочие способы решения этой проблемы — от классических сетевых настроек до современных веб-сервисов.
Если вам обязательно нужно использовать именно COMConnector (например, у вас уже написан сложный и объемный код сравнения объектов), единственным решением будет объединение двух сетей на уровне сетевого оборудования.
Вместо использования клиентских программ VPN на рабочем месте, системные администраторы обеих сетей должны настроить постоянный защищенный туннель между офисами (Site-to-Site VPN). В этом случае маршрутизаторы будут сами перенаправлять пакеты между подсетями. Для успешного соединения необходимо выполнить следующие шаги:
hosts) на сервере-источнике, чтобы он мог успешно преобразовывать имя сервера-приемника в его локальный IP-адрес.Минусы подхода: Организация такого канала часто блокируется службами безопасности, особенно если базы принадлежат разным юридическим лицам. Кроме того, COM-соединение крайне чувствительно к стабильности канала: при малейшем микросбое связи сессия зависает, что может приводить к зависанию рабочих процессов на сервере.
Использование технологии HTTP/HTTPS-запросов — это самый надежный способ интеграции 1С в современных реалиях. Он полностью избавляет от необходимости использовать нестабильный и устаревший COM.
Как это работает: На стороне удаленной базы (к которой нужно подключиться) создается и публикуется на веб-сервере (IIS или Apache) собственный HTTP-сервис. Этот сервис будет принимать запросы и отдавать данные для сравнения (например, в формате JSON). Основная база обращается к нему с помощью встроенного объекта HTTPСоединение.
Разберем создание такого механизма по шагам.
Шаг 1. Создание HTTP-сервиса в удаленной базе
В конфигураторе удаленной базы создаем новый объект «HTTP-сервис» (например, с именем СравнениеДанных). Добавляем шаблон URL /getdata и метод GET, который будет выгружать нужную таблицу данных. Напишем обработчик этого метода:
Функция ПолучитьДанныеДляСравненияGET(Запрос)
// Формируем запрос к данным, которые нужно сравнить
ЗапросБД = Новый Запрос;
ЗапросБД.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
ТаблицаДанных = ЗапросБД.Выполнить().Выгрузить();
// Упаковываем данные в массив структур для последующей сериализации в JSON
МассивРезультатов = Новый Массив;
Для Каждого Строка Из ТаблицаДанных Цикл
СтруктураСтроки = Новый Структура;
СтруктураСтроки.Вставить("Код", Строка.Код);
СтруктураСтроки.Вставить("Наименование", Строка.Наименование);
СтруктураСтроки.Вставить("Артикул", Строка.Артикул);
МассивРезультатов.Добавить(СтруктураСтроки);
КонецЦикла;
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивРезультатов);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Формируем ответ сервера
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Возврат Ответ;
КонецФункции
Шаг 2. Публикация базы на веб-сервере
С помощью конфигуратора публикуем базу на веб-сервере (меню «Администрирование» — «Публикация на веб-сервере...»). Обязательно устанавливаем флаг «Публиковать HTTP-сервисы».
Шаг 3. Получение данных в основной базе
В нашей основной базе пишем код, который через стандартный порт HTTP (80) или HTTPS (443) заберет эти данные:
Процедура ВыполнитьСравнениеДанных()
// Параметры подключения к опубликованной базе
Сервер = "web.remote-company.ru";
Порт = 443;
Пользователь = "Администратор_API";
Пароль = "SuperSecurePassword";
// Защищенное соединение SSL, если используется HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
Соединение = Новый HTTPСоединение(Сервер, Порт, Пользователь, Пароль, , 30, ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/remote_db/hs/СравнениеДанных/getdata");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
СтрокаJSON = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Читаем полученные данные
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
МассивДанных = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Здесь запускаем наш алгоритм сравнения данных
ВыполнитьСопоставление(МассивДанных);
Иначе
Сообщить("Ошибка запроса. Код ответа сервера: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение с сервером: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Преимущества HTTP-сервисов:
comcntr.dll при обновлениях платформы.Если у вас нет возможности или прав администрировать веб-сервер, настраивать маршрутизацию и просить сисадминов открывать порты наружу, отличным выходом станет использование официального сервиса 1С:Линк.
Проанализируем этот сценарий:
https://subdomain.link.1c.ru.Если вам не требуется сравнение в режиме реального времени («здесь и сейчас»), то идеальным решением будет обмен файлами через промежуточный узел, к которому имеют доступ обе изолированные сети.
Рассмотрим схему работы:
Этот способ является абсолютно безопасным, так как базы данных остаются полностью изолированными друг от друга и не имеют прямых входящих подключений из интернета.
Для принятия окончательного решения проанализируйте требования проекта: