Администрирование · 14 мин
COM-соединение в 1С: назначение, настройка и типичные ошибки
Что такое COM-соединение в 1С, чем V83.COMConnector отличается от других способов обмена, как написать подключение и какие ошибки встречаются чаще всего.
COM-соединение в 1С — это способ подключения одного приложения к информационной базе 1С через технологию COM (Component Object Model) операционной системы Windows. Внутри самой 1С для этого используется объект V83.COMConnector (в старых платформах — V82.COMConnector), который позволяет из кода одной базы открыть другую базу и работать с её данными напрямую: читать справочники, создавать документы, вызывать процедуры общих модулей.
Такой механизм чаще всего применяют для обмена данными между двумя базами 1С (например, между «Бухгалтерией» и «Управлением торговлей»), а также для доступа к данным 1С из внешних программ — скриптов, самописных утилит, интеграционных сервисов. COM-соединение работает только в среде Windows, потому что сама технология COM является частью этой операционной системы.
Важно понимать ограничение: COM-соединение — это синхронное, «тяжёлое» подключение. Оно загружает в память фактически второй экземпляр клиентского приложения базы, держит соединение открытым и потребляет лицензию. Поэтому для регулярных обменов в современных конфигурациях чаще выбирают веб-сервисы, HTTP-сервисы или EnterpriseData, а COM оставляют для локальных разовых задач и интеграций внутри одной сети.
Как устроено COM-соединение и что происходит при подключении
Технически подключение строится в два этапа. Сначала создаётся COM-объект-коннектор — V83.COMConnector. Это зарегистрированный в Windows компонент, который поставляется вместе с платформой 1С. Затем у коннектора вызывается метод Connect(), которому передаётся строка подключения к базе — такая же, как в списке информационных баз или в параметре запуска конфигуратора.
Строка подключения различается для файлового и клиент-серверного режима. Для файловой базы указывается путь к каталогу: File="C:\Bases\Trade";Usr="Администратор";Pwd="123";. Для серверной базы — имя сервера и имя базы в кластере: Srvr="Server1C";Ref="Trade";Usr="Admin";Pwd="123";. Если параметры указаны неверно, метод Connect() вернёт ошибку ещё на этапе установления соединения.
Результат успешного вызова Connect() — объект, представляющий подключённую базу. Через него доступны менеджеры объектов: Соединение.Справочники.Номенклатура, Соединение.Документы.РеализацияТоваровУслуг и так далее. Дальше с данными работают почти так же, как в обычном коде 1С, с одним существенным отличием: нельзя передавать между базами объекты встроенного языка напрямую — только примитивные типы или объекты, созданные уже внутри соединения.
Когда COM-соединение оправдано, а когда лучше выбрать другой механизм
COM хорошо подходит в трёх ситуациях: обмен между базами в одной локальной сети, разовые операции переноса данных и интеграция 1С с локальными скриптами или утилитами на Windows. Например, бухгалтер запускает обработку, которая по COM забирает остатки из базы склада — для такой задачи механизм прост и надёжен.
Не подходит COM для интеграций через интернет, для работы с Linux-сервером 1С, для мобильных клиентов и для обменов с большим числом параллельных подключений. Каждое COM-соединение занимает лицензию и держит ресурсоёмкий сеанс, поэтому десятки одновременных подключений быстро упираются в лицензионные и аппаратные ограничения.
Альтернативы стоит рассматривать по задаче: для регулярных обменов между типовыми конфигурациями — планы обмена и формат EnterpriseData, для доступа внешних систем — HTTP-сервисы и стандартный OData-интерфейс, для интеграции с сайтом — веб-сервисы. Эти механизмы не требуют Windows на стороне клиента и не расходуют лицензию на каждое подключение так, как COM.
Сравнение способов интеграции
Быстрое прямое подключение в локальной сети Windows; требует совпадения версий платформы, занимает лицензию, не работает через интернет и на Linux.
Подходят для внешних систем и веб-интеграций; требуют публикации на веб-сервере и продуманной авторизации.
Штатный механизм регулярных обменов между типовыми конфигурациями; асинхронный, но требует настройки сопоставления объектов.
Как написать COM-подключение: пример кода
Минимальный фрагмент подключения из одной базы 1С к другой выглядит так. Сначала создаётся коннектор, затем выполняется попытка соединения с обработкой ошибки — это обязательно, потому что база может быть недоступна, заблокирована или пароль окажется неверным.
Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "File=""D:\Bases\Trade"";Usr=""Обмен"";Pwd=""Secret"";";
Попытка
Соединение = Коннектор.Connect(СтрокаПодключения);
Исключение
Сообщить("Не удалось подключиться: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Соединение = Неопределено;
Коннектор = Неопределено;
Обратите внимание на ключевой приём: объекты, с которыми работаете внутри подключённой базы (запросы, документы, элементы справочников), нужно создавать через Соединение.NewObject() или через менеджеры соединения, а не через Новый текущей базы. Объект, созданный в «своей» базе, нельзя передать в чужую — это одна из самых частых ошибок начинающих.
Завершать работу следует явным освобождением переменных: присвоить Неопределено сначала соединению, потом коннектору. Если этого не сделать, сеанс в подключённой базе может остаться висеть до завершения работы вызывающего приложения, удерживая лицензию и блокировки.
- 1Убедитесь, что на компьютере, откуда выполняется подключение, установлена та же версия платформы, что и у целевой базы (или зарегистрирован нужный компонент comcntr.dll).
- 2Создайте в целевой базе отдельного пользователя для обмена с минимально необходимыми правами.
- 3Сформируйте строку подключения: File= для файловой базы, Srvr/Ref для серверной, плюс Usr и Pwd.
- 4Создайте объект Новый COMОбъект("V83.COMConnector") и вызовите Connect() внутри блока Попытка/Исключение.
- 5Работайте с данными через Соединение.NewObject() и менеджеры соединения.
- 6По завершении обнулите переменные соединения и коннектора, проверьте, что сеанс в целевой базе закрылся.
Требования к окружению и регистрация компонента
Для работы COM-соединения на машине, которая инициирует подключение, должен быть зарегистрирован COM-компонент платформы — файл comcntr.dll. При обычной установке платформы он регистрируется автоматически. Если подключение выполняется с сервера 1С или с компьютера, где ставились только отдельные компоненты, регистрацию иногда приходится выполнять вручную.
Ручная регистрация выполняется командой от имени администратора: regsvr32 "C:\Program Files\1cv8\<версия>\bin\comcntr.dll". Путь зависит от установленной версии платформы и разрядности. После регистрации объект V83.COMConnector становится доступен для создания.
Разрядность имеет значение: 32-разрядное приложение не сможет использовать 64-разрядный компонент и наоборот. Если подключение выполняется из внешнего скрипта или сторонней программы, проверьте, что разрядность вызывающего процесса совпадает с разрядностью зарегистрированной библиотеки. Ошибка «Класс не зарегистрирован» почти всегда означает либо отсутствие регистрации, либо несовпадение разрядности.
Ограничения и риски, о которых нужно знать заранее
Первое ограничение — лицензии. COM-соединение к серверной базе занимает клиентскую лицензию так же, как обычный сеанс пользователя. При массовых обменах это приводит к ошибкам «не найдено свободной лицензии». Планируйте обмены с учётом лицензионного запаса или выбирайте механизмы без лицензионной стоимости подключения.
Второе — блокировки и транзакции. Код, выполняемый через COM, работает в базе как полноценный сеанс: длительные транзакции через соединение блокируют записи и мешают пользователям. Избегайте массовой записи документов в одной транзакции через COM в рабочее время; разбивайте операции на порции.
Третье — безопасность. Пароль пользователя в строке подключения хранится в коде или настройках в открытом виде. Создавайте для COM-обмена отдельную учётную запись с ограниченными правами, не используйте учётные записи реальных пользователей и не давайте такой учётной записи права администратора без необходимости.
Типичные ошибки и способы их устранения
Самая частая проблема — ошибка создания объекта «V83.COMConnector»: «Класс не зарегистрирован» или «Недопустимая строка с указанием класса». Причины: компонент не установлен, не зарегистрирован или несовпадение разрядности. Лечится регистрацией comcntr.dll нужной разрядности от имени администратора.
Вторая группа ошибок — на этапе Connect(): «Информационная база не обнаружена», «Ошибка аутентификации», «База заблокирована». Здесь проверяют строку подключения (путь, имя сервера, имя базы в кластере), логин и пароль, а также наличие блокировки соединений, установленной администратором на время регламентных работ.
Третья группа — ошибки уже внутри работающего кода: попытка передать в соединение объект своей базы, обращение к несуществующему реквизиту (конфигурации баз различаются), обрыв соединения при длительной операции. Все обращения к соединению стоит оборачивать в попытки с информативной обработкой исключений, чтобы понимать, на каком объекте произошёл сбой.
Как проверить, что подключение работает корректно
Минимальная проверка — выполнить через соединение простой запрос, например получить количество элементов какого-либо справочника, и сравнить результат с данными в целевой базе. Если запрос возвращает осмысленные данные, соединение и права настроены правильно.
Вторая контрольная точка — сеансы в целевой базе. В консоли кластера (для серверной базы) или в разделе «Активные пользователи» должно быть видно сеанс с типом «COM-соединение» от имени пользователя обмена. После завершения обработки и обнуления переменных этот сеанс должен исчезнуть. Если сеанс остаётся — соединение не освобождено.
Третья проверка — права: попробуйте через соединение прочитать объект, на который у пользователя обмена нет прав. Должна вернуться ошибка доступа, а не «тихий» пустой результат. Это подтверждает, что механизм прав работает и учётная запись не имеет избыточных полномочий.
Как проверить результат
Объект V83.COMConnector создаётся без исключения
Ошибка «Класс не зарегистрирован» — компонент не установлен или несовпадение разрядности
Метод возвращает объект соединения
Ошибка аутентификации или «база не обнаружена» — проверить строку подключения и права
Запрос возвращает данные, совпадающие с целевой базой
Пустой результат при наличии данных или ошибка доступа к метаданным
Сеанс COM-соединения исчезает из списка активных пользователей
Сеанс висит — переменные соединения не освобождены
Часто задаваемые вопросы
Можно ли подключиться через COM к базе на другом компьютере?
Да, если база серверная — укажите в строке подключения сервер и имя базы (Srvr/Ref), и подключение пойдёт через кластер. Для файловой базы на другом компьютере нужен общий сетевой доступ к каталогу базы, но такой режим медленный и чувствителен к разрывам сети, поэтому для регулярных обменов лучше перевести базу в клиент-серверный вариант.
Работает ли COM-соединение на Linux?
Нет. Технология COM является частью Windows, поэтому инициировать COM-подключение можно только с Windows-машины. Сервер 1С на Linux может принимать COM-подключения от Windows-клиентов, но сам с Linux-хоста такое подключение создать нельзя — используйте HTTP-сервисы или OData.
Расходует ли COM-соединение лицензию 1С?
Да. Сеанс, создаваемый через COM-коннектор, занимает клиентскую лицензию наравне с обычным пользовательским сеансом. Это нужно учитывать при планировании обменов: несколько одновременных COM-подключений могут исчерпать лицензионный запас и заблокировать вход пользователям.
Чем отличаются V82.COMConnector и V83.COMConnector?
Это компоненты разных версий платформы: V82 для платформы 8.2, V83 для 8.3. Подключаться нужно коннектором, соответствующим версии платформы целевой базы. Если база работает на 8.3, используйте V83.COMConnector; коннектор 8.2 к базе 8.3 не подключится.
Почему возникает ошибка «Класс не зарегистрирован» при создании V83.COMConnector?
Чаще всего компонент comcntr.dll не установлен или не зарегистрирован на машине, откуда выполняется подключение, либо не совпадает разрядность: 32-разрядное приложение пытается использовать 64-разрядный компонент. Решение — установить платформу нужной разрядности или вручную выполнить regsvr32 для comcntr.dll от имени администратора.
Можно ли через COM вызвать процедуру из общего модуля другой базы?
Да, если общий модуль серверный, неглобальный и у него включён признак «Вызов сервера» (и «Внешнее соединение»). Обращение выглядит как Соединение.ИмяОбщегоМодуля.ИмяПроцедуры(). Глобальные модули и модули с клиентским контекстом через соединение недоступны.
Что важно запомнить
COM-соединение — это прямой доступ к базе 1С через V83.COMConnector, работающий только в Windows и занимающий лицензию. Подходит для локальных интеграций и разовых переносов данных; для регулярных и внешних обменов выбирайте HTTP-сервисы, OData или планы обмена. Всегда используйте отдельную учётную запись с минимальными правами, обрабатывайте ошибки, освобождайте соединение и тестируйте массовые операции на копии базы.