Как организовать соединение между базами 1С при работе через веб-сервер: альтернативы COM-объектам

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

В современной практике разработки на платформе 1С:Предприятие 8 всё чаще возникает задача интеграции двух информационных баз, которые опубликованы на веб-сервере. Традиционный метод использования V83.COMConnector, привычный по работе в локальной сети или в режиме «толстого клиента», в среде веб-серверов сталкивается с рядом ограничений. Проанализируем ситуацию: когда базы доступны по протоколам HTTP/HTTPS, прямое обращение через COM становится не только технически сложным (из-за разрядности систем и прав доступа), но и не всегда оптимальным с точки зрения производительности. Разберем основные способы решения этой задачи, которые позволяют организовать взаимодействие так же эффективно, как и через COM-соединение.

Вариант 1. Использование стандартного интерфейса OData (REST API)

Если нам нужно просто и быстро получить данные из другой базы (справочники, документы, регистры) или записать их туда, не создавая при этом сложной логики на стороне «приемника», рассмотрим использование OData. Это автоматический механизм 1С, который превращает базу в полноценный REST-сервис без написания единой строки кода для самого интерфейса.

Проанализируем шаги для его настройки:

  1. Откроем базу-источник в Конфигураторе.
  2. Перейдем в меню «Администрирование» — «Публикация на веб-сервере».
  3. Установим галочку «Публиковать стандартный интерфейс OData».
  4. В списке ниже выберем конкретные объекты (например, Справочник.Номенклатура), к которым нужен доступ.

После этого мы сможем обращаться к данным с помощью обычных HTTP-запросов. Рассмотрим пример логики на стороне базы-клиента:


Соединение = Новый HTTPСоединение("имя-сервера", , "Пользователь", "Пароль");
Запрос = Новый HTTPЗапрос("/ИмяБазы/odata/standard.odata/Catalog_Номенклатура?$format=json");
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    // Обработка полученных данных JSON
КонецЕсли;

Этот метод является самым легким аналогом COM-соединения для простых операций чтения и записи.

Вариант 2. Использование Web-сервисов (SOAP)

В тех случаях, когда нам требуется вызвать конкретную процедуру или функцию в удаленной базе (аналог Соединение.ИмяПроцедуры() в COM), наиболее надежным способом будет использование Web-сервисов. Выясним причину их популярности: они позволяют передавать сложные структуры данных и выполнять бизнес-логику на стороне сервера второй базы.

Разберем пример реализации, предложенный участниками сообщества. Для начала в базе, к которой мы подключаемся, должен быть создан объект Web-сервис с определенными операциями. Затем в вызывающей базе мы используем объект WSПрокси.

Рассмотрим пример кода для подключения:


// Сначала определим путь к опубликованному сервису (WSDL)
ПутьКСервису = "http://server/base/ws/MyService?wsdl";
Логин = "admin";
Пароль = "1";

Попытка
    // Создаем определение сервиса
    Определение = Новый WSОпределения(ПутьКСервису, Логин, Пароль);
    
    // Создаем прокси-объект для вызова методов
    // Указываем пространство имен, имя сервиса и имя точки подключения
    ПространствоИмен = "http://www.my-company.ru/integration";
    ИмяСервиса = "ExchangeService";
    ТочкаПодключения = "ExchangeServiceSoap";
    
    Обр = Новый WSПрокси(Определение, ПространствоИмен, ИмяСервиса, ТочкаПодключения);
    Обр.Пользователь = Логин;
    Обр.Пароль = Пароль;
    
    // Вызываем удаленную функцию, например, получение таблицы данных
    ПараметрыВызова = Новый Структура("ДатаНачала, ДатаКонца", НачалоПериода, КонецПериода);
    Результат = Обр.GetTableData(НачалоПериода, КонецПериода);
    
Исключение
    Сообщить("Ошибка подключения к веб-сервису: " + ОписаниеОшибки());
КонецПопытки;

Преимущество этого метода в том, что он работает через стандартный порт веб-сервера (обычно 80 или 443) и не требует открытия специфических портов для COM-соединения.

Вариант 3. Особенности использования COM-соединения через веб-сервер

Многие разработчики задаются вопросом: «А почему нельзя просто оставить COM?». Проанализируем ситуацию. Технически это возможно, если сервер 1С и веб-сервер работают под управлением ОС Windows. Однако при работе через тонкий клиент, который обращается к базе через веб-сервер, код выполняется на стороне сервера приложений или самого веб-сервера (в зависимости от контекста).

Важные нюансы, которые нужно учесть:

Если же условия позволяют и вы решили использовать COM, типичный код подключения будет выглядеть так:


Попытка
    COMConnector = Новый COMОбъект("V83.COMConnector");
    // Для серверной базы строка подключения формируется через Srvr и Ref
    СтрокаПодключения = "Srvr=""MyServer"";Ref=""MyBase"";Usr=""Admin"";Pwd=""123"";";
    Соединение = COMConnector.Connect(СтрокаПодключения);
    
    // Теперь можно обращаться к методам второй базы
    СправочникСсылка = Соединение.Справочники.Номенклатура.НайтиПоКоду("001");
Исключение
    Сообщить("Не удалось подключиться через COM: " + ОписаниеОшибки());
КонецПопытки;

Сравнение методов: что выбрать?

Выясним, какой метод лучше подходит для вашей задачи:

  1. OData: Идеально для быстрой синхронизации данных, когда не нужно писать сложный код. Работает «из коробки».
  2. Web-сервисы (SOAP/HTTP): Рекомендуемый современный стандарт. Позволяет инкапсулировать логику внутри базы-источника и передавать только готовый результат. Стабильно работает при любой нагрузке и на любых ОС.
  3. COM-соединение: Постепенно уходящая в прошлое технология. Стоит использовать только для старых конфигураций в полностью Windows-окружении, где переписывание на веб-сервисы слишком трудозатратно.
  4. Внешние источники данных: Рассмотрим этот вариант, если вам нужно только читать данные на уровне SQL-запросов. Это работает быстрее всего, так как обращение идет напрямую к СУБД, минуя сервер 1С второй базы.

Резюмируем: при работе через тонкий клиент и веб-сервер наиболее надежным и производительным решением будет создание собственного HTTP-сервиса или использование OData. Это гарантирует отсутствие проблем с правами доступа и разрядностью компонент, которые так характерны для COM-соединений.

← На главную