При переходе на современные операционные системы (например, при миграции с Windows Server 2008 на Windows Server 2016) разработчики и системные администраторы часто сталкиваются с неожиданным поведением старого, но проверенного временем программного кода. Одной из наиболее сложных проблем является падение платформы 1С:Предприятие с кодом исключения 0xc0000005 (нарушение прав доступа или Access Violation) при попытке динамического подключения внешних компонент.
Особенно остро эта проблема проявляется, если внешняя компонента была разработана на классической среде Visual FoxPro (VFP). Примечательно, что сбой происходит не в самом коде компоненты, а внутри стандартной библиотеки платформы 1С addin.dll. В этой статье мы подробно разберем, почему возникает эта ошибка, как операционная система Windows Server 2016 блокирует работу устаревших runtime-библиотек и какими способами можно полностью решить эту проблему.
Проанализируем типичный сценарий сбоя, зафиксированный в системном журнале событий Windows (Event Viewer):
Имя сбойного приложения: 1CV8.exe, версия: 8.3.17.1386
Имя сбойного модуля: addin.dll, версия: 8.3.17.1386
Код исключения: 0xc0000005
Смещение ошибки: 0x00005617
Путь сбойного приложения: C:\Program Files (x86)\1cv8\8.3.17.1386\bin\1CV8.exe
Путь сбойного модуля: C:\Program Files (x86)\1cv8\8.3.17.1386\bin\addin.dll
---
Для того чтобы найти эффективное решение, нам необходимо детально разобраться в механизмах взаимодействия платформы 1С, COM-технологии и подсистемы безопасности Windows Server 2016.
Выделим четыре основные причины, которые в совокупности приводят к аварийному завершению процесса 1CV8.exe:
ПодключитьВнешнююКомпоненту() с типом ТипВнешнейКомпоненты.COM, платформа пытается зарегистрировать DLL-библиотеку в реестре операционной системы «на лету». Для этого addin.dll вызывает стандартные экспортируемые функции библиотеки: сначала DllInstall (для регистрации в пользовательской ветке HKCU), а если она отсутствует — DllRegisterServer (для регистрации в системной ветке HKLM). Компоненты, скомпилированные в среде FoxPro, не поддерживают DllInstall и требуют записи строго в защищенную ветку реестра HKLM\Software\Classes. Без повышенных прав администратора эта операция блокируется ОС, а устаревший рантайм FoxPro некорректно обрабатывает ошибку доступа, вызывая падение всего хост-процесса.
0xc0000005.
C:\Program Files (x86)\1cv8\common\.... В Windows Server 2016 эта папка имеет жесткие ограничения на запись. Библиотека Visual FoxPro при старте по умолчанию пытается создать или перезаписать конфигурационные файлы ресурсов пользователя — foxuser.dbf и foxuser.fpt в своей рабочей директории. Невозможность создать эти файлы из-за нехватки прав приводит к моментальному краху рантайма VFP.
vfp9r.dll) в операционной системе должна присутствовать библиотека времени выполнения Microsoft Visual C++ 2003 года — msvcr71.dll. В современных версиях Windows Server этой библиотеки нет по умолчанию, в отличие от устаревших ОС вроде Windows Server 2008, куда она часто устанавливалась вместе с сопутствующим ПО.
---
Рассмотрим несколько эффективных способов решения этой проблемы, начиная от изменения логики интеграции в коде 1С и заканчивая тонкой настройкой операционной системы.
Самый надежный способ избежать конфликтов при вызове ПодключитьВнешнююКомпоненту — это полностью исключить этот шаг из кода 1С. Поскольку компонента является классическим COM-сервером, мы можем зарегистрировать её в операционной системе один раз (в процессе развертывания или администрирования сервера) и затем сразу создавать объект в коде 1С.
Выполним регистрацию компоненты в операционной системе вручную. Для этого запустим командную строку от имени Администратора и выполним регистрацию через 32-разрядную версию утилиты regsvr32, так как компонента FoxPro является 32-битной:
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\common\Info\Calcoper.dll"
После успешной регистрации в реестре Windows появится соответствующий класс с уникальным программным идентификатором (ProgID). Теперь проанализируем, как изменить код в конфигурации 1С.
Вместо нестабильного кода динамической регистрации:
// Избегайте этого вызова для старых компонент на Windows Server 2016
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("C:\Program Files (x86)\1cv8\common\Info\Calcoper.dll", "Расчет", ТипВнешнейКомпоненты.COM);
Мы будем использовать прямое создание COM-объекта через безопасный блок Попытка...Исключение:
Попытка
// Вместо "Расчет" используем ProgID, прописанный при компиляции вашей ВК в FoxPro
РасчетныйМодуль = Новый COMОбъект("Calcoper.Application");
// Выполняем расчетные операции
Результат = РасчетныйМодуль.ВыполнитьРасчет(Параметры);
Исключение
ЗаписатьЛогСобытий("Ошибка инициализации внешней компоненты Calcoper: " + ОписаниеОшибки(), УровеньЖурналаРегистрации.Ошибка);
ВызватьИсключение "Не удалось запустить модуль расчета. Обратитесь к системному администратору.";
КонецПопытки;
Этот подход гарантирует, что платформа 1С не будет пытаться выполнять низкоуровневые манипуляции с реестром при каждом запуске сеанса пользователя, что полностью исключит падение модуля addin.dll.
---
Если компонента падает даже при ручной регистрации через regsvr32, необходимо убедиться, что в операционной системе присутствуют все необходимые файлы среды выполнения FoxPro. Выполним следующие действия:
msvcr71.dll (его можно взять со старого работающего сервера Windows Server 2008 или из дистрибутива Visual FoxPro) и скопируем его в системную папку для 32-битных библиотек: C:\Windows\SysWOW64\.vfp9r.dll и файлы локализации ресурсов, например vfp9rrus.dll или vfp9renu.dll) имеют абсолютно одинаковую версию сборки (Build Number). Разночтения в версиях файлов ресурсов и основного ядра рантайма гарантированно приводят к ошибке 0xc0000005 на этапе инициализации COM-объекта.Calcoper.dll или скопируйте их в общую системную директорию C:\Windows\SysWOW64\.---
Как упоминалось в анализе причин, среда FoxPro пытается создавать служебные файлы таблиц ресурсов foxuser.dbf. Если библиотека расположена в защищенной директории Program Files (x86), операционная система заблокирует эту операцию.
Чтобы решить эту проблему кардинально на уровне исходного кода внешней компоненты, проделаем следующие шаги при компиляции проекта в Visual FoxPro:
config.fpw.
RESOURCE = OFF
config.fpw.Build COM DLL. Теперь конфигурационный файл будет внедрен непосредственно внутрь вашей DLL-библиотеки, и компонента больше не будет пытаться создавать посторонние файлы на диске сервера.---
Если особенности архитектуры системы не позволяют отказаться от динамического подключения внешней компоненты через ПодключитьВнешнююКомпоненту(), нам потребуется ослабить защитные механизмы операционной системы индивидуально для процесса 1С.
Разберем по шагам, как добавить исполняемый файл платформы 1С в исключения системного защитника Windows Server 2016:
C:\Program Files (x86)\1cv8\8.3.17.1386\bin\1CV8.exe).---
Падение платформы 1С с кодом 0xc0000005 при работе с легаси-компонентами на Windows Server 2016 — это классический конфликт современной подсистемы безопасности ОС со старыми стандартами разработки ПО. Наиболее технологичным и безопасным решением является Способ 1: ручная регистрация компоненты на сервере и последующая работа через прямой вызов Новый COMОбъект. Это позволит изолировать работу компоненты, повысить производительность и гарантировать стабильность работы сервера 1С:Предприятие.