1с тип comобъект не может использоваться в данных формы

Обновлено: 04.07.2024

Особенности использования COM-объектов

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

Использование оператора доступа по индексу []

В технологии Automation не предусмотрено штатных средств для реализации обращений по индексам, а доступ к индексированным свойствам (т.е. выражения вида МояФункция(X, Y) = Z) через Automation допускает неоднозначность толкования и не поддерживается встроенным языком 1С:Предприятия.

Для обработки свойств-коллекций рекомендуется использовать оператор цикла Для Каждого . , использующий стандартный для Automation интерфейс IEnumVARIANT . Для доступа по индексу через Automation объекты-коллекции 1С:Предприятия также реализуют методы Получить() и Установить() .

Передача параметров в конструктор объекта

Метод NewObject() объекта Automation 1С:Предприятия имеет переменное число параметров - первым параметром в NewObject() всегда передается имя типа создаваемого объекта, а последующие параметры могут быть использованы для передачи данных в конструктор создаваемого объекта.

Совпадение имен свойств и методов объекта

Технология Automation подразумевает возможность двоякого толкования некоторых элементов агрегатного объекта. Например, могут не различаться одноименные свойство и метод, возвращающий значение и не имеющий параметров. Эту особенность следует иметь в виду при работе с объектами 1С:Предприятия через Automation.

Например, если реквизит справочника назван так же, как и один его методов (реквизит ПолноеНаименование и метод ПолноеНаименование() ), то получение реквизита Справочник.ПолноеНаименование может привести к вызову метода Справочник.ПолноеНаименование() . Такая неразличимость возможна именно при работе через Automation, во встроенном языке 1С:Предприятия свойства и методы объектов 1С:Предприятия разделены.

Отображение в отладчике свойств со значением "Ошибка чтения значения"

Упомянутая выше возможность двоякого толкования элементов агрегатного объекта имеет и визуальное отображение - при просмотре в отладчике 1С:Предприятия свойств COM-объектов можно видеть свойства со значением "Ошибка чтения значения". В действительности эти свойства являются методами, однако могут использоваться и как свойства (например, в таком языке как Visual Basic).

Значит дело было так. Появилась необходимость подключаться к базам по com соединению, для анализа тамошних объектов метаданных. Проблема оказалась в том, что базы могли работать на разных версиях 1С. Пошел в интернет, искал, читал, но все фигня, в оновном все предлагают держать базы на одной версии, что для меня было невозможным.

Кроме, вот этой статьи. Огромное спасибо автору (Леонид Кириенко) и zakiap

Тут уже интересней, но есть пару минусов

1) 1С должна работать от имени учетки с админскими правами.

2) "Варварское" поведение по отношению dllhost.exe :)

3) Могут возникнуть проблемы при одновременном обращении к базам на разных версиях.

Но, как оказалось, самым для меня полезным, оказалась не сама статья, а один из комментариев к ней.


Если присмотрется, то видно, что у него создано несколько оберток для разных версий. Увидев этот коммент, я тут же обрадовался, думал сейчас все расскажут. Но не тут то было, показать, показал, а рассказать забыл)

Инструкция

1. Идем "Панель управления" - "Администрирование" - "Службы компонентов"

2. В оснастке служб компонентов, "Службы компонентов" - "Компьютеры" - "Мой компьютер" - "Приложения COM+"

3. Создаем новое приложение, правой кнопкой по "Приложения COM+" - "Создать" - "Приложение"

4. Выбираем "Создать новое приложение", называем например "1cv8", тип выбираем "Библиотечное приложение"

должно полчуить так


5. Раскрываем "1cv8", правой кнопкой по "Компоненты" - "Создать" - "Компонент".

6. Выбираем вариант "Установка новых компонентов", находим нашу библиотеку comcntr.dll

Находится она в катлоге BIN установленной платформы, у меня например путь такой

"C:\Program Files (x86)\1cv8\8.3.10.2168\bin\comcntr.dll"

должны получить следующую картину


7. Правой кнопкой по "V83.COMConnector.1" - "Псевдоним. ", меняем наименование с "CopyOf.V83.COMConnector.1" на "V83.COMConnector_8.3.9.2033". Данное действие проделываем для всех нужных версий платформ.

8. Открываем "regedit" через пуск или команду "Выполнить", нажимаем F3 и указываем для поиска строку с наименованием созданой нами обертки, например "V83.COMConnector_8.3.9.2033". Или использум для поиска CLSID созданной обертки.

9. Ищем значение в ветке "HKEY_LOCAL_MACHINE" у меня путь такой HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\\ выглядеть должно так


В ветке "InprocServer32" меняем значение у меня, "C:\Program Files (x86)\1cv8\8.3.10.2168\bin\comcntr.dll" на путь к нужной версии длл, в данном случае "C:\Program Files (x86)\1cv8\8.3.9.2033\bin\comcntr.dll".

Данное дейстие проделываем для всех созданных оберток.

Все готово) Для подключения к конкретной версии базы, в 1С теперь нужно использовать следующую конструкцию

В файлах утилита, которая выполнит все эти действия автоматически. Подходит для тех у кого 1С лежит в каталоге

"C:\Program Files (x86)\1cv8". У кого что то отличается, вот ссылка на GitHub . Запустить утилиту нужно от имени администратора. Надеюсь данный материал будет вам полезен)

Обработка для проверки работоспобности соединения с разыми версиями

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

При регистрации библиотек из разных версий 8.3, в одном СОМ приложении, возможно подключиться только к одной из версий.
(15) Решил проблему, создав компоненты в отдельных приложениях СОМ user841691; AlxPop; Franchiser; SoftIce; SurovcevD; WizaXxX; + 6 – Ответить (15) Методом проб и ошибок- свойствах приложения-> Активация-> Серверное подключение . Так заводится и создается инстанс без ошибок Доброго дня.
Оставлю это здесь.
При последовательном подключении к разным платформам COM соединением, необходимо сделать следующую настройку в свойствах КомКоннектора
размер группы увеличить с 1 до 5
время ожидания уменьшить с 15 до 2

Спасибо за статью. Мне она помогла, но если просто сделать как написано, возникали ошибки. Куча комментариев с разными ошибками не дали быстрого решения как именно сделать настройки. Предлагаю слегка скорректированный алгоритм. (*) - измененные шаги. В нем нет последних шагов по работе с реестром. У меня сработало на двух серверах.
Если автор посчитает возможным - можно было бы перенести в шапку.

Передача объектов 1С:Предприятия через COM

Раздел содержит описание некоторых особенностей передачи данных 1С:Предприятия через механизм COM/Automation.

Когда данные передаются через COM

При использовании 1С:Предприятия совместно с другими программами или системами, а также при необходимости доступа к данным нескольких разных информационных баз 1С:Предприятия, могут использоваться средства модели межкомпонентного доступа к объектам (Component Object Model, COM). Ее главная идея заключается в предоставлении универсального средства создания и освобождения объектов, и универсального способа обращения к свойствам и методам объектов, включая передачу необходимых данных. Частным случаем реализации модели COM является Automation, определяющий универсальный интерфейс IDispatch для доступа к свойствам и методам объектов, а также универсальный способ передачи данных (структура VARIANT ).

1С:Предприятие поддерживает средства Automation и тем самым позволяет:

с одной стороны, использовать во встроенном языке 1С:Предприятия произвольные объекты, доступные через Automation на данном компьютере или в сети. Для этого во встроенном языке 1С:Предприятия может быть использован оператор "Новый COMОбъект(<идентификатор COM объекта>)";

с другой стороны, использовать объекты 1С:Предприятия при разработке других программ на различных языках программирования с применением различных инструментальных средств. Для этого 1С:Предприятие регистрирует объекты с идентификаторами: "V8.Application" - клиентское приложение 1С:Предприятия, "V8.COMConnector" - внешнее соединение 1С:Предприятия.

Обращения к свойствам объектов, а также передача значений входных и выходных параметров методов при помощи Automation предполагает универсальный способ представления передаваемых данных. Представление данных при помощи структуры VARIANT накладывает определенные ограничения на типы передаваемых данных и может создать определенные трудности при интерпретации получаемых данных.

Набор типов данных, представимых структурой VARIANT, ограничен, и не охватывает всего многообразия типов данных, доступных в 1С:Предприятии. Ниже будут рассмотрены некоторые особенности передачи средствами COM (через структуру VARIANT) данных 1С:Предприятия различных типов.

Примитивные типы

Значения NULL и Неопределено , а также типы данных Число , Строка , Дата , Булево , определенные в 1С:Предприятии, считаются примитивными. Они представляются аналогичными типами, определенными в VARIANT . Преобразование примитивных типов 1С:Предприятия в VARIANT представлено в таблице:

Тип в 1С:Преприятии Тип VARIANT
значение NULL VT_NULL
значение Неопределено VT_EMPTY
тип Число Целое в диапазоне от -2147483648 до 2147483647 VT_I4
Другие VT_R8
тип Строка VT_BSTR
тип Дата VT_DATE
тип Булево VT_BOOL

Примитивные типы и значения, определенные в VARIANT , преобразуются в примитивные типы и значения 1С:Предприятия в соответствии со следующей таблицей.

Тип VARIANT Тип в 1С:Предприятии

VT_I2, VT_I4, VT_R4, VT_R8, VT_CY, VT_ERROR, VT_DECIMAL, VT_I1, VT_UI1, VT_UI2, VT_UI4, VT_I8, VT_UI8, VT_INT, VT_UINT

тип ЧислоVT_BSTR тип СтрокаVT_DATE тип ДатаVT_BOOL тип Булево

При передаче через COM значение примитивного типа сохраняется, быть может, за исключением точности представления числа. Это значит, что, например, значение типа Строка , после передачи через VARIANT сколько угодно раз, никак не изменится, и любые операции над ней будут давать такой же результат, который они давали до передачи через VARIANT .

Массивы

В структуре VARIANT предусмотрен специальный тип - VT_ARRAY , представляющий собой массив с несколькими измерениями и заданными диапазонами индексов по каждому из измерений. Он представляется специальной структурой SAFEARRAY . Для совместимости с другими объектами, представленными в COM, в 1С:Предприятии предусмотрен специальный тип данных COMSafeArray , в который преобразуется структура SAFEARRAY и наоборот.

При получении 1С:Предприятием структуры VARIANT , содержащей данные VT_ARRAY , она преобразуется в объект 1С:Предприятия COMSafeArray . При необходимости передачи из 1С:Предприятия структуры VARIANT , содержащей данные VT_ARRAY , в 1С:Предприятии должен быть подготовлен соответствующий объект COMSafeArray .

Важно, что данные типа VT_ARRAY являются аналогом примитивных типов в том смысле, что выступают в качестве значений, а не ссылок. В частности, преобразование структуры VARIANT в COMSafeArray приводит к копированию всех содержащихся в ней данных, и наоборот.

Объектные типы

Все остальные типы данных, определенные в 1С:Предприятии, в том числе и коллекции значений, являются объектами и преобразуются к типу VT_DISPATCH структуры VARIANT .

С другой стороны, при получении 1С:Предприятием значения VARIANT типа VT_DISPATCH , оно будет преобразовано в значение типа COMОбъект , набор свойств и методов которого будет совпадать с набором свойств и методов объекта, указатель на который содержался в VARIANT типа VT_DISPATCH . Работа с таким объектом может выполняться только через предоставляемые им свойства и методы, кроме оператора Для Каждого . .

Однако, в том случае, если 1С:Предприятие узнает в нем "свой" объект, VT_DISPATCH будет обратно преобразован в исходный объект 1С:Предприятия и его можно будет использовать так, как любой другой объект 1С:Предприятия этого же типа (оператор Для Каждого . , обращения по индексу, встроенные функции Строка() , Тип() и т.д.).

1С:Предприятие или COM-соединение, подсоединенное к некоторой информационной базе, распознает объект как "свой" только в том случае, если он был создан этим же подсоединением к информационной базе. Например, если из COM-соединения получить элемент справочника и передать этот элемент справочника в качестве параметра какого-нибудь метода объекта, полученного из этого же COM-соединения, то при выполнении этого метода объект будет распознан как "свой". Объект, полученный из другого соединения с информационной базой, не будет распознан как "свой".

Такое поведение объектов 1С:Предприятия объясняется тем, что большинство объектов 1С:Предприятия используют свой экземпляр контекста информационной базы, из которой они получены, и в другом экземпляре контекста информационной базы они "своими" не являются. Каждое приложение 1С:Предприятия и каждый экземпляр COM-соединения поддерживает свой экземпляр контекста информационной базы. Поэтому объекты 1С:Предприятия не распознаются как "свои" не в том приложении 1С:Предприятия или экземпляре COM-соединения, в котором они были созданы.

В Automation (интерфейс IDispatch ) не предусмотрено штатных средств для реализации обращений к элементам массивов по индексам. Предусмотренные в Automation индексированные свойства допускают неоднозначность толкования и не поддерживаются встроенным языком 1С:Предприятия. Это значит, что для коллекций значений, не опознанных 1С:Предприятием как "свои" объекты, невозможно обращение к элементам по индексам из встроенного языка 1С:Предприятия. Однако, многие коллекции, в том числе и коллекции, определенные в 1С:Предприятии, поддерживают специальный интерфейс IEnumVARIANT , позволяющий совершить последовательный обход всех элементов коллекции. Этот механизм используется оператором Для Каждого . , который имеется во многих языках программирования, в том числе и во встроенном языке 1С:Предприятия. Этот же механизм используется встроенным отладчиком 1С:Предприятия, когда он показывает элементы коллекции.

Для удобства обращения к элементам коллекций, определенных в 1С:Предприятии, после передачи коллекции через VARIANT в большинстве коллекций значений ( Массив , ТаблицаЗначений , Структура и другие) предусмотрены методы Получить() и Установить() , действие которых аналогично обращению к элементам коллекций по индексам.

Например, если переменная "ПолученныйМассив" содержит объект типа Массив , то оператор

ATI Radeon x1600pro + GA-M61SME-S2 дают страшные тормоза в играх
ВСЕМ ЗДРАААААААСТИИИ. МОЙ КОМП СИЛЬНО ТОРМОЗИТ А В ИГРУШКАХ.

Передать структуру из формы в форму управляемые формы
Нужно передать из произвольной формы у форму документа структуру при закрытии В форме.


Управляемые формы
Начал немного усваивать 1С, вопрос к профи. Есть &quot;управляемые формы&quot;, все формы называются.

Управляемые формы 1с
как перебрать строки в таблице на управляемой форме и сделать невидимыми некоторые из них?

gbukov, это мы без кода должны угадать что там у тебя делается?

Тормозит после окончания процедуры ОткрытьФайл где-то на минуту

Добавлено через 1 час 35 минут
Отладчиком проверил. Именно после КонецПроцедуры завис. Может на сервере что-то требуется прописать ПриСоздании?

gbukov, сделай скрин "Замера производительности" и давай сюда

Добавлено через 6 минут
СписокЛистов - список значений? Это реквизит формы?

Добавлено через 1 минуту
И еще посмотри какой тип у МассивДанныхКолонок
так:

И сюда напиши, если ComSafeArray, то виноват в медленности скорее всего маршалинг До какой точки? Что запускается при переходе в форму? Тормоза после окончания процедуры

gbukov, запускаешь замер, жмешь свою команду. Ждешь. Останавливаешь замер. Сортируешь по чистому ВРЕМЕНИ и скрин сюда

Добавлено через 27 секунд
gbukov, нужна самая долгая точка в замере

СписокЛистов - СписокЗначений и реквизит формы. СписокДляВыбора тоже СписокЗначений и выведен на форму. МассивДанныхКолонок - массив. Может хранить массив где-то еще? gbukov, ну в твоем коде нет ни одной серверной функции, преобразование данных отпадает Отличная идея. Сейчас попробую поставить точку по нажатию какой-нибудь кнопки.

gbukov, ну ради эксперемента, объяви переменную СписокЛистов

В самом верху модуля

Добавлено через 51 секунду
gbukov, и удали из реквизитов формы - реквизит СписокЛистов

Добавлено через 11 минут
С переменной и правда шустрее заработало.

Добавлено через 9 минут
А можно с деревом НаКлиенте работать? Я потом массив в дерево на форме переношу для редактирования и на сервере это достаточно тормознуто выходит.

Добавлено через 15 минут
Переменная решила проблему с тормозами. Спасибо.

Читайте также: