Передача СОМ-объекта с клиента на сервер
Привет. Как передать СОМ-объект с клиента на сервер?
Пробовал так:
V8 = Новый COMОбъект("V83.Application");
РезультатПодключения = V8.Connect(ПараметрыСоединения);
Объект.АдресВХ = ПоместитьВоВременноеХранилище(V8, Новый УникальныйИдентификатор());
//где Объект.АдресВХ — реквизит типа Строка неограниченной длины
V8 = Новый COMОбъект("V83.Application");
РезультатПодключения = V8.Connect(ПараметрыСоединения);
СтруктураСОМ = Новый Структура("СОМ", V8);
Объект.АдресВХ = ПоместитьВоВременноеХранилище(СтруктураСОМ, Новый УникальныйИдентификатор());
в обоих случаях одна ошибка:
Ошибка помещения значения во временное хранилище
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘request’:
Процедуры по переносу находятся в модуле объекта. Туда и нужно передать V8
Обмен данными между базами 1С через COM соединение
Один из вариантов обмена данными между базами 1С это обмен через COM соединение. С помощью COM соединения можно из одной базы 1С подключиться к другой и прочитать или записать данные. Пользоваться этим методом можно как в клиент-серверных вариантах баз, так и в файловых базах. В этой статье рассматривается такого рода соединений на платформа 8.3
Com соединение
Можно создать два вида COM объектов для приложения 1С. Это ole соединения V83.Application и com соединения V83.COMConnector. В случае с V83.Application запускается практически полноценный экземпляр приложения 1С. В случае использования V83.COMConnector запускается небольшая серверная часть. Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V83.COMConnector и только в случае нехватки функционала V83.Application. Особенно сильно разница в скорости работы может быть заметна на базах большого объема. Для платформе 8.2 используется V82.Application или V82.COMConnector
Установить OLE соединение
Установить COM соединение
Строка подключения
Разрыв соединения
Для объекта V83.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.
Метод NewObject()
Для создания нового объекта можно воспользоваться методом NewObject(), например:
После создания Com объекта можно далее работать с ним, например
Можно также использовать менеджеры объектов конфигурации:
Получение и сравнение перечисления через COM соединение
Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так
Получение объекта через COM по идентификатору
Через менеджеры объектов конфигурации получаем com объект, например :
Затем получаем строку уникального идентификатора :
Затем в базе данных можно найти по ссылке нужный документ, таким образом:
Если нужно найти com объект по идентификатору, то тогда нужно написать так:
Работа с 1С через OLE 8.* (V81.Application, V81.COMConnector)
Данная статья рассматривает два из этих объектов V81.Application, V81.COMConnector, служащих для подключения с использованием COM-технологий к базе 1С 8.1 не зависимо от того находится ли данная база на сервере или представлена в виде файлового варианта.
Так же мы рассмотрим нюансы подключения к базе из 1C v7.7.
К данной статье будет приложен иллюстративный материал в виде конфигурации с демо-обработкой, входящей в состав данной базы, и обработка для 7.7, демонстрирующая соединение с данной базой.
Создание каркасной базы
Создадим новую конфигурацию
В ней мы создадим ПараметрСеанса МиниЛогЗапуска и глобальный модуль с атрибутами
- Глобальный
- Клиент
- Сервер
Приведу код глобального модуля
Так же определим процедуру в модуле внешнего соединения
Так же добавим ещё один не глобальный модуль с атрибутами
- Клиент
- Сервер
И с единственной функцией
Application и ComConnector сравнение соединение из 1С 8
Для исследрования вызова функций не глобальных модулей Сохраняем конфигурацию, и теперь нам есть что исследовать.
Для целого ряда методов в синтаксис помощнике указанно «Не используется в модуле внешнего соединения». Это упоминание не даёт полной картины.
Объект V81.Application соответствует объекту V77.Aplication, а именно происходит загрузка сервера с интерфейсными библиотеками в режиме клиент, объект же V81.COMConnector при загрузке не имеет ничего из того что отвечает за интерфейс с пользователем, что повышает производительность при работе с внешним соединением.
Создаём обработку в нашей конфигурации, для проверки вызова наших методов.
В обработке обявляем две переменных и функцию установления соединения с базой
В переменной открытия мы передаём либо строку «V81.Application», либо строку «V81.ComConnector»
При этом для V81.Application возвращается Истина в connection, а cntr является нашим объектом через который мы обращаемся к базе
Для ComConnector в connection возвращается объект для обращения к базе, а cntr является объектом описанным в синтаксис помощнике как COM-соединитель.
Свойства и методы COM-соединителя.
Свойство, только чтение, Тип: Число.
Определяет максимальное число одновременно существующих объектов COM-соединение, созданных через данный COM-соединитель.
Число одновременно существующих соединений включает также число соединений, находящихся в пуле COM-соединений. Значением по умолчанию 0 (число одновременно существующих объектов COM-соединение не ограничено).
Устанавливать свойству не нулевое значение можно только в том случае, если сам объект COM-соединитель был создан в Multithreaded Apartment (MTA), что обеспечивает реальное функционирование самого COM-соединителя и созданных им объектов COM-соединение в многопотоковой (multithreaded) среде. Это условие соблюдается в частности, если COM-соединитель был создан в приложении ASP.NET.
Если же объект COM-соединитель был создан в Singlethreaded Apartment (STA), то реально все действия с COM-соединителем и созданными им объектами COM-соединение будут выполняться в одном потоке. В этом случае, если метод Connect не сможет на первом проходе найти подходящее или создать новое COM-соединение, то выполнение этого метода зациклится, так как освободить уже, возможно, ненужное другое COM-соединение будет нельзя по той причине, что операция освобождения объекта COM-соединение должна быть выполнена в том же потоке, в котором уже выполняется метод Connect.
Следует помнить, что создание COM-объектов из приложения 1C:Предприятие 8.1 выполняется из STA. Это же справедливо для большинства GUI-приложений Windows.
- Connect(<Строка соединения>)
- <Строка соединения> (обязательный)
Строка параметров, используемая 1С:Предприятием для соединения с информационной базой.
Строка соединения представляет собой набор параметров, каждый из которых является фрагментом вида: <Имя параметра=><Значение>, где Имя параметра — имя параметра, а Значение — его значение. Фрагменты отделяются друг от друга символами ‘;’. Если значение содержит пробельные символы, то оно должно быть заключено в двойные кавычки («).
Для файлового варианта определен параметр: File — каталог информационной базы (файловый режим);
Для клиент-серверного варианта определены параметры: Srvr — имя сервера 1С:Предприятия; Ref — имя информационной базы на сервере;
Для всех вариантов определены параметры: Usr — имя пользователя; Pwd — пароль и UC<Код доступа> позволяет выполнить установку соединения с информационной базой, на которую установлена блокировка установки соединений.
Если при установке блокировки задан непустой код доступа, то для установки соединения необходимо в параметре /UC указать этот код доступа.
- Тип: COM-соединение.
Создает соединение с информационной базой 1С:Предприятия 8.1.
Устанавливает соединение с информационной базой 1С:Предприятия 8.1 и возвращает ссылку на объект COM-соединение.
Установка соединения выполняется по следующему алгоритму:
- COM-соединение с требуемыми параметрами ищется в пуле соединений. Если найдено, то используется оно.
- Если COM-соединение с требуемыми параметрами не найдено, то анализируется не исчерпан ли лимит по числу одновременно существующих соединений. Если не исчерпан, то создается новое COM-соединение.
- Если лимит исчерпан, но при этом в пуле имеются неиспользуемые COM-соединение, то соединение, дольше всех находящееся в пуле, удаляется и создается новое COM-соединение.
- Если никаким способом найти подходящее или создать новое COM-соединение не удалось, то происходит ожидание освобождения COM-соединение другим потоком, после чего весь процесс повторяется, начиная с пункта 1.
- <Идентификатор> (обязательный)
- Тип: Строка. Идентификатор протокола (по умолчанию tcp), имя компьютера или IP адрес агента сервера (обязательно), номер IP порта агента сервера (по умолчанию 1540). Например, значением параметра могут быть следующие строки: «server1», «tcp://server1», «tcp://server1:1540», «server1:1540».
- Тип: Соединение с агентом сервера.
Выполняет подсоединение к агенту сервера 1С:Предприятия 8.1, работающему на указанном серверном компьютере.
Если подсоединение невозможно, то вызывается исключение.
- ConnectWorkingProcess(<Имя>)
- <Имя> (обязательный)
- Тип: Строка. Имя или IP адрес рабочего процесса, с которым должно быть установлено соединение, в формате: <протокол>://<адрес_или_имя>:<порт> Например:
- testcomp
- tcp://testcomp
- tcp://testcomp:2354
- tcp://43.73.34.11:5342.
- Тип: Соединение с рабочим процессом.
Создает административное соединение с рабочим процессом кластера серверов 1С:Предприятия 8.1.
Для установки соединения с базой надо методу Connect нашего объекта передать строку соединения Для файловой версии данная строка содержит параметры:
- File с указанием пути к папке с файлом базы
- Usr с указанием имени прользователя
- Pwd с указанием пароля прользователя
Для соединения с сервером Usr и Pwd прежние параметры, а вот вместо File два параметра Srvr с указанием имени сервера и Ref с указанием имени Базы
Вызовы из восьмёрки через Application и ComConnector
Пробуем организовать вызов функций нашей конфигурации из обработки на 8.1
Пишем процедуру вызова функций с определением, что возвращается при вызове
Рассмотрим лог сообщений:
Что это нам даёт?
Значения типа неопределено,NULL,Истина,Ложь передаются в соединение с базой корректно.
Модуль внешнего соединения при подключении через V81.Application не отрабатывает.
Модуль приложения при подключении через V81.Application отрабатывает.
Тип подключения, в котором мы подключаемся к базе, соответствует типу подключения клиент
Пишем аналогичную процедуру, но уже с использованием ComConnector
Лог сообщений у нас отличается в строчках
То есть при обращении через объект V81.ComConnector подключение осуществляется в режиме север, даже если мы подключаемся к локальной файловой базе.
Теперь попробуем обратиться к нашим объектам, ну хотя бы к V81.Application из 1С 7.7
Пишем примерно тот же код
Лог сообщений выглядит так
Так мы убеждаемся что Ложь соответствует 0, Истина -1, а NULL и неопределено ничего в стандартах 1Cv7.7 не возвращают
Как же отличить NULL от неопределено?
Для этого у объекта cntr в случае V81.Application и у connection в случае V81.ComConnector есть метод String
В описание данного метода сказано «Получает строковое представление значения произвольного типа».
Пробуем использовать этот метод из 7.7
Добавив в нашу Функцию ВызовФункций() несколько строк кода
Сохраним обработки и запустив просмотрим лог сообщений
Мы можем получить тип любых метаданных используя этот пример и описание работы с метаданными
Использование менеджеров для работы с данными через ОЛЕ
Мы прояснили процесс работы с метаданными, а теперь обратимся к работе с данными
В данной процедуре мы указываем наименование справочника, и если такого наименования нет, то мы создаём элемент справочника. Выводим всю информацию которую можем получить и присваиваем значение элемента справочника нашей константе
Создадим элемент и просмотрим лог сообщений
Запросы,Конструкторы запросов и произвольные объекты 8.* через ОЛЕ
Мы использовали работу менеджеров для получения и изменения, данных базы,но более высокой производительностью в восьмёрке обладают запросы и их мы так же можем использовать.
В данном примере мы сначала пользуемся V81.Application, у которого есть интерфейсные библиотеки и методом NewObject (являющимся конструкцией языка 1С 8.* Новый) для вызова конструктора запроса.
Потом мы закрываем базу, и подключившись через V81.ComConnector создаём сам запрос и результат запроса в линейном порядке выводим в объект 7.7 таблица.
В принципе такой порядок использования запроса необязателен, но из ComConnector мы не сможем вызвать метод ОткрытьМодально() по причине отсутствия интерфейсных библиотек.
Проблема булева типа из 7.7 (можем передать, но не можем вернуть)
Изменим структуру нашей базы, а именно. Для Константы Константа1 изменим тип с простого типа Строка на составной Булево,Число
Разместим в глобальном модуле функцию, которая нам вернет значение в виде строки.
Так же предположим, что мы не хотим, что бы код нашей функции компилировался при запуске в режиме приложения, а хотим что бы наш код работал только в режиме внешнего соединения независимо от того подключаемся мы через V81.ComConnector или через V81.Appliction.
Вызов из 77 я описывать не буду, он уже для вас довольно тривиален.
В принципе вместо напсиания данного кода мы можем, запустив восьмёрку, вычислить выражение в табло и убедиться, что ЗначениеВстрокуВнутр(Истина)= <"B",1>ЗначениеВстрокуВнутр(Ложь)=
Определим функцию работы с нашей константой в обработке вызываемой из 7.7
Рассмотрим лог сообщений после вызова всех трех вариантов функций и просмотра базы в режиме предпрития
Какой вывод мы можем сделать из этого лога
Что тип булево возвращается стороннему приложению как число.
Мы можем установить значение булева и любого неизвестного 7.7 типа через ЗначениеИзСтрокиВнутр, но как минимум в случае с булевым типом мы не сможем его прочитать обратно иначе чем число.
Сам собой напрашивается вывод, что надо быть аккуратным при проектировании внешних функций и метаданных, проектируя их таким образом что бы мы могли одназначно опредилить по возвращенному параметру булев тип и никогда бы не смогли спутать его с числом.
Проблема времени из 7.7 (не можем передать)
Добавляем в нашу базу регистр накопления и документ регистратор и пишем в 7.7 простую функцию, формирующую движения данного документа
Рассмотрим лог сообщений
Вывод из этого лога прост. Время даже при передаче через ЗначениеИзСтрокиВнутр теряется.
Класс не существует
И в заключении. Если выскакивает ошибка с «Класс не существует», значит, что не зарегистрирован COM-объект 1С:Предприятия.
COM соединение в 1С 8.3 на примере
Перенос данных из одной информационной базы в другую можно осуществить при помощи конвертации данных, либо типовой обработки по загрузке/выгрузке.
Иногда стандартного функционала не достаточно, например, когда нужно применить сложные алгоритмы обработки данных. В таких случаях целесообразнее использовать в 1С 8.3 COM-соединение. Этот механизм позволяет подсоединиться к другой базе и получать из нее все необходимые данные. Такой способ отличается повышенным быстродействием и надежностью.
Реализация COM-соединения
В нашем примере мы сделаем простую обработку 1С, которая будет выводить все номера и суммы документов реализации за указанный период. Примеров применения существует много, но в рамках данной статьи важно понять основные принципы работы с COM-соединениями. Данный пример доступен для скачивания по ссылке.
Обратите внимание, что способ подключения к файловым и клиент-серверным базам отличается. Мы будем применять «V83.COMConnector», так как работа идет с базами на платформе 8.3. Следовательно, для более низких версий будут использоваться COMConnector V81 и V82 соответственно.
Следующим нашим шагом будет добавление на форму табличной части, в которую будут выводиться данные. Так нужно указать поля для ввода периода, по которому будут отбираться документы. Сама процедура заполнения будет выполняться при нажатии соответствующей кнопки со следующим кодом:
После выполнения наша обработка будет выглядеть так, как показано на рисунке ниже.