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

19.02.24

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

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

Всем зрасьте!

В прошлый раз я красил газон, рассказывая, как там языки программирования появились, как до 1С-а мы дожили и как теперь писать диссертации про C++. Меня раскритиковали за туманное описание таинств. Но на горизонте событий черной дыры C++, где приличное высокоуровневое программирование вырождается в постоянное кипение вакуума вокруг выделения и освобождения памяти, скзать что-то достоверно - весьма непростая задача. Но мы попробуем еще раз зайти в эту реку. Ну или это будет уже другая река - не суть.

Итак, давайте рассмотрим практический кейс рисования внешней компоненты, которая будет оповещать нас из фонового задания, что обещает нам 1С аж в 26-м релизе, до которого еще жить и жить.

 

ЗАМЫСЕЛ БОЖЫЙ

Итак, мысль проста, как три копья. Странно, что 1С-негам это все в голову пришло только сейчас, ибо сделать оное было весьма просто, а уж додуматься - и сам Кришна велел.

Суть в том, что в современном мире микросервисов любой приличный язык программирования позволяет с полпинка запилить какой-нить сервис, основанный на обычном HTTP[S]-протоколе. Для C++ написано огромное количество различных библиотек для организации такого сервера. В одной из статей я писал про библиотеку restbed, в этой статье я раскажу о библиотеке httplib, о которой я узнал из комментов.

Суть же всего дива заключается в том, что внешняя компонента будет создавать локальный веб-сервер, а фоновое задание будет создавать HTTP-соединение и дергать его по любому поводу, в то время как компонента будет генерировать внешнее событие (например, в форме, из которой запущено фоновое задание). Ну и в ходе обработки этого внешнего события мы будем двигать прогресс-бар и писать слова.

И да, я все это на Linux буду делать. Для винды этот код тоже подойдет, но как там его компилить - сами разбирайтесь, ибо мне вломы искать винду - я ей только на работе пользуюсь.

 

ОСНОВЫ

За основу я взял шаблон от kandr, который не глючит под 64-битным линухом, в отличие от шаблона от infactum. Единственная проблема в том, что шаблон от kandr не умеет внешние события, поэтому их в него воткнуть.

Итак, приступим...

 

БИБЛИОТЕКА httplib

 

Установка

Речь о библиотеке для организации сервера. Итак, у меня в убунту это делается так:

sudo apt install libcpp-httplib-dev

 

Сборка ВК

Для сборки ВК с этой библиотекой мы будем использовать такое заклинание:

g++ AddInNative.cpp TestComponent.cpp -I../include -I/usr/include -fPIC -march=x86-64 -O2 -lcpp-httplib --std=c++17 -o mylib.so

Если использовать ключ -shared, то есть вероятность того, что собранная компонента заработает не только на вашем компьютере.

 

МОДИФИКАЦИЯ КОДА ВНЕШНЕЙ КОМПОНЕНТЫ

Итак, мы установили библиотеку httplib, скачали шаблон внешней компоненты. Остается теперь внести в этот шаблон правки, чтобы у нас все заработало.

Для начала чуть подправим функционал для того, чтобы нам обрабатывать внешнее событие.

Для этого в файл "AddinTemplate/src/AddInNative.cpp" нужно добавить функцию для организации внешнего события:

bool AddInNative::ExtEvent(const std::u16string& cname, const std::u16string& cevent, const std::u16string& ctext)
{
	return m_iConnect && m_iConnect->ExternalEvent((WCHAR_T*)cname.c_str(), (WCHAR_T*)cevent.c_str(), (WCHAR_T*)ctext.c_str());
}

Собственно, мы тут просто вызываем функцию ExternalEvent 1С-ного интерфейса iConnect. Оное действо как раз вызывает процедуру ВнешнееСобытие в форме (ну или ОбработкаВнешнегоСобытия в модуле приложения).

Дальше нам нужно поправить файл "AddinTemplate/src/AddInNative.h". И тут я позволю себе немного поленится и покласть эту функцию в секцию public, чтобы не мучаться в дальнейшем с пробросом этого всего в наш класс.

bool ExtEvent(const std::u16string& cname, const std::u16string& cevent, const std::u16string& ctext);

Так, с внешними событиями покончили.

Дальше приступим к реализации нашего веб-сервера. Для этого поменяем файл "AddinTemplate/src/TestComponent.cpp", в который добавим следующие строки:

#include <thread>
#include <codecvt>
#include "httplib.h"

std::vector<std::thread> t1;

void start_thread (void * _obj)
{
	httplib::Server svr;
	TestComponent * progress((TestComponent*)_obj);

	svr.Get("/hi", [&](const httplib::Request &r, httplib::Response &res) {
		
        std::string s;
        for (auto p : r.params) {
            s+= p.first + ":" + p.second + "\n";
        }
		
		std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert;
		const std::u16string s0 = convert.from_bytes(s);

		progress->setR(s0);
	    res.set_content(s, "text/plain; charset=utf-8");
	});

    svr.listen("0.0.0.0", 8080);

    return;

}

void TestComponent::startListen()
{
	t1.push_back ( std::thread(start_thread, (void *) this) );
}

Собсно, какую мы тут дичь сотворили?

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

2. Добавили функцию start_thread, которая стартует поток, в котором создается веб-сервис, слушающий порт 8080 и реагирующий на HTTP GET /hi.

3. Добавили функцию startListen, которая будет вызываться методом внешней компоненты ЗапуститьСервер().

Для того, чтобы это сработало, нам нужно в функцию "TestComponent::TestComponent()" добавить следующий код:

AddProcedure(u"StartListen", u"ЗапуститьСервер", [&]() { this->startListen(); });

Дальше нам нужно создать функцию "setR", которая вызывается из нашего обработчика GET, которая, в свою очередь, должна вызывать функцию ExternalEvent.

Давайте сделаем это!

void TestComponent::setR(const std::u16string &text)
{
	std::u16string event = u"ExternalEvent";
	std::u16string name = u"AddIn." + name;

	ExtEvent(name, event, text);

}

Ну и добавим в файл "AddinTemplate/src/TestComponent.h" следующий код:

public:
    void setR(const std::u16string &text);

 

ПОДКЛЮЧЕНИЕ К 1С

Итак, давайте подоткнем это к 1С. Для этого я создал новую конфигурацию, сотворил там общую форму, в которой прописал подключение компоненты и запуск веб-сервиса, а также обработку внешнего события:

&НаКлиенте
асинх Процедура ПриОткрытии(Отказ)
	МетоположениеКомпоненты = "/home/.../AddinTemplate/src/mylib.so";
	Т = Ждать ПодключитьВнешнююКомпонентуАсинх(МетоположениеКомпоненты, "AAA", ТипВнешнейКомпоненты.Native);
	ВнешняяКомпонента = Новый("AddIn.AAA.AddInNative");
	ВнешняяКомпонента.ЗапуститьСервер();
КонецПроцедуры

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
	Сообщить(Источник);
	Сообщить(Событие);
	Сообщить(Данные);
КонецПроцедуры

А теперь давайте дернем "http://localhost:8080/hi?a=Привет, мир!"  И вот что у нас получилось:

 

 

Т.е. компонента передала пару Параметр:Значение в 1С!

Ну я надеюсь, что дальше эту конструкцию Вы и сами допилите, применив оное колдунство для оповещения с сервера. И да, файл не прикладываю - в статье достаточно информации, чтобы это повторить, ну и вирусов никаких, раз файла нет)))

 

ЗАКЛЮЧЕНИЕ

Я пришел домой в 18:30, в 20:30 статья была готова. О чем это говорит? О том, что нет ничего сложного в создании внешней компоненты, которая дернет из фонового задания вашу форму и передаст данные о том, что там вообще и как.

Всем всех благ! Подписывайтесь на каналы, ставьте лайки, пишите комменты!

"C++" "Внешняя компонента"

См. также

Разработка внешних компонент 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 и маркетинг Управленческий учет Платные (руб)

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

18000 руб.

30.05.2017    54039    9    69    

46

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

Внешняя компонента для конвертации PDF файлов в картинки без использования дополнительных программ. Работает на сервере и в тонком клиенте.

2400 руб.

25.06.2024    1126    3    4    

3

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

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

2400 руб.

04.05.2018    47297    124    66    

67

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

Внешняя компонента, позволяющая посылать команды и получать ответы по GraphQL протоколу из 1С.Может быть использована при интеграции. В 1С работает на стороне "клиента".

4600 руб.

27.06.2023    3598    3    0    

5

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

Позволяет автоматизировать работу с картинками. С помощью компоненты можно измерять размер изображений, поворачивать их, наносить водяные знаки, конвертировать из одного формата в другой. Будет очень полезна для интернет-магазинов и всех, кому постоянно требуется работать с различными графическими форматами. Выполнена по технологии NativeAPI. Работает с форматами: jpg (jpeg), png, bmp, gif, tif

3600 руб.

02.09.2010    77514    72    257    

191

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

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

3000 руб.

12.05.2020    28653    138    100    

91

Разработка внешних компонент Системный администратор Программист Стажер Бесплатно (free)

Библиотека для работы с базами SQLite из 1С на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!

14.01.2025    1799    bayselonarrend    10    

44

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

В статье описывается приложение-конструктор внешних компонент (native API). Конструктор упрощает процесс разработки за счет удобного добавления всех нужных функций и процедур в графическом режиме, с указанием их параметров и типов параметров. На выходе приложение генерирует готовый код на С++ и Rust и позволяет сразу приступить к реализации, без настройки API компоненты вручную.

04.12.2024    4713    kovalevdmv    26    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. 3vs 19.02.24 06:28 Сейчас в теме
А не взять ли товарищу Нуралиеву автора на полставочки архитектором платформы 1С?!
2. starik-2005 3096 19.02.24 07:14 Сейчас в теме
(1) нах-нах-нах. Я им в интернейшнл тестовое решал - меня до сих пор подтряхивает от их эйчеров)))

ЗЫ: и да, тут код мой плох - к утечкам памяти ведет он. Но знаю я, как боль сию унять, а вас я попрошу об этом подумать самостоятельно)))
3. Pavel_Vladivostok 58 19.02.24 08:38 Сейчас в теме
(2)
(1) нах-нах-нах. Я им в интернейшнл тестовое решал - меня до сих пор подтряхивает от их эйчеров)))

ЗЫ: и да, тут код мой плох - к утечкам памяти ведет он. Но знаю я, как боль сию унять, а вас я попрошу об этом подумать самостоятельно)))


Учитель йода плохо кончил, не стоит его пародировать, а статья хороша :)
4. starik-2005 3096 19.02.24 09:12 Сейчас в теме
(3) Вы просто товарища Шекспира не читали в переводе товарища Пастернака - магистр Йода нервно курит в углу ))) Хотя в современном мире что магистр, что бакалавр - оно такое )))
9. John_d 5911 19.02.24 12:30 Сейчас в теме
(3)
Учитель йода плохо кончил, не стоит его пародировать, а статья


Йода умирает в возрасте 900 лет и, наконец, полностью сливается с Силой.

Неплохую жизнь Йода прожил, да.)
13. stopa85 43 19.02.24 18:31 Сейчас в теме
(2) а если я попрошу вас написать компаненту для винды или даже для Андроид. Tcp клиент.

Хорошую компанену. Чтобы без утечек памяти и при дисконекте сама подключалась заново. Возьмётесь?

Понимаю вопрос денег есть. Но это ведь обсуждаемо)
14. starik-2005 3096 19.02.24 18:44 Сейчас в теме
(13) все обсуждаемо в этом мире.
5. Asmody 19.02.24 10:14 Сейчас в теме
Вот этими штуками
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t>

"плюсы" просто вымораживают! Ну как такое в 2024 году писать
6. starik-2005 3096 19.02.24 10:38 Сейчас в теме
(5) Просто шаблоны. Я их копипащу, так что не замечаю трудностей ))) Тут вообще все скопипащено )))
7. A1WEB 59 19.02.24 11:16 Сейчас в теме
Какие наработки у вас есть по отладке ВК?
8. starik-2005 3096 19.02.24 11:32 Сейчас в теме
(7) У меня никаких, но из вижуалстудио можно подоткнуться к dll-ке, запущенной из 1С. Но я, лично, предпочитаю отлаживать прототип без кода компоненты. Потом уже вставляю в компоненту и подтыкаю к 1С.
10. German 413 19.02.24 12:53 Сейчас в теме
А если несколько форм открыть каждая из них будет сервером?, что то дикое
11. starik-2005 3096 19.02.24 13:16 Сейчас в теме
(10) Лучше одну форм и несколько фоновых. Но, в принципе, для потоков тут вектор, в конец которого каждый новый поток добавляется. И если разместить их на разных портах (не только на 8080), то вполне должно работать.
12. sdf1979 206 19.02.24 17:01 Сейчас в теме
Круто! Хренак, хренак и в продакшн... Тупые разрабы в 1С никак не могут реализовать. Только в 8.3.26.
Только в платформе будет скорее всего под все ОС, которая она поддерживает, под все виды клиентов, в том числе и в веб-клиенте. Ну и работать будет не только в локальной сети.
15. user612295_death4321 20.02.24 06:42 Сейчас в теме
Видимо кросс-функциональное взаимодействие между программами становится все более популярнее. Не так давно решал кейс "По кнопке из внешней системы должен открыться АРМ в 1С", пошел примерно теми же путями, только используя по середине centrifugo, который принимает от внешней системы HTTP по API, а сообщения уже шлет через веб-сокет который поднят со стороны клиента 1С до centrifugo.
16. Viktor_Ermakov 371 20.02.24 09:26 Сейчас в теме
(15) а почему не воспользоваться типовыми механизмами платформы для этой задачи?
17. starik-2005 3096 20.02.24 14:36 Сейчас в теме
(16) А что за типовые механизмы?

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

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

Поэтому, когда Вы говорите "А", то следует говорить и "Б". Иначе сообщение воспринимается в негативном ключе, как отсылка к какому-то "всем известному" "типовому механизму", о котором все и понятия не имеют.
26. user612295_death4321 23.02.24 11:33 Сейчас в теме
(17) Предположу, что под "Типовыми" могла подразумеваться система взаимодействия.

Я действительно в своем комментарии не уточнил, что решал этот кейс на старой УПП в режиме совместимости 8.2.
Для современных систем такой кейс я решал как раз через СВ.
27. starik-2005 3096 23.02.24 13:29 Сейчас в теме
(26)
система взаимодействия
С учетом того, что она не бесплатная (50к за сервер), требует развернуть джаву и постгрес, то если у кого-то ее нет, написать ВК будет бесплатнее (ну сколько там в час 1С-нег получает? И не надо никому платить, чтобы он это все с джавой и постгресом поставил и обслуживал)
28. user612295_death4321 24.02.24 10:17 Сейчас в теме
(27)
С учетом того, что она не бесплатная (50к за сервер), требует развернуть джаву и постгрес, то если у кого-то ее нет, написать ВК будет бесплатнее (ну сколько там в час 1С-нег получает? И не надо никому платить, чтобы он это все с джавой и постгресом поставил и обслуживал)


Ну здесь ты правильно подмечаешь, что бизнес мыслит деньгами и вопросы "How much" встают в первую очередь, однако если попробовать посчитать, то:

1. В современных реалиях вижу очень мало 1Сников, которые хотят/могут/любой другой глагол выйти за рамки классического 1С, чтоб вот так взять и собрать компоненту.
2. Вопросы стабильности, как траблшутить проблему в кейсах нестабильной работы. Если бизнес-процесс является критический (основной генератор денег) как правило поднять надо все в максимально шустрые сроки.

Т.е в стоимость надо закладывать не только разработку, но и эксплуатацию и возможные бизнесовые потери, если сработает риск из п.2.

Здесь СВ мне видится более надежным вариантом (опять же не везде применимым), по следующим причинам:
1. Можно сказать, что это почти нативный компонент платформы, под нативностью подразумеваю встроенные классы в платформе, для взаимодействия с СВ, + в БСП за нас уже позаботились и дали пачку программных интерфейсов для быстрого старта.
2. Для КОРП лицензий, СВ входит в стоимость без дополнительных затрат в виде 50к.
3. В Enterprise сегменте развернуть сервер это обычное дело, по моей статистике у нас стабильно в неделю развертывается по 3-4 ВМ :)
4. Ну а самый сок, что СВ является таким же классическим компонентом экосистемы 1С Предприятие, а значит если что-то пойдет не так, я могу рассчитывать на реакцию со стороны моего РКЛ партнера с утвержденным SLA и я не останусь со своей проблемой сам с собой.

Я мыслил примерно такой логикой:
1. Если можно решить через СВ - решать через СВ.
2. Если через СВ решить нельзя, решить кейс через ВК.
3. Писать в какой то регистр сведений из внешней системы и ходить туда обработчиком ожидания раз в секунду - непозволительно и таким заниматься не стоит.
29. starik-2005 3096 11.03.24 11:27 Сейчас в теме
(28)
которые хотят/могут/любой другой глагол выйти за рамки классического 1С, чтоб вот так взять и собрать компоненту
Ща вот любят все литкоды всякие там про физбаз и такое разное. Так вот для физбаза с литкода надо моск напрягать, а для ВК на 1С - нет, бо все копипастится на 100%. А как собрать - ну гуглишь ошибку линковщика - три первых сцылки гарантированно отвечают на вопрос, чего там в строке компилятора не хватает.
ЗЫ: сдается мне, что развернуть СВ будет дороже, чем написать ВК. Даже с учетом того, что СВ типа "куплен" в рамках КОРП.
18. gybson 20.02.24 17:03 Сейчас в теме
За локалхост себя дергать это такое занятие, не везде приличное =)
19. starik-2005 3096 20.02.24 17:46 Сейчас в теме
20. stopa85 43 21.02.24 07:43 Сейчас в теме
(14) а как с Вами связаться?
21. starik-2005 3096 21.02.24 12:10 Сейчас в теме
22. stopa85 43 21.02.24 12:17 Сейчас в теме
(21) да что-то не отправляет вам сообщение. Пишет отложенная группа.
23. пользователь 21.02.24 14:21
Сообщение было скрыто модератором.
...
24. efin 22.02.24 01:28 Сейчас в теме
Я правильно понял, что ВК только под тонкого клиента на Linux x64?
То есть веб-клиенты в пролете?
25. starik-2005 3096 22.02.24 05:53 Сейчас в теме
(24) ВК для всего того, для чего Вы сможете ее собрать. В этом и соль.
30. efin 06.05.24 14:26 Сейчас в теме
(0) товарищи специалисты, я видел нативные ВК для 1С, написанные на С(++) и на Дельфи.
Кто-то может запилить шаблон на Go? Меня бы устроила ее работа на сервере 1С linux x64. Работа в тонком клиенте, или даже в веб-клиентах будет приятными бонусами.
Готов, по согласованию, профинансировать разработку, и отдать шаблон в массы бесплатно через гитхаб.
31. Diversus 2330 28.06.24 16:02 Сейчас в теме
Надо было выложить исходники. Я бы качнул и автора поблагодарил бы Sm
user1216897; +1 Ответить
32. starik-2005 3096 15.07.24 17:13 Сейчас в теме
(31)
исходники
Так они прям в статье. Сцылки все даны.
Оставьте свое сообщение