Разработка и Конфигурация · 12 мин
Что такое COM в 1С и как работает COM-соединение
Что такое COM в 1С: COM-соединение между базами, COMConnector, V83.COMConnector, примеры кода, ошибки регистрации comcntr.dll и способы их устранения.
COM в 1С — это механизм взаимодействия между программами через технологию Component Object Model от Microsoft. В контексте 1С чаще всего под COM понимают COM-соединение: способ подключиться из одной информационной базы 1С (или из внешнего приложения) к другой базе и работать с её данными — читать справочники, создавать документы, запускать запросы — программно, без открытия интерфейса.
Технология работает только в Windows, так как опирается на системный COM-интерфейс. Для подключения используется COM-объект V83.COMConnector (для платформы 8.3), который регистрируется библиотекой comcntr.dll из каталога установки платформы. Через него создаётся «внешнее соединение» — полноценный программный доступ к другой базе.
COM-соединение применяют для обмена данными между базами (например, между «Бухгалтерией» и «Зарплатой и управлением персоналом»), для интеграции 1С с внешними системами, для пакетной обработки данных и для сценариев, где веб-сервисы недоступны или не настроены. Ниже разберём, как это работает на практике, какие есть ограничения и какие ошибки встречаются чаще всего.
Что такое COM-объект и COM-соединение в 1С
COM (Component Object Model) — это стандарт Microsoft, позволяющий одному приложению использовать функциональность другого через заранее описанные интерфейсы. Приложение-источник регистрирует в операционной системе COM-объект, а приложение-потребитель создаёт его экземпляр и вызывает методы.
В 1С COM используется в двух направлениях. Во-первых, сама платформа предоставляет COM-объекты наружу: любое внешнее приложение (скрипт, программа на C#, Delphi, даже Excel через VBA) может подключиться к базе 1С. Во-вторых, из кода 1С можно создавать COM-объекты других программ — например, Excel.Application для выгрузки данных в Excel или V83.COMConnector для подключения к другой базе 1С.
Объект V83.COMConnector и библиотека comcntr.dll
Центральный элемент механизма — COM-объект с программным идентификатором V83.COMConnector. Он предоставляет метод Connect, который принимает строку подключения к базе и возвращает объект внешнего соединения. Через этот объект доступны почти все прикладные возможности базы: менеджеры справочников и документов, запросы, перечисления, общие модули (если они доступны внешнему соединению).
За регистрацию объекта отвечает библиотека comcntr.dll, которая находится в каталоге bin конкретной версии платформы, например C:\Program Files\1cv8\8.3.22.1709\bin\comcntr.dll. Важно: версия библиотеки должна соответствовать версии платформы, с которой работает база, иначе соединение завершится ошибкой несовпадения версий.
Как создать COM-соединение: пример кода
Подключение из кода 1С к другой базе выглядит так. Сначала создаётся COM-объект коннектора, затем вызывается метод Connect со строкой подключения. Для клиент-серверной базы строка содержит имя сервера, имя базы, пользователя и пароль.
Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr=""Server1C"";Ref=""TradeBase"";Usr=""Обмен"";Pwd=""12345"";";
Соединение = Коннектор.Connect(СтрокаПодключения);
// Чтение данных из базы-источника
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Для файловой базы строка подключения выглядит иначе: File="C:\Bases\Trade";Usr="Обмен";Pwd="12345";. После завершения работы соединение нужно освободить, присвоив переменным значение Неопределено, иначе сеанс на стороне базы-источника может остаться висеть до таймаута.
- 1Убедитесь, что на компьютере, где выполняется код, установлена платформа той же версии, что и у базы-источника
- 2Зарегистрируйте comcntr.dll нужной версии командой regsvr32 от имени администратора
- 3Создайте в базе-источнике отдельного пользователя с минимально необходимыми правами
- 4Создайте COMОбъект V83.COMConnector и вызовите Connect со строкой подключения
- 5Выполните обмен данными и обязательно освободите соединение через Неопределено
- 6Проверьте в консоли кластера или в мониторе, что сеанс соединения закрылся
Регистрация comcntr.dll и типичные ошибки
Самая частая проблема при работе с COM — ошибка создания объекта с сообщением вида «Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован». Она означает, что в системе не зарегистрирована библиотека comcntr.dll или зарегистрирована версия другой разрядности.
Регистрация выполняется из командной строки с правами администратора. Если код выполняется 64-разрядным процессом (например, сервером 1С x64), нужна 64-разрядная библиотека из соответствующего каталога платформы.
regsvr32 "C:\Program Files\1cv8\8.3.22.1709\bin\comcntr.dll"Вторая типичная ошибка — «Несовпадение версий клиента и сервера»: она возникает, когда коннектор одной версии платформы пытается подключиться к базе, работающей на другой версии. Лечится регистрацией comcntr.dll той же версии, что и сервер. Третья группа проблем — права доступа: пользователь, указанный в строке подключения, должен существовать в базе-источнике и иметь права на нужные объекты.
Ограничения и особенности COM-соединения
COM-соединение — мощный, но «капризный» механизм, и его ограничения нужно учитывать при проектировании интеграции. Главное ограничение — платформа: COM работает только в Windows. Если сервер 1С развёрнут на Linux, COM-соединение на нём недоступно, и нужно использовать веб-сервисы, HTTP-сервисы или планы обмена.
Другие существенные моменты:
- COM-соединение не потребляет клиентскую лицензию (в отличие от V83.Application), но создаёт сеанс в кластере, который виден в консоли;
- код выполняется в контексте безопасности базы-источника: нельзя обойти права пользователя, указанного в строке подключения;
- производительность ниже, чем у прямого обращения к данным: каждый вызов — это межпроцессное взаимодействие, поэтому массовые операции лучше выполнять пакетами через запросы, а не построчно;
- нельзя передавать между базами объекты по ссылке: документ базы-источника нельзя «присвоить» в базу-приёмник, данные нужно переносить по реквизитам;
- при обновлении платформы на сервере нужно перерегистрировать comcntr.dll новой версии, иначе интеграция сломается.
Альтернативы COM: что выбрать для интеграции
COM — не единственный и не всегда лучший способ связать базы. Выбор зависит от окружения, требований к надёжности и версий платформы.
Способы интеграции баз 1С
Подходит для обмена между базами в одной Windows-инфраструктуре, когда нужен гибкий программный доступ. Ограничение: только Windows, привязка к версии платформы, хрупкость при обновлениях.
Кроссплатформенный вариант, работает через сеть и брандмауэры, не зависит от разрядности. Требует публикации на веб-сервере и написания кода сервисов.
Штатный механизм для регулярной синхронизации между типовыми конфигурациями. Надёжен, с регистрацией изменений, но менее гибок для разовых произвольных выборок.
Подходят для чтения данных из сторонних СУБД (SQL Server, PostgreSQL) в интерфейс 1С, но не для соединения двух баз 1С между собой.
Практическое правило: если обе базы живут в одной сети на Windows и обмен несложный (например, ночная выгрузка остатков), COM — быстрый и рабочий вариант. Если интеграция критична для бизнеса, должна переживать обновления платформы или базы разнесены по разным площадкам, надёжнее построить обмен на HTTP-сервисах или планах обмена.
Как выбрать механизм
Как проверить, что COM-соединение работает
После настройки полезно пройти короткую проверку, прежде чем запускать обмен в рабочем режиме. Минимальный тест — создать соединение и выполнить простой запрос к справочнику с ограничением выборки.
Как проверить результат
Объект создан без исключения
Ошибка «Класс не зарегистрирован» — не зарегистрирована или не та разрядность comcntr.dll
Возвращён объект соединения
Ошибка аутентификации или несовпадения версий — проверьте пользователя, пароль и версию библиотеки
Запрос возвращает данные из базы-источника
Ошибка прав доступа — добавьте пользователю права на читаемый объект
Сеанс в консоли кластера закрывается после освобождения соединения
Сеанс висит — соединение не освобождено, проверьте присвоение Неопределено
Часто задаваемые вопросы
Чем V83.COMConnector отличается от V83.Application?
COMConnector создаёт лёгкое внешнее соединение без интерфейса и не потребляет клиентскую лицензию. V83.Application запускает полноценное приложение 1С в фоне, занимает лицензию и больше ресурсов, но позволяет выполнять код, требующий клиентского контекста. Для обмена данными почти всегда достаточно COMConnector.
Работает ли COM-соединение на Linux-сервере 1С?
Нет. COM — технология Windows, поэтому ни сервер 1С на Linux, ни кластер на Linux не смогут инициировать COM-подключение. В таких сценариях используют HTTP-сервисы, веб-сервисы или обмен через файлы и планы обмена.
Можно ли подключиться через COM к базе другой версии платформы?
Нет, версия зарегистрированной comcntr.dll должна совпадать с версией платформы базы-источника. При обновлении платформы на сервере нужно заново зарегистрировать библиотеку из каталога новой версии, иначе возникнет ошибка несовпадения версий.
Почему COM-соединение работает медленно при больших выгрузках?
Каждый вызов через COM — это межпроцессное взаимодействие с сериализацией данных. Построчное создание тысяч документов через отдельные вызовы очень медленное. Оптимизация: выбирать данные пакетами одним запросом на стороне источника и переносить их массивами, а не обращаться к базе за каждой записью.
Безопасно ли использовать COM для обмена между базами?
Сам механизм безопасен при соблюдении правил: отдельный служебный пользователь с минимальными правами, отсутствие паролей в открытом виде в коде, работа только внутри защищённой локальной сети. Выносить COM-подключение за пределы контура сети (через интернет) нельзя — для этого существуют веб-сервисы с шифрованием.
Что делать, если после обновления платформы обмен через COM перестал работать?
Почти наверняка причина в том, что в системе зарегистрирована старая версия comcntr.dll. Найдите библиотеку в каталоге bin новой версии платформы, зарегистрируйте её командой regsvr32 от имени администратора (с учётом разрядности процесса, который выполняет подключение) и повторите тест соединения.
Что важно запомнить
COM в 1С — это способ программного подключения к другой базе через объект V83.COMConnector и библиотеку comcntr.dll. Механизм работает только в Windows, требует совпадения версий платформы и библиотеки, не потребляет лицензию, но создаёт сеанс. Для критичных и кроссплатформенных интеграций надёжнее использовать HTTP-сервисы или планы обмена.