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

Публикация № 1658262 13.05.22

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

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

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

Аннотация

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

Скачать файлы

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

.zip 33,25Kb
5
.zip 33,25Kb 5 Скачать

Специальные предложения

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

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

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

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

См. также

GGraphics - внешняя компонента для работы с картинками jpg (jpeg), png, bmp, gif, tif

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

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

3600 руб.

02.09.2010    72522    71    253    

187

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

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

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

2400 руб.

12.05.2020    21326    110    84    

68

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

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

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

1500 руб.

17.09.2018    31547    95    121    

102

Внешняя компонента WebSocket для 1С (c поддержкой Authorization token bearer)

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

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

4440 руб.

22.06.2020    13611    9    26    

14

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

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

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

1200 руб.

04.05.2018    41274    104    64    

55

Разработка внешней компоненты по технологии Native API. Мониторинг файловой системы в 1С

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

Пример разработки внешней компоненты по технологии Native API для мониторинга выбранной папки файловой системы (изменение, переименование, удаление) файлов.

1 стартмани

12.03.2023    5121    4    binx    3    

45

Конвертор из PDF

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

Native компонента для рендеринга PDF в картинки, и (или) извлечения текста из PDF файлов.

2 стартмани

25.01.2023    3015    22    bmk74    11    

23

Внешняя компонента для подключения 1С к однофазным электросчетчикам Меркурий

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

Внешняя компонента выполнена по технологии Native API для 1С 8.3, и предназначена для сбора и документирования данных от однофазных счетчиков Меркурий 200, 201, 203 (кроме Меркурий 203.2TD), 206 Посредством интерфейсов RS-485, CAN.

1 стартмани

11.08.2022    3577    6    user1779098    4    

11

Делаем табло в обозревателе из 1Ски с нуля за полчаса. Без бутстрапов, реактов и ангуляров. Жизнетрюки от kuzkov.info

Разработка внешних компонент WEB-интеграция Платформа 1С v8.3 Абонемент ($m)

На Инфостарте много разработок, которые предназначены для отображения в обозревателе данных на связи из 1С. С разными способами подключения, на разных технологиях. Есть платные, есть бесплатные. В данной публикации я хочу показать, как можно сделать сопряжение 1С обозреватель своими 1Сными силами с базовыми навыками верстки с нуля за полчаса и бесплатно.

1 стартмани

02.05.2022    9700    127    Steelvan    0    

67

Внешняя компонента - универсальный, надежный перехватчик клавиатурных событий

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

Перехват нажатия клавиш в 1С реализован с привязкой к фокусу формы. Если форма (или главное окно процесса 1С) теряет фокус, то перехват перестает работать. Чтобы решить эту проблему, была разработана соответствующая внешняя компонента.

1 стартмани

29.11.2021    8745    20    Prometeus2011    14    

36

Внешняя компонента для мобильного приложения

Разработка внешних компонент Мобильная разработка Мобильная платформа Россия Абонемент ($m)

Внешняя компонента для дополнения мобильной платформы некоторыми функциями.

1 стартмани

02.11.2021    8940    28    Prometeus2011    45    

37

Распознавание речи в мобильном приложении 1С на Android

Мобильная разработка Разработка внешних компонент Мобильная платформа Абонемент ($m)

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

1 стартмани

15.07.2021    10082    9    salexdv    6    

36

Звуковое управление в 1С 8.3

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

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    10434    velemir    36    

81

Внешняя компонента: Android tools

Мобильная разработка Разработка внешних компонент Платформа 1С v8.3 Мобильная платформа Абонемент ($m)

Несколько дополнительных функций для мобильного приложения\клиента под Android. Размер архива внешних компонент под архитектуры ARM и x86 - 390KB.

1 стартмани

12.01.2021    14297    39    KAV2    46    

16

GraphViz1С: внешняя компонента 1С Native API для построения графов

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

Внешняя компонента Native API для Windows с исходными кодами на C++ для построения графов посредством библиотеки GraphViz. Граф строится на основании текстового описания в формате dot. Реализован экспорт в большинство графических форматов. Поддерживаются версии платформы от 8.3.14 и выше до 8.3.18.

22.12.2020    10841    214    kandr    15    

66

Использование встроенного сканера ТСД на Android в мобильном клиенте и мобильном приложении (драйвер сканера Android для 1С)

Разработка внешних компонент Мобильная разработка Платформа 1С v8.3 Абонемент ($m)

Используя данный драйвер, можно без единой строки кода, просто установив на ТСД мобильный клиент 1С, сразу начать подбирать товары в документах вашей учётной системы. А, адаптировав нужные формы под небольшой размер экрана ТСД, можно просто создать полноценное рабочее место для выполнения операций с помощью ТСД, не прибегая к стороннему софту. Если же на складе плохая связь (или её нет вовсе), то можно использовать возможности мобильного клиента в автономном режиме (потребуется доработка вашей конфигурации). Драйвер также можно использовать и для Android приложения на мобильной платформе. В результате чего можно обойтись без ненужных полей ввода и клавиатуры «на пол-экрана».

3 стартмани

09.10.2020    53154    378    ltfriend    221    

107

Мониторинг учетных записей пользователей Windows Server 2008/2012

Разработка внешних компонент Информационная безопасность Россия Абонемент ($m)

Программа позволяет отслеживать журнал событий безопасности действий над учетными записями пользователей (удаление, создание, блокировка, смена пароля и т.д.), и отправлять на E-mail уведомление системному администратору в случае изменения конфигурации пользователей Windows Server.

3 стартмани

10.09.2020    6891    0    ClickUp    0    

2

Внешняя компонента на C# для парсинга страниц через Phantom JS на сервере 1С х32,х64

Инструментарий разработчика Разработка внешних компонент WEB-интеграция Мессенджеры и боты Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

PhantomJS - это браузер без окна, используемый для автоматизации взаимодействия с веб-страницами. PhantomJS предоставляет JavaScript API, обеспечивающий автоматическую навигацию, снимки страницы, эмуляции поведение пользователя, что делает его распространенным инструментом, используемым для запуска модульных тестов на основе браузера в автономной системе, такой как среда непрерывной интеграции . PhantomJS основан на WebKit, что делает его похожей на Safari и Google Chrome средой просмотра. Это программное обеспечение с открытым исходным кодом, выпущенное под лицензией BSD.

1 стартмани

06.08.2020    12233    8    DrZombi    7    

22

Внешняя компонента Native API для управления окнами и буфером обмена, получения снимков окон Windows и Linux

Разработка внешних компонент Управляемые формы Россия Абонемент ($m)

Внешняя компонента Native API для Windows и Linux с исходными кодами на C++. Возможности компоненты: получение списка окон и списка процессов, управление размерами и положением окна, снимок окон и снимок экрана, доступ к данным буфера обмена, взаимодействие по протоколу WebSocket.

2 стартмани

16.04.2020    12157    24    kandr    13    

30

Android Java и NativAPI C++ внешняя компонента для широковещательных сообщений (отправка и прием). Подключаем сканер ШК и клавиатуру к "1С мобильное приложение"

Оптовая торговля Розничная торговля Сканер штрих-кода Разработка внешних компонент Мобильная разработка Мобильная платформа Оптовая торговля, дистрибуция, логистика Абонемент ($m)

Подключаем сканер ШК и клавиатуру к "1С мобильное приложение", на терминале сбора данных "ATOL Smart.Lite android 7.0". Работаем с буфером обмена. В архиве к теме; 1. исходник компоненты (папка package готовый zip); 2. исходник "AccessibilityService" для перехвата клавиатуры (папка package готовый apk); 3. cf - тестовая конфигурация

1 стартмани

15.04.2020    18598    105    SanyMaga    102    

20

Конвертация PDF в 1С

Разработка внешних компонент Абонемент ($m)

COM-компонента для работы с PDF (32/64 bit)

4 стартмани

31.03.2020    32638    157    SerVer1C    143    

77

Получение фото с веб-камеры

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

Получение фото с веб-камеры без ActiveX. Внешняя компонента по технологии Native API.

1 стартмани

25.03.2020    21267    190    berezdetsky    51    

27

Быстрая печать этикеток (ZPL, EPL, TSPL, EZPL, GEPL, TSPL-EZ)

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

Качественная и быстрая печать на внутреннем языке принтеров этикеток.

4 стартмани

02.02.2020    22992    80    Johny_v    20    

35

Сканирование по TWAIN в 1С (обычные и управляемые формы)

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

Обработка показывает пример, как можно в 1С проводить сканирование с помощью компоненты TWAIN.

3 стартмани

03.01.2020    15541    50    Denr83    0    

20

Маленькая и скромная мобильная внешняя компонента

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

Изваять простенькую мобильную компоненту на 1С для android не так-то просто. Посему назло отдельным супостатам, не желающим делится исходниками, представляю весь свой скромный труд на публичный суд.

1 стартмани

21.10.2019    21687    18    ripreal1    34    

67

Native внешняя компонента для оповещения по UDP или TCP

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

Native внешняя компонента для оповещения по UDP или TCP, которая реализует возможность в 1С передавать сообщения с сервера на клиента. Исходный код компоненты также представлен.

1 стартмани

06.10.2019    23117    50    vdv2701    40    

48

PinkRabbitMQ - Native API компонента 1С с открытым исходным кодом, для обмена сообщениями через RabbitMQ

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

PinkRabbitMQ представляет собой Native API компоненту для 1С Предприятия 8 (Windows 32bit и 64bit) с открытым исходным кодом на с++ (можно собрать компоненту самостоятельно). PinkRabbitMQ это низкоуровневая компонента которая реализует обмен по протоколу AMQP с брокером сообщений RabbitMQ. Для организации высокоуровнего обмена между информационными базами предназначен Адаптер. Компонента разрабатывается в рамках проекта Адаптер.

29.07.2019    39073    1856    Begemoth80    255    

206

Компонента для 1С, принимающая вес с железнодорожных, автомобильных, крановых весов

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

Программа "Компонента приёма веса для 1С, версия 3.0" позволяет принимать и заносить вес с весов непосредственно в программу "1С" - то есть, прием веса осуществляется целиком и полностью из программы "1С".

26400 руб.

09.04.2019    14809    2    8    

5

Внешние компоненты мобильной платформы 1С для ОС Андроид

Разработка внешних компонент Мобильная разработка Мобильная платформа Бесплатно (free)

На трех простых примерах описана процедура разработки внешних компонент для Андроид. Статья написана по мотивам доклада на конференции INFOSTART 2018 EDUCATION.

31.01.2019    23245    IgorKissil    29    

80

Эмулятор ККМ по стандарту ФФД 1.1

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

Эмулятор драйвера ККМ по стандарту ФФД 1.1 предназначен для использования всех возможностей программы, при отсутствии физической кассы. Подойдет как программистам при разработке интерфейса РМК, например, так и пользователям для тестирования возможностей программы.

1 стартмани

30.12.2018    38273    188    Matveymc    31    

28

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

Разработка внешних компонент Абонемент ($m)

Создание внешней компоненты по технологии Com "с нуля", используя ассемблер goAsm.

1 стартмани

26.11.2018    12199    chessman    42    

137

WebSocket Клиент / Сервер. Внешний компонент

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

Реализация протокола WebSocket. Клиентская часть для взаимодействия с внешними сервисами. Серверная часть для организации собственного сервера, принимающего клиентские соединения в многопоточном режиме. Возможно взаимодействие RabbitMQ Slack Asterisk и другие

1 стартмани

16.11.2018    34230    166    nomadon    74    

32

Внешняя компонента для выполнения регулярных выражений

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

Внешняя Native API компонента для выполнения регулярных выражений на платформе 1С:Предприятие 8. Написана на C++. Используется движок PCRE2 версии 10.36 (до версии 13, использовался boost::regex v 1.69). Версия синтаксиса Perl Compatible Regular Expressions.

1 стартмани

12.11.2018    24312    62    KAV2    121    

82

TextRadar - компонента нечеткого поиска

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

Компонента предназначена для организации нечеткого поиска в текстовых данных, решения задач сопоставления списков и т.д. Вычисляемый коэффициент релевантности (похожести) - нормированный, лежит в диапазоне между 0 и 1. В случае необходимости (опционально) формируются данные для отображения найденных фрагментов. Расчет коэффициентов происходит в многопоточном режиме (на уровне компоненты). Для 32 и 64 разрядных систем.

19.09.2018    31450    42    TSSV    19    

19

Класс-обработка “Работа с картами Яндекс”

Разработка внешних компонент WEB-интеграция Платформа 1С v8.3 Абонемент ($m)

Как показать точку или маршрут на карте Яндекс. Как получить координаты по строке адреса (геокодирование).

1 стартмани

01.08.2018    45737    307    RSConsulting    21    

74

Распознавание лиц (off-line). Демонстрационная база.

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

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

1 стартмани

17.07.2018    25112    84    nomadon    45    

117