Разработка и Конфигурация · 12 мин
Как работать с COM-объектом в 1С
Практическое руководство по работе с COM-объектами в 1С: создание COMConnector, подключение к другой базе, вызовы методов, типичные ошибки и способы их устранения.
COM-объекты в 1С используются, когда нужно обратиться из одной базы к другой, выгрузить данные во внешнюю программу (например, Excel) или вызвать функции внешней библиотеки, зарегистрированной в Windows. Технология COM (Component Object Model) позволяет платформе 1С создавать экземпляры внешних компонентов и вызывать их методы напрямую из встроенного языка, без файловых обменов и промежуточных форматов.
На практике чаще всего применяются два сценария: подключение к другой информационной базе 1С через объект V83.COMConnector и работа с приложениями Microsoft Office через объекты вида Excel.Application или Word.Application. Оба сценария строятся одинаково: создаётся COM-объект, устанавливается соединение, выполняются вызовы, затем соединение корректно закрывается.
Важно понимать ограничения: COM работает только под Windows, требует совпадения разрядности клиента и сервера с разрядностью COM-компонента, а соединение через COMConnector существенно медленнее, чем работа внутри одной базы. Поэтому COM стоит рассматривать как инструмент интеграции «точка-точка», а не как универсальный транспорт для массовых обменов.
Что такое COM-объект и когда он нужен в 1С
COM — это технология Windows, позволяющая одной программе использовать функциональность другой через стандартизированный интерфейс. В 1С доступ к COM реализован через тип COMОбъект: вы указываете программный идентификатор (ProgID) зарегистрированного компонента, и платформа создаёт его экземпляр.
Типичные задачи, где COM оправдан: прямое чтение остатков из другой базы 1С без промежуточных файлов, формирование документов Word и отчётов Excel по шаблону, обращение к OLE DB или ADO для чтения данных из внешних источников, вызов методов сторонних библиотек (например, компонентов криптографии или оборудования).
COM не подходит для высоконагруженных обменов и не работает в Linux-окружении и в веб-клиенте. Если обмен планируется регулярный и объёмный, рассмотрите HTTP-сервисы, веб-сервисы или планы обмена — они устойчивее и не зависят от разрядности процессов.
Создание COM-объекта и базовый синтаксис
Объект создаётся одной строкой: Объект = Новый COMОбъект("Excel.Application");. Если компонент не зарегистрирован в системе или разрядность не совпадает, платформа выбросит исключение с ошибкой создания объекта — поэтому создание всегда помещают в конструкцию Попытка ... Исключение ... КонецПопытки;.
После создания объекта вы вызываете его методы и обращаетесь к свойствам так же, как к обычным объектам встроенного языка. Пример с Excel:
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось создать COM-объект: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Excel.Visible = Ложь;
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
Лист.Cells(1, 1).Value = "Номенклатура";
Книга.SaveAs("C:\Temp\Отчет.xlsx");
Книга.Close(Ложь);
Excel.Quit();
Excel = Неопределено;
Обратите внимание на завершение: сначала закрываются дочерние объекты (книги, листы), затем вызывается Quit(), и только потом переменной присваивается Неопределено. Если просто оборвать выполнение, процесс EXCEL.EXE останется висеть в памяти сервера или клиентской машины.
Подключение к другой базе 1С через V83.COMConnector
Для связи двух баз 1С используется COM-коннектор — библиотека comcntr.dll, которая устанавливается вместе с платформой. Сначала создаётся сам коннектор, затем вызывается метод Connect со строкой подключения, аналогичной строке запуска базы.
Попытка
Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr=""Server1"";Ref=""TradeBase"";Usr=""Обмен"";Pwd=""secret"";";
Соединение = Коннектор.Connect(СтрокаПодключения);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
// обработка данных
КонецЦикла;
Соединение = Неопределено;
Коннектор = Неопределено;
Для файловой базы строка подключения выглядит иначе: File="C:\Bases\Trade";Usr="Обмен";Pwd="secret";. Через объект соединения доступны практически все возможности встроенного языка той базы: запросы, создание документов, вызов экспортных процедур общих модулей через Соединение.ОбщийМодуль.Метод().
- 1Убедитесь, что на машине, где выполняется код, зарегистрирована comcntr.dll нужной версии платформы
- 2Создайте объект V83.COMConnector в блоке Попытка
- 3Сформируйте строку подключения с сервером, именем базы и учётной записью с минимально необходимыми правами
- 4Вызовите Connect и сохраните результат в отдельную переменную соединения
- 5Выполните нужные операции через объект соединения
- 6Обнулите переменные соединения и коннектора после завершения
Разрядность, регистрация компонента и частые ошибки
Самая распространённая проблема — ошибка «-2147221005: Недопустимая строка с указанием класса» при создании объекта. Она означает, что COM-компонент не зарегистрирован в системе либо зарегистрирован не той разрядности: 64-разрядный процесс не видит 32-разрядные COM-компоненты и наоборот.
Если код выполняется на 64-разрядном сервере 1С, а comcntr.dll зарегистрирована только 32-разрядной версией, подключение не создастся. Решение — зарегистрировать нужную версию командой regsvr32 "C:\Program Files\1cv8\<версия>\bin\comcntr.dll" от имени администратора или установить соответствующую разрядность платформы.
Ещё одна частая ситуация: код работает на клиенте, но падает на сервере. Причина в том, что на сервере компонент не зарегистрирован или у учётной записи агента сервера 1С нет прав на его создание. Проверяйте регистрацию именно на том компьютере и под тем пользователем, где реально выполняется код.
Производительность и безопасность COM-соединений
Каждый вызов метода или обращение к свойству через COM — это межпроцессное взаимодействие, которое на порядки медленнее обычного вызова внутри 1С. Цикл из десяти тысяч обращений к ячейкам Excel может выполняться минутами. Оптимизация проста: минимизируйте количество вызовов, передавайте данные пакетами (например, массивами в Excel через Range.Value) и выносите логику на сторону внешней базы через экспортные функции общих модулей.
С точки зрения безопасности строка подключения содержит логин и пароль в открытом виде. Не храните её непосредственно в коде обработки или общего модуля — используйте защищённые константы, параметры сеанса или внешние настройки с ограниченным доступом. Учётной записи для COM-подключения выдавайте только те роли, которые реально нужны для обмена.
Альтернативы COM и когда их выбрать
COM — не единственный способ интеграции, и часто не лучший. Перед внедрением стоит сопоставить варианты по условиям вашей инфраструктуры.
Способы связи между базами 1С
Подходит для разовых синхронизаций и административных задач под Windows. Ограничения: только Windows, зависимость от разрядности, низкая скорость массовых вызовов.
Подходит для регулярных обменов и интеграции с любыми системами, работает на любой платформе. Требует публикации базы на веб-сервере и разработки API.
Подходит для типовой синхронизации данных между базами 1С с гарантией доставки и регистрацией изменений. Требует настройки правил и мониторинга очередей.
Подходит как простой вариант без прямого доступа между базами. Минус — нет мгновенной актуальности данных и нужен контроль целостности файлов.
Если обмен происходит раз в день по расписанию и объёмы небольшие, COM вполне рабочее решение. Если данные нужны в режиме, близком к реальному времени, или одна из баз работает на Linux — закладывайте HTTP-сервисы сразу, миграция с COM позже обойдётся дороже.
Как выбрать действие
Проверка результата и диагностика
После внедрения COM-обмена проверьте не только факт выполнения кода, но и отсутствие побочных эффектов: зависших процессов, открытых сеансов, блокировок в базе-источнике. Регламентные задания с COM-подключением стоит снабдить записью в журнал регистрации с указанием длительности и количества обработанных объектов — это упростит поиск деградации производительности.
Как проверить результат
После завершения обмена процессы EXCEL.EXE или сеансы внешней базы закрыты
В диспетчере задач копятся зависшие процессы, растёт потребление памяти
Операция завершается без ошибок, длительность стабильна от запуска к запуску
Периодические ошибки создания объекта или рост времени выполнения
Количество и содержимое загруженных объектов совпадает с источником
Пропуски, дубли или частично заполненные документы
Что важно запомнить
COM-объект создаётся через Новый COMОбъект, для связи баз используется V83.COMConnector. Всегда оборачивайте создание в Попытку, закрывайте объекты, следите за разрядностью компонентов и не храните пароли в коде. Для регулярных и кроссплатформенных обменов предпочтительнее HTTP-сервисы и планы обмена.
Частые вопросы
Можно ли использовать COM-объект в веб-клиенте 1С?
Нет. Веб-клиент выполняется в браузере и не имеет доступа к COM-инфраструктуре Windows. Тонкий клиент под Windows может работать с COM, но при переносе кода на сервер или в веб-клиент такие вызовы нужно заменять на серверные механизмы интеграции.
Чем отличается V83.COMConnector от V83.Application?
V83.COMConnector создаёт лёгкое соединение с базой без полноценного клиентского приложения — это основной вариант для обменов. V83.Application запускает фактически полный клиентский сеанс через COM, потребляет больше ресурсов и лицензий, и применяется редко, например когда нужен доступ к функциям, недоступным через коннектор.
Почему после обновления платформы перестало работать COM-подключение?
При обновлении платформы меняется версия comcntr.dll, и зарегистрированная ранее библиотека может перестать соответствовать версии базы. Перерегистрируйте comcntr.dll из каталога новой версии платформы командой regsvr32 с правами администратора на том компьютере, где выполняется код.
Как передать таблицу значений через COM в другую базу?
Напрямую передать таблицу значений как объект нельзя — через COM корректно передаются примитивные типы и сериализуемые структуры. Практичные варианты: сериализовать данные в XML или JSON и передать строкой, либо вызывать экспортную функцию общего модуля внешней базы, которая сама запросит нужные данные на своей стороне.
Безопасно ли запускать COM-обмен регламентным заданием на сервере?
Да, при соблюдении условий: компонент зарегистрирован на сервере, код защищён обработкой исключений, объекты закрываются в любом сценарии, а учётная запись подключения имеет минимальные права. Дополнительно ограничьте длительность задания, чтобы зависшее соединение не блокировало очередь регламентных операций.
Что делать, если Excel через COM «зависает» на диалоговом окне?
Скрытые модальные диалоги (запросы на сохранение, предупреждения о формате) блокируют автоматизацию. Установите Excel.DisplayAlerts = Ложь перед операциями сохранения и закрытия, не включайте Visible = Истина на сервере, а при отладке запускайте код на клиенте с видимым окном, чтобы увидеть, какой диалог мешает выполнению.