Как перевести обмен данными между Альфа-Авто и КА 2 (ERP) с COM-соединения на Web или HTTP сервисы?

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При переходе с устаревших конфигураций (УПП, КА 1.1) на современные системы (КА 2, ERP) многие разработчики сталкиваются с деградацией технологии COM-соединения. Основная проблема заключается в разности разрядностей платформ: Альфа-Авто (особенно версии 4, 5 и даже 6) часто требует использования 32-битного клиента из-за специфических компонент защиты и драйверов торгового оборудования, в то время как КА 2/ERP обычно работают на 64-битных серверах. Попытки настроить V83.Application через "Службы компонентов" (DCOM) приводят к нестабильности и низкой производительности. Рассмотрим, как полностью уйти от COM в пользу Web-сервисов (SOAP) или HTTP-сервисов (REST).

Выбор технологии: Web-сервисы против HTTP-сервисов

Для начала проанализируем, какой тип сервиса выбрать для решения нашей задачи. Web-сервисы работают по протоколу SOAP. Их главное преимущество для 1С-разработчика — строгая типизация и автоматическая поддержка платформой через пакеты XDTO. Платформа сама проверяет структуру данных на соответствие схеме WSDL. Это "родной" для 1С способ, который позволяет вызывать функции удаленной базы почти так же просто, как методы локального общего модуля.

HTTP-сервисы (REST) — это более современный и легковесный стандарт. Здесь мы сами управляем структурой запроса и ответа. В качестве формата данных чаще всего используется JSON. HTTP-сервисы работают быстрее, так как не несут в себе тяжеловесных XML-описаний SOAP, и они проще в отладке через сторонние инструменты. Разберем оба варианта реализации.

Настройка веб-сервера IIS для работы с разной разрядностью

Одной из главных преград при публикации сервисов является настройка IIS. Если ваша Альфа-Авто работает на 32-разрядной платформе, а КА 2 на 64-разрядной, возникнет конфликт при обращении к расширению веб-сервера. Разберем, как решить проблему ошибки 500.0 Internal Server Error.

  1. Откроем Диспетчер служб IIS.
  2. Перейдем в раздел Пулы приложений.
  3. Для базы, работающей на 32-битной платформе (Альфа-Авто), найдем соответствующий пул, зайдем в Дополнительные параметры и установим значение Разрешены 32-разрядные приложения в True.
  4. Для 64-битной базы (КА 2) это значение должно быть False. Таким образом, каждая база будет работать в своем пуле с нужной разрядностью библиотек wsapxx.dll.
  5. Проверим работоспособность публикации, обратившись к WSDL-описанию через браузер по адресу вида: http://server/base/ws/ExchangeService.1cws?wsdl.

Реализация обмена через Web-сервис

Рассмотрим создание простого Web-сервиса в базе-приемнике (например, КА 2), к которому будет обращаться Альфа-Авто для передачи данных. Создадим функцию Ping для проверки связи и функцию передачи данных контрагента.

Во-первых, создадим в дереве конфигурации объект Web-сервис с именем ExchangeService. Укажем Пространство имен (например, http://www.наша-компания.ru/exchange) и выберем пакет XDTO http://v8.1c.ru/8.1/data/core для передачи базовых типов.

Добавим операцию Ping с типом возвращаемого значения boolean (http://www.w3.org/2001/XMLSchema). Текст модуля будет предельно простым:


Функция Ping()
    Возврат Истина;
КонецФункции

Теперь создадим более сложную функцию для получения данных. Посмотрим на пример формирования XML-строки для передачи информации о контрагенте. Мы не можем передать СправочникСсылка напрямую, поэтому будем использовать GUID и текстовые поля.


Функция ПолучитьДанныеКонтрагента(ИНН)
    КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
    Если КонтрагентСсылка.Пустая() Тогда
        Возврат "Не найден";
    КонецЕсли;

    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Contractor");
    ЗаписьXML.ЗаписатьАтрибут("Наименование", КонтрагентСсылка.Наименование);
    ЗаписьXML.ЗаписатьАтрибут("GUID", Строка(КонтрагентСсылка.УникальныйИдентификатор()));
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    Возврат ЗаписьXML.Закрыть();
КонецФункции

Использование HTTP-сервисов и JSON

Проанализируем современный подход с использованием JSON. Это удобнее, так как платформа 1С версии 8.3.14 и выше имеет отличные встроенные инструменты сериализации. В КА 2 создадим HTTP-сервис. Определим шаблон ресурса, например, /get_data/{INN}.

Разберем код обработчика GET-запроса, который возвращает структуру данных в формате JSON:


Функция КонтрагентыGet(Запрос)
    ИНН = Запрос.ПараметрыURL.Получить("INN");
    Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
    
    Результат = Новый Структура;
    Если Не Контрагент.Пустая() Тогда
        Результат.Вставить("Успех", Истина);
        Результат.Вставить("Наименование", Контрагент.Наименование);
        Результат.Вставить("GUID", Строка(Контрагент.УникальныйИдентификатор()));
    Иначе
        Результат.Вставить("Успех", Ложь);
    КонецЕсли;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Результат);
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
    Возврат Ответ;
КонецФункции

В Альфа-Авто для получения этих данных мы будем использовать HTTPСоединение и HTTPЗапрос. Это работает значительно быстрее, чем COM, и не требует наличия установленной платформы Альфа-Авто на сервере КА 2.

Как заменить "открытие формы" через Web-сервис?

Один из самых частых аргументов в пользу COM (V83.Application) — возможность интерактивного взаимодействия, например, программное открытие формы контрагента в другой базе. Web-сервисы и HTTP-сервисы этого делать не умеют, так как они работают в фоновом сеансе на стороне сервера.

Выясним, как обойти это ограничение и сохранить удобство для пользователя:

  1. Навигационные ссылки (e1cib): Вместо попытки открыть окно через OLE, мы можем сформировать навигационную ссылку на объект в КА 2. В Альфа-Авто добавим кнопку, которая выполняет команду ЗапуститьПриложение("e1cib/data/Справочник.Контрагенты?ref=..."). Если у пользователя установлен тонкий клиент КА 2, база откроется сразу на нужном объекте.
  2. Синхронизация данных: Правильнее будет сначала запросить данные через сервис, создать "черновик" контрагента в Альфа-Авто (сопоставив его по GUID), и открыть уже локальную форму. При записи локальной формы данные по сервису отправятся обратно в КА 2.
  3. Использование OData: В КА 2 можно включить стандартный интерфейс OData. Это позволит Альфа-Авто читать любые данные из КА 2 вообще без написания программного кода на стороне КА 2.

Рекомендации по стабильности

При переходе на сервисы важно помнить о безопасности и стабильности:

Авторизация: Всегда используйте отдельного пользователя в базе-сервере с минимально необходимыми правами ("Только чтение" или права на конкретные сервисы). Учетные данные передаются в объекте ОпределенияWebСервиса или через заголовки HTTPСоединения.

Обработка ошибок: В отличие от COM, где ошибка просто "валит" скрипт, при работе с сервисами мы должны анализировать коды возврата (для HTTP) или использовать конструкцию Попытка...Исключение для Web-сервисов. Это позволит системе продолжать работу, даже если сервер КА 2 временно недоступен.

Подводя итог, перенос обмена на HTTP-сервисы с JSON — это наиболее перспективное решение для связки Альфа-Авто и КА 2. Это решает проблемы с разрядностью платформ, повышает скорость работы и делает систему архитектурно правильной.

← На главную