Как исправить ошибку «Неудачная попытка создания объекта (ПерехватСобытий)» в 1С 7.7?

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

При переносе информационных баз 1С:Предприятия 7.7 на новый сервер или разворачивании их из резервной копии разработчики часто сталкиваются с ошибками инициализации внешних библиотек и компонентов. Одной из распространенных неполадок при старте конфигурации является сообщение «Неудачная попытка создания объекта (ПерехватСобытий)». Проанализируем причину возникновения этой проблемы и разберем по шагам, как восстановить работоспособность системы.

Анализ программного кода и выявление источника проблемы

Рассмотрим фрагмент кода в глобальном модуле (обычно в процедуре ПриНачалеРаботыСистемы), на котором происходит прерывание работы программы:


Настройки = СоздатьОбъект("УправлениеНастройками");
Настройки.Сбросить("Проверка типов");
Настройки.Сбросить("Отладка");
Настройки.Включить("Оптимизация");
Настройки.Включить("TurboBL");
Настройки.Включить("ПерехватитьСобытияГК");
ПерехватСобытий = СоздатьОбъект("ПерехватСобытий");
оПерехватчик = СоздатьОбъект("Перехватчик");

Разберем, что происходит при выполнении этих строк:

  1. Объект УправлениеНастройками является частью популярной внешней компоненты 1С++ (1cpp.dll). Если первая строка выполняется без ошибок, это означает, что сама DLL-библиотека успешно загружена в память процесса с помощью метода ЗагрузитьВнешнююКомпоненту.
  2. Объекты типа ПерехватСобытий не являются штатными COM-объектами Windows или предопределенными типами 1С++. Это пользовательские ООП-классы, реализованные средствами 1С++.
  3. Для того чтобы среда 1С++ знала о существовании таких классов, при старте должен считываться файл описания классов — по умолчанию defcls.prm, расположенный в каталоге информационной базы.

Если при переносе базы из бэкапа были скопированы файлы данных и DLL-библиотеки, но забыт служебный конфигурационный файл defcls.prm (или файлы исходного кода классов), метод СоздатьОбъект не сможет найти описание класса и завершится с критической ошибкой.

Пошаговое решение проблемы

Выполним следующие действия для исправления ошибки:

  1. Проверим наличие файла описания классов: перейдем в каталог информационной базы на новом сервере и убедимся, что там присутствует файл defcls.prm. Если его нет, перенесем его из исходной резервной копии или со старого сервера.
  2. Проверим пути к файлам реализации классов: откроем файл defcls.prm текстовым редактором. В нем содержатся пути к модулям классов (файлы с расширениями .ert, .cls или .txt). Убедимся, что все указанные каталоги (например, подпапка Классы) и вложенные файлы скопированы в каталог базы данных в полном объеме.
  3. Проверим синтаксис директив #include: если в файле описания классов используются вложенные включения других конфигурационных файлов через директиву #include, необходимо удостовериться, что каждый подключаемый файл физически доступен по указанному пути.

Дополнительные факторы при переносе 1С 7.7 на современные серверные ОС

Если файл defcls.prm на месте, но ошибки инициализации сохраняются, проанализируем системные параметры операционной системы:

  1. Предотвращение выполнения данных (DEP): компонента 1С++ и механизмы перехвата событий (такие как TurboBL и ПерехватитьСобытияГК) осуществляют динамическую модификацию исполняемого кода в оперативной памяти. Аппаратный механизм защиты DEP в Windows Server может блокировать подобные операции. Добавим исполняемые файлы 1cv7s.exe и 1cv7.exe в исключения DEP либо настроим режим OptIn.
  2. Регистрация 32-битных библиотек: если внешняя компонента регистрируется в системе через утилиту regsvr32, на 64-разрядных операционных системах необходимо использовать утилиту из каталога C:\Windows\SysWOW64\regsvr32.exe, а не системную 64-битную по умолчанию. При этом для 1С++ системная регистрация необязательна — достаточно положить 1cpp.dll рядом с базой и вызвать программную загрузку.
  3. Наличие библиотек среды выполнения Visual C++: для корректной работы 1cpp.dll требуются 32-разрядные библиотеки Microsoft Visual C++ Redistributable (x86), соответствующие версии компилятора используемой сборки компоненты.
  4. Права доступа: пользователям терминального сервера требуются права на чтение и запись не только в каталог базы данных, но и в каталог временных файлов %TEMP%.

Альтернативный вариант: программная загрузка классов

Чтобы снизить зависимость конфигурации от статического файла defcls.prm в корне каталога базы, можно использовать метод программной инициализации классов средствами встроенного языка 1С++:


Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "1cpp.dll") = 1 Тогда
    Классы = СоздатьОбъект("ЗагрузчикКлассов");
    Классы.ЗагрузитьКлассы(КаталогИБ() + "defcls.prm");
КонецЕсли;

Явное указание пути через КаталогИБ() гарантирует, что система найдет файлы описания классов независимо от текущего рабочего каталога запускаемого процесса 1С:Предприятия.

← На главную