COM-коннектор 1С: регистрация comcntr.dll, права и первое подключение
Содержание
Чтобы установить COM-соединение с 1С 8.3, зарегистрируйте библиотеку comcntr.dll из папки bin установленной платформы командой regsvr32 от имени администратора, а затем создайте объект V83.COMConnector и вызовите у него метод Connect со строкой подключения к базе. Разрядность платформы, из которой берёте comcntr.dll, должна совпадать с разрядностью программы, которая открывает соединение.
Частое заблуждение — что COM-соединение «включается» где-то в настройках самой базы. Такой галочки нет. Соединение — это обычная системная COM-компонента Windows плюс пользователь 1С с нужными правами. Всё, что ниже, относится к платформе 8.3 и не зависит от конфигурации: Бухгалтерия, ЗУП или УТ подключаются одинаково.
Подготовка: что проверить до установки COM-соединения
Большая часть проблем с COM-соединением возникает до первой строки кода. Проверьте четыре вещи.
- 🖥️ Операционная система. COM — технология Windows. На Linux и macOS
comcntr.dllнет, там для обмена используют HTTP-сервисы, веб-сервисы или OData. - 📦 Полный дистрибутив платформы. Библиотека лежит в каталоге вида
C:\Program Files\1cv8\8.3.24.1467\bin\. В дистрибутиве только тонкого клиента её нет — ставьте полную технологическую платформу. - 🔢 Разрядность. 32-битная программа (например, 32-битный Excel или старый скрипт VBScript, запущенный 32-битным интерпретатором) видит только 32-битную регистрацию. 64-битная — только 64-битную.
- 🔑 Пользователь 1С. Нужен отдельный пользователь с паролем и правом на внешнее соединение. Подключаться под сотрудником бухгалтерии плохая идея: его сеанс и права смешаются с интеграцией.
Где искать нужную версию:
| Платформа | Типовой каталог |
|---|---|
| 64-битная | C:\Program Files\1cv8\<версия>\bin\comcntr.dll |
| 32-битная | C:\Program Files (x86)\1cv8\<версия>\bin\comcntr.dll |
Если на компьютере стоит несколько версий платформы, зарегистрированной окажется та, для которой regsvr32 запускали последним. Именно она и будет отвечать на V83.COMConnector.
Регистрация comcntr.dll: как установить COM-коннектор
Сама установка COM-компоненты сводится к одной команде. Но выполнять её нужно правильно.
Шаг 1. Откройте командную строку от администратора
Нажмите Пуск, наберите cmd, щёлкните правой кнопкой по «Командная строка» и выберите запуск от имени администратора. Без повышенных прав регистрация завершится ошибкой доступа.
Шаг 2. Выполните регистрацию
Для 64-битной платформы:
regsvr32 "C:\Program Files\1cv8\8.3.24.1467\bin\comcntr.dll"
Для 32-битной платформы на 64-битной Windows удобнее явно вызвать 32-битный regsvr32:
%SystemRoot%\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.24.1467\bin\comcntr.dll"
Номер версии подставьте свой. Успешная регистрация заканчивается окном «Успешное выполнение DllRegisterServer».
Шаг 3. Проверьте, что класс появился
reg query HKCR\V83.COMConnector\CLSID
Если команда вернула GUID — класс на месте. Быстрая проверка из PowerShell:
$c = New-Object -ComObject V83.COMConnector
$c.GetType()
Для проверки 32-битной регистрации запускайте 32-битный PowerShell из %SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\.
Шаг 4. Не забывайте про обновление платформы
После установки новой версии платформы перерегистрируйте comcntr.dll из её каталога. Иначе внешние программы продолжат работать через старую библиотеку, а при удалении старой версии соединение перестанет создаваться совсем.
Снять регистрацию можно ключом /u:
regsvr32 /u "C:\Program Files\1cv8\8.3.23.1997\bin\comcntr.dll"
Не путайте V83.COMConnector и V83.Application. Первый открывает лёгкое внешнее соединение без интерфейса. Второй запускает полноценный толстый клиент как OLE-сервер: он тяжелее, дольше стартует и показывает окна.
Права пользователя 1С и безопасность DCOM
Зарегистрированная библиотека — половина дела. Дальше пропускают или не пропускают две стороны: сама база 1С и Windows.
Права в базе
- Откройте базу в режиме Конфигуратора.
- Найдите роль, которую назначите пользователю интеграции, или создайте отдельную роль в расширении.
- В правах на корень конфигурации включите право «Внешнее соединение».
- Дайте роли права на те объекты, которые будет читать или записывать внешняя программа.
- В режиме 1С:Предприятие создайте пользователя, назначьте ему роль и задайте пароль.
У пользователя с полными правами право на внешнее соединение уже есть. Но для постоянной интеграции лучше узкая роль: если пароль утечёт, урон ограничится нужными справочниками.
Через COM доступны только общие модули с установленным флажком «Внешнее соединение» в свойствах модуля. Если внешняя программа не видит нужную процедуру, проверьте этот флажок и признак «Экспорт».
DCOM и COM+ для серверного вызова
Когда соединение открывает обычная программа под пользователем Windows, настраивать DCOM не нужно. Сложности начинаются, если Новый COMОбъект("V83.COMConnector") вызывается из серверного кода 1С. Он работает под учётной записью службы сервера (часто USR1CV8), и у неё может не хватить прав на создание объекта.
Проверенный приём — оформить коннектор как COM+ приложение:
- Запустите
dcomcnfg(Службы компонентов). - Откройте
Службы компонентов → Компьютеры → Мой компьютер → Приложения COM+. - Создайте новое пустое приложение, тип — серверное.
- На шаге удостоверения укажите учётную запись, под которой приложение будет работать.
- В созданном приложении откройте
Компонентыи добавьтеcomcntr.dllнужной разрядности через установку новых компонентов. - В свойствах приложения на вкладке безопасности при необходимости отключите принудительную проверку доступа или выдайте роль учётной записи службы 1С.
Так коннектор запускается в отдельном процессе под заданным пользователем. Сбой внешнего соединения не уронит рабочий процесс сервера.
Учётная запись, указанная в COM+ приложении, должна иметь доступ к каталогу файловой базы или к серверу 1С по сети. Пароль этой учётной записи храните так же аккуратно, как пароль администратора.
Строка подключения и первое соединение из внешнего приложения
Метод Connect принимает строку подключения. Её формат тот же, что в списке баз.
| Вариант базы | Строка подключения |
|---|---|
| Файловая | File="C:\Bases\Buh";Usr="Обмен";Pwd="secret"; |
| Клиент-серверная | Srvr="srv1c";Ref="buh";Usr="Обмен";Pwd="secret"; |
| Сервер с нестандартным портом | Srvr="srv1c:2541";Ref="buh";Usr="Обмен";Pwd="secret"; |
Внутри строки значения в кавычках. В языках, где кавычки экранируются, это главная причина опечаток.
Из самой 1С (другая база)
Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("Srvr=""srv1c"";Ref=""buh"";Usr=""Обмен"";Pwd=""secret"";");
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Организации.Наименование КАК Наименование ИЗ Справочник.Организации КАК Организации";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Объекты внутри чужой базы создают через NewObject, а не Новый. Код выполняется на той стороне, где создан коннектор: в клиентском модуле — на компьютере пользователя, в серверном — на сервере 1С.
Из VBScript
Set v8 = CreateObject("V83.COMConnector")
Set conn = v8.Connect("File=""C:\Bases\Buh"";Usr=""Обмен"";Pwd=""secret"";")
Set sel = conn.Справочники.Организации.Выбрать()
Do While sel.Следующий()
WScript.Echo sel.Наименование
Loop
Файл сохраняйте в кодировке, которую понимает cscript, иначе кириллические имена объектов не распознаются. Надёжнее вынести обращение к объектам в общий модуль базы и вызывать его функцию с латинским именем.
Из Python
import win32com.client
v8 = win32com.client.Dispatch("V83.COMConnector")
conn = v8.Connect('Srvr="srv1c";Ref="buh";Usr="Обмен";Pwd="secret";')
query = conn.NewObject("Запрос")
query.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Всего ИЗ Справочник.Контрагенты"
sel = query.Выполнить().Выбрать()
while sel.Следующий():
print(sel.Всего)
Нужен пакет pywin32, а разрядность Python должна совпадать с разрядностью зарегистрированного comcntr.dll.
Пароль в строке подключения не храните в коде. Берите его из переменной окружения или защищённого хранилища.
COM-соединение в клиент-серверном варианте
С серверной базой появляются ограничения, которых у файловой нет.
Версия коннектора равна версии сервера
Версия comcntr.dll на клиентской машине должна совпадать с версией сервера 1С до последней цифры. Сервер 8.3.24.1467 и коннектор 8.3.24.1342 не договорятся. После обновления сервера обновите платформу и перерегистрируйте библиотеку на всех машинах, откуда идут COM-подключения.
Сеть и порты
Клиент сначала обращается к агенту сервера (по умолчанию порт 1540), затем к менеджеру кластера (1541) и к рабочим процессам. Диапазон портов рабочих процессов задают в свойствах рабочего сервера, по умолчанию это 1560–1591. Если между машинами есть брандмауэр, откройте все три группы портов. Открыть только 1540 недостаточно.
Сеансы и нагрузка
- 🔄 Каждый вызов
Connectсоздаёт новый сеанс. Держите соединение открытым на время пакета операций, а не переподключайтесь на каждую запись. - 🧹 Сеанс закрывается, когда освобождается последняя ссылка на объект соединения. В скриптах присваивайте переменной
Nothing(VBScript) илиНеопределено(1С). - 👀 Внешние соединения видны в консоли кластера в списке сеансов. Если их копится десятки, значит, где-то не освобождаются ссылки.
- 🎫 Сеанс внешнего соединения — полноценный сеанс. Проверить, как он учитывается в лицензиях, можно командой
rac session list --licenses.
Если зависшие COM-сеансы приходится завершать из консоли кластера, учтите: принудительное завершение рвёт незаписанные транзакции этой интеграции. Делайте это вне окна обмена.
Как держать COM-интеграцию в рабочем состоянии
Соединение настроили один раз, а ломается оно обычно через месяцы, после обновлений. Несколько привычек снимают большую часть таких поломок.
Обработка ошибок в коде
Оборачивайте Connect и каждую операцию записи в обработку исключений. Текст ошибки пишите в журнал вместе с временем и строкой подключения без пароля. Тогда при сбое ночного обмена сразу видно, на каком этапе он остановился: на создании объекта, на входе в базу или на записи документа.
Попытка
Соединение = Коннектор.Connect(СтрокаПодключения);
Исключение
ЗаписьЖурналаРегистрации("Интеграция.COM", УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
Возврат;
КонецПопытки;
Запуск по расписанию
Если скрипт с COM-соединением запускает Планировщик заданий Windows, задание должно работать под той же учётной записью, под которой вы проверяли подключение вручную. У системной учётной записи другие права на сетевые каталоги, и файловая база по UNC-пути ей может быть недоступна.
Регламент обновления платформы
- 📝 Ведите список машин, где зарегистрирован
comcntr.dll. - 🔁 После обновления сервера 1С обновляйте платформу на каждой из них и перерегистрируйте библиотеку.
- ✅ Сразу после обновления запускайте тестовое подключение, а не ждите ночного обмена.
Ошибки при установке и подключении COM-соединения
Сообщения об ошибках у COM многословные, но причин немного.
Если ни одна ветка не подошла, проверьте строку подключения вручную: откройте эту же базу в обычном клиенте 1С с теми же сервером, именем базы и пользователем. Не открылась — дело не в COM.