Разработка и Конфигурация · 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="Пароль";. Учётная запись должна существовать в целевой базе и обладать достаточными правами на читаемые или изменяемые объекты.
- 1Убедитесь, что на компьютере, где исполняется код, установлена платформа 1С той же версии, что и у целевой базы
- 2Создайте объект Новый COMОбъект("V83.COMConnector") внутри блока Попытка
- 3Сформируйте строку подключения с типом базы, пользователем и паролем
- 4Вызовите метод Connect и сохраните результат в переменную соединения
- 5Выполните нужные операции через Соединение.NewObject()
- 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 = Неопределено;
Типичные ошибки и их диагностика
Ошибка «Недопустимая строка с указанием класса» означает, что ProgID не найден в реестре: компонент не установлен, не зарегистрирован или имя указано с опечаткой. Проверьте регистрацию командой regsvr32 и точность написания ProgID.
Ошибка «Класс не зарегистрирован» при работающем ранее коде часто появляется после обновления платформы: новая версия регистрирует свой коннектор, а старый перестаёт быть доступен. Решение — зарегистрировать нужную версию comcntr.dll вручную.
Если Connect() возвращает ошибку аутентификации или «Информационная база не обнаружена», проверьте строку подключения: правильность пути или имени сервера, существование пользователя и отсутствие лишних пробелов в параметрах.
Как проверить результат
Переменная содержит объект, исключение не возникло
Срабатывает блок Исключение с текстом о недопустимом классе
Connect возвращает объект соединения, доступен NewObject
Ошибка аутентификации или "база не обнаружена"
В диспетчере задач не остаётся лишних процессов Excel/1С
Процессы накапливаются после каждого запуска
Альтернативы COM-подключению
Для обмена между базами 1С современная альтернатива COM — HTTP-сервисы и веб-сервисы: они работают на любой операционной системе, не требуют установки платформы на стороне клиента и безопаснее при обмене через интернет. Планы обмена подходят для регулярной синхронизации по расписанию.
Для выгрузки в Excel без установленного Office используйте табличный документ с сохранением в формате XLSX через метод Записать() — это быстрее COM и не требует лицензии Office на сервере. COM остаётся оправданным, когда нужны сложные макеты, диаграммы или макросы Excel.
Сравнение способов интеграции
Простая настройка, прямой доступ к объектам базы. Только Windows, требует установленной платформы и совпадения разрядности
Кроссплатформенно, безопасно, работает через интернет. Требует разработки и публикации сервиса на стороне источника
Готовый механизм регулярной синхронизации с контролем изменений. Избыточен для разовых выгрузок
Не требует связи между базами в реальном времени. Нужно согласование форматов и ручной контроль
Часто задаваемые вопросы
Можно ли создать 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. Всегда оборачивайте создание в Попытку/Исключение, следите за разрядностью и освобождайте объекты после работы.