Как устроено COM-подключение к базе 1С и что нужно для его работы

· 10 мин

Содержание

Внешнее соединение 1С — это подключение к информационной базе из другой программы через COM-объект V83.COMConnector, без запуска окна 1С. Чтобы его запустить, нужны три вещи: зарегистрированная библиотека comcntr.dll той же разрядности, что и вызывающая программа, правильная строка подключения и пользователь с правом «Внешнее соединение» в роли.

Частое заблуждение — считать, что внешнее соединение «открывает 1С в фоне». Это не так. Никакого клиентского приложения не стартует: платформа загружается прямо в процесс вызывающей программы, а наружу отдаётся серверный контекст базы. Форм, диалогов и клиентского кода там нет.

Как работает внешнее подключение к базе 1С

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

Что происходит на практике:

  • 🔌 коннектор comcntr.dll загружается в процесс вызывающего приложения (Excel, скрипт, служба, другая база 1С);
  • 🗄️ для файловой базы этот процесс сам открывает файлы базы; для клиент-серверной — подключается к кластеру серверов 1С;
  • 👤 создаётся обычный сеанс от имени указанного пользователя, со всеми его правами;
  • 📦 доступны только объекты серверного контекста и модуль внешнего соединения конфигурации.

Кто обычно пользуется внешним соединением:

  • обработки обмена «база — база», когда одна 1С читает данные другой напрямую;
  • скрипты администратора: выгрузить остатки, проверить список пользователей, запустить регламентную операцию;
  • сторонние программы на Windows (Python, C#, VBScript), которым нужны данные 1С.

Какой код выполняется во внешнем соединении

В конфигурации есть отдельный модуль — модуль внешнего соединения. Он выполняется при старте такого сеанса, как модуль сеанса для обычных пользователей.

Общий модуль доступен через внешнее соединение, только если в его свойствах отмечен флажок «Внешнее соединение». Если флажка нет, вызов функции модуля вернёт ошибку «метод не найден», хотя в Конфигураторе модуль на месте.

Способы подключения: COM-соединение и его альтернативы

Внешнее соединение — не единственный способ достучаться до базы снаружи. Перед настройкой стоит понять, подходит ли оно под задачу.

СпособКак работаетКогда выбиратьОграничения
Внешнее соединение (V83.COMConnector)Платформа грузится в процесс вызывающей программыБыстрый доступ к данным из Windows-программ и другой базы 1СТолько Windows, только серверный контекст, версия должна совпадать с сервером
OLE Automation (V83.Application)Запускается полноценный клиент 1СНужен клиентский контекст, формы, печатьТяжелее, медленнее, требует права «Automation»
HTTP-сервисы, веб-сервисыЗапрос по HTTP к опубликованной базеИнтеграция с сайтами, мобильными и Linux-системамиНужна публикация на веб-сервере и разработка сервиса
ODataСтандартный REST-интерфейс к объектамЧтение и запись данных без программирования сервисаНужна публикация и настройка состава объектов

Если интеграция живёт годами и вызывается часто, HTTP-сервис обычно надёжнее: не зависит от разрядности, версии платформы на клиенте и регистрации DLL. Внешнее соединение хорошо для внутренних задач внутри одной Windows-инфраструктуры.

Строка подключения

Формат строки зависит от типа базы.

Файловая база:

File="D:\Bases\Buh";Usr="Обмен";Pwd="пароль";

Клиент-серверная база :

Srvr="srv1c";Ref="buh";Usr="Обмен";Pwd="пароль";

Здесь Srvr — имя сервера 1С (при нестандартном порте — srv1c:2541), Ref — имя базы в кластере, как оно указано в консоли администрирования. Если пользователь входит через аутентификацию Windows, параметры Usr и Pwd не указывают.

Подготовка и запуск внешнего соединения 1С по шагам

Шаг 1. Зарегистрируйте comcntr.dll

Библиотека лежит в каталоге bin установленной платформы. Регистрацию выполняют из командной строки, запущенной от имени администратора:

regsvr32 "C:\Program Files\1cv8\8.3.24.1342\bin\comcntr.dll"

Номер версии в пути подставьте свой. Для 32-битной платформы путь будет в C:\Program Files (x86)\1cv8\....

Установщик платформы не всегда регистрирует коннектор сам. Надёжнее выполнить regsvr32 вручную после каждого обновления платформы: регистрация привязана к конкретному каталогу версии.

Шаг 2. Проверьте разрядность

Разрядность коннектора должна совпадать с разрядностью программы, которая его вызывает. Это главный источник проблем.

  • 🖥️ 32-битный Excel или 32-битный Python — нужен comcntr.dll из 32-битной платформы;
  • 🖥️ 64-битная программа — из 64-битной;
  • 🖥️ обработка 1С с кодом &НаСервере — коннектор нужен той разрядности, что и сервер 1С, и зарегистрирован на машине, где работают рабочие процессы rphost.

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

Шаг 3. Подготовьте пользователя и роль

В Конфигураторе у роли, которую получит пользователь обмена, должно быть включено право «Внешнее соединение». Оно находится в правах на корень конфигурации, рядом с правами «Тонкий клиент», «Толстый клиент» и «Веб-клиент».

В типовых конфигурациях роли менять в Конфигураторе не нужно: подходящие права уже есть у полных профилей. Назначение пользователю делается в режиме Предприятия через Администрирование → Настройки пользователей и прав.

Шаг 4. Подключитесь и проверьте

Минимальный пример на встроенном языке, из другой базы 1С:

&НаСервере
Процедура ПрочитатьНоменклатуруНаСервере()

	Коннектор = Новый COMОбъект("V83.COMConnector");
	Соединение = Коннектор.Connect("Srvr=""srv1c"";Ref=""buh"";Usr=""Обмен"";Pwd=""пароль"";");

	Запрос = Соединение.NewObject("Запрос");
	Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 Номенклатура.Наименование КАК Наименование
	|ИЗ Справочник.Номенклатура КАК Номенклатура";

	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Сообщить(Выборка.Наименование);
	КонецЦикла;

	Выборка = Неопределено;
	Запрос = Неопределено;
	Соединение = Неопределено;
	Коннектор = Неопределено;

КонецПроцедуры

Тот же доступ из VBScript для быстрой проверки, что коннектор вообще работает:

Set Connector = CreateObject("V83.COMConnector")
Set Base = Connector.Connect("File=""D:\Bases\Test"";Usr=""Exchange"";Pwd=""123"";")
WScript.Echo Base.Metadata.Name
Set Base = Nothing
Set Connector = Nothing

Если скрипт напечатал имя конфигурации — регистрация, разрядность и права в порядке. Дальше ищите проблему уже в своём коде.

Запускайте .vbs нужным интерпретатором: C:\Windows\SysWOW64\cscript.exe — 32-битный, C:\Windows\System32\cscript.exe — 64-битный. Так за минуту видно, какая разрядность коннектора зарегистрирована.

Права доступа и безопасность внешнего соединения

Внешнее соединение получает ровно те права, что есть у пользователя из строки подключения. Поэтому безопасность настраивают через этого пользователя.

Правила, которые стоит соблюдать:

  1. Заведите отдельного пользователя под интеграцию, например «Обмен_Склад». Не подключайтесь от администратора.
  2. Дайте ему роль только с нужными объектами: чтение справочников, запись конкретных документов. Права «Администрирование» ему не нужны.
  3. Отключите этому пользователю интерактивный вход: оставьте право «Внешнее соединение» и уберите права на клиентские приложения. Тогда под его паролем нельзя будет зайти в базу руками.
  4. Не храните пароль в открытом виде в скриптах на общих дисках. Строка подключения передаётся в открытом виде, и любой, кто прочитал скрипт, получает доступ к базе.
  5. Если программа работает под доменной учётной записью службы, используйте аутентификацию Windows: пароль 1С тогда вообще не нужен в строке.

Внешнее соединение выполняет серверный код с правами пользователя. Через NewObject("Запрос") можно прочитать всё, на что у него есть право чтения. Ограничение «прочитать только остатки» обеспечивает только роль, а не сама программа-интегратор.

Внешнее соединение из служб и веб-приложений

Когда коннектор вызывает служба Windows или сайт на IIS, объект создаётся от имени учётной записи службы. У неё должен быть доступ к каталогу файловой базы (чтение и запись) или сетевой доступ к серверу 1С.

Распространённый приём для таких случаев — запуск коннектора как COM+ приложения:

  1. Откройте Службы компонентов (dcomcnfg).
  2. В разделе Приложения COM+ создайте пустое серверное приложение.
  3. Укажите учётную запись, от имени которой оно будет работать.
  4. Добавьте в него компонент comcntr.dll.

Коннектор тогда работает в отдельном процессе dllhost.exe. Это снимает конфликт разрядности: 32-битная программа может обращаться к 64-битному коннектору. Заодно падение 1С не роняет основное приложение.

Требования и ограничения COM-подключения

Перед внедрением сверьтесь с ограничениями, чтобы не переделывать интеграцию.

  • 🪟 Только Windows. COM — технология Windows. С Linux-машины так подключиться нельзя, нужны HTTP-сервисы или OData.
  • 🔢 Версия коннектора = версия сервера. Для клиент-серверной базы номер версии comcntr.dll должен совпадать с номером версии сервера 1С до последней цифры сборки. После обновления сервера коннектор на клиентских машинах тоже нужно обновить и перерегистрировать.
  • 🧩 Нет клиентского контекста. Формы, Предупреждение(), ВвестиСтроку() и прочий интерактив недоступны. Код с &НаКлиенте не вызвать.
  • 🔑 Лицензии. Внешнее соединение — полноценный сеанс. Если свободных лицензий нет, подключение не установится.
  • 🔒 Монопольный режим. Если база заблокирована для обновления конфигурации или установлен запрет начала сеансов, внешнее соединение тоже не откроется. Код блокировки передают параметром UC в строке подключения.
  • 🧵 Один процесс — одна версия платформы. В одном процессе нельзя одновременно держать коннекторы разных версий 8.3. Для двух серверов разных версий нужны разные процессы.

У объекта V83.COMConnector есть настройки пула соединений — PoolCapacity и PoolTimeout. Если программа часто подключается и отключается, пул избавляет от задержки на каждое новое подключение.

Ошибки при запуске внешнего соединения и что с ними делать

Тексты ошибок зависят от вызывающей программы: Excel, Python и 1С формулируют их по-разному. Ориентируйтесь на суть сообщения.

Диагностика: выберите симптом

Если ни одна ошибка не подошла, повторите подключение коротким VBScript из шага 4. Он отсекает проблемы вашего кода и сразу показывает, работает ли сам коннектор.

Контроль активных сеансов внешнего соединения

Каждое внешнее соединение видно в списках сеансов как отдельное приложение «COM-соединение». Это помогает найти зависшие подключения, которые держат лицензии и блокировки.

Где смотреть:

БазаГде видноЧто делать
Клиент-сервернаяКонсоль администрирования серверов 1С → кластер → Информационные базы → база → СеансыОтфильтровать по приложению, посмотреть пользователя, компьютер и время начала
Клиент-серверная, из командной строкиУтилита rac: rac session list с указанием кластераУдобно для скриптов мониторинга
ЛюбаяСписок активных пользователей в режиме ПредприятияВидно имя пользователя и приложение
ЛюбаяЖурнал регистрации с отбором по приложению «COM-соединение»История подключений и ошибок за период

Почему соединения «висят»

Сеанс внешнего соединения закрывается, когда освобождены все ссылки на COM-объекты, полученные через него. Если в коде осталась хоть одна переменная с объектом из чужой базы — выборка, запрос, ссылка на элемент — сеанс продолжит жить.

Поэтому в примерах выше переменные обнуляются в обратном порядке: сначала выборка и запрос, потом соединение и коннектор. В VBScript то же самое делают через Set ... = Nothing.

Принудительное завершение сеанса в консоли кластера обрывает работу программы, которая через него обращается к базе. Если в этот момент шла запись документов, транзакция откатится, а интегратор получит ошибку. Завершайте такие сеансы, когда обмен точно не идёт, например вне расписания выгрузки.

Перед запуском интеграции через внешнее соединение
Выполнено: 0 / 7

Частые вопросы

Можно ли подключиться внешним соединением к базе в облаке 1С:Фреш?
Нет. Прямого доступа к кластеру там нет, для интеграции используют HTTP-сервисы, OData или штатные механизмы обмена сервиса.
Нужно ли устанавливать платформу 1С на компьютер, откуда идёт подключение?
Да. Коннектор — часть платформы, отдельно его не поставить. Достаточно установить платформу нужной версии и разрядности и зарегистрировать comcntr.dll.
Чем внешнее соединение отличается от V83.Application?
V83.Application запускает полноценный клиент 1С со своим окном и клиентским контекстом. Внешнее соединение работает без интерфейса и быстрее, но даёт доступ только к серверной части.
Сколько внешних соединений можно открыть одновременно?
Ограничение задают лицензии и ресурсы сервера: каждое соединение — отдельный сеанс. Держать десятки параллельных сеансов ради одной интеграции не стоит, лучше использовать пул коннектора.
Можно ли запретить внешнее соединение в базе совсем?
Да, если ни у одной роли пользователей нет права «Внешнее соединение». Тогда подключение через коннектор будет отклоняться на этапе входа.