Какую внешнюю компоненту написать для 1С: обзор реальных задач и технологий разработки Native API

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка внешних компонент (ВК) для платформы «1С:Предприятие» — это отличный способ расширить стандартные возможности встроенного языка, обойти платформенные ограничения и интегрировать систему с низкоуровневым системным API или сторонним оборудованием. Часто разработчики, желающие освоить эту технологию, сталкиваются с творческим кризисом: базовые учебные примеры (вроде открытия дисковода или синтезатора речи) не имеют практической ценности, а для написания полноценных драйверов торгового оборудования нет физических устройств под рукой.

В этой статье мы подробно рассмотрим, какие реальные бизнес-задачи требуют создания внешних компонент, проанализируем современные технологии их разработки и разберем практические примеры реализации популярных функций, включая кроссплатформенную паузу выполнения кода.

Выбор технологии разработки: C++, Rust и современный C# с технологией NativeAOT

Прежде чем перейти к идеям, давайте определимся с технологическим стеком. Традиционно внешние компоненты писались либо как COM-объекты (привязанные к операционной системе Windows), либо по технологии Native API на языке C++. Однако сегодня экосистема разработки сильно шагнула вперед, и мы можем использовать более безопасные и современные инструменты.

C++ (Native API). Это классический, максимально производительный путь. Платформа 1С предоставляет готовый C++ SDK. Основной минус — сложность управления памятью, высокий порог входа и риск уронить весь рабочий процесс сервера «1С» (rphost) из-за одной некорректно обработанной ошибки или утечки памяти.

Rust и библиотека addin1c. Для тех, кто ценит скорость C++, но не хочет вручную управлять указателями и бороться с сегментацией памяти, идеальным выбором стал язык Rust. В сообществе разработчиков 1С активно развивается библиотека (крейт) addin1c. Она полностью автоматизирует экспорт стандартных функций Native API 1С, трансляцию типов данных и управление жизненным циклом объектов. Написание кроссплатформенной компоненты на Rust становится тривиальной задачей.

C# (Microsoft .NET) и NativeAOT. Долгое время считалось, что написать Native API компоненту на C# невозможно без тяжелой прослойки CLR. Но начиная с .NET 7/8/9 появилась технология NativeAOT (Ahead-Of-Time compilation). Мы можем скомпилировать код C# напрямую в нативную динамическую библиотеку (.dll под Windows или .so под Linux). Для этого достаточно добавить в файл проекта .csproj специальный тег:


<PropertyGroup>
    <PublishAot>true</PublishAot>
</PropertyGroup>

После этого мы можем экспортировать функции Native API, используя атрибут [UnmanagedCallersOnly], что позволяет писать быстрые, кроссплатформенные и легкие внешние компоненты на привычном C#.

ТОП-7 идей для разработки полезной внешней компоненты

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

  1. Кроссплатформенная пауза выполнения (метод Sleep).

    Во встроенном языке 1С отсутствует стандартный оператор или метод для приостановки выполнения потока на заданное количество миллисекунд. Написание маленькой компоненты с единственным методом Sleep — это лучший учебный проект («Hello World»), который гарантированно найдет применение в реальных задачах моделирования транзакций или ожидания завершения фоновых процессов.

  2. Сохранение табличных документов в многолистовую книгу Excel без установленного MS Office.

    Хотя в современных релизах платформы появились новые возможности работы с файлами, во многих тиражных решениях и на старых версиях (или в режиме совместимости) сохранение нескольких объектов ТабличныйДокумент в один файл Excel с разделением по листам остается проблемой. Использование COM-объекта Excel.Application медленно, нестабильно и не работает на серверах под управлением Linux. Нативная компонента, оборачивающая легкую C++ или Rust библиотеку для работы с форматом XLSX, решает эту проблему раз и навсегда.

  3. Асинхронная двусторонняя работа с COM-портами (RS232).

    Это классическая задача интеграции с различным нестандартным оборудованием: весами, датчиками, сканерами, промышленными контроллерами. Компонента должна уметь опрашивать любое количество портов в фоновом потоке и генерировать внешнее событие 1С (ВнешнееСобытие) при поступлении новых данных, передавая в параметрах имя вызвавшего порта.

  4. Продвинутая работа с ZIP-архивами.

    Стандартный объект 1С ЗаписьZipФайла не умеет добавлять новые файлы в уже существующий архив без его полного пересоздания. Написание обертки над популярными библиотеками сжатия (например, zlib или libzip) позволит реализовать инкрементное добавление файлов в архив, гибко управлять методами шифрования и степенью сжатия данных.

  5. Генерация и разбор PDF «на лету» без тяжелого софта на сервере.

    Часто на серверах Linux возникает необходимость извлечь изображения (например, сканы документов) из PDF-файла или собрать новый PDF-документ из набора картинок. Использование утилит командной строки через вызов системного приложения неэффективно по скорости. Внешняя компонента на базе библиотек libharu или PDF-Writer решит эту задачу непосредственно в оперативной памяти процесса.

  6. Универсальный WebSocket-клиент.

    Несмотря на то, что в версии платформы 8.3.27 появился встроенный WebSocket-клиент, огромное количество внедрений работает на более старых релизах платформы. Бесплатная, кроссплатформенная внешняя компонента для работы с WebSocket позволяет организовать real-time обмен сообщениями с чат-ботами, телефонией и брокерами сообщений без постоянного опроса базы данных.

  7. Авторизация по протоколу SRP (Secure Remote Password).

    Для интеграции с некоторыми защищенными веб-сервисами требуется авторизация по протоколу SRP. Этот протокол требует сложных математических вычислений с очень большими числами (криптография с большими простыми числами). Встроенный язык 1С не поддерживает вычисления длинной арифметики, поэтому внешняя компонента здесь незаменима.

Реализация функции паузы (Sleep) в 1С: сравнительный анализ решений

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

На практике часто встречаются следующие обходные пути без использования внешних компонент:

Вариант 1. Использование системной утилиты PING (кроссплатформенный вариант):


Процедура Пауза_Ping(Секунды)
    ЗапуститьПриложение("ping -w 1000 -n " + (Секунды + 1) + " 127.0.0.1", , Истина);
КонецПроцедуры

Этот метод плох тем, что порождает новый процесс в операционной системе, нагружает CPU и может быть заблокирован политиками безопасности или системным профилем при запуске в контексте фонового задания на сервере.

Вариант 2. Использование объекта WScript.Shell (только под Windows):


Процедура Пауза_WSH(Секунды)
    WSH = Новый COMОбъект("WScript.Shell");
    WSH.Run("TIMEOUT /T " + СокрЛП(Секунды) + " /NOBREAK", 0, Истина);
КонецПроцедуры

Этот способ не работает на серверах под управлением Linux и также требует создания внешнего процесса операционной системы.

Вариант 3. Идеальное решение — использование метода внешней компоненты:

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


#include <thread>
#include <chrono>

void SleepMs(long milliseconds) {
    std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds));
}

А во встроенном языке 1С работа с такой компонентой будет выглядеть изящно и безопасно:


&НаКлиенте
Процедура ВыполнитьДлительнуюОперацию()
    
    // Подключаем компоненту из макета
    Если ПодключитьВнешнююКомпоненту("ОбщийМакет.ПолезныеИнструменты", "Tools", ТипВнешнейКомпоненты.Native) Тогда
        Компонента = Новый("AddIn.Tools.SystemHelper");
        
        Для Итератор = 1 По 10 Цикл
            // Выполняем шаг алгоритма
            ОбработатьПорциюДанных(Итератор);
            
            // Приостанавливаем выполнение на 500 миллисекунд
            Компонента.Sleep(500); 
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Как подступиться к разработке: пошаговый план для начинающих

Разберем по шагам, с чего начать разработку своей первой внешней компоненты Native API:

  1. Определитесь с целевыми платформами. Выясните, где будет выполняться ваша компонента — на клиенте (Windows x86/x64) или на сервере (Linux x64). Это определит архитектуру сборки.
  2. Выберите язык программирования. Если вы только начинаете, попробуйте Rust с библиотекой addin1c. Это убережет вас от утечек памяти и падений сервера 1С. Если вы C#-разработчик — воспользуйтесь возможностями сборки NativeAOT в .NET 8.
  3. Создайте скелет проекта. За основу возьмите официальные шаблоны от фирмы «1С» или открытые шаблоны сообщества на GitHub. Компонента должна обязательно реализовывать интерфейс IComponentBase и экспортировать функции инициализации.
  4. Упакуйте готовую компоненту в ZIP-архив. Для удобного развертывания соберите библиотеки под все необходимые платформы (например, my_addon_win64.dll, my_addon_linux64.so) и создайте файл манифеста manifest.xml. Упакуйте всё в один ZIP-архив и загрузите его в общий макет конфигурации 1С.
  5. Протестируйте стабильность. Помните, что код внешней компоненты выполняется в адресном пространстве процесса 1С. Обязательно тестируйте обработку исключений, чтобы ошибки внутри ВК не приводили к аварийному завершению сеанса пользователя.

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

← На главную