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

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

Как создать COM-объект в 1С: подключение и примеры кода

Как создать COM-объект в 1С: синтаксис Новый COMОбъект, подключение к базе через V83.COMConnector, работа с Excel, типичные ошибки и способы их устранения.

COM-объекты в 1С позволяют платформе взаимодействовать с внешними приложениями и другими базами 1С через технологию Component Object Model от Microsoft. С помощью COM-подключения можно обмениваться данными между базами, выгружать отчёты в Excel, обращаться к Word, Outlook и любым программам, которые регистрируют COM-интерфейс в операционной системе.

Для создания COM-объекта во встроенном языке 1С используется конструкция Новый COMОбъект("Имя.Класса"). В качестве имени указывается программный идентификатор (ProgID), зарегистрированный в реестре Windows — например, V83.COMConnector для подключения к другой базе 1С или Excel.Application для работы с таблицами.

Технология работает только под Windows и требует, чтобы нужный COM-компонент был установлен и зарегистрирован на том компьютере, где выполняется код — на клиенте или на сервере 1С. Это принципиальный момент: если код выполняется на сервере, COM-компонент ищется именно на сервере, а не на машине пользователя.

Что такое COM-объект и когда он нужен в 1С

COM (Component Object Model) — технология Microsoft для взаимодействия программных компонентов. Приложение регистрирует в системе класс с уникальным идентификатором, после чего любая программа, включая 1С, может создать экземпляр этого класса и вызывать его методы.

В практике 1С COM чаще всего применяется в трёх сценариях: подключение одной базы 1С к другой для обмена данными, автоматизация Microsoft Office (Excel, Word, Outlook) и обращение к сторонним компонентам — драйверам оборудования, библиотекам штрихкодирования, криптографическим средствам.

Следует учитывать, что COM — устаревающая технология, и фирма «1С» рекомендует для новых интеграций использовать веб-сервисы, HTTP-сервисы и планы обмена. Однако для локальных задач и быстрого обмена между базами COM остаётся рабочим и простым инструментом.

Базовый синтаксис создания COM-объекта

Создание объекта выполняется одной строкой кода. Конструктор принимает ProgID и, при необходимости, имя компьютера для удалённого подключения:

Excel = Новый COMОбъект("Excel.Application");

Excel.Visible = Истина;

Книга = Excel.Workbooks.Add();

Лист = Книга.Worksheets(1);

Лист.Cells(1, 1).Value = "Пример выгрузки";

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

Попытка

Excel = Новый COMОбъект("Excel.Application");

Исключение

Сообщить("Не удалось создать COM-объект: " + ОписаниеОшибки());

Возврат;

КонецПопытки;

Подключение к другой базе 1С через V83.COMConnector

Самый распространённый сценарий — соединение двух баз 1С. Для этого используется компонент V83.COMConnector, который устанавливается вместе с платформой 1С:Предприятие 8.3. Сначала создаётся коннектор, затем через него открывается соединение с базой по строке подключения.

Коннектор = Новый COMОбъект("V83.COMConnector");

СтрокаПодключения = "File=""C:\Bases\Trade""; Usr=""Администратор""; Pwd=""123"";";

Соединение = Коннектор.Connect(СтрокаПодключения);

// Теперь можно обращаться к объектам удалённой базы

Запрос = Соединение.NewObject("Запрос");

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл

Сообщить(Результат.Ссылка);

КонецЦикла;

Для серверной базы строка подключения выглядит иначе: Srvr="ИмяСервера"; Ref="ИмяБазы"; Usr="Пользователь"; Pwd="Пароль";. Учётная запись должна существовать в целевой базе и обладать достаточными правами на читаемые или изменяемые объекты.

Порядок подключения к базе через COM
  1. 1
    Убедитесь, что на компьютере, где исполняется код, установлена платформа 1С той же версии, что и у целевой базы
  2. 2
    Создайте объект Новый COMОбъект("V83.COMConnector") внутри блока Попытка
  3. 3
    Сформируйте строку подключения с типом базы, пользователем и паролем
  4. 4
    Вызовите метод Connect и сохраните результат в переменную соединения
  5. 5
    Выполните нужные операции через Соединение.NewObject()
  6. 6
    По завершении присвойте переменным Неопределено для освобождения ресурсов

Разрядность, регистрация компонента и место выполнения кода

Главная причина ошибок при создании COM-объектов — несовпадение окружения. Компонент V83.COMConnector существует в 32- и 64-разрядной версиях, и его разрядность должна совпадать с разрядностью процесса, который его вызывает: 64-битный сервер 1С требует 64-битного коннектора.

Если компонент не зарегистрирован автоматически при установке, его можно зарегистрировать вручную командой regsvr32 "C:\Program Files\1cv8\<версия>\bin\comcntr.dll", запущенной от имени администратора. Для 64-разрядной версии используется соответствующий каталог установки.

Также критично место выполнения кода. Если процедура помечена директивой &НаСервере, COM-объект создаётся на сервере 1С — и Excel или коннектор должны быть установлены именно там. Клиентский компьютер в этом случае не участвует. Для работы с Office на машине пользователя код должен выполняться в клиентском контексте.

Освобождение COM-объектов и управление памятью

Каждый созданный COM-объект удерживает ресурсы операционной системы и процесс внешнего приложения. Если не завершить работу корректно, в памяти останутся «висящие» процессы — например, невидимые экземпляры EXCEL.EXE, которые накапливаются и замедляют сервер.

Правильное завершение для Excel выглядит так: закрыть книгу без сохранения или с сохранением, вызвать Excel.Quit(), затем присвоить переменной значение Неопределено. Для соединения с базой 1С достаточно присвоить переменным соединения и коннектора значение Неопределено.

// Завершение работы с Excel

Excel.DisplayAlerts = Ложь;

Книга.Close(Ложь);

Excel.Quit();

Excel = Неопределено;

Типичные ошибки
01
Создание COM-объекта внутри цикла — обработка тысяч строк занимает часы вместо минут
02
Отсутствие Quit() и обнуления переменных — в диспетчере задач копятся процессы Excel
03
Несовпадение разрядности: 32-битный коннектор и 64-битный сервер дают ошибку создания объекта
04
Код выполняется на сервере, а Excel установлен только на клиенте — объект не создаётся
05
Обращение к удалённой базе без Попытка/Исключение — любой сбой сети вызывает аварийное завершение

Типичные ошибки и их диагностика

Ошибка «Недопустимая строка с указанием класса» означает, что ProgID не найден в реестре: компонент не установлен, не зарегистрирован или имя указано с опечаткой. Проверьте регистрацию командой regsvr32 и точность написания ProgID.

Ошибка «Класс не зарегистрирован» при работающем ранее коде часто появляется после обновления платформы: новая версия регистрирует свой коннектор, а старый перестаёт быть доступен. Решение — зарегистрировать нужную версию comcntr.dll вручную.

Если Connect() возвращает ошибку аутентификации или «Информационная база не обнаружена», проверьте строку подключения: правильность пути или имени сервера, существование пользователя и отсутствие лишних пробелов в параметрах.

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

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

Создание объекта
Норма

Переменная содержит объект, исключение не возникло

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

Срабатывает блок Исключение с текстом о недопустимом классе

Соединение с базой
Норма

Connect возвращает объект соединения, доступен NewObject

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

Ошибка аутентификации или "база не обнаружена"

Завершение работы
Норма

В диспетчере задач не остаётся лишних процессов Excel/1С

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

Процессы накапливаются после каждого запуска

Альтернативы COM-подключению

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

Для выгрузки в Excel без установленного Office используйте табличный документ с сохранением в формате XLSX через метод Записать() — это быстрее COM и не требует лицензии Office на сервере. COM остаётся оправданным, когда нужны сложные макеты, диаграммы или макросы Excel.

Сравнение способов интеграции

COM-подключение

Простая настройка, прямой доступ к объектам базы. Только Windows, требует установленной платформы и совпадения разрядности

HTTP/веб-сервисы

Кроссплатформенно, безопасно, работает через интернет. Требует разработки и публикации сервиса на стороне источника

Планы обмена

Готовый механизм регулярной синхронизации с контролем изменений. Избыточен для разовых выгрузок

Файловый обмен (XLSX, XML)

Не требует связи между базами в реальном времени. Нужно согласование форматов и ручной контроль

Часто задаваемые вопросы

Можно ли создать COM-объект на сервере Linux?

Нет, технология COM существует только в Windows. На Linux-сервере 1С используйте HTTP-сервисы, веб-сервисы или файловый обмен. Если интеграция через COM обязательна, вынесите её на отдельный Windows-компьютер с установленной платформой.

Почему возникает ошибка «-2147221005: Недопустимая строка с указанием класса»?

Это системная ошибка Windows, означающая, что ProgID не найден в реестре. Проверьте, установлен ли компонент на том компьютере, где выполняется код, зарегистрируйте его через regsvr32 от имени администратора и убедитесь, что разрядность компонента совпадает с разрядностью процесса 1С.

Чем отличается V83.COMConnector от V83.Application?

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

Как передать таблицу значений через COM в другую базу?

Напрямую объекты между базами через COM не передаются — каждая база работает со своими типами. Передавайте примитивные данные (строки, числа, даты) или сериализуйте таблицу в XML/JSON через ЗаписьXML, передавайте строку и восстанавливайте объект на принимающей стороне.

Безопасно ли использовать COM для изменения данных в удалённой базе?

Само по себе соединение безопасно, если используется учётная запись с минимально необходимыми правами. Риски связаны с кодом: изменения выполняются без контроля со стороны пользователя удалённой базы. Всегда тестируйте обработку на копии базы, используйте транзакции через Соединение.НачатьТранзакцию() и храните пароли вне кода.

Итог

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

COM-объект создаётся конструкцией Новый COMОбъект(ProgID) и требует зарегистрированного компонента на компьютере исполнения кода. Для связи баз используется V83.COMConnector с методом Connect, для Office — объекты вида Excel.Application. Всегда оборачивайте создание в Попытку/Исключение, следите за разрядностью и освобождайте объекты после работы.