В современной практике разработки на платформе 1С:Предприятие 8 всё чаще возникает задача интеграции двух информационных баз, которые опубликованы на веб-сервере. Традиционный метод использования V83.COMConnector, привычный по работе в локальной сети или в режиме «толстого клиента», в среде веб-серверов сталкивается с рядом ограничений. Проанализируем ситуацию: когда базы доступны по протоколам HTTP/HTTPS, прямое обращение через COM становится не только технически сложным (из-за разрядности систем и прав доступа), но и не всегда оптимальным с точки зрения производительности. Разберем основные способы решения этой задачи, которые позволяют организовать взаимодействие так же эффективно, как и через COM-соединение.
Если нам нужно просто и быстро получить данные из другой базы (справочники, документы, регистры) или записать их туда, не создавая при этом сложной логики на стороне «приемника», рассмотрим использование OData. Это автоматический механизм 1С, который превращает базу в полноценный REST-сервис без написания единой строки кода для самого интерфейса.
Проанализируем шаги для его настройки:
Справочник.Номенклатура), к которым нужен доступ.После этого мы сможем обращаться к данным с помощью обычных HTTP-запросов. Рассмотрим пример логики на стороне базы-клиента:
Соединение = Новый HTTPСоединение("имя-сервера", , "Пользователь", "Пароль");
Запрос = Новый HTTPЗапрос("/ИмяБазы/odata/standard.odata/Catalog_Номенклатура?$format=json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обработка полученных данных JSON
КонецЕсли;
Этот метод является самым легким аналогом COM-соединения для простых операций чтения и записи.
В тех случаях, когда нам требуется вызвать конкретную процедуру или функцию в удаленной базе (аналог Соединение.ИмяПроцедуры() в 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-соединения.
Многие разработчики задаются вопросом: «А почему нельзя просто оставить COM?». Проанализируем ситуацию. Технически это возможно, если сервер 1С и веб-сервер работают под управлением ОС Windows. Однако при работе через тонкий клиент, который обращается к базе через веб-сервер, код выполняется на стороне сервера приложений или самого веб-сервера (в зависимости от контекста).
Важные нюансы, которые нужно учесть:
COMConnector, возникнет ошибка. Решение — настройка компоненты через «Службы компонентов» (DCOM) в Windows.IUSR или ApplicationPoolIdentity). У этих пользователей часто нет прав на регистрацию и запуск COM-объектов.Если же условия позволяют и вы решили использовать COM, типичный код подключения будет выглядеть так:
Попытка
COMConnector = Новый COMОбъект("V83.COMConnector");
// Для серверной базы строка подключения формируется через Srvr и Ref
СтрокаПодключения = "Srvr=""MyServer"";Ref=""MyBase"";Usr=""Admin"";Pwd=""123"";";
Соединение = COMConnector.Connect(СтрокаПодключения);
// Теперь можно обращаться к методам второй базы
СправочникСсылка = Соединение.Справочники.Номенклатура.НайтиПоКоду("001");
Исключение
Сообщить("Не удалось подключиться через COM: " + ОписаниеОшибки());
КонецПопытки;
Выясним, какой метод лучше подходит для вашей задачи:
Резюмируем: при работе через тонкий клиент и веб-сервер наиболее надежным и производительным решением будет создание собственного HTTP-сервиса или использование OData. Это гарантирует отсутствие проблем с правами доступа и разрядностью компонент, которые так характерны для COM-соединений.