Разъяснение Внешних Компонент 1С

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

И вот в 2020 году существенно изменилось SDK оборудования, для которого было написано SDK. А Visual Basic прекратил свое существование. На нем еще можно писать внешние компоненты, но уже только под 32 разряда. Пришлось искать новые средства для разработки, поддерживающие 64-разрядные платформы.

И на этом пути пришлось потратить более 6 часов для выбора инструмента и его настройки.

Отличие ВК, 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.dll надо зарегистрировать стандартно через regsvr32.exe и потом можно проверить ее работоспособность кодом на 1С:

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

Заключение

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

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

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

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

Теперь осталось завершить проект. О результатах сообщу.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *