Разработка и Конфигурация · 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 выбросит исключение — его нужно оборачивать в конструкцию Попытка/Исключение, чтобы корректно обработать сбой.
- 1Убедитесь, что на компьютере установлена платформа той же версии, что и у целевой базы, и зарегистрирована comcntr.dll
- 2Создайте объект V83.COMConnector через Новый COMОбъект
- 3Сформируйте строку подключения с путём к базе, пользователем и паролем
- 4Вызовите метод Connect внутри блока Попытка/Исключение
- 5Выполните нужные операции с объектами удалённой базы
- 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-разрядная, возникнет ошибка создания объекта. Решение — использовать совпадающую разрядность либо запускать обмен через внешнее приложение нужной разрядности.
Как проверить результат и когда выбрать альтернативу
После настройки COM-обмена проверьте три вещи: соединение устанавливается и корректно закрывается (в консоли сеансов целевой базы не остаётся зависших сеансов), данные переносятся без потерь (количество загруженных записей совпадает с количеством выгруженных), при разрыве связи код выдаёт понятную ошибку, а не аварийно завершается. Тестируйте обмен на копии базы, прежде чем запускать его в рабочей среде.
COM — не единственный и не всегда лучший способ интеграции. HTTP-сервисы и веб-сервисы 1С работают кроссплатформенно и не требуют установки платформы на стороне клиента. Планы обмена подходят для регулярной синхронизации между типовыми конфигурациями. Внешние источники данных удобны для чтения из SQL-баз. COM оправдан, когда нужен быстрый прямой доступ к объектной модели другой базы в Windows-инфраструктуре и нет возможности поднять сервисы.
Как выбрать механизм интеграции
Что важно запомнить
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.