ActiveX контейнер для управляемого интерфейса системы 1С:Предприятие

Опубликовал premier в раздел Программирование - Внешние компоненты

Внешняя компонента "ControlContainer" для платформы "1С:Предприятие" v.8.2, 8.3, реализующая размещение ActiveX объектов на управляемых формах системы 1С:Предприятие.

   Как известно, компания 1С лишила разработчиков возможности размещения ActiveX объектов на управляемой форме. Обходные пути, конечно же есть, они неоднократно были описаны в публикациях, например, в этой - http://infostart.ru/public/61064/. Но все они сводятся к вставке элементов управления в поле HTML документа, что лишь частично удовлетворяет потребность в их использовании. Большой минус такого подхода - невозможность подписаться на события размещенного элемента управления. Мне, например, очень не хватало подписки на событие нажатия кнопки на web-камере элемента управления, производящего захват изображения с последующим сохранением снимка. Да и со стандартными элементами управления, входящими в поставку Windows, сложно работать, не имея возможности подписаться на их события. Например, элемент управления MSCAL.Calendar оповещает контейнер о смене даты, а как же без подписки на событие узнать, что оно произошло?
   Проблема "висела в воздухе", пока  не возникла идея написать контейнер ActiveX объектов для управляемых форм. Подобная публикация уже имела место быть на Инфостарте, но была снята мною из-за обнаруженных проблем, связанных с некорректным освобождением интерфейсов элементов управления. Оказалось, что дело не в элементах управления и не в реализации внешней компоненты, а в механизмах подключения внешних компонент, реализованных по COM технологии самой платформой 1С:Предприятие. Но, поскольку решить эту проблему в состоянии только разработчики платформы 1С, я решил вновь разместить публикацию, так как решение, представленное в ней, является на данный момент единственной альтернативой размещения ActiveX объекта вне поля HTML документа. Проблема с освобождением интерфейсов обнаруживается лишь на стадии отладки компоненты и не приводит к краху системы, да и других непредсказуемых эффектов я не обнаружил.
   Работа с компонентой очень проста, поскольку компонента имеет всего лишь два метода (описание приемов работы с компонентой продемонстрировано в приложенных обработках). Всё остальное делает платформа 1С:Предприятие.

 

Не для коммерческого использования (см. лицензионное соглашение).

  

Файлы

Наименование Файл Версия Размер Кол. Скачив.
ActiveX control container
.zip 34,57Kb
28.02.16
59
.zip 2.0 34,57Kb 59 Скачать

См. также

Google Maps для 1С от 6 000 руб.

Комментарии

1. Ksu (файл скачал) 23.09.2014 16:17
Есть вопрос по использованию данной компоненты.
Каким образом ее публиковать в системе? через regsvr32 выдается ошибка и соответственно дальше дело не идет
Сделала стандартным способом архив компоненты с манифестом.
Установка проходит, а компонента не подключается.
код инициализации пишу такой:
	Try      
		AttachAddIn("CommonTemplate.MGS_CtrlCont","CtrlCont");
		ObjectVK = New ("AddIn.CtrlCont.ControlContainer");
	Except
		Try
			InstallAddIn("CommonTemplate.MGS_CtrlCont");
			AttachAddIn("CommonTemplate.MGS_CtrlCont","CtrlCont");
			ObjectVK = New ("AddIn.CtrlCont.ControlContainer");
		Except
			Message("Внешняя компонента ControlContainer не установлена!");
		EndTry;
	EndTry;

...Показать Скрыть
# Ответить
2. premier 23.09.2014 16:51
А какая именно ошибка выдаётся при регистрации через regsvr32?
В какой ОС пытаетесь регистрировать?
Какая разрядность у операционной системы?
Не зная всего этого, я не смогу Вам подсказать.
Ответили: (3)
# Ответить
3. Ksu (файл скачал) 23.09.2014 17:05
(2) premier,
С регистрацией в системе разобралась. Надо было запустить регистрацию от администратора.
Собственно система win7
Хочется автоматизировать установку у пользователей
# Ответить
4. premier 24.09.2014 10:58
Windows 7 упрямая операционка в плане безопасности.
Попробуйте в каталог с компонентой поместить .bat или .cmd файл, содержащий вызов: regsvr32.exe CtrlCont.dll
и уже его запускать от имени администратора. По крайней мере запустить файл проще, чем писать в командной строке.
# Ответить
5. kolayuk 18.12.2014 11:29
Здравствуйте, не могли бы вы предоставить исходники данной компоненты? Есть задача интегрировать свое окно в существующую форму 1С, через FindWindowEx это сделать проблематично, тк там куча окон с одинаковыми классами у всех ЭУ, нужно хотя бы получить HWND конкретной формы, очень интересно как вы это решили. Собственно интересуют даже не столько исходники конкретной компоненты, сколько технология создания своих элементов управления. Спасибо! Мои контакты: kolayuk at gmail.com
Ответили: (6)
# Ответить
6. premier 18.12.2014 14:17
(5) Здравствуйте. Если бы Вы внимательно прочитали публикацию, Вы, наверняка, уже давно реализовали бы свою задачу. В описании есть несколько моментов, которые явно указывают на механизм поиска окна на управляемой форме.
ТипПоляФормы (обязательный)
Тип: Число.
Тип элемента формы, в который будет вставлен элемент управления.
Возможные значения:
0 - поле диаграммы (Диаграмма, ДиаграммаГанта, Дендрограмма)
1 - поле форматированого документа, поле HTML документа.


Поиск, соответственно, и производится по дочерним окнам формы с указанными классами.
Чтобы компонента могла правильно разместить элемент управления в поле формы,
следует размещать на форме только одно поле с указанным типом, иначе элемент
управления будет размещен в произвольном поле с подходящим типом,
не занятом другим элементом управления.


А по поводу технологии создания своих элементов управления, если Вы, конечно, имеете ввиду внешнюю компоненту, которой, собственно и является ActiveX контейнер, есть масса информации на дисках ИТС. С описанием и примерами.
# Ответить
7. qwsachka 21.05.2015 03:09
Здравствуйте Premier !

Использование вашего контейнера позволит использовать любые ActiveX , которые зарекомендовали себя в обычных приложениях ?

Меня интересует Перехватчик клавишь , которым я пользовался на 8.1 . Подключить его в ваш контейнер не удалось .

Имеется ли у вас пример работы с перехватчиком клавишь , подобно данной публикации ? Мне нужно получать событие нажатия клавиши Enter , когда я пишу что-нибудь в Форматированном документе .
Ответили: (8)
# Ответить
8. premier 27.05.2015 16:15
(7) qwsachka, отвечу по порядку:
Использование вашего контейнера позволит использовать любые ActiveX , которые зарекомендовали себя в обычных приложениях ?
Я тестировал контейнер на ActiveX объектах как сторонних производителей, так и разработанных мной. Все работали.

Меня интересует Перехватчик клавишь , которым я пользовался на 8.1 . Подключить его в ваш контейнер не удалось .
Если Перехватчик - это ActiveX объект, то должен был подключиться.

Имеется ли у вас пример работы с перехватчиком клавишь , подобно данной публикации ? Мне нужно получать событие нажатия клавиши Enter , когда я пишу что-нибудь в Форматированном документе .
В принципе, реализовать такой Перехватчик вполне возможно (я даже писал ВК с похожим функционалом для 1С 7.7). Но вот привязать его к какому-то конкретному элементу на управляемой форме будет достаточно проблематично.
# Ответить
9. nay2k (файл скачал) 29.07.2015 15:20
Здравствуйте, premier.
У меня следующая проблема. Мне нужно подключить ActiveX компоненту по работе со считывателем смарт-карт (Сайт компоненты - http://www.scardsoft.com/main.php3?Theme=SCardX).
Подключаю ее вот таким образом:
 SCardX_Easy = Контейнер1.УстановитьActiveX("SCardXEasy.SCardX_Easy", 1);

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

1с прерывает отладку, дальнейший код не выполняется и 1с вываливается с ошибкой платформы при любом действии.
В неуправляемой форме подобной ошибки не возникает, правда там не СomОбъект создается, а ActiveX родным методом подключается.
Ответили: (10)
# Ответить
10. premier 31.07.2015 11:20
(9) nay2k, ActiveX и Сom - это разные названия одной и той же технологии, раньше такие объекты OLE назывались, так что создаются объекты, разработанные по одной и той же технологии. Вообще, странно, конечно, что-то, не то видимо с контейнером. Хотя я массу ActiveX объектов на ней тестировал. И своих и от Microsoft как на скриншоте. Ничего не падало. И события отрабатывались корректно. Может, в платформе 1С дело? Я отлаживал на 8.2 (разные подрелизы) и на 8.3.5.1098. Вы на какой платформе 1С SCardX_Easy подключали? Мне так кажется, что дело в платформе 1С. У меня есть элемент управления web-камерой, который преспокойно работает на всех платформах 1С, которые я использовал и вот сообщение, что на управляемой форме платформа падает (там тоже использовался контейнер)! Поставлю самый последний релиз 8.3, потестирую.
# Ответить
11. premier 31.07.2015 11:43
Кажется понял. Ошибка вываливается в тонком клиенте. Причем на платформе 8.3.6, в 8.3.5 всё работает...
Ответили: (12)
# Ответить
12. nay2k (файл скачал) 03.08.2015 12:09
(11) premier, Да именно в тонком клиенте. Версия платформы - 8.3.4.437. Т.е ошибка именно из-за платформы?
Спасибо, вас и за контейнер и за ответы! На этот раз мне проще было переписать обработку под толстый клиент, но в дальнейшем надеюсь пригодится.
# Ответить
13. pp77 28.08.2015 09:45
Добрый день!
Если регистрировать в реестре через regsvr32 и подключать
ПодключитьВнешнююКомпоненту("AddIn.ControlContainer")

компонента работает великолепно

Но это не удобно, т.к. придется регистрировать на каждом клиенте.

Попытался сделать так:
УстановитьВнешнююКомпоненту("ОбщийМакет.ActiveX_UF");


ОбщийМакет.ActiveX_UF это макет (двоичные данные) в который загружен архив zip содержащий:

1. файл манифеста "MANIFEST.xml" :

<?xml version="1.0" encoding="UTF-8"?>
<bundle xmlns="http://v8.1c.ru/8.2/addin/bundle">
<component os="Windows" path="CtrlCont.dll" type="Com" arch="i386"/>
</bundle>
2. сама dll

УстановитьВнешнююКомпоненту отрабатывает на ура, но подключить не удается, строка подключения:
ПодключитьВнешнююКомпоненту("ОбщийМакет.ActiveX_UF","ControlContainer")
возвращает ложь
можете подсказать в чем может быть причина.?
Спасибо.
Ответили: (14)
# Ответить
14. premier 28.08.2015 10:55
(13) pp77, дело в том, что регистрировать компоненту в любом случае придётся "От имени Администратора". Я так думаю, не все пользователи имеют такие права, поэтому из макета они просто не смогут зарегистрировать компоненту, не имея соответствующих прав. Предлагаю воспользоваться способом, описанном в посте 4.
# Ответить
15. pp77 31.08.2015 12:28
Добрый день
На платформе 8.3.6, компонента не стабильно работает (управляемый интерфейс), часто 1С вываливается (например при закрытии обработки) Вы писали об этом в п.11. Будете ли Вы оптимизировать под 8.3.6?
Спасибо
# Ответить
16. premier 31.08.2015 14:57
pp77, Я написал в конце публикации, что исправил эту ошибку. При тестировании использовал самую последнюю версию платформы, которая была доступна на начало августа 2015 г.
Точно версию платформы не помню, но не ниже 8.3.6.2076. Причём тестировал на разных OS. Нестабильности не заметил. Вы как давно файл скачивали?
Ответили: (17)
# Ответить
17. pp77 02.09.2015 09:40
(16) premier\
Качали 26.08.2015,
Дата dll 11.08.2015
тестировали на 8.3.2041
попробуем под "совсем последней" платформой 8.3.2237
Ответили: (18)
# Ответить
18. premier 02.09.2015 11:21
(17) pp77, мне кажется не в платформе дело. Возможно, проблема в ActiveX элементе, который Вы пытаетесь использовать совместно с контейнером. Я протестировал не меньше десятка ActiveX объектов. Последовательно вызывал их методы, изменял свойства, инициировал события. Закрывал форму, на которой расположен контейнер, снова открывал, закрывал 1С без закрытия формы - не было краха системы! Может, вышлете Вашу обработку с ActiveX объектом, естественно, для тестирования?
Ответили: (19)
# Ответить
19. pp77 08.09.2015 12:18
(18) premier,
Добрый день!
Спасибо, прошу прощения за задержку с ответом.
Обработку прикладываю. Для установки компоненты AcniveX достаточно поставить демо версию системы Zulu:
Zulu (в самом внизу страницы ссылка, под скачать)
После установки, в обработке в процедуре ОбработчикОжиданияОткрытияФормы() нужно поправить путь к zmp файлу (это необходимо для Active X объекта). По умолчанию , если установите ZUlu по этому пути, сразу все должно работать:
C:\Program Files (x86)\Zulu 7.0\
Как воспроизвести:
Вариант 1: После открытия обработки и отображения карты "ткнутся" на любой объект карты - 1С закрывается. Воспроизводится почти всегда
Вариант 2: После открытия обработки и отображения карты , ввести ИДОбъекта (поле сверху слева)= 29. Повыбирать на карте объекты (закрываться не будет). Закрыть обработку, повторить сначала. Раза с 3-его 1С вылетает.
Пробовал на последнем релизе 2237 и 2041. На 32битных 64битных ОС.
Ответили: (20)

Прикрепленные файлы:

ВзаимодействиеСZula.epf
# Ответить
20. premier 08.09.2015 16:46
(19) pp77, действительно, не работает ни в тонком клиенте, ни в толстом. Будет время - потестирую. А на обычных формах пробовали запускать? Сам ActiveX - то хоть рабочий?
Ответили: (21)
# Ответить
21. pp77 09.09.2015 04:13
(20) premier,
Добрый день!

Да на в обычном приложении все работает замечательно.
Прикладываю обработку для обычного приложения, с внедренным Active X типовым способом.
Подключение карты в процедуре ПриОткрытии также сделано по умолчанию:C:\Program Files (x86)\Zulu 7.0\
Спасибо
Ответили: (22)

Прикрепленные файлы:

Пример взаимодействия с Зулу 7_ОбычноеПриложение.epf
# Ответить
22. premier 09.09.2015 11:43
(21) pp77, вот что я заметил при тестировании:
Если в процедуре ВыборОбъекта() заменить фрагмент кода
ИДОбъекта = ЭлементУправления1.CurrentID; // именно в этом месте платформа "падает"
на
ИДОбъекта = Число(ЭлементУправления1.CurrentID);
программа перестаёт "падать". Видимо, платформа не распознаёт тип значения CurrentID, хотя в отладчике тип указывается как число.
Причём обратное преобразование
ЭлементУправления1.CurrentID = ИДОбъекта;
происходит вполне корректно. Вот такая загадка платформы 8.3...
Ответили: (23)
# Ответить
23. pp77 10.09.2015 04:57
(22) premier,
Добрый день!
Применили Ваши рекомендации
"Вариант 1: После открытия обработки и отображения карты "ткнутся" на любой объект карты - 1С закрывается. Воспроизводится почти всегда " - "исправился"
но если открыть обработку (с подгрузкой карты) закрыть, открыть заново, закрыть, открыть - "Падение 1С"
Т.е. стабильно с 3 раза "падает 1С".
Ответили: (24) (25)
# Ответить
24. premier 10.09.2015 14:27
(23) pp77, действительно, "падает 1С" при повторном открытии обработки. Но только с объектами Zulu. Обработка, приложенная, как пример использования, открывается сколько угодно раз. Я раз 20 открывал-закрывал эту обработку и это не приводило к падению 1С. Очевидно проблема в объекте Zulu, потому как контейнер, содержащий другие ActiveX объекты, при многократном открытии не приводит к краху системы.
# Ответить
25. premier 10.09.2015 14:34
(23) pp77, попробовал изменить Вашу обработку таким образом: контейнеры в ней создаются, но ActiveX объекты не устанавливаются. Обработка запускается множество раз и не "роняет" 1С. Стало быть, вывод сам собой напрашивается - дело не в контейнере, а в элементе управления.
Ответили: (26)
# Ответить
26. pp77 11.09.2015 06:45
(25) premier,
Добрый день!
Спасибо. Будем связываться с разработчикам Zulu.
# Ответить
27. pp77 01.10.2015 08:10
Добрый день!
Получили ответ от разработчиков Zulu (они воспроизвели у себя ситуацию):
В сценарии работы формы получается так, что при закрытии формы элемент MapCtrl высвобождается раньше, чем объект connection point на IPropertyNotifySink, который форма-контейнер у него запросила. Стандартный сценарий подразумевает, что сначала высвобождаются запрошенные объекты у элемента, а потом уже сам элемент. Если элемент вставляется на форму через «прослойку», то тогда в этом коде нужно убедиться, что все connection point закрыты, прежде чем элемент будет высвобожден.
Ответили: (28)
# Ответить
28. premier 01.10.2015 16:52
(27) pp77, Немного подправил код внешней компоненты. Сейчас обработка открывается - закрывается множество раз без "падения системы". Скиньте в личку e-mail. Я вышлю Вам ВК для тестирования.
# Ответить
29. pp77 02.10.2015 08:22
Добрый день!
Скинул в личку мой адрес
Спасибо.
# Ответить
30. pp77 05.10.2015 11:23
Добрый день!
Спасибо проблема решена
# Ответить
31. pp77 06.10.2015 06:01
Добрый день!
Обнаружил все же недочет, в рамках сеанса 1С все работает корректно, но при закрытии 1С, 1С закрывается с ошибкой.
Имя события проблемы: APPCRASH
Имя приложения: 1cv8c.exe
Версия приложения: 8.3.6.2299
Отметка времени приложения: 55f16760
Имя модуля с ошибкой: ntdll.dll
Версия модуля с ошибкой: 6.1.7601.18933
Отметка времени модуля с ошибкой: 55a69e20
Код исключения: c0000005
Смещение исключения: 00051365
Версия ОС: 6.1.7601.2.1.0.16.7
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789
Ответили: (32) (33)
# Ответить
32. premier 06.10.2015 08:28
(31) pp77, а какие объекты Zulu подключаете, те же, что и в выложенных ранее обработках?
# Ответить
33. premier 06.10.2015 08:34
(31) pp77, не удалось воспроизвести ошибку. Несколько раз в течение сеанса открывал - закрывал обработку. Потом закрыл приложение. Всё нормально отработало.
# Ответить
34. pp77 06.10.2015 11:47
Да обработка "не валит" 1С. Возможно, что то не то сделали в функционале (будем смотреть) по результатам, отпишусь.
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл