1с тип comобъект не может использоваться в данных формы
Особенности использования 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 . Запустить утилиту нужно от имени администратора. Надеюсь данный материал будет вам полезен)
Обработка для проверки работоспобности соединения с разыми версиямиСпециальные предложения
(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С:Предприятия в соответствии со следующей таблицей.
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
При передаче через 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С, вопрос к профи. Есть "управляемые формы", все формы называются.
Управляемые формы 1с
как перебрать строки в таблице на управляемой форме и сделать невидимыми некоторые из них?
Тормозит после окончания процедуры ОткрытьФайл где-то на минуту
Добавлено через 1 час 35 минут
Отладчиком проверил. Именно после КонецПроцедуры завис. Может на сервере что-то требуется прописать ПриСоздании?
gbukov, сделай скрин "Замера производительности" и давай сюда
Добавлено через 6 минут
СписокЛистов - список значений? Это реквизит формы?
Добавлено через 1 минуту
И еще посмотри какой тип у МассивДанныхКолонок
так:
gbukov, запускаешь замер, жмешь свою команду. Ждешь. Останавливаешь замер. Сортируешь по чистому ВРЕМЕНИ и скрин сюда
Добавлено через 27 секунд
gbukov, нужна самая долгая точка в замере
gbukov, ну ради эксперемента, объяви переменную СписокЛистов
В самом верху модуля
gbukov, и удали из реквизитов формы - реквизит СписокЛистов
Добавлено через 11 минут
С переменной и правда шустрее заработало.
Добавлено через 9 минут
А можно с деревом НаКлиенте работать? Я потом массив в дерево на форме переношу для редактирования и на сервере это достаточно тормознуто выходит.
Добавлено через 15 минут
Переменная решила проблему с тормозами. Спасибо.
Читайте также: