Как зарегистрировать библиотеку Compound.dll для 1С 7.7 в Windows x86 и x64?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При обслуживании и разработке решений на платформе 1С:Предприятие 7.7 часто возникает необходимость низкоуровневой работы с файлами структурированного хранилища (Compound Files), такими как файлы внешних отчетов (.ert), конфигураций (.md) или списка пользователей (users.usr). Для этих задач традиционно применялась внешняя COM-компонента Compound.dll (программный идентификатор Amber.Compound).

Однако в современных версиях Windows штатная регистрация через стандартную утилиту regsvr32 нередко завершается сбоем или сообщением: «Ошибка при вызове LoadLibrary - Неверная попытка доступа к адресу памяти». Разберем по шагам, почему возникает эта ошибка, как зарегистрировать библиотеку вручную через системный реестр и какие существуют современные альтернативы.

Анализ причин сбоя стандартной регистрации

Прежде чем приступать к исправлению, выясним причину, по которой стандартный вызов regsvr32 Compound.dll не срабатывает:

  1. Срабатывание механизма DEP (Data Execution Prevention): Ошибка LoadLibrary с системным кодом 998 (ERROR_NOACCESS — «Неверная попытка доступа к адресу памяти») в большинстве случаев вызвана защитой DEP. Библиотека создавалась под старые операционные системы, и при инициализации функции DllMain происходит обращение к секциям памяти без разрешения на исполнение, что немедленно блокируется ядром Windows.
  2. Архитектурный конфликт в 64-битных ОС: Команда regsvr32, запущенная без указания полного пути в 64-разрядной Windows, вызывает 64-битную версию из папки System32. 64-битный процесс не может загрузить 32-битную DLL.
  3. Блокировка безопасности скачанных файлов: Файлы, полученные через интернет, помечаются специальным флагом блокировки NTFS (Zone.Identifier).

Решение 1. Ручная регистрация через системный реестр

Если механизм саморегистрации библиотеки через точку входа DllRegisterServer дает сбой, мы можем прописать все необходимые ключи COM-сервера напрямую в реестр Windows. Разберем этот способ подробно.

Создадим текстовый файл с расширением .reg, скопируем в него приведенный ниже код и выполним слияние с реестром от имени администратора. Обратите внимание: пути к файлу библиотеки в реестре необходимо указывать с двойными обратными слэшами и заменить на фактический каталог размещения файла на вашем компьютере (например, C:\\Program Files (x86)\\1Cv77\\BIN\\COMPOUND.DLL).


Windows Registry Editor Version 5.00

; Регистрация ProgID
[HKEY_CLASSES_ROOT\Amber.Compound]
@="Amber.Compound"

[HKEY_CLASSES_ROOT\Amber.Compound\Clsid]
@="{78191F00-4E73-11D5-918E-000000000000}"

; Регистрация CLSID для 32-разрядных систем
[HKEY_CLASSES_ROOT\CLSID\{78191F00-4E73-11D5-918E-000000000000}]
@="Amber.Compound"

[HKEY_CLASSES_ROOT\CLSID\{78191F00-4E73-11D5-918E-000000000000}\InprocServer32]
@="C:\\Program Files\\1Cv77\\BIN\\COMPOUND.DLL"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{78191F00-4E73-11D5-918E-000000000000}\ProgID]
@="Amber.Compound"

; Дублирование в HKLM
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Amber.Compound\Clsid]
@="{78191F00-4E73-11D5-918E-000000000000}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{78191F00-4E73-11D5-918E-000000000000}\InprocServer32]
@="C:\\Program Files\\1Cv77\\BIN\\COMPOUND.DLL"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{78191F00-4E73-11D5-918E-000000000000}\ProgID]
@="Amber.Compound"

; Обязательная ветка подсистемы WOW64 для 64-разрядных Windows (x64)
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{78191F00-4E73-11D5-918E-000000000000}]
@="Amber.Compound"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{78191F00-4E73-11D5-918E-000000000000}\InprocServer32]
@="C:\\Program Files\\1Cv77\\BIN\\COMPOUND.DLL"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{78191F00-4E73-11D5-918E-000000000000}\ProgID]
@="Amber.Compound"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{78191F00-4E73-11D5-918E-000000000000}]
@="Amber.Compound"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{78191F00-4E73-11D5-918E-000000000000}\InprocServer32]
@="C:\\Program Files\\1Cv77\\BIN\\COMPOUND.DLL"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{78191F00-4E73-11D5-918E-000000000000}\ProgID]
@="Amber.Compound"

После применения данного .reg-файла создание объекта в коде 1С через команду СоздатьОбъект("Amber.Compound") сможет найти зарегистрированный класс и связать его с DLL в обход встроенного механизма регистрации.

Решение 2. Корректная регистрация через 32-битный regsvr32 и настройка DEP

Если мы хотим зарегистрировать модуль штатным методом через командную строку, выполним следующие шаги:

  1. Снятие блокировки файла: Нажмем правой кнопкой мыши на файл Compound.dll, перейдем в «Свойства» и на вкладке «Общие» проверим наличие предупреждения о безопасности. Если отображается кнопка «Разблокировать», нажмем ее и применим изменения.
  2. Настройка исключений DEP: Откроем «Свойства системы» → вкладка «Дополнительно» → раздел «Быстродействие» (кнопка «Параметры») → вкладка «Предотвращение выполнения данных». Если выбран вариант включения DEP для всех программ, кроме списка, добавим туда исполняемый файл regsvr32.exe, а также исполняемый файл платформы 1cv7.exe.
  3. Запуск 32-разрядного регистратора: Запустим командную строку cmd.exe обязательно от имени администратора и выполним команду, явно обратившись к 32-битной версии утилиты: %SystemRoot%\SysWOW64\regsvr32.exe "C:\Program Files\1Cv77\BIN\COMPOUND.DLL"

Альтернативные способы работы с compound-документами 1С

Формат файлов 1С 7.7 представляет собой стандартную спецификацию Microsoft OLE Structured Storage. Если библиотека Compound.dll не подходит или вызывает сбои на современных серверных системах, рассмотрим более надежные альтернативные решения:

  1. Консольная утилита GComp: Общепринятый в сообществе инструмент для разборки и сборки compound-файлов 1С (файлов .md, .ert). Позволяет в автоматическом режиме командной строки извлекать внутренние потоки данных, редактировать их и упаковывать обратно без использования COM-библиотек.
  2. Архиватор 7-Zip: Штатный архиватор 7-Zip умеет открывать составные OLE-хранилища как обычные архивы. Файлы users.usr и .ert можно просто открыть в архиваторе и извлечь нужный поток для чтения.
  3. Использование Windows API (OLE32): В современных языках программирования или скриптах чтение таких файлов можно реализовать через вызовы функций системной библиотеки ole32.dll (методы StgOpenStorage, интерфейсы IStorage и IStream), что исключает зависимость от устаревших 32-разрядных внешних компонентов.
  4. Специализированные библиотеки администрирования: Для прямого управления пользователями в файле users.usr рекомендуется использовать специализированные решения, такие как внешняя компонента UsersDef.dll или классы проекта 1C++.
← На главную