Регистрируем 64-битную DLL и COM-коннектор 1С утилитой regsvr32

· 9 мин

Содержание

Для 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++ и путь к файлу

Три вещи, без которых регистрация сорвётся:

  1. Права администратора. regsvr32 пишет в ветку реестра HKEY_CLASSES_ROOT, а туда обычному пользователю доступ закрыт. Командную строку нужно запускать от имени администратора.
  2. Visual C++ Redistributable. comcntr.dll зависит от среды выполнения Microsoft Visual C++ той же разрядности, что и платформа. Если её нет, регистрация падает с ошибкой загрузки.
  3. Точный путь к DLL. Проверьте номер установленной версии в каталоге 1cv8 — он входит в путь и у каждого свой.

Запускать regsvr32 просто двойным кликом бесполезно: окно мелькнёт без прав администратора и вернёт ошибку доступа. Всегда работайте через командную строку, открытую с повышенными правами.

Чтобы открыть командную строку от администратора: в поиске Windows наберите cmd, щёлкните по «Командная строка» правой кнопкой и выберите «Запуск от имени администратора». В заголовке окна появится слово «Администратор» — это и есть признак, что права получены.

Про Visual C++: нужную версию среды выполнения ставит сам установщик платформы 1С, отдельно скачивать её обычно не нужно — достаточно устанавливать платформу штатным инсталлятором, а не распаковывать файлы вручную. Если comcntr.dll перенесли на машину простым копированием, без установки платформы, среды выполнения может не оказаться — тогда и появляется ошибка загрузки модуля.

Если на сервере установлены и 32-, и 64-битная платформы, ориентируйтесь на разрядность той службы агента сервера, через которую работают пользователи: на современных серверах это, как правило, 64 бита. Разрядность клиентской платформы на рабочем месте проще всего увидеть по каталогу 1cv8: путь в Program Files без (x86) означает 64 бита.

Перед запуском regsvr32 проверьте
Выполнено: 0 / 5

Регистрация COM-коннектора через командную строку: по шагам

Порядок действий одинаков для любой COM-библиотеки 1С, меняется только путь к файлу.

  1. Откройте командную строку от имени администратора (как описано выше).
  2. Определите разрядность comcntr.dll по каталогу установки платформы.
  3. Соберите команду: сначала полный путь к нужному 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"
  1. Нажмите Enter. При успехе появится окно с текстом вида «DllRegisterServer в … выполнено успешно».

Полезные ключи утилиты:

  • /s — «тихий» режим без всплывающего окна, удобно для скриптов: regsvr32 /s "путь";
  • /u — отменить регистрацию (разрегистрировать) библиотеку: regsvr32 /u "путь".
  1. Проверьте результат. Регистрация создаёт 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.dllregsvr32 + создание 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?
Первый регистрирует 64-битные DLL, второй — 32-битные. В 64-битной Windows имена папок устроены наоборот от ожидаемого, поэтому путают их постоянно.
Где взять comcntr.dll, если его нет в каталоге bin?
Он ставится опцией «COM-коннектор» в установщике платформы. Запустите инсталлятор 1С заново в режиме изменения и отметьте этот компонент — файл появится в bin.
Нужны ли права администратора для регистрации?
Да. regsvr32 пишет в реестр, поэтому командную строку обязательно открывать через «Запуск от имени администратора». Без этого будет ошибка 0x80070005.
Можно ли зарегистрировать сразу две разрядности коннектора?
Да, 32- и 64-битную comcntr.dll можно зарегистрировать на одной машине соответствующими версиями regsvr32. Каждая обслуживает программы своей разрядности.
Почему после регистрации V83.COMConnector всё равно не создаётся?
Чаще всего не совпадает разрядность: внешняя программа 32-битная, а зарегистрирован 64-битный коннектор (или наоборот). Приведите их к одной разрядности.