Регистрируем 64-битную DLL и COM-коннектор 1С утилитой regsvr32
Содержание
Для 64-битной библиотеки запускайте regsvr32 из каталога C:\Windows\System32, для 32-битной — из C:\Windows\SysWOW64. Названия папок в 64-битной Windows устроены наоборот, и именно на этом спотыкается большинство.
Чаще всего под «регистрацией DLL для 1С» имеют в виду COM-коннектор comcntr.dll — библиотеку, через которую внешняя программа или web-сервер соединяется с базой по технологии V83.COMConnector. Разберём, какую DLL регистрировать в x64, какой именно regsvr32 для этого нужен, и когда регистрация вообще не требуется.
Регистрация нужна только COM-библиотекам. Внешние компоненты по технологии Native (расширения для сканеров, оборудования, обмена) через regsvr32 не ставятся — для них есть ПодключитьВнешнююКомпоненту(). Как отличить одно от другого — в конце статьи.
Какой regsvr32 запускать и какую DLL регистрировать
В 64-битной Windows живут две утилиты regsvr32 с одинаковым именем, но разной разрядностью:
| Разрядность DLL | Какой regsvr32 | Полный путь |
|---|---|---|
| 64 бита (x64) | 64-битный | C:\Windows\System32\regsvr32.exe |
| 32 бита (x86) | 32-битный | C:\Windows\SysWOW64\regsvr32.exe |
Выглядит нелогично: папка System32 хранит 64-битные модули, а SysWOW64 — 32-битные. Так в Windows исторически обеспечивается совместимость со старыми программами. Запомнить проще по правилу: разрядность DLL и разрядность regsvr32 должны совпадать, иначе получите ошибку загрузки модуля.
Почему это так жёстко: процесс Windows загружает библиотеку в своё адресное пространство, а оно либо 32-битное, либо 64-битное. 64-битная программа физически не может загрузить 32-битную DLL, и наоборот. regsvr32 перед регистрацией тоже загружает библиотеку, поэтому обязан быть той же разрядности, что и сам файл.
Если разрядность стороннего файла неизвестна, самый надёжный ориентир — каталог, из которого он взят, и разрядность программы-поставщика. Для comcntr.dll хватает каталога платформы: Program Files — 64 бита, Program Files (x86) — 32 бита.
Разрядность comcntr.dll совпадает с разрядностью установленной платформы 1С, а её легко определить по каталогу установки:
- 🟢 64-битная платформа —
C:\Program Files\1cv8\<номер версии>\bin\comcntr.dll; - 🟡 32-битная платформа —
C:\Program Files (x86)\1cv8\<номер версии>\bin\comcntr.dll.
Важный момент про назначение: регистрировать нужно ту разрядность коннектора, которая совпадает с программой, устанавливающей соединение. Если COM-связь с базой инициирует 64-битный процесс (например, 64-битный сервер приложений или 64-битный скрипт), берите 64-битный comcntr.dll. Если соединение создаёт 32-битное приложение (скажем, 32-битный Excel или старый внешний модуль) — ставьте 32-битную версию.
Сам коннектор нужен для внешнего соединения с базой: загрузки данных из сторонней программы, обмена между базами по COM, запуска операций из скрипта планировщика. Для обычной интерактивной работы пользователя он не требуется — база открывается штатным клиентом без всякой регистрации.
Что подготовить: права, Visual C++ и путь к файлу
Три вещи, без которых регистрация сорвётся:
- Права администратора.
regsvr32пишет в ветку реестраHKEY_CLASSES_ROOT, а туда обычному пользователю доступ закрыт. Командную строку нужно запускать от имени администратора. - Visual C++ Redistributable.
comcntr.dllзависит от среды выполнения Microsoft Visual C++ той же разрядности, что и платформа. Если её нет, регистрация падает с ошибкой загрузки. - Точный путь к DLL. Проверьте номер установленной версии в каталоге
1cv8— он входит в путь и у каждого свой.
Запускать regsvr32 просто двойным кликом бесполезно: окно мелькнёт без прав администратора и вернёт ошибку доступа. Всегда работайте через командную строку, открытую с повышенными правами.
Чтобы открыть командную строку от администратора: в поиске Windows наберите cmd, щёлкните по «Командная строка» правой кнопкой и выберите «Запуск от имени администратора». В заголовке окна появится слово «Администратор» — это и есть признак, что права получены.
Про Visual C++: нужную версию среды выполнения ставит сам установщик платформы 1С, отдельно скачивать её обычно не нужно — достаточно устанавливать платформу штатным инсталлятором, а не распаковывать файлы вручную. Если comcntr.dll перенесли на машину простым копированием, без установки платформы, среды выполнения может не оказаться — тогда и появляется ошибка загрузки модуля.
Если на сервере установлены и 32-, и 64-битная платформы, ориентируйтесь на разрядность той службы агента сервера, через которую работают пользователи: на современных серверах это, как правило, 64 бита. Разрядность клиентской платформы на рабочем месте проще всего увидеть по каталогу 1cv8: путь в Program Files без (x86) означает 64 бита.
Регистрация COM-коннектора через командную строку: по шагам
Порядок действий одинаков для любой COM-библиотеки 1С, меняется только путь к файлу.
- Откройте командную строку от имени администратора (как описано выше).
- Определите разрядность
comcntr.dllпо каталогу установки платформы. - Соберите команду: сначала полный путь к нужному
regsvr32, затем в кавычках — путь к DLL.
Для 64-битной платформы (номер версии подставьте свой):
"C:\Windows\System32\regsvr32.exe" "C:\Program Files\1cv8\8.3.24.1234\bin\comcntr.dll"
Для 32-битной платформы на 64-битной Windows:
"C:\Windows\SysWOW64\regsvr32.exe" "C:\Program Files (x86)\1cv8\8.3.24.1234\bin\comcntr.dll"
- Нажмите Enter. При успехе появится окно с текстом вида «DllRegisterServer в … выполнено успешно».
Полезные ключи утилиты:
/s— «тихий» режим без всплывающего окна, удобно для скриптов:regsvr32 /s "путь";/u— отменить регистрацию (разрегистрировать) библиотеку:regsvr32 /u "путь".
- Проверьте результат. Регистрация создаёт COM-класс с идентификатором
V83.COMConnector, и если библиотека прописана верно, объект создаётся без ошибки. Проще всего проверить коротким скриптом или прямо из внешней программы:
Set Connector = CreateObject("V83.COMConnector")
Для платформы 8.2 идентификатор назывался V82.COMConnector — если переносите старый скрипт, замените его на V83.COMConnector, иначе соединение не установится даже при зарегистрированной библиотеке.
Если на машине стоит несколько версий платформы, COM-коннектор V83.COMConnector будет указывать на ту comcntr.dll, которую зарегистрировали последней. Чтобы переключиться на нужную версию, просто зарегистрируйте её comcntr.dll поверх — отдельно снимать прежнюю регистрацию не обязательно.
Путь к bin в кавычки берут обязательно: в нём есть пробелы (Program Files), и без кавычек командная строка разорвёт путь на части.
Ошибки regsvr32 и коды возврата: что означают
Сообщения regsvr32 короткие и часто пугают кодами вида 0x8007xxxx. На практике это сводится к нескольким типовым причинам.
Код 0x0 или пустое сообщение об успехе означают, что регистрация прошла. Если после этого V83.COMConnector всё равно не создаётся во внешней программе, проверяйте разрядность самой этой программы — она должна совпадать с разрядностью зарегистрированного коннектора.
Частый случай — подключение к базе из Excel или Word через COM. Здесь разрядность коннектора должна совпадать с разрядностью самого Office, а не Windows. 32-битный Excel на 64-битной Windows работает только с 32-битным comcntr.dll, зарегистрированным через SysWOW64. Это самая распространённая причина ситуации «на одной машине работает, на другой — нет».
Регистрация на сервере и в клиент-серверной базе
В клиент-серверном варианте comcntr.dll регистрируют не на каждом рабочем месте, а там, где фактически создаётся COM-соединение.
- Если внешнее приложение обращается к базе со своего компьютера — коннектор регистрируется на этом компьютере.
- Если соединение инициирует серверный процесс (например, регламентное задание на сервере приложений или модуль web-сервера) — коннектор нужен на той машине, где крутится этот процесс, и его разрядность должна совпадать с разрядностью серверного процесса.
На сервере приложений платформа ставится вместе со службой 1C:Enterprise 8.x Server Agent. Если устанавливали серверную часть с опцией регистрации COM-коннектора, comcntr.dll уже прописан. Проверить это проще всего, попробовав создать объект коннектора из внешней программы; получили ошибку создания COM — регистрируйте вручную по инструкции выше.
Переустановка или обновление платформы на сервере требуют остановки службы агента сервера, а это оборвёт все активные пользовательские сеансы. Планируйте такие работы на окно обслуживания, когда в базе никто не работает, и предупредите пользователей заранее.
Отдельно про web-публикацию: при публикации базы на web-сервере внешние COM-подключения к ней идут через тот же механизм коннектора, поэтому разрядность модуля web-сервера (например, модуля для IIS или Apache) и зарегистрированного comcntr.dll тоже должны совпадать. Смешивать 32- и 64-битные части в одной цепочке нельзя.
Ещё один нюанс сервера связан с обновлениями. Новая версия платформы ставится в отдельный каталог bin, а запись в реестре продолжает указывать на comcntr.dll из старого каталога. После обновления коннектор на сервере регистрируют заново — уже на библиотеку из нового каталога версии, иначе внешние соединения будут обращаться к устаревшему модулю.
Когда regsvr32 не нужен: внешние компоненты и ПодключитьВнешнююКомпоненту
Главная путаница вокруг темы: не всякая DLL для 1С регистрируется через regsvr32. Утилита умеет работать только с COM-библиотеками, которые экспортируют функцию DllRegisterServer. Если её нет — вы увидите ошибку «точка входа не найдена», и это нормально: такую библиотеку регистрировать не нужно.
Современные внешние компоненты 1С 8.3 чаще всего делают по технологии Native API. Их не ставят в систему, а подключают прямо из встроенного языка:
ПодключитьВнешнююКомпоненту("ОбщийМакет.МояКомпонента", "МояКомпонента", ТипВнешнейКомпоненты.Native);
Такая компонента обычно поставляется архивом с файлом манифеста и отдельными DLL под каждую разрядность (x86 и x64). Платформа сама выбирает нужную версию под разрядность своего процесса — руками regsvr32 вызывать не надо.
Коротко, что чем подключается:
| Тип библиотеки | Как подключается |
|---|---|
COM-коннектор comcntr.dll | regsvr32 + создание V83.COMConnector во внешней программе |
COM-компонента (экспортирует DllRegisterServer) | regsvr32, затем подключение по ProgID |
| Внешняя компонента Native | без регистрации, через ПодключитьВнешнююКомпоненту() |
Понять, что перед вами Native-компонента, можно по поставке: это обычно ZIP-архив с файлом манифеста и несколькими DLL внутри, по одной на разрядность. COM-компонента приходит отдельной DLL, которую требуется «поставить в систему». Если документация к компоненте предписывает regsvr32 — это COM; если просит «добавить в макет и подключить из кода» — это Native. Есть и косвенная проверка: попытка зарегистрировать Native-файл через regsvr32 вернёт ошибку «точка входа DllRegisterServer не найдена».
При массовой установке COM-коннектора на несколько машин команду regsvr32 /s обычно кладут в bat-файл и запускают от имени администратора — через средства развёртывания или вручную. Так не приходится регистрировать библиотеку на каждом компьютере по отдельности, а «тихий» ключ /s не выводит окон на рабочих местах.
Если не помогло: когда COM-компоненту по каким-то причинам нельзя зарегистрировать (нет прав на сервере, политика безопасности), выбор обычно смещают в сторону Native-компоненты или прямого соединения с базой через web-сервис, где регистрация в реестре не требуется вовсе.
Частые вопросы
Чем отличается regsvr32 из System32 и SysWOW64?
Где взять comcntr.dll, если его нет в каталоге bin?
bin.Нужны ли права администратора для регистрации?
regsvr32 пишет в реестр, поэтому командную строку обязательно открывать через «Запуск от имени администратора». Без этого будет ошибка 0x80070005.Можно ли зарегистрировать сразу две разрядности коннектора?
comcntr.dll можно зарегистрировать на одной машине соответствующими версиями regsvr32. Каждая обслуживает программы своей разрядности.