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

13.05.22

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пишем внешнюю компоненту для 1С, NativeAPI на С++, для ОС Linux, с использованием Qt Creator.:
.zip 33,25Kb
8
8 Скачать (1 SM) Купить за 1 850 руб.

Аннотация

В статье рассмотрен процесс создания внешней компоненты для 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

См. также

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

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

2400 руб.

25.06.2024    1270    3    4    

3

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

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

3600 руб.

02.09.2010    77720    73    257    

191

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

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

4600 руб.

27.06.2023    3746    3    0    

5

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

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

2400 руб.

04.05.2018    47556    124    66    

67

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

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

1500 руб.

17.09.2018    36974    114    127    

115

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

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

14.01.2025    2533    bayselonarrend    14    

48

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

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

04.12.2024    5251    kovalevdmv    26    

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

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

Повторюсь, тематика, которую статья затрагивает, очень даже интересна сообществу. Я, например, просто такую статью писать не хочу - у меня нет реального кейса для применения ВК, т.к. я перешел на микросервисы и работу с аппаратурой я делегировал сервисам, поднятым на малинках и апельсинках, которые в 1С отдают данные через REST-API, о чем я как-то писал: https://infostart.ru/1c/articles/1543746/
6. user1779098 83 13.05.22 16:00 Сейчас в теме
2. A1WEB 59 13.05.22 15:23 Сейчас в теме
Спасибо, очень круто! Буду разбираться.
7. ltfriend 13.05.22 18:33 Сейчас в теме
Не совсем понял, для чего было использовать Qt.
12. user1779098 83 13.05.22 23:17 Сейчас в теме
(7)Для VS полно примеров, просто решил попробовать реализовать на Qt (имею право). Результат - мы с вами убедились, что да это возможно (с некоторыми ограничениями конечно, работаю над их обходом). Другой вопрос нужно ли это вам. Но к счастью вы не один и я думаю найдутся люди которым это понадобится. Денег я за эти исследования не беру, надеюсь проделанная мной работа вам может пригодится в будущем, и вы сэкономите кучу времени используя эти наработки. Спасибо за комментарий.
21. AndreyShitov 16.05.22 05:39 Сейчас в теме
(12) КМК, комментарий о том, что вы Qt и не используете, плюс никаких QtCreator специфичных вещей в статье нет, чтобы заострять внимание именно на нём. С тем же успехом читатель может в kwrite/gedit/vim/etc набрать этот код и скормить компилятору.
23. user1779098 83 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 236 13.05.22 20:57 Сейчас в теме
Несмотря на указанные выше недостатки всё равно поддержку автора плюсом. Библиотеку всё-таки надо помещать в lib или opt, в home ему не место.
10. user1779098 83 13.05.22 21:43 Сейчас в теме
(8)Спасибо, соглашусь с вами. Оставил в папке проекта чтобы показать нюансы регистрации в системе.
9. PerlAmutor 157 13.05.22 21:12 Сейчас в теме
Наконец то, что-то стоящее за долгое время. Побольше бы таких статей. Сам писать компоненты бросил из-за того, что API 1С не совместимо с MinGW и настоящей кроссплатформенности не получается.
11. user1779098 83 13.05.22 21:44 Сейчас в теме
13. starik-2005 3155 14.05.22 12:16 Сейчас в теме
(9) да, там проблема с заголовками для венды, но это решаемо, хоть и не совсем тривиально.
14. PerlAmutor 157 14.05.22 15:03 Сейчас в теме
(13) Там проблема в ABI (name mangles), иной работы исключений и внешних зависимых .dll файлах. Нельзя просто так взял и установить внешнюю компоненту, которая тянет за собой еще и ворох внешних .dll.
15. user1779098 83 14.05.22 15:25 Сейчас в теме
(14) Я делал проект под Linux использовал GCC 64. Если я правильно понимаю вы пытаетесь использовать MinGV - в нем могут возникнуть проблемы с пространствами имён namespace (легко решить, но тяжело разобраться), и из за Windows могут возникнуть проблемы с termio.h
19. starik-2005 3155 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 83 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 83 30.07.22 04:32 Сейчас в теме
(29)
виндовым GCC

не нужно использовать виндовый GCC. Базовая компонента создана компанией 1С в VS и прекрасно компилируется её компилятором (MSVC называется). Так же прекрасно экспортируются все функции, сам лично проверял. То что выложил я - адаптировано для GCC 64 и Linux
31. user1779098 83 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 39 07.10.22 09:39 Сейчас в теме
Ваш пример под последней Убунтой и в qt creator 4.11.1 не собирается, мешает как минимум
CONFIG += c++11
в ttyAddin.pro
ИМХО для variant нужно же с++17 ...
P.S. С этой правкой собирается, но 1с её подключить не может :(
33. sh00m 39 07.10.22 11:15 Сейчас в теме
(32) Может проблема в этом, но это варнинги, не ошибки (скрин прикрепил)
Прикрепленные файлы:
34. user887928 11.10.22 17:13 Сейчас в теме
Добрый день, компонента собирается для Linux замечательно, у меня есть необходимость создать аналогичную вещь для Windows 1С 8.3 (64 бита).
Поможите с базовым примером для QtCreator?
37. user1779098 83 05.11.22 07:29 Сейчас в теме
(34) Моя другая статья "Внешняя компонента для однофазных счётчиков Меркурий".
https://infostart.ru/public/1699962/
В ней на днях выложу исходник для Windows.
35. sh00m 39 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 39 15.10.22 08:41 Сейчас в теме
(35) Рано поднял кипишь, все работает, я просто напутал с компиляцией
Оставьте свое сообщение