Передача СОМ-объекта с клиента на сервер
Привет. Как передать СОМ-объект с клиента на сервер?
Пробовал так:
V8 = Новый COMОбъект("V83.Application");
РезультатПодключения = V8.Connect(ПараметрыСоединения);
Объект.АдресВХ = ПоместитьВоВременноеХранилище(V8, Новый УникальныйИдентификатор());
//где Объект.АдресВХ — реквизит типа Строка неограниченной длины
V8 = Новый COMОбъект("V83.Application");
РезультатПодключения = V8.Connect(ПараметрыСоединения);
СтруктураСОМ = Новый Структура("СОМ", V8);
Объект.АдресВХ = ПоместитьВоВременноеХранилище(СтруктураСОМ, Новый УникальныйИдентификатор());
в обоих случаях одна ошибка:
Ошибка помещения значения во временное хранилище
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘request’:
Процедуры по переносу находятся в модуле объекта. Туда и нужно передать V8
Обмен данными между базами 1С через COM соединение
Один из вариантов обмена данными между базами 1С это обмен через COM соединение.
С помощью COM соединения можно из одной базы 1С подключиться к другой и прочитать или записать данные. Пользоваться этим методом можно как в клиент-серверных вариантах баз, так и в файловых базах. В этой статье и разберем примеры такого рода соединений. В примерах используется платформа 8.2.
Можно создать два вида COM объектов для приложения 1С. Это V82.Application и V82.COMConnector. В случае с V82.Application запускается практически полноценный экземпляр приложения 1С. в случае использования V82.COMConnector запускается небольшая серверная часть.
Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V82.COMConnector и только в случае нехватки функционала V82.Application. Особенно сильно разница в скорости работы может быть заметна на базах большого объема.
-
Создадим COM объект
-
для серверного варианта базы
А теперь соберем весь код в кучу
Далее можно например воспользоваться методом NewObject(), чтобы создать запрос, и с его помощью прочитать данные из базы к которой подключались.
Для вида подключения V82.Application метод применяется для COM объекта, который создавался изначально, а для V82.COMConnector метод применяется к подключению. далее работа с запросом идет стандартными средствами 1С. в коде это выглядит так:
Для версии 1С:Предприятие 8.3 все остается без изменений за исключением того, что при создании COMОбъектов надо использовать «V83.COMConnector» или «V83.Application».
Взаимодействие между базами 1С через COM
В этой статье я расскажу о многих особенностях взаимодействия между базами 1С по COM технологии, накопленных за годы развития и использования интеграционного коммерческого продукта 2iS:Интеграция нашей компании 2iS.
Термины
COM-клиент – процесс(поток) ОС, запросивший создание COM-объекта
COM-сервер – COM-объект, созданный по запросу клиента
Com-соединитель – COM-объект V8X.ComСonnector для создания внешних соединений с базами 1С
Automation-сервер – он же OLE-сервер, COM-объект V8X.Application для создания приложений 1С
Издание платформы – подстрока до 2-й точки версии платформы (например 8.2, 8.3)
Сборка платформы – полная строка версии платформы (например 8.2.19.130, 8.2.16.352)
Подключение внешнего соединения
-
Создание COM-объекта Com-соединитель (Имя класса — V8X.ComConnector). Варианты:
-
Пример
КомСоединитель = Новый COMОбъект(“V83.ComConnector”, ИмяКомпьютера);
ВнешнееСоединение = КомСоединитель.Connect(СтрокаСоединения);
Затраты на COM-вызовы
Соотношение затрат на вызов по типам расположения COM-сервера
- Минимальные для внутрипроцессного Com-сервера
Минимизация количества COM-вызовов
- Создаем базовую внешнюю обработку с набором общих методов для приема вызовов от COM-клиента на стороне COM-сервера
Обратная связь
-
Нельзя прервать поток COM-Клиента и его соединение с сервером приложений 1С, пока не завершится вызов COM-сервера
-
информацию о прогрессе выполнения
Схема принципа “минимум COM-вызовов”
Такая схема дружественна к большим задержкам каналов связи. Поэтому она во многом похожа на вызов веб-сервиса. А следовательно используя ее для COM взаимодействия, вы значительно снижаете затраты на возможные переходы между COM и веб-сервисом в обоих направлениях.
Отладка
Чтобы включить возможность отладки внешних соединений, в подкаталоге conf нужно создать файл comcntrcfg.xml с соответствующим содержимым. В окне подключения можно сделать кнопку/флажок для программного создания такого файла. Однако много версий платформы содержат ошибку, из-за которой предметы отладки внешних соединений не видны в отладчике даже с этим корректно настроенным файлом. На платформе 8.3 эти проблемы вроде бы решены.
Пример файла comcntrcfg.xml:
Также нельзя забывать о необходимости запускать конфигуратор для отладки с той же (до регистра букв) строкой соединения, что и предмет отладки. Поэтому в этом диалоге нужно сделать кнопку для запуска конфигуратора COM-сервера с правильной строкой соединения.
В какой-то мере обойти проблему невидимости предмета отладки внешнего соединения и ряд других неудобств можно путем однократного выполнения кода на толстом клиенте с заменой режима «Внешнее соединение» на «Automation-сервер» (приложение), т.е. используя COM класс V8X.Application и включенную видимость. Поэтому в окне подключения нужны параметры для выбора режима подключения.
После создания подключения на стороне COM-клиента обычно требуется подключение отладчика базы COM-сервера и установка там точки останова в нужном месте. Поэтому в окне подключения нужно расположить кнопку подключения отладчика/конфигуратора COM-сервера. Если COM-сервер запущен в режиме видимого приложения, то для подключения отладчика можно воспользоваться асинхронным вызовом исключения в нем. Из диалога с ошибкой в приложении COM-сервера через кнопку «Конфигуратор» можно будет открыть конфигуратор и в большинстве случаев сразу подключить отладчик. Если подключение отладчика таким способом недоступно, то оператору поможет отображение информации о сеансе (его номера) в базе COM-сервера. Также нужна кнопка открытия в открытом отладчике файла внешней обработки, которая будет выполняться в нем.
Управление COM классами и COM+ приложениями 1С
Управление COM классами
- Внешнее соединение (V8X.ComConnector)
Управление COM+ приложениями
Далее можно изменить тип активации (внутрипроцессный/внепроцессный) на закладке Активация/Activation.
В нашем продукте имеется инструмент «Управление COM классами 1С» для просмотра/регистрации/изменения всех COM классов и COM+ приложений 1С на указанном компьютере:
Настройка DCOM-сервера
Появится око в котором необходимо выбрать роль «Сервер приложений»/»Application server». На этапе выбора ролей сервера приложений необходимо указать пункт «Сетевой доступ к COM+»/»COM+ network access». Если это не сделать, то при попытке создания COM-объекта вы будете получать ошибку «Ошибка при вызове конструктора (COMОбъект): The component or application containing the component has been disabled».