При переносе информационных баз 1С:Предприятия 7.7 на новый сервер или разворачивании их из резервной копии разработчики часто сталкиваются с ошибками инициализации внешних библиотек и компонентов. Одной из распространенных неполадок при старте конфигурации является сообщение «Неудачная попытка создания объекта (ПерехватСобытий)». Проанализируем причину возникновения этой проблемы и разберем по шагам, как восстановить работоспособность системы.
Рассмотрим фрагмент кода в глобальном модуле (обычно в процедуре ПриНачалеРаботыСистемы), на котором происходит прерывание работы программы:
Настройки = СоздатьОбъект("УправлениеНастройками");
Настройки.Сбросить("Проверка типов");
Настройки.Сбросить("Отладка");
Настройки.Включить("Оптимизация");
Настройки.Включить("TurboBL");
Настройки.Включить("ПерехватитьСобытияГК");
ПерехватСобытий = СоздатьОбъект("ПерехватСобытий");
оПерехватчик = СоздатьОбъект("Перехватчик");
Разберем, что происходит при выполнении этих строк:
УправлениеНастройками является частью популярной внешней компоненты 1С++ (1cpp.dll). Если первая строка выполняется без ошибок, это означает, что сама DLL-библиотека успешно загружена в память процесса с помощью метода ЗагрузитьВнешнююКомпоненту.ПерехватСобытий не являются штатными COM-объектами Windows или предопределенными типами 1С++. Это пользовательские ООП-классы, реализованные средствами 1С++.defcls.prm, расположенный в каталоге информационной базы.Если при переносе базы из бэкапа были скопированы файлы данных и DLL-библиотеки, но забыт служебный конфигурационный файл defcls.prm (или файлы исходного кода классов), метод СоздатьОбъект не сможет найти описание класса и завершится с критической ошибкой.
Выполним следующие действия для исправления ошибки:
defcls.prm. Если его нет, перенесем его из исходной резервной копии или со старого сервера.defcls.prm текстовым редактором. В нем содержатся пути к модулям классов (файлы с расширениями .ert, .cls или .txt). Убедимся, что все указанные каталоги (например, подпапка Классы) и вложенные файлы скопированы в каталог базы данных в полном объеме.#include: если в файле описания классов используются вложенные включения других конфигурационных файлов через директиву #include, необходимо удостовериться, что каждый подключаемый файл физически доступен по указанному пути.Если файл defcls.prm на месте, но ошибки инициализации сохраняются, проанализируем системные параметры операционной системы:
TurboBL и ПерехватитьСобытияГК) осуществляют динамическую модификацию исполняемого кода в оперативной памяти. Аппаратный механизм защиты DEP в Windows Server может блокировать подобные операции. Добавим исполняемые файлы 1cv7s.exe и 1cv7.exe в исключения DEP либо настроим режим OptIn.regsvr32, на 64-разрядных операционных системах необходимо использовать утилиту из каталога C:\Windows\SysWOW64\regsvr32.exe, а не системную 64-битную по умолчанию. При этом для 1С++ системная регистрация необязательна — достаточно положить 1cpp.dll рядом с базой и вызвать программную загрузку.1cpp.dll требуются 32-разрядные библиотеки Microsoft Visual C++ Redistributable (x86), соответствующие версии компилятора используемой сборки компоненты.%TEMP%.Чтобы снизить зависимость конфигурации от статического файла defcls.prm в корне каталога базы, можно использовать метод программной инициализации классов средствами встроенного языка 1С++:
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "1cpp.dll") = 1 Тогда
Классы = СоздатьОбъект("ЗагрузчикКлассов");
Классы.ЗагрузитьКлассы(КаталогИБ() + "defcls.prm");
КонецЕсли;
Явное указание пути через КаталогИБ() гарантирует, что система найдет файлы описания классов независимо от текущего рабочего каталога запускаемого процесса 1С:Предприятия.