Пишем внешнюю компоненту для 1С, NativeAPI на С++, для ОС Linux, с использованием Qt Creator

13.05.22

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

В статье рассмотрен процесс создания внешней компоненты для 1С в среде Qt Creator для операционной системы Linux (ubuntu, debian, mint и им подобных). На примере компоненты для сбора данных от внешней аппаратуры и сохранение их в базе, посредством 1С. В качестве внешней аппаратуры в данном примере будем использовать Arduino UNO.

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

Наименование Файл Версия Размер
Пишем внешнюю компоненту для 1С, NativeAPI на С++, для ОС Linux, с использованием Qt Creator.:
.zip 33,25Kb
7
.zip 33,25Kb 7 Скачать

Аннотация

В статье рассмотрен процесс создания внешней компоненты для 1С в среде Qt Creator для операционной системы Linux (ubuntu, debian, mint и им подобных). На примере компоненты для сбора данных от внешней аппаратуры и сохранение их в базе, посредством 1С. В качестве внешней аппаратуры в данном примере будем использовать Arduino UNO.

 

Для создания внешней компоненты понадобятся

  1. Материал «Технология создания внешних компонент», на странице 1С:ИТС

  2. Шаблон пустой внешней компоненты.

  3. Qt Creator. Я использовал версию 6.0.2.

 

Шаблон компоненты

В операционной системе Linux 1С поддерживает внешние компоненты созданные при помощи технологии Native API, технологии COM поддерживаются только в ОС Windows потому, что создавались специально под эту операционную систему ввиду её популярности в своё время. Поэтому мы будем пользоваться заранее написанном на С++ и реализованном в рамках технологии Native API шаблоне.

С описанием методов которые должны быть реализованы во внешней компоненте можно ознакомится на сайте 1С:ИТС.

За основу я взял кастомный шаблон с ресурса Github

Ссылка на шаблон компоненты https://github.com/Infactum/addin-template

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

 

Начало пути

Запускаем Qt Creator и создаём новый проект — библиотека С++

 

 

Выбираем путь размещения нашей библиотеки и систему сборки qmake. Далее в папку с проектом нашей библиотеки ложим содержимое папки src шаблона внешней компоненты, в результате там будут файлы Component.cpp, Component.h, dllmain.cpp, exports.cpp, stdafx.h и созданные автоматически имя_класса.cpp, имя_класса.h, имя_класса_global.h (у меня это ttyAddin_global.h, ttyAddin.h, ttyAddin.cpp). И в любое удобное место папку include (с файлами AddInDefBase.h, com.h, ComponentBase.h, IandroidComponentHelper.h, ImemoryManager.h, types.h) я её расположил в папке с проектом.

В *.pro файле, у меня это ttyAddin.pro необходимо указать путь к файлам в папке include путём добавления строки.

INCLUDEPATH +="/home/delphin/ProjectQt/estern_lib2/include/"

Так же можно библиотечные файлы из папки include добавить в папку с проектом и прописать в HEADERS и SOURCES соответственно их имена, но этот путь более долог.

 

Далее в файлы ttyAddin.h, ttyAddin.cpp добавляем наш код. Сам класс ttyAddin необходимо проунаследовать от шаблонного класса Component.

 

Первоначально эти файлы будут выглядеть так:

ttyAddin.h

#ifndef TTYADDIN_H
#define TTYADDIN_H
#include "ttyAddin_global.h"
#include "Component.h"
// C library headers
#include <iostream>

class TTYADDIN_EXPORT TtyAddin : public Component
{
public:
    const char *Version = u8"1.0.0";    //присутствует в шаблоне версия нашего класса
    explicit TtyAddin();
    std::string extensionName() override;   //наименование класса
private:
    std::shared_ptr<variant_t> sample_property; 
};
#endif // TTYADDIN_H

 

ttyAddin.cpp

#include "ttyaddin.h"
std::string TtyAddin::extensionName() { // наименование нашего класса которое будет передано в 1с
    return "TTY"; // необходимо указать своё.
}
TtyAddin::TtyAddin()
{
    // Universal property. Could store any supported by native api type.    //присутствует в шаблоне
    sample_property = std::make_shared<variant_t>();
    AddProperty(L"SampleProperty", L"ОбразецСвойства", sample_property);
    // Full featured property registration example      //присутствует в шаблоне
    AddProperty(L"Version", L"ВерсияКомпоненты", [&]() {
        auto s = std::string(Version);
        return std::make_shared<variant_t>(std::move(s));
    });

Также необходимо внести изменения в файле exports.cpp

 

 

После перечисленных действий необходимо собрать проект и произвести компиляцию с целью получения файла динамической библиотеки (*.so) в режиме Debug или Release. В Linux динамические библиотеки имею расширение *.so (в Windows всем привычный*.dll).

ВАЖНО: Чтобы эту библиотеку могли использовать программы необходимо выполнить следующие действия. Добавить нашу директорию с библиотекой в список известных директорий для чего подредактировать файл /etc/ld.so.conf. Например, у меня этот файл состоит из таких строк:

include /etc/ld.so.conf.d/*.conf
/home/delphin/.cache/fontconfig/
/home/delphin/.cache/gstreamer-1.0/

Во всех этих директориях хранятся всеми используемые библиотеки. В этом списке нет лишь одной директории - /lib, которая сама по себе не нуждается в описании, так как она является главной. Получается, что наша библиотека станет "заметной", если поместить ее в один их этих каталогов, либо отдельно описать в отдельном каталоге.

Необходимо в конец этого файла (ld.so.conf) добавить путь к папке с нашей библиотекой.

include /etc/ld.so.conf.d/*.conf
/home/delphin/.cache/fontconfig/
/home/delphin/.cache/gstreamer-1.0/
/home/delph/ProjectQt/estern_lib2/build-ttyAddin-Desktop_Qt_6_3_0_GCC_64bit-Release/

Сохраняем, закрываем. Чтобы система перечитала настройки заново, необходимо в терминале выполнить
команду
ldconfig.

 

Интеграция с 1С

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

 

&НаКлиенте

Перем Компонента, ПутьКБиблиотеке;

&НаКлиенте

Процедура Подключить(Команда) //обработчик созданной команды (кнопки)

ПутьКБиблиотеке="/home/delphin/ProjectQt/estern_lib2/build-ttyAddin-Desktop_Qt_6_3_0_GCC_64bit-Release/libttyAddin.so";

РезультатПодключения = ПодключитьВнешнююКомпоненту(ПутьКБиблиотеке, "libextDLib", ТипВнешнейКомпоненты.Native);

Сообщить ("Компонента подключена - " + РезультатПодключения );

Попытка

Компонента = новый ("AddIn.libextDLib.TTY");

Сообщить ("Компонента создана");

Исключение

Сообщить ("неудалось создать компоненту");

КонецПопытки;

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

 

В настройках конфигурации необходимо установить «запуск в режиме Толстого клиента», так как для упрощения кода мы всё написали на клиенте.

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

 

 

Реализация необходимых методов. (функций компоненты)

Поскольку мы ставили перед собой задачу прикрутить к 1С последовательный порт для получения данных от различных устройств через интерфейсы rs-232, rs-422, rs-485, то соответственно в нашем классе мы будем реализовывать методы для работы с последовательным портом. В качестве инструмента я выбрал стандартную Си библиотеку termios.h

Почему не QserialPort:

1. Мы пишем пример под Linux (кросплатформенность не критична).

2. termios.h более быстрая и тратит меньше ресурсов.

3. В динамической библиотеке нельзя использовать цикл событий, и соответственно невозможно использовать сигналы и слоты (даже используя отдельные потоки, пробовал не получилось) всё это сводит плюсы Qt на нет.

4. Используя termios.h можно реализовать самые экзотические настройки и режимы работы порта (например подключить старый советский принтер Robotron).

Для этого нам необходимо реализовать методы «Подключения порта», «Настройки порта», «Отключения порта», «Передачи данных», «Приёма данных». Подключение и настройку я реализовал одним методом ConnectPort, отключение методом DisconnectPort, чтение и запись методами -ReadPort и SendToPort. Так же для передачи данных в 1С я использовал стандартную функцию ExternalEvent для чего переопределил методы ExternalEvent, CleanEventBuffer, GetEventBufferDepth

 

ttyAddin.h

#ifndef TTYADDIN_H
#define TTYADDIN_H
#include "ttyAddin_global.h"
#include "Component.h"
// C library headers
#include <iostream>
#include <string>
// Linux headers
#include <fcntl.h>   // Contains file controls like O_RDWR
#include <errno.h>   // Error integer and strerror() function
#include <termios.h> // Contains POSIX terminal control definitions
#include <unistd.h>  // write(), read(), close()
class TTYADDIN_EXPORT TtyAddin : public Component
{
public:
    const char *Version = u8"1.0.0";    //присутствует в шаблоне версия нашего класса
    explicit TtyAddin();
    variant_t ConnectPort (const variant_t &, const variant_t &);// объявление метода инициализации порта и подключение к нему
    void DisconnectPort(void);  //объявление метода отключения от порта
    void ReadPort ();           //объявление метода чтения буфера порта
    void SendToPort (const variant_t &);    //объявление метода отправки строки в порт
    std::string extensionName() override;   //наименование класса
private:
    //переопределяем проунаследованные методы
    bool ExternalEvent(const std::string &, const std::string &, const std::string &);
    bool SetEventBufferDepth(long);
    long GetEventBufferDepth();
    int serial_port;     //переменная для хранения дескриптора порта
    struct termios tty;  //структура данных настроек порта
    char read_buf [256]; //буфер временного хранения принятых данных
    //std::string str;
    std::string PortNameStr;//хранение пути к порту
    std::shared_ptr<variant_t> sample_property; //наименование нашего класса которое будет передано в 1с
};
#endif // TTYADDIN_H

 

ttyAddin.cpp

#include "ttyaddin.h"
std::string TtyAddin::extensionName() { // наименование нашего класса которое будет передано в 1с
    return "TTY";
}
TtyAddin::TtyAddin()
{
    // Universal property. Could store any supported by native api type.    //присутствует в шаблоне
    sample_property = std::make_shared<variant_t>();
    AddProperty(L"SampleProperty", L"ОбразецСвойства", sample_property);
    // Full featured property registration example      //присутствует в шаблоне
    AddProperty(L"Version", L"ВерсияКомпоненты", [&]() {
        auto s = std::string(Version);
        return std::make_shared<variant_t>(std::move(s));
    });
    //Регистрация методов
    //Указываются названия методов которые мы будем использовать в 1С и связанные с ними методы класса
    AddMethod(L"Сonnect", L"ПодключитьПорт", this, &TtyAddin::ConnectPort);
    AddMethod(L"Disconnect", L"ОтключитьПорт", this, &TtyAddin::DisconnectPort);
    AddMethod(L"Read", L"ЧитатьПорт", this, &TtyAddin::ReadPort);
    AddMethod(L"Send", L"ОтправитьВПорт", this, &TtyAddin::SendToPort);
}
// определение метода инициализации порта и подключение к нему
// принимает строку пути к файлу порта и скорость порта (число)
// в случае успеха возвращает истину
variant_t TtyAddin::ConnectPort (const variant_t & serialPortName, const variant_t & Baud)
{   variant_t res = false;
    //проверка операндов на соответствие типов
    if (std::holds_alternative<std::string>(serialPortName) && (std::holds_alternative<int32_t>(Baud)))
    {  res = true;
       PortNameStr = std::get<std::string>(serialPortName); //помещаем путь к порту в строку пример "/dev/ttyACM0"
       const char *PortName=PortNameStr.c_str();    // преобразуем в строку в стиле Си (массив char) и сохраняем указатель на нее
       serial_port = open(PortName, O_RDWR); //открываем указанный порт для чтения и записи  (только для чтения O_RDONLY)
       if (serial_port < 0) {
           throw std::runtime_error(u8"указанный порт отсутствует в системе");  //если открыть порт не удалось
       }
       switch (static_cast<int>(std::get<int32_t>(Baud)))   // в соответствии с указанной скоростью устанавливаем скорость порта
        {
            case 1200:cfsetspeed(&tty, B1200);
                      break;
            case 2400:cfsetspeed(&tty, B2400);
                      break;
            case 4800:cfsetspeed(&tty, B4800);
                      break;
            case 9600:cfsetspeed(&tty, B9600);
                      break;
            case 19200:cfsetspeed(&tty, B19200);
                      break;
            default: res = false;
                      throw std::runtime_error(u8"значение скорости недопустимо");
                      break;
        }
       // вводим основные настройки
       tty.c_cflag &= ~PARENB; // без паритета
       tty.c_cflag &= ~CSTOPB; // 1 стоп бит
       tty.c_cflag |= CS8;     // 8 бит
       tty.c_cflag &= ~CRTSCTS; // без RTS/CTS аппаратного управления потоком
       //сохраняем настройки
       if (tcsetattr(serial_port, TCSANOW, &tty) != 0)
       {  throw std::runtime_error(u8"невозможно сохранить настройки порта");
       }
       memset(&read_buf, '\0', sizeof(read_buf));//инициализируем буфер
       TtyAddin::SetEventBufferDepth(10);  //устанавливаем размер очереди событий в 1с  функция описана в 1С:ИТС
    }
    else{  res = false;
           throw std::runtime_error(u8"метод serialSetting - неподдерживаемые типы данных");} //если имя порта не строка, а скорость не число
    return res;
}
//определение метода отключения от порта
void TtyAddin::DisconnectPort(void) //Отключаем порт
{   close(serial_port); }
//определение метода чтения буфера порта
void TtyAddin::ReadPort ()
{   tcflush(serial_port,TCIOFLUSH); // чистим буфер порта от мусора перед чтением
    sleep(1);                       // ждём (секунды)
    int num_bytes = read(serial_port, &read_buf[0], sizeof(read_buf)); //читаем буфер порта
    if (num_bytes <= 0) //если -1 ошибка 0 буфер пуст
    {
        throw std::runtime_error(u8"данные в порт не поступают");
    }
    else {   ExternalEvent(extensionName(), PortNameStr, static_cast<std::string>(read_buf));} // вывод в 1с через внешнее событие
}
//определение метода отправки строки в порт
void TtyAddin::SendToPort (const variant_t & data)
{   if (std::holds_alternative<std::string>(data))  //проверяем соответствие типа введённых данных
    {   std::string dataString = std::get<std::string>(data); //преобразуем в строку
        const char * msg = dataString.c_str();      //и  переводим ее в строку в стиле си
          write(serial_port, msg, sizeof(msg));     // отправляем
    }
    else {   throw std::runtime_error(u8"метод serialSetting - неподдерживаемые типы данных");}
}
//переопределяем проунаследованные методы
bool TtyAddin::ExternalEvent(const std::string &src, const std::string &msg, const std::string &data)
{   return Component::ExternalEvent( src, msg, data);}
bool TtyAddin::SetEventBufferDepth(long depth)
{   return Component::SetEventBufferDepth(depth);}
long TtyAddin::GetEventBufferDepth()
{   return Component::GetEventBufferDepth();}

 

Собираем проект, компилируем.

 

Внешнее устройство (Arduino UNO)

Arduino будет получать команду (определённый символ), и в соответствии с командой давать ответ — строку символов с номером ответа.

Прошивка для ардуино.

char inChar;

int counter;



void setup() {

  Serial.begin(9600);

}

void loop() {

  if (Serial.available()) {

  inChar = Serial.read();

  delay(100);

  if(inChar=='e')

  {

    Serial.print("UNO received: ");

    Serial.print(inChar);

    Serial.print(" №");

    Serial.println(++counter);

  }

 }

}

 

в модуль в 1 С добавляем код

(файл порта может называться ttyUSB0 или ttyACM0 где 0 номер если таких подключено несколько)

&НаКлиенте

Перем Компонента, ПутьКБиблиотеке;

&НаКлиенте

Процедура Подключить(Команда)

  ПутьКБиблиотеке="/home/delphin/ProjectQt/estern_lib2/build-ttyAddin-Desktop_Qt_6_3_0_GCC_64bit-Release/libttyAddin.so";

  РезультатПодключения = ПодключитьВнешнююКомпоненту(ПутьКБиблиотеке, "libextDLib", ТипВнешнейКомпоненты.Native);

  Сообщить ("Компонента подключена - " + РезультатПодключения );

 Попытка

  Компонента = новый ("AddIn.libextDLib.TTY");

  Сообщить ("Компонента создана");

 Исключение

  Сообщить ("неудалось создать компоненту");

 КонецПопытки;

 Попытка

  Компонента.ПодключитьПорт ("/dev/ttyACM0", 9600); //указан путь к файлу порта. в ОС (папка dev, файл ttyACM0)

  Сообщить ("Порт подключен");

 Исключение

  Сообщить ("неудалось подключить порт");

 КонецПопытки;

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



&НаКлиенте

  Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

  Компонента.ОтключитьПорт();

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



&НаКлиенте

Процедура Получить(Команда)

  Компонента.ОтправитьВПорт("e");

  Компонента.ЧитатьПорт();

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

Сохраняем конфигурацию, подключаем прошитую ардуину, запускаем конфигурацию и проверяем. При нажатии на кнопку подключить подключаемся к порту, при нажатии читать получаем строку из ардуины.

 

 

Ну вот и всё. в данном примере мы открываем порт для чтения и записи отправляём туда букву 'е', в свою очередь ардуинка если получена буква 'е' формирует и отправляет строку (ответ).

Область возможного применения

 1. Сбор и документирование данных со счётчиков электроэнергии посредством rs-485, rs-422.

 2. Сбор и документирование данных со станков с ЧПУ посредством выше указанных интерфейсов.

 3. Сбор и документирование данных с маршрутных контроллеров и систем диагностики авто.

 4. И любая подобная задача.

Тестировалось на платформе 1С:Предприятие 8.3 (8.3.20.1789) ОС Linux Mint, Ubuntu.

Native API внешняя компонента Linux Arduino serial port Qt

См. также

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

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

43

Внешняя компонента для сканирования (замена 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    26364    132    99    

84

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

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

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

2400 руб.

04.05.2018    45090    117    66    

61

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

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

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

1500 руб.

17.09.2018    35189    104    127    

111

Мастер создания внешних компонент 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    54048    35    14    

68

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

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

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

2400 руб.

22.06.2016    30870    4    4    

8

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

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

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

19.02.2024    4138    starik-2005    28    

53

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

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

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

26.01.2024    4883    starik-2005    32    

39
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. starik-2005 3036 13.05.22 14:40 Сейчас в теме
Статью читать предельно трудно, на мой взгляд. Помимо того, что код плохо отформатирован, так он еще и отдельными малосвязанными кусками выложен. Не совсем ясно, как скомпилировать библиотеку. Не ясно, зачем прописывать путь к библиотеке в /etc/..., если потом к этой компоненте будет полный путь. Или это нужно только для компиляции? Также не совсем ясно, чем сложнее использовать какой-нить vscode для ровно того же самого?

Да, статья, наверное, будет полезна тем, кто пытается разобраться с разработкой внешних компонент, но подача материала запутывает. Автор больше бы заработало, если бы выложил это, как статью без платного файла, добавив больше содержания и структурировав материал. При том куча внешних совершенно кроссплатформенных (включая андройды) компонентов лежат на гите, собрать которые можно легким нажатием пары кнопарей.
Treaqq; user1703622; +2 1 Ответить
3. user1779098 80 13.05.22 15:38 Сейчас в теме
(1) если не прописать путь в /etc/..., то ОС не разрешит пользоваться этой библиотекой. Это Linux. Попробуйте не прописывать может и получится, но вот я с этим помучился. По поводу форматирования - старался сэкономить место. Спасибо за замечания, со следующей их учту.
20. AndreyShitov 16.05.22 05:29 Сейчас в теме
(3) Странно видеть мистификации "ОС не разрешит" от автора статьи по разработке библиотеки под эту самую ОС. В ld.so.conf всего-лишь указаны директории, где динамический линковщик будет искать файлы библиотек, не более.

1С и из своей директории как-то загружает, а ссылок на неё нет в /etc/ld.so.conf, и внешние компоненты подключаемые клиентом загружает не имея доступа на запись в /etc/ld.so.conf. Так что никаких "это Linux" здесь быть не может, здесь "я не разобрался". А за /home/<что угодно> в /etc/ld.so.conf вообще руки отрывать надо. В системе уже есть каталоги, где должны лежать файлы динамически подключаемых библиотек.

Из статьи абзац
ВАЖНО: Чтобы эту библиотеку могли использовать программы необходимо выполнить следующие действия
лучше убрать - это мало того, что неправда, так ещё и вредный совет.

И если боритесь за экономию места, во второй половине статьи двойной межстрочный интервал в блоках с кодом тоже не нужен, в первой половине статьи этой проблемы же нет.
22. user1779098 80 16.05.22 11:53 Сейчас в теме
В ld.so.conf всего-лишь указаны директории, где динамический линковщик будет искать файлы библиотек, не более - всё правильно. Так же там написано не 1С, а программы. Хотя замечание правильное и я с ним полностью согласен теоретически могут возникнуть случаи когда линковщику необходимо указать этот путь. Например у меня на более старом Mint, 1C (для обучения программированию) сама эту библиотеку не нашла. По поводу компоновки кода согласен и уже отвечал, что в следующий раз это учту. Спасибо за комментарий.
24. Infactum 315 17.05.22 09:13 Сейчас в теме
(22) Механизм поиска "библиотеки" для загрузки опредялется RPATH. Чтобы искать в том же каталоге, как например платформа делает, см. в сторону $ORIGIN
https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/RPATH-handling
4. user1779098 80 13.05.22 15:42 Сейчас в теме
(1)Ну а по поводу платности файла - я на сайте недавно и не нашёл способа выложить его полностью бесплатно. Объясните мне как это сделать. Могу его вам скинуть в личку.
5. starik-2005 3036 13.05.22 15:52 Сейчас в теме
(4) ну мне файл ни к чему - на гите десятки и компонет, и шаблонов.
Суть: если выкладываете файл, то получаете за скачивание, а если оформляете, как статью, то получаете 10 стартманей за публикацию + 30 за 50 "звезд" + 20 за 100 "звезд". Т.е. 60 стартманей за сотню звезд, которые вполне бы могла набрать Ваша статья, будь она грамотно оформлена. А файл - лучше ссылку на гит прикреплять, ну или исчерпывающе в статье писать о том, что надо сделать - тогда и файла будет не нужно.

Повторюсь, тематика, которую статья затрагивает, очень даже интересна сообществу. Я, например, просто такую статью писать не хочу - у меня нет реального кейса для применения ВК, т.к. я перешел на микросервисы и работу с аппаратурой я делегировал сервисам, поднятым на малинках и апельсинках, которые в 1С отдают данные через REST-API, о чем я как-то писал: https://infostart.ru/1c/articles/1543746/
6. user1779098 80 13.05.22 16:00 Сейчас в теме
2. morin 58 13.05.22 15:23 Сейчас в теме
Спасибо, очень круто! Буду разбираться.
7. ltfriend 961 13.05.22 18:33 Сейчас в теме
Не совсем понял, для чего было использовать Qt.
12. user1779098 80 13.05.22 23:17 Сейчас в теме
(7)Для VS полно примеров, просто решил попробовать реализовать на Qt (имею право). Результат - мы с вами убедились, что да это возможно (с некоторыми ограничениями конечно, работаю над их обходом). Другой вопрос нужно ли это вам. Но к счастью вы не один и я думаю найдутся люди которым это понадобится. Денег я за эти исследования не беру, надеюсь проделанная мной работа вам может пригодится в будущем, и вы сэкономите кучу времени используя эти наработки. Спасибо за комментарий.
21. AndreyShitov 16.05.22 05:39 Сейчас в теме
(12) КМК, комментарий о том, что вы Qt и не используете, плюс никаких QtCreator специфичных вещей в статье нет, чтобы заострять внимание именно на нём. С тем же успехом читатель может в kwrite/gedit/vim/etc набрать этот код и скормить компилятору.
23. user1779098 80 16.05.22 12:01 Сейчас в теме
(21)Qt использовал как редактор. С библиотеками от Qt могут возникнуть проблемы например на AstraLinux, где они отсутствуют, а с доустановкой например в закрытых учрежденьях могут возникнуть проблемы. Код спокойно компилируется и без Qt. От Qt только qmake.
25. AndreyShitov 17.05.22 12:40 Сейчас в теме
(23) Вы путаете сущности. QtCreator ≠ Qt. Вы сейчас сказали что-то вроде ".NET использовал как редактор", вместо "использовал Visual Studio". Qt - набор библиотек. QtCreator - на этих библиотеках написанная IDE.
8. cdiamond 233 13.05.22 20:57 Сейчас в теме
Несмотря на указанные выше недостатки всё равно поддержку автора плюсом. Библиотеку всё-таки надо помещать в lib или opt, в home ему не место.
10. user1779098 80 13.05.22 21:43 Сейчас в теме
(8)Спасибо, соглашусь с вами. Оставил в папке проекта чтобы показать нюансы регистрации в системе.
9. PerlAmutor 129 13.05.22 21:12 Сейчас в теме
Наконец то, что-то стоящее за долгое время. Побольше бы таких статей. Сам писать компоненты бросил из-за того, что API 1С не совместимо с MinGW и настоящей кроссплатформенности не получается.
11. user1779098 80 13.05.22 21:44 Сейчас в теме
13. starik-2005 3036 14.05.22 12:16 Сейчас в теме
(9) да, там проблема с заголовками для венды, но это решаемо, хоть и не совсем тривиально.
14. PerlAmutor 129 14.05.22 15:03 Сейчас в теме
(13) Там проблема в ABI (name mangles), иной работы исключений и внешних зависимых .dll файлах. Нельзя просто так взял и установить внешнюю компоненту, которая тянет за собой еще и ворох внешних .dll.
15. user1779098 80 14.05.22 15:25 Сейчас в теме
(14) Я делал проект под Linux использовал GCC 64. Если я правильно понимаю вы пытаетесь использовать MinGV - в нем могут возникнуть проблемы с пространствами имён namespace (легко решить, но тяжело разобраться), и из за Windows могут возникнуть проблемы с termio.h
19. starik-2005 3036 14.05.22 21:38 Сейчас в теме
(15) не, он пытается под линухом для венды откомпилить dll, а это вообще не просто ни разу - там есть def-файл в комплекте, но cl.exe делает либу, указывая индексы на описанные в def-файле имена, а MinGW этого не делает. Если я вообще правильно понял. Но и cl.exe требует соответствующего ключа для линковщика.
27. vxer 29.07.22 14:10 Сейчас в теме
(19) А вообще в принципе возможна кроссплатформенная сборка со всеми танцами с бубнами? Или это будут два принципиально разных проекта под каждую платформу?
26. vxer 29.07.22 14:07 Сейчас в теме
(15) Допустим, можно решить проблему termio.h, она вхдит в MSYS2. Какие могут конкретно возникнуть проблемы с namespac'ами, если собирать компоненту под MSYS2 под Windows?
28. user1779098 80 29.07.22 15:54 Сейчас в теме
termio.h только под Linux. Для Windows - windows.h. Реализация методов подключения к порту, чтения порта и отключения будут другими. При чём отличия достаточно большие.
29. vxer 29.07.22 18:06 Сейчас в теме
(28) Я ж не спрашиваю про termio.h. Я уже констатирую факт, что оно собралось, но под Windows имена экспортируемых функций из DLL, собранных виндовым GCC имеют вид _ZN7MyAddIn13extensionNameB5cxx11Ev, чего 1С явно ожидать от DLL-ки не будет, может в Linux её такое и удовлетворит, не знаю. Если библиотеки компилятора ещё и можно статически прилинковать в DLL, то вот уже библиотеку msys-2.0.dll статически прилинковать не получится, а в ней как раз и есть реализация termio. Вопрос лишь в том можно ли собрать всё же компоненту именно MinGW-w64 под Windows?
Прикрепленные файлы:
30. user1779098 80 30.07.22 04:32 Сейчас в теме
(29)
виндовым GCC

не нужно использовать виндовый GCC. Базовая компонента создана компанией 1С в VS и прекрасно компилируется её компилятором (MSVC называется). Так же прекрасно экспортируются все функции, сам лично проверял. То что выложил я - адаптировано для GCC 64 и Linux
31. user1779098 80 30.07.22 04:45 Сейчас в теме
(29)
имена экспортируемых функций и


(29) Я полагаю надо разобраться с кодировкой. В библиотеке используются широкие символы с длинной в 2 байта. Может по этой причине их названия искажены
17. пользователь 14.05.22 15:30
Сообщение было скрыто модератором.
...
18. пользователь 14.05.22 15:39
Сообщение было скрыто модератором.
...
16. пользователь 14.05.22 15:27
Сообщение было скрыто модератором.
...
32. sh00m 46 07.10.22 09:39 Сейчас в теме
Ваш пример под последней Убунтой и в qt creator 4.11.1 не собирается, мешает как минимум
CONFIG += c++11
в ttyAddin.pro
ИМХО для variant нужно же с++17 ...
P.S. С этой правкой собирается, но 1с её подключить не может :(
33. sh00m 46 07.10.22 11:15 Сейчас в теме
(32) Может проблема в этом, но это варнинги, не ошибки (скрин прикрепил)
Прикрепленные файлы:
34. user887928 11.10.22 17:13 Сейчас в теме
Добрый день, компонента собирается для Linux замечательно, у меня есть необходимость создать аналогичную вещь для Windows 1С 8.3 (64 бита).
Поможите с базовым примером для QtCreator?
37. user1779098 80 05.11.22 07:29 Сейчас в теме
(34) Моя другая статья "Внешняя компонента для однофазных счётчиков Меркурий".
https://infostart.ru/public/1699962/
В ней на днях выложу исходник для Windows.
35. sh00m 46 13.10.22 05:48 Сейчас в теме
Есть подозрение, что использованный шаблон не работает начиная примерно с 8.3.21 ... почему: https://github.com/Infactum/addin-template/issues
Собирается всё замечательно и без ошибок, но вот в 1С:Предприятие 8.3 (8.3.22.1603) он не подключается с ошибкой "Тип не определен (AddIn.SampleAddIn.Sample)" - я пробовал работать напрямую с оригиналом использованного шаблона на который ссылается автор - https://github.com/Infactum/addin-template собирал сначала в 22-й убунте, потом в виртуалке с чистым 11-м дебианом, в QT-Creator и в CLion, - результат один: собирается без ошибок, но в 1С 8.3.22.1603 собранная so-библиотека не подключается!
36. sh00m 46 15.10.22 08:41 Сейчас в теме
(35) Рано поднял кипишь, все работает, я просто напутал с компиляцией
Оставьте свое сообщение