При обслуживании и разработке решений на платформе 1С:Предприятие 7.7 часто возникает необходимость низкоуровневой работы с файлами структурированного хранилища (Compound Files), такими как файлы внешних отчетов (.ert), конфигураций (.md) или списка пользователей (users.usr). Для этих задач традиционно применялась внешняя COM-компонента Compound.dll (программный идентификатор Amber.Compound).
Однако в современных версиях Windows штатная регистрация через стандартную утилиту regsvr32 нередко завершается сбоем или сообщением: «Ошибка при вызове LoadLibrary - Неверная попытка доступа к адресу памяти». Разберем по шагам, почему возникает эта ошибка, как зарегистрировать библиотеку вручную через системный реестр и какие существуют современные альтернативы.
Прежде чем приступать к исправлению, выясним причину, по которой стандартный вызов regsvr32 Compound.dll не срабатывает:
LoadLibrary с системным кодом 998 (ERROR_NOACCESS — «Неверная попытка доступа к адресу памяти») в большинстве случаев вызвана защитой DEP. Библиотека создавалась под старые операционные системы, и при инициализации функции DllMain происходит обращение к секциям памяти без разрешения на исполнение, что немедленно блокируется ядром Windows.regsvr32, запущенная без указания полного пути в 64-разрядной Windows, вызывает 64-битную версию из папки System32. 64-битный процесс не может загрузить 32-битную DLL.Если механизм саморегистрации библиотеки через точку входа 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 в обход встроенного механизма регистрации.
Если мы хотим зарегистрировать модуль штатным методом через командную строку, выполним следующие шаги:
Compound.dll, перейдем в «Свойства» и на вкладке «Общие» проверим наличие предупреждения о безопасности. Если отображается кнопка «Разблокировать», нажмем ее и применим изменения.regsvr32.exe, а также исполняемый файл платформы 1cv7.exe.cmd.exe обязательно от имени администратора и выполним команду, явно обратившись к 32-битной версии утилиты:
%SystemRoot%\SysWOW64\regsvr32.exe "C:\Program Files\1Cv77\BIN\COMPOUND.DLL"
Формат файлов 1С 7.7 представляет собой стандартную спецификацию Microsoft OLE Structured Storage. Если библиотека Compound.dll не подходит или вызывает сбои на современных серверных системах, рассмотрим более надежные альтернативные решения:
.md, .ert). Позволяет в автоматическом режиме командной строки извлекать внутренние потоки данных, редактировать их и упаковывать обратно без использования COM-библиотек.users.usr и .ert можно просто открыть в архиваторе и извлечь нужный поток для чтения.ole32.dll (методы StgOpenStorage, интерфейсы IStorage и IStream), что исключает зависимость от устаревших 32-разрядных внешних компонентов.users.usr рекомендуется использовать специализированные решения, такие как внешняя компонента UsersDef.dll или классы проекта 1C++.