Разъяснение внешних компонент

17.06.21

Разработка - Разработка внешних компонент

Более пятилетки назад, еще в 2015 году я написал свою внешнюю компоненту на Visual Basic 6. По сути, это была простая обертка для доступа к функция DLL. Потом написал еще одну обертку уже для другой DLL, от другого оборудования. На этом моё писательство внешних компонент и ограничилось. И вот в 2020 году существенно изменилось SDK оборудования, для которого было написано SDK. А Visual Basic прекратил свое существование. На нем еще можно писать внешние компоненты, но уже только под 32 разряда. Пришлось искать новые средства для разработки, поддерживающие 64-разрядные платформы. И на этом пути пришлось потратить более 6 часов для выбора инструмента и его настройки.

Скачать исходный код

Наименование Файл Версия Размер
Образец внешней компоненты
.zip 12,98Mb
9
.zip 12,98Mb 9 Скачать

Отличие ВК, COM и Native

Удивительно, но я, столько лет использовавший в практике внешние компоненты, и даже являющийся их разработчиком, так до конца и не понимал различиям между их реализациями.

Объясню по-простому. Есть COM-объекты, например когда вы пишете Новый COMобъект(«Excel.Application»), создается COM-объект со своими свойствами и методами. Это хорошо знакомые любому 1С-нику сущности. Здесь «Excel.Application» — название COM-класса. Такие COM-объекты можно использовать в любом приложении, не только в 1С.

ВК, написанная по технологии COM, тоже имеет название COM-класса. Если написать Новый COMобъект(«AddIn.MyVK»), то тоже будет создан COM-объект, но получить через него доступ к методам внешней компоненты нельзя. Методы ВК описываются в специальном формате и становятся доступны только после подключения по функции ПодключитьВнешнююКомпоненту( «AddIn.MyVK»), которая возвращает уже НеизвестныйОбъект, а не COMОбъект.

ВК по технологии COM соблюдают свой стандарт еще со времен 1C 7.7, поэтому работают одинаково хорошо в 1С 7.7 и 1С 8. Разумеется, такую компоненту нельзя будет использовать за пределами 1С, потому что этот стандарт COM разработан и применяется только в 1С.

В 1С 8 применили новую технологию написания ВК — Native. Она позволяет обойтись без COM-обвязки, 1С разбирает DLL Native компоненты, определяет свойства и методы и подключает ее к использованию. Здесь уже не используется имя класса, ВК подключается из DLL.

Native компоненты тоже можно использовать только в 1С.

Использование ВК на сервере

В моей практике нужно было организовать доступ для обслуживания оборудования через ВК по расписанию. Для этого планировалось использовать регламентные задания на сервере 1С.

Но из-за особенностей реализации на сервере 1С могут использоваться только Native-компоненты. Поэтому COM-компонента не запускалась на сервере.

Выход был найден в том, что по расписанию запускалось приложение 1С, а из него уже — необходимая обработка обслуживания. В приложении компонента прекрасно подключалась.

От ВК назад к COM

Но вот что удивительно, на сервере 1С можно использовать обычные COM-объекты.

Поэтому если для компоненты важно, чтобы она работала на сервере, можно добавить в COM-компоненту обычные методы COM-объекта, важные на сервере. Ну или целиком отказаться от технологии ВК-компонент и реализовать COM-Объект.

Правда, в такой реализации не будут доступны ВнешниеСобытия, дескриптор окна от 1С, AppDispatch от 1С, возможность отказаться от изменения реестра, многопоточность.

Но в моем случае мне нужно было написать простую обертку, которая вызывала бы функции из DLL. Когда я разрабатывал COM-ВК, я не знал, что можно просто написать COM-объект и я получил бы тот же результат.

32 и 64 разряда

В принципе, можно было бы написать компоненту и на Visual Basic, но он не умеет генерировать 64-разрядные компоненты. А учитывая, что у 1С появилось 64-разрядное клиентское приложение, которое уже довольно широко используется, пришлось бы только ради ВК, написанной по 32-разрядной технологии, использовать 32-разрядную версию клиента 1С. Это неудобно, поэтому, как бы хорош не был VB, от него нужно отказаться.

Отказываться надо и по другой причине. VB больше не сопровождается, поэтому начинать на нем новые проекты просто не имеет смысла. Нужно идти «в ногу со временем».

Net или C++

Реальность такова, что Visual Basic был вытеснен C# (Си Шарп). А этот язык требует для выполнения своих приложений платформу Net.

Поэтому ВК, разработанные на C# (и вообще под Net), даже для требуют требуют regasm. Кроме того, там возникает чехарда с версиями Net, рекомендуется делать сборки под стабильные версии Net.

Для разработки простой обертки над DLL Net избыточна и излишня. С другой стороны, разработка на C# проще, чем на C++, но, увы, Net будет мешать прозрачности решения.

Однако важно понимать, что на C++ намного более сложно программировать, чем на C#, особенно для 1С-ника, который привык к Basic-подобному языку. Сопровождать вашу компоненту будет проще, если она будет написана на C#, да и Net сейчас распространена во всей экосистеме Windows.

На чем разрабатывать ВК в 2020

Под Windows из вменяемых средств разработку можно вести только в Visual Studio. Для индивидуальных разработчиков (не компаний) этот инструмент бесплатный.

Удивительно, но на ИТС в разделе «Технология внешних компонент» 1С в своих примерах разработки ВК на Visual Studio выкладывает только проект Native-ВК и то под довольно древний релиз Visual Studio, поэтому просто так его не запустить.

Хотя сам по себе Visual Studio довольно сложный инструмент, чтобы им пользоваться, начинающему нужно потратить несколько часов на его предварительную настройку.

Первоначально у меня получилось скомпилировать пример COM-ВК на C# отсюда. Но потом я решил, что для моих целей Net — излишня.

Тогда я использовал статью по разработке COM-объекта с нуля на Visual Studio 10. К сожалению, в новых версиях VS отключен мастер по добавлению свойств и методов в COM-объект, но удалось их добавить вручную:

Место, куда добавлять методы, выделил. Свойства не использую.

Статья написана по результатам обсуждения на Мисте. Поиск адекватного решения для задачи написания ВК в 2020 году длился более недели. Но в итоге инструмент был найден и первая тестовая ВК с одним методом написана.

Прикладываю файл с тестовой ВК из одного метода: anvizcchex-cpp-com-s-edinstvennym-metodom-test

Компоненту AnvizCCHEX.dll надо зарегистрировать стандартно через regsvr32.exe и потом можно проверить ее работоспособность кодом на 1С:

тест = Новый COMОбъект(«AnvizCCHEX.Device»);
рез = тест.Test();
Сообщить(рез); //Должно быть выведено 1

Заключение

Для меня разработка внешней компоненты для 1С в 2020 году стало настоящим испытанием, вызову моему упорству.

Хорошо, что у меня был заказ от клиента, для себя я может быть и сдался бы. А так мне просто необходимо было найти решение.

Для меня этот проект стал еще одним подтверждением моей способности добиваться результата в сложных условиях. А также немного прокачал терпение к людям, потому что программисты, которые сталкивались с ВК, немного снисходительно относились в консультациях к новичку в теме. И мне было немного обидно, что со мной, опытным программистом 1С, общаются как с зеленым юнцом. Но я поборол эти психологические проблемы, потому что по сути да, в технологиях ВК я «мало пороху нюхал».

Хочу также выразить признательность Serginio1 за поддержку и консультации на Мисте, иногда даже непрошенные, но всегда полезные.

Проект успешно завершил, компоненту сдал заказчику.

См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52303    34    69    

43

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35333    108    127    

112

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26477    132    99    

84

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    45242    117    66    

61

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30896    4    4    

8

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    54101    35    14    

68

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4236    starik-2005    28    

53

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4993    starik-2005    32    

40
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 93 15.09.21 15:39 Сейчас в теме
Поэтому ВК, разработанные на C# (и вообще под Net), даже для требуют требуют regasm.

Не по-русски.
Выход был найден в том, что по расписанию запускалось приложение 1С, а из него уже — необходимая обработка обслуживания. В приложении компонента прекрасно подключалась.

Колхоз
Первоначально у меня получилось скомпилировать пример COM-ВК на C# отсюда.

Нерабочая ссылка
Статья написана по результатам обсуждения на Мисте.

Нерабочая ссылка
2. user626743_2mugik 14.10.21 14:17 Сейчас в теме
С++ как то ближе к телу что-ли .Ну его етот Нет.
3. Serginio 938 13.12.21 18:53 Сейчас в теме
>>Правда, в такой реализации не будут доступны ВнешниеСобытия, дескриптор окна от 1С, AppDispatch от 1С, возможность отказаться от изменения реестра, многопоточность.

Для Сервера это и не нужно

Если обязательно хочется ВК на .Net то можно использовать
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux

Правда писалось это давно. Нужно подправить
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux
https://infostart.ru/1c/articles/534901/
Но как то она не особо пользовалась спросом.
Сейчас нужно пересобрать под новые версии https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/netcore-hosting
А для линукса добавить условную компиляцию

Интерфейсы API среды выполнения .NET Core находятся в coreclr.dll (в Windows), в libcoreclr.so (на платформе Linux) или в libcoreclr.dylib (в macOS). Первым шагом для размещения .NET Core является загрузка библиотеки CoreCLR. Некоторые основные приложения проверяют разные пути или используют входные параметры для поиска библиотеки, пока другие могут загрузить ее по заранее определенному пути (рядом с основным приложением, например, или из известного расположения на компьютере).
После обнаружения библиотека загружается с помощью LoadLibraryEx (в Windows) или dlopen (в Linux или macOS).
sh00m; kote; +2 Ответить
4. sh00m 46 07.08.22 11:47 Сейчас в теме
(3) Сергей, если у вас получится пересобрать либы (и обновить исходники) для использования c клиентом 32/64 да еще и под Linux, это будет просто великолепно. Признаться, я сейчас даже собрать NetObjectToNative в свежей студии с установленным core SDK 6.0.101 не могу ... да чего уж там собрать, он его даже не открывает, говорит, что xproj давно не работает.
5. sh00m 46 08.08.22 11:34 Сейчас в теме
Получилось у меня пересобрать под современной visual studio 2022 проекты NetObjectToNative и AddInNetObjectToNative, а вот что с ними делать под linux чтобы заставить 1С использовать свою DLL, как я это делаю с помощью NetObjetToIDispatch45 сейчас под виндой - совершенно не понятно :) Свою DLL переписал под .NET 6.0, опубликовал в виде nuget-пакета со всеми зависимостями...
6. sh00m 46 09.08.22 06:26 Сейчас в теме
Пытаюсь взлететь под виндой, 1С-ка ругается на строку: рез = Новый("AddIn.NetObjectToNative.NetObjectToNative");
говорит:
Тип не определен (AddIn.NetObjectToNative.NetObjectToNative)

P.S. Странно, что Врап = Новый("AddIn.NetObjectToNative.LoaderCLR"); из этой же либы отрабатывает совершенно нормально
Оставьте свое сообщение