Как устроено COM-подключение к базе 1С и что нужно для его работы
Содержание
Внешнее соединение 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-битный. Так за минуту видно, какая разрядность коннектора зарегистрирована.
Права доступа и безопасность внешнего соединения
Внешнее соединение получает ровно те права, что есть у пользователя из строки подключения. Поэтому безопасность настраивают через этого пользователя.
Правила, которые стоит соблюдать:
- Заведите отдельного пользователя под интеграцию, например «Обмен_Склад». Не подключайтесь от администратора.
- Дайте ему роль только с нужными объектами: чтение справочников, запись конкретных документов. Права «Администрирование» ему не нужны.
- Отключите этому пользователю интерактивный вход: оставьте право «Внешнее соединение» и уберите права на клиентские приложения. Тогда под его паролем нельзя будет зайти в базу руками.
- Не храните пароль в открытом виде в скриптах на общих дисках. Строка подключения передаётся в открытом виде, и любой, кто прочитал скрипт, получает доступ к базе.
- Если программа работает под доменной учётной записью службы, используйте аутентификацию Windows: пароль 1С тогда вообще не нужен в строке.
Внешнее соединение выполняет серверный код с правами пользователя. Через NewObject("Запрос") можно прочитать всё, на что у него есть право чтения. Ограничение «прочитать только остатки» обеспечивает только роль, а не сама программа-интегратор.
Внешнее соединение из служб и веб-приложений
Когда коннектор вызывает служба Windows или сайт на IIS, объект создаётся от имени учётной записи службы. У неё должен быть доступ к каталогу файловой базы (чтение и запись) или сетевой доступ к серверу 1С.
Распространённый приём для таких случаев — запуск коннектора как COM+ приложения:
- Откройте
Службы компонентов(dcomcnfg). - В разделе
Приложения COM+создайте пустое серверное приложение. - Укажите учётную запись, от имени которой оно будет работать.
- Добавьте в него компонент
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.
Принудительное завершение сеанса в консоли кластера обрывает работу программы, которая через него обращается к базе. Если в этот момент шла запись документов, транзакция откатится, а интегратор получит ошибку. Завершайте такие сеансы, когда обмен точно не идёт, например вне расписания выгрузки.