К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как написать компоненту для 1С

Как написать внешнюю компоненту для 1С по технологии Native API: подготовка среды, структура проекта на C++, регистрация методов, подключение в конфигурации и типичные ошибки.

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

Прежде чем писать собственную компоненту, проверьте, действительно ли она нужна. Многие задачи решаются штатными средствами: HTTP-запросами, COM-объектами, веб-сервисами, расширениями конфигурации или внешними обработками. Компонента оправдана, когда нужна высокая производительность, прямой доступ к драйверу устройства или вызов готовой нативной библиотеки. Ошибка на этапе выбора технологии оборачивается неделями лишней работы и проблемами с сопровождением.

Ниже разобран полный цикл: от подготовки среды разработки до подключения готовой компоненты в конфигурации и проверки её работы. Материал ориентирован на разработчика, знакомого со встроенным языком 1С и базовыми навыками C++.

Что такое внешняя компонента и когда она нужна

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

Типичные сценарии применения: работа со сканерами штрихкодов, ККТ и другим торговым оборудованием, криптографические операции, распознавание изображений, интеграция с нестандартным оборудованием, ускорение расчётов. Если задача решается штатными средствами платформы за приемлемое время — компонента не нужна.

Подготовка среды разработки

Для работы потребуется комплект разработки внешних компонент — он доступен на портале 1С в разделе загрузок и содержит заголовочные файлы, документацию и пример шаблона проекта. Дополнительно нужен компилятор C++: Visual Studio под Windows, GCC или Clang под Linux. Удобно сразу настроить CMake, чтобы собирать библиотеку под несколько платформ из одного проекта.

Проверьте разрядность целевой платформы. 64-разрядный клиент 1С загружает только 64-разрядную библиотеку, 32-разрядный — соответственно 32-разрядную. Если в компании используются оба варианта, компоненту нужно собрать в двух версиях и упаковать их в один архив с правильными именами файлов.

Порядок подготовки
  1. 1
    Скачайте комплект разработки внешних компонент с портала 1С
  2. 2
    Установите компилятор C++ и CMake
  3. 3
    Скопируйте шаблонный проект в рабочий каталог
  4. 4
    Соберите шаблон без изменений и убедитесь, что он компилируется
  5. 5
    Подключите собранную тестовую библиотеку в пустой базе 1С

Структура проекта компоненты

Шаблонный проект состоит из нескольких обязательных частей. Точка входа — функция GetClassObjectFactory, через которую платформа получает фабрику классов. Класс компоненты наследует базовый класс из комплекта и переопределяет методы регистрации: RegisterExtensionAs (имя компоненты), RegisterPropAs (свойства), RegisterMethodAs (методы), а также обработчики вызовов CallAsProc и CallAsFunc.

Имя, заданное в RegisterExtensionAs, — это то имя, под которым объект будет создан в коде 1С через конструктор Новый("AddIn.ИмяКомпоненты"). Выбирайте короткое уникальное имя латиницей: при конфликте имён двух компонент в одной информационной базе возникнут ошибки подключения.

cpp
long CMyComponent::RegisterExtensionAs(WCHAR_T** wsExtensionName)
{
    const wchar_t* wsExtension = L"MyComponent";
    return convToShortWchar(wsExtensionName, wsExtension);
}

Реализация методов и свойств

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

Свойства реализуются через пары методов Get/Set по индексу свойства. Для обмена большими объёмами данных удобно передавать строки (например, XML или JSON) или двоичные данные — это проще и надёжнее, чем многочисленные вызовы отдельных методов.

Сборка и упаковка компоненты

После компиляции библиотеки упаковываются в ZIP-архив с манифестом manifest.xml. В манифесте перечисляются файлы для каждой платформы и разрядности: Windows x86, Windows x64, Linux и другие. Платформа при подключении сама выбирает подходящий файл из архива, поэтому ошибки в манифесте проявляются как «компонента не найдена» на части рабочих мест.

Готовый архив загружается в конфигурацию как макет с типом «Двоичные данные» — обычно в общие макеты. Это позволяет хранить компоненту внутри информационной базы и разворачивать её на любых рабочих местах без ручного копирования файлов.

Подключение компоненты в конфигурации

Подключение выполняется кодом: сначала УстановитьВнешнююКомпоненту с указанием местоположения макета, затем ПодключитьВнешнююКомпоненту, после чего объект создаётся конструктором Новый("AddIn.ИмяКомпоненты"). Для тонкого и веб-клиента код нужно оборачивать в асинхронные вызовы — синхронные методы там недоступны.

bsl
НачатьУстановкуВнешнейКомпоненты(, "ОбщийМакет.МояКомпонента");
Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.МояКомпонента", "MyComp", ТипВнешнейКомпоненты.Native);
Если Подключено Тогда
    Компонента = Новый("AddIn.MyComp.MyComponent");
КонецЕсли;

После подключения проверьте работу каждого метода на граничных значениях: пустые строки, нули, большие объёмы данных. Полезно вывести версию компоненты отдельным методом — это упрощает диагностику, когда на разных рабочих местах оказываются разные сборки.

Контрольные точки

Как проверить результат

Подключение компоненты
Норма

Метод ПодключитьВнешнююКомпоненту возвращает Истина

Тревожный признак

Возвращает Ложь или возникает исключение — проверьте манифест и разрядность

Вызов методов
Норма

Методы выполняются и возвращают ожидаемые значения

Тревожный признак

Аварийное завершение клиента — ошибка работы с памятью в коде компоненты

Работа на всех рабочих местах
Норма

Компонента подключается на клиентах с разной разрядностью и ОС

Тревожный признак

На части мест компонента не найдена — в архиве нет нужной сборки

Типичные ошибки и их устранение

Самая частая проблема — несовпадение разрядности библиотеки и клиента. Вторая по распространённости — ошибки в manifest.xml: неверные имена файлов или отсутствие нужной платформы. Третья группа ошибок связана с памятью: утечки и обращения к освобождённым буферам проявляются не сразу, а при длительной работе, поэтому тестируйте компоненту под нагрузкой в цикле.

Типичные ошибки
01
Сборка только под одну разрядность — компонента не загружается на части рабочих мест
02
Неправильный manifest.xml — платформа сообщает, что компонента не найдена
03
Освобождение памяти платформы через delete — аварийное завершение клиентского приложения
04
Отсутствие проверки типов параметров — непредсказуемое поведение при вызове из кода 1С
05
Синхронное подключение в тонком клиенте — код падает с ошибкой, нужен асинхронный вызов
Итог

Что важно запомнить

Компонента пишется на C++ по шаблону Native API, собирается под все нужные платформы и разрядности, упаковывается с манифестом в ZIP и подключается из макета конфигурации. Критичны корректная работа с памятью, проверка типов параметров и тестирование на копии базы перед внедрением.

Частые вопросы

Можно ли написать компоненту не на C++?

Технология Native API рассчитана на C++. Существуют обёртки и альтернативные подходы (например, COM-компоненты на .NET для Windows), но они ограничивают кроссплатформенность и поддерживаются хуже. Для новых разработок рекомендуется именно Native API.

Чем внешняя компонента отличается от внешней обработки?

Внешняя обработка — это код на встроенном языке 1С, который выполняется внутри платформы и не требует компиляции. Компонента — нативная библиотека на C++, дающая доступ к возможностям операционной системы и сторонним библиотекам, недоступным из встроенного языка.

Работает ли компонента в веб-клиенте?

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

Как отладить компоненту?

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

Можно ли обновить компоненту без перезапуска сеансов?

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

Что делать, если компонента конфликтует с другой компонентой?

Конфликты возникают при совпадении имён, заданных в RegisterExtensionAs. Переименуйте свою компоненту, добавив уникальный префикс (например, по названию организации), пересоберите и обновите вызовы в коде конфигурации.