Пишем внешнюю компоненту для 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

См. также

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

46

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

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

2400 руб.

04.05.2018    46873    122    66    

66

Разработка внешних компонент Программист Платформа 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    28322    138    100    

90

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

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

2400 руб.

25.06.2024    918    2    3    

2

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

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

4600 руб.

27.06.2023    3431    2    0    

4

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

Внешняя компонента в виде библиотеки (.dll файл), позволяющая посылать команды и получать ответы по протоколу WebSocket из 1С. Компонента работает только на стороне "клиента".

4440 руб.

22.06.2020    18184    18    33    

22

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

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

1500 руб.

17.09.2018    36525    113    127    

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

Да, статья, наверное, будет полезна тем, кто пытается разобраться с разработкой внешних компонент, но подача материала запутывает. Автор больше бы заработало, если бы выложил это, как статью без платного файла, добавив больше содержания и структурировав материал. При том куча внешних совершенно кроссплатформенных (включая андройды) компонентов лежат на гите, собрать которые можно легким нажатием пары кнопарей.
Treaqq; nameless2987; +2 1 Ответить
3. user1779098 81 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 81 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 81 13.05.22 15:42 Сейчас в теме
(1)Ну а по поводу платности файла - я на сайте недавно и не нашёл способа выложить его полностью бесплатно. Объясните мне как это сделать. Могу его вам скинуть в личку.
5. starik-2005 3090 13.05.22 15:52 Сейчас в теме
(4) ну мне файл ни к чему - на гите десятки и компонет, и шаблонов.
Суть: если выкладываете файл, то получаете за скачивание, а если оформляете, как статью, то получаете 10 стартманей за публикацию + 30 за 50 "звезд" + 20 за 100 "звезд". Т.е. 60 стартманей за сотню звезд, которые вполне бы могла набрать Ваша статья, будь она грамотно оформлена. А файл - лучше ссылку на гит прикреплять, ну или исчерпывающе в статье писать о том, что надо сделать - тогда и файла будет не нужно.

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

не нужно использовать виндовый GCC. Базовая компонента создана компанией 1С в VS и прекрасно компилируется её компилятором (MSVC называется). Так же прекрасно экспортируются все функции, сам лично проверял. То что выложил я - адаптировано для GCC 64 и Linux
31. user1779098 81 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 81 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) Рано поднял кипишь, все работает, я просто напутал с компиляцией
Оставьте свое сообщение