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

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

COM-объекты 1С: что это такое и как с ними работать

Что такое COM-объекты в 1С, как работает COM-соединение между базами, примеры кода V83.COMConnector, типичные ошибки и способы их устранения.

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

Технология работает только на Windows, поскольку COM — это компонентная модель этой операционной системы. При подключении 1С загружает специальную DLL-библиотеку (comcntr.dll), которая регистрируется в системе при установке платформы и предоставляет доступ к объектной модели информационной базы: справочникам, документам, запросам, перечислениям.

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

Что такое COM и как он применяется в 1С

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

В практике 1С выделяют три основных применения COM. Первое — COM-соединение между базами 1С: например, база «Управление торговлей» напрямую читает остатки из базы «Бухгалтерии». Второе — автоматизация Microsoft Office: заполнение шаблонов Word, выгрузка таблиц в Excel. Третье — работа с внешними компонентами и драйверами оборудования, которые поставляются в виде COM-объектов.

Какие COM-объекты предоставляет платформа 1С

Платформа 1С регистрирует в системе несколько COM-классов. Главный из них — V83.COMConnector (для платформы 8.3; для 8.2 — V82.COMConnector). Этот объект создаёт COM-соединения с информационными базами. Число в имени соответствует версии платформы, поэтому важно использовать коннектор той же версии, что и целевая база.

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

COM-объектНазначениеКогда применять
V83.COMConnectorОблегчённое соединение с базойОбмен данными, чтение и запись объектов
V83.ApplicationПолный клиент 1С под внешним управлениемРедкие сценарии, где нужен толстый клиент
Excel.Application, Word.ApplicationАвтоматизация OfficeФормирование документов и отчётов

Как установить COM-соединение между двумя базами 1С

Подключение выполняется в два шага: сначала создаётся объект-коннектор, затем вызывается его метод Connect со строкой подключения. Строка подключения совпадает по формату с параметрами командной строки 1С: для файловой базы указывается путь к каталогу, для серверной — имя сервера и имя базы.

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

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

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

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

Номенклатура = Соединение.Справочники.Номенклатура.НайтиПоКоду("000001");

Сообщить(Номенклатура.Наименование);

Для серверной базы строка выглядит иначе: Srvr="Server1"; Ref="TradeBase"; Usr="..."; Pwd="...";. Если указанный пользователь не существует или пароль неверен, метод Connect выбросит исключение — его нужно оборачивать в конструкцию Попытка/Исключение, чтобы корректно обработать сбой.

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

Работа с объектами удалённой базы через COM

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

Запрос к удалённой базе выполняется через объект запроса, созданный в контексте соединения:

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

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Наименование);

КонецЦикла;

Обращение к перечислениям требует осторожности: значение перечисления удалённой базы нельзя напрямую сравнить со значением текущей базы, даже если конфигурации одинаковые. Сравнивайте по имени значения или по представлению. Аналогично ссылки на объекты разных баз несовместимы — для сопоставления используйте GUID (метод УникальныйИдентификатор()) или коды/номера.

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

Использование COM для работы с Excel и Word

Второй популярный сценарий — автоматизация Office. Через COM-объекты Excel.Application и Word.Application из 1С можно заполнять шаблоны договоров, выгружать отчёты в таблицы и формировать печатные формы со сложным форматированием.

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

Excel.Visible = Ложь;

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

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

Лист.Cells(1, 1).Value = "Номенклатура";

Лист.Cells(1, 2).Value = "Остаток";

Книга.SaveAs("D:\Отчеты\Остатки.xlsx");

Excel.Quit();

Главное правило при работе с Office через COM — всегда завершать процесс вызовом Quit() и освобождать объект. Если код прервётся по ошибке до вызова Quit, в системе останется висеть невидимый процесс EXCEL.EXE, который удерживает файл и потребляет память. Поэтому весь код после создания объекта помещайте в Попытка/Исключение, а Quit вызывайте и в ветке обработки ошибки.

Требования, ограничения и типичные ошибки

COM работает только в Windows-окружении. Если сервер 1С работает на Linux, COM-соединение с него инициировать нельзя — нужен либо Windows-клиент, выполняющий обмен, либо другой механизм интеграции (HTTP-сервисы, веб-сервисы, планы обмена). Также библиотека comcntr.dll должна быть зарегистрирована в системе; при обновлении платформы регистрацию иногда приходится повторять вручную командой regsvr32 или через ярлык «Регистрация утилиты администрирования».

Разрядность тоже имеет значение: 64-разрядное приложение не может загрузить 32-разрядный COM-объект в том же процессе и наоборот. Если соединение создаётся из 64-разрядного кода, а платформа установлена 32-разрядная, возникнет ошибка создания объекта. Решение — использовать совпадающую разрядность либо запускать обмен через внешнее приложение нужной разрядности.

Типичные ошибки
01
Использование V82.COMConnector для базы на платформе 8.3 — приводит к ошибке создания объекта; версия коннектора должна совпадать с версией платформы
02
Отсутствие блока Попытка/Исключение вокруг Connect — при недоступности базы обмен падает без понятного сообщения
03
Сравнение ссылок и перечислений разных баз напрямую — сравнение всегда ложно, данные дублируются или теряются
04
Неосвобождённое соединение в конце работы — накапливаются зависшие сеансы и блокировки в целевой базе
05
Передача таблицы значений между базами через COM — объект не сериализуется, данные нужно перебирать построчно

Как проверить результат и когда выбрать альтернативу

После настройки COM-обмена проверьте три вещи: соединение устанавливается и корректно закрывается (в консоли сеансов целевой базы не остаётся зависших сеансов), данные переносятся без потерь (количество загруженных записей совпадает с количеством выгруженных), при разрыве связи код выдаёт понятную ошибку, а не аварийно завершается. Тестируйте обмен на копии базы, прежде чем запускать его в рабочей среде.

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

Маршрут решения

Как выбрать механизм интеграции

Обе базы на Windows, нужен прямой доступ к объектам, обмен разовый или редкийИспользуйте COM-соединение через V83.COMConnector
Сервер на Linux или нужен доступ из внешних систем без платформы 1СПубликуйте HTTP-сервисы или веб-сервисы в целевой базе
Регулярная синхронизация между типовыми конфигурациямиНастройте план обмена или типовую синхронизацию данных
Нужно только читать данные из SQL-базы напрямуюРассмотрите внешние источники данных
Итог

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

COM-объекты 1С — это механизм прямого доступа к объектам другой базы или внешней программы через технологию COM. Для связи баз используйте V83.COMConnector той же версии, что и платформа целевой базы, всегда обрабатывайте ошибки подключения и освобождайте соединение. Технология работает только на Windows; для кроссплатформенных сценариев выбирайте HTTP-сервисы.

Частые вопросы о COM-объектах 1С

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

Эта ошибка означает, что COM-класс не зарегистрирован в системе. Проверьте, что на компьютере установлена платформа 1С нужной версии, и зарегистрируйте библиотеку comcntr.dll из каталога bin платформы командой regsvr32 с правами администратора. Также проверьте совпадение разрядности приложения и платформы.

Можно ли через COM подключиться к базе на сервере 1С под Linux?

Нет, COM — технология Windows и на Linux недоступна. Для интеграции с сервером на Linux используйте HTTP-сервисы, веб-сервисы (SOAP) или обмен через файлы и промежуточные хранилища.

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

Напрямую передать объект таблицы значений нельзя. Стандартный приём — выполнить запрос в удалённой базе, перебрать выборку построчно и на каждой итерации переносить значения полей в структуру или запись текущей базы.

Безопасно ли хранить пароль в строке подключения в коде?

Нет, пароль в открытом виде в коде — риск утечки. Храните учётные данные в защищённых настройках, например в константах с ограниченным доступом, или используйте отдельную учётную запись с минимально необходимыми правами только для обмена.

Почему после обмена в целевой базе остаются активные сеансы?

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

Чем COM-соединение отличается от Automation-сервера V83.Application?

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