Компилирование внешней компоненты AddInNative в ОС Linux

01.02.15

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

В статье отражены некоторые моменты, которые нужно учесть, чтобы скомпилировать пример 1С-вской внешней компоненты AddInNative в ОС Linux.

Решил посмотреть, как работает внешняя компонента для 1С в Linux-е, благо под рукой уже была настроенная виртуалка с Xubuntu и установленной там платформой 8.3.5.1383.

Скопировал в виртуалку с диска ИТС папку VNCOMP83/example/NativeAPI/, зашёл в эту папку, набрал команду "make" и:

$ make

In file included from AddInNative.cpp:15:0:
AddInNative.h:4:27: фатальная ошибка: ComponentBase.h: Нет такого файла или каталога
компиляция прервана.
make: *** [AddInNative.o] Ошибка 1

Посмотрел, где расположен файл ComponentBase.h - как оказалось, он (и ряд других заголовочных файлов) находится в папке VNCOMP83/include/.

Вывод 1: с диска ИТС нужно копировать 2 папки - VNCOMP83/example/NativeAPI/ и VNCOMP83/include/

Пробую скомпилировать ещё раз:

$ make

In file included from AddInNative.cpp:15:0:
AddInNative.h:73:5: ошибка: «HANDLE» не является именем типа
AddInNative.h:74:5: ошибка: «HANDLE» не является именем типа
...

make: *** [AddInNative.o] Ошибка 1

Действительно, в файле AddInNative.h в самом конце присутствуют следующие определения:

    HANDLE              m_hTimer;
    HANDLE              m_hTimerQueue;

Linux про тип HANDLE ничего не знает. Смотрю где используются m_hTimer и m_hTimerQueue - они используются в файле AddInNative.cpp - один раз в CAddInNative::CAddInNative(), ещё один раз в CAddInNative::Done() и, наконец, в CAddInNative::CallAsProc(...) в ветках "case eMethStartTimer" и "case eMethStopTimer". Причём в последней процедуре код, связанный с этими переменными, выделен как Windows-специфичный (#ifndef __linux__ ... #endif). Отсюда можно сделать вывод, что в других местах разработчики просто забыли выделить код с помощью директив. Сделаем это самостоятельно.

В AddInNative.h меняю:

    HANDLE              m_hTimer;
    HANDLE              m_hTimerQueue;

на

#ifndef __linux__
    HANDLE              m_hTimer;
    HANDLE              m_hTimerQueue;
#endif

В AddInNative.cpp меняю:

CAddInNative::CAddInNative()
{
    m_iMemory = 0;
    m_iConnect = 0;
    m_hTimerQueue = 0;
}

на

CAddInNative::CAddInNative()
{
    m_iMemory = 0;
    m_iConnect = 0;
#ifndef __linux__
    m_hTimerQueue = 0;
#endif
}

после чего

void CAddInNative::Done()
{
    if(m_hTimerQueue )
    {
        DeleteTimerQueue(m_hTimerQueue);
        m_hTimerQueue = 0;
    }
}

меняю на

void CAddInNative::Done()
{
#ifndef __linux__
    if(m_hTimerQueue )
    {
        DeleteTimerQueue(m_hTimerQueue);
        m_hTimerQueue = 0;
    }
#endif
}

Как вариант, можно просто закомментировать "linux-неугодный" код, но тогда исходники перестанут компилироваться под Windows.

Вывод 2: перед компилированием нужно убрать Windows-специфичный код из исходников.

Очередная попытка:

$ make

...

AddInNative.cpp:438:49: ошибка: нет подходящей функции для вызова «IMsgBox::Alert(const wchar_t [3])»
...

make: *** [AddInNative.o] Ошибка 1

Тут уже даже разбираться не хочется, поэтому просто в файле AddInNative.cpp в функции CAddInNative::CallAsProc() комментирую строки:

//                        if (succeed)
//                            imsgbox->Alert(L"OK");
//                        else
//                            imsgbox->Alert(L"Cancel");

Вывод 3: перед компилированием нужно убрать ещё кое-какой код.

И ещё раз:

$ CXXFLAGS="-D __linux__" make

...

g++ -MM -D __linux__ -I../include -m32 -finput-charset=WINDOWS-1251 -fPIC AddInNative.cpp >  AddInNative.d
g++ -c  -D __linux__ -I../include -m32 -finput-charset=WINDOWS-1251 -fPIC dllmain.cpp -o dllmain.o
g++ -MM -D __linux__ -I../include -m32 -finput-charset=WINDOWS-1251 -fPIC dllmain.cpp >  dllmain.d
g++ -c  -D __linux__ -I../include -m32 -finput-charset=WINDOWS-1251 -fPIC stdafx.cpp -o stdafx.o
g++ -MM -D __linux__ -I../include -m32 -finput-charset=WINDOWS-1251 -fPIC stdafx.cpp >  stdafx.d
g++ -D __linux__ -I../include -m32 -finput-charset=WINDOWS-1251 -fPIC -shared AddInNative.o dllmain.o stdafx.o -o AddInNative.so -lpthread

Аллилуйя!!! Наконец-то, в каталоге появился долгожданный AddInNative.so!!!

Теперь попробую подключить эту внешнюю компоненту. Создаю новую внешнюю обработку, добавляю на форму команду Команда1 и пишу обработчик:

&НаСервере
Процедура Команда1НаСервере()

	Ок = ПодключитьВнешнююКомпоненту("/путь/к/файлу/внешней/компонеты/AddInNative.so", "AddInNative", ТипВнешнейКомпоненты.Native);
	Если НЕ Ок Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Ошибка подключения ВК!";
		Сообщение.Сообщить();
		Возврат;
	КонецЕсли;

	ОбъектВК = Новый("AddIn.AddInNative.AddInNativeExtension");
	ДвДанные = ОбъектВК.ЗагрузитьКартинку("/usr/share/backgrounds/space-01.jpg");
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "Прочитано байт: " + ДвДанные.Размер();
	Сообщение.Сообщить();

КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)

	Команда1НаСервере();

КонецПроцедуры

И она таки вертится:

См. также

Разработка внешних компонент 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    54131    9    69    

46

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

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

2400 руб.

25.06.2024    1177    3    4    

3

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

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

2400 руб.

04.05.2018    47404    124    66    

67

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

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

4600 руб.

27.06.2023    3660    3    0    

5

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

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

3600 руб.

02.09.2010    77571    72    257    

191

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

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

3000 руб.

12.05.2020    28783    138    100    

91

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

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

14.01.2025    2273    bayselonarrend    14    

48

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

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

04.12.2024    4922    kovalevdmv    26    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. jobkostya1c_ERP 100 15.01.15 08:09 Сейчас в теме
Хоть и стороняя эта тема по разработке внешних компонент да еще в линуксе поставлю плюс.
3. webester 26 17.01.15 11:53 Сейчас в теме
(1)Очень ценное и нужное замечание, держите нас в курсе. Весь инфостарт испереживался, я сам как на иголках, нервы на пределе, обновляю страницу, каждые 15секунд, Внимание! Опасный момент! И да! Да дорогие друзья, kostyaomsk таки поставил плюс и оставил об этом комментарий. Как мы все долго этого ждали, этого бесполезного никому не нужного комментария "поставил +". И вот он наконец то! Спасибо тебе kostyaomsk за твой флуд ради флуда.
14. jaroslav.h 180 23.01.15 10:11 Сейчас в теме
(1) kostyaomsk, сколько вам можно писать "ХВАТИТЬ ПИСАТЬ, ПОЧТИ В КАЖДОМ СООБЩЕНИИ СВОЕЙ БЕЗПОЛЕЗНЫЙ КОММЕНТАРИЙ?????!!!!!", вы по другому не умете зарабатывать $m? Взрослый мужик, а хитрун еще тот. Стыдно!
AlexanderKai; +1 Ответить
15. q_i 584 23.01.15 17:44 Сейчас в теме
(14) myr4ik07, во-первых, беСполезный, а во-вторых, для выяснения отношений есть ЛС, форум, обращение к модераторам и т.п.
Это касается и (3)
Надеюсь на Ваше понимание.
17. webester 26 25.01.15 13:55 Сейчас в теме
(15)А че ему можно писать че попало, а мне нельзя?
А че это вы тут указываете, если:
для выяснения отношений есть ЛС, форум, обращение к модераторам и т.п.
я предлагаю вам воспользоваться вашим же советом.
2. caponid 16.01.15 10:09 Сейчас в теме
4. Yagodka.Andrey 19.01.15 14:33 Сейчас в теме
За статью спасибо, камрад.
Сейчас компоненты забросил, но... чем черт не шутит )
5. q_i 584 19.01.15 17:30 Сейчас в теме
(4) Yagodka.Andrey, если будет интерес - можно будет попробовать скооперироваться.
И вообще, если у кого-нибудь есть какая-нибудь практическая задача - пишите - может что-нибудь сделаем. А то сейчас у меня весь интерес чисто академический (единственный клиент с линуксовым сервером перешёл на винду ещё год назад). ))
6. vslimv 20.01.15 10:57 Сейчас в теме
(5) Давно мечтаю о telnet'e на сервере. Правда в ВК дуб)
Но очень радостно, что подобные технологии развиваются, а то в моем окружении никто не решился на com в лине)
7. q_i 584 20.01.15 12:58 Сейчас в теме
(6) vslimv, ну на com в лине не решился даже microsoft ))
А какую задачу хочется решить с помощь telnet'а на сервере?
10. servs 66 21.01.15 12:33 Сейчас в теме
(7) например для управления Asterisk используя AMI, нужен клиент telnet.
Есть ROM-Asterisk-Native, но там закрытый код.
11. q_i 584 21.01.15 13:14 Сейчас в теме
(10) servs, я Пастернака не читал с Astetisk-ом не работал, но судя по http://xgu.ru/wiki/AMI там можно обойтись или встроенным телнет клиентом в связке с expect, или написать что надо на python (благо, биндинги, судя по всему, есть). А запускать опять же банально через ЗапуститьПриложение().
Если есть конкретная задача, можем посмотреть варианты решения.
13. vslimv 22.01.15 13:06 Сейчас в теме
(11)
встроенным телнет клиентом в связке с expect

Немного не понял))
ЗапуститьПриложение() не канает. Нужно слушать события по telnet'у, причем желательно асинхронное поступление событий в 1с.
Хотя может я просто Вас не понял)
16. q_i 584 23.01.15 17:46 Сейчас в теме
(13) vslimv, это скорее я не понял. Т.е. нужно открыть сокет, слушать его, а полученные данные передавать в 1С? Так? А кто и что будет в этот сокет писать/читать с другой стороны (со стороны клиента)?
18. vslimv 26.01.15 07:47 Сейчас в теме
(16) Все именно так.Со стороны сервера asterisk висит AMI(Asterisk Manager API). Будет отсылать тебе после авторизации, все события в текстовом виде. Более подробно о нем и на русском тут .
Со стороны клиента ВК и события из нее)
В общем задача ее принимать текст из 1С и отправлять в AMI и наоборот из AMI в 1С. Сама ничего уметь не должна, разве что отправлять в 1С ошибку при подключении к сокету, если таковая имеется.
12. vslimv 22.01.15 13:01 Сейчас в теме
(10) servs, ROM-Asterisk-Native насколько я знаю виндовый, а для линукса есть только у мико(далеко не бесплатно+куча **рни в подарок)+ она работает через богопротивный AJAM.
8. pumbaE 20.01.15 13:22 Сейчас в теме
sleep, добавь sleep
регулярки
поддрежку webcosket , дабы можно было-бы в тонком клиенте прогресс бар нарисовать.
rabbitmq
9. q_i 584 20.01.15 19:24 Сейчас в теме
(8) pumbaE,
sleep:
ЗапуститьПриложение("sleep 5", , Истина);

Регулярки аналогично через perl/grep.

Вообще, есть мысль написать статью про вызов линуксовых команд из 1С. В простейшем варианте через ЗапуститьПриложение() с перенаправлением stdout во временный файл с последующим разгребанием этого файла средствами 1С. Но хочется ещё реализовать компоненту для работы без временного файла, т.е. вызывается команда и её stdout читается прямо в строку 1С (возможная опция - запись в stdin). В примитивном варианте это можно сделать в компоненте через popen(), в более продвинутом через pipe()/fork()/exec(). Собственно, и статья родилась когда решил попробовать реализовать эту простенькую задачку и начал компилить сырцы 1с. Впрочем, popen() чего-то не захотел тогда работать (fread() сразу же возвращал 0, а feof(), соответственно, 1).

WebSocket и RabbitMQ - а что с ними делать? )))
19. q_i 584 16.02.15 20:02 Сейчас в теме
Проблема с Alert-ами заключалась в том, что в в include/AddInDefBase.h в прототипе метода ожидается WCHAR_T* (строка 2-хбайтовых символов), а передаётся wchar_t* (строка 4-хбайтовых символов; L"OK" - это 4-хбайтовые символы):
virtual bool ADDIN_API Alert(const WCHAR_T* text)

Поэтому нужно поменять
if (succeed)
    imsgbox->Alert(L"OK");
else
    imsgbox->Alert(L"Cancel");

на
WCHAR_T *msg = NULL;
if (succeed)
    ::convToShortWchar(&msg, L"OK");
else
    ::convToShortWchar(&msg, L"Cancel");
imsgbox->Alert(msg);
delete[] msg;
minimajack; +1 Ответить
20. michael512 24.01.20 09:48 Сейчас в теме
Скудновато. Где можно нарыть литературы и примеров по программированию NativeAPI внешней компоненты в формате Linux (выходной файл по-моему должен быть .so) ? Причина, скорый перевод офиса на импортозамещающие ПО, а конкретно на Astra Linux
21. q_i 584 25.01.20 00:43 Сейчас в теме
(20) Я знаю только один источник информации по этой теме - ИТС. Кстати, они (фирма 1С) по-моему собрались с силами и облагородили исходники.
А что Вам за компоненты нужно будет писать, если конечно это не военная (или иная очень охраняемая) тайна? Просто сейчас вроде в тренде web-сервисы, rest-интерфейсы и прочая смузня.
22. michael512 25.01.20 13:43 Сейчас в теме
(21)
А что Вам за компоненты нужно будет писать, если конечно это не военная (или иная очень охраняемая) тайна? Просто сейчас вроде в тренде web-сервисы, rest-интерфейсы и прочая смузня.
компонента связи через adb планшета на андроид, проще говоря, перекидывание файлов туда-сюда, установка/удаление приложения и т.п. Андроид-приложение нативное
Оставьте свое сообщение