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

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

При переносе информационных баз 1С:Предприятия 7.7 со старых операционных систем (Windows XP) на современные платформы (Windows 8, 8.1, 10) разработчики и администраторы часто сталкиваются с фатальной ошибкой при запуске:

Формекс=СоздатьОбъект("ServiceFormEx");
{Глобальный Модуль(2299)} Неудачная попытка создания объекта (ServiceFormEx)

В операционной системе Windows XP конфигурация работала без сбоев, но в новой среде выполнение глобального модуля аварийно прерывается. Разберем по шагам, почему возникает эта ошибка и как восстановить работоспособность базы данных.

Причина 1. Историческая путаница библиотек 1С++ и FormEx

Проанализируем архитектуру используемых внешних компонент. Идентификатор класса ServiceFormEx (или его русскоязычный синоним СервисРасшФормы) применялся исключительно в старых версиях универсальной библиотеки 1cpp.dll (ветки 1.x и ранние 2.x), когда функционал FormEx поставлялся встроенным непосредственно внутрь 1С++.

В актуальных версиях библиотеки 1С++ модуль FormEx был полностью выделен в отдельный независимый проект. Если в новой операционной системе была установлена свежая сборка внешней компоненты или подключена оригинальная библиотека FormEx.dll, класс ServiceFormEx перестает существовать.

В отдельной официальной библиотеке FormEx.dll данный базовый класс называется Сервис (на английском языке — Service). Соответственно, обращение к старому идентификатору вызывает сбой инициализации объекта в памяти.

Решение 1. Корректировка программного кода и имени класса

Рассмотрим, как изменить код создания объекта в глобальном модуле или подключаемых обработках. Если в рабочей среде используется актуальная версия FormEx.dll, необходимо заменить обращение к классу ServiceFormEx на Service или Сервис.

Посмотрим на пример вызова:


// Вместо устаревшего вызова:
// Сервис = СоздатьОбъект("ServiceFormEx");

// Используем актуальный идентификатор:
Сервис = СоздатьОбъект("Service");
// Или на русском языке:
// Сервис = СоздатьОбъект("Сервис");

Если данный объект использовался, например, для динамической компиляции и внедрения дополнительного глобального модуля программного кода, вызовы его методов сохраняются:


// Пример загрузки глобального модуля
Сервис = СоздатьОбъект("Service");
глДопМодуль = Сервис.ДобавитьГлобальныйМодуль(глДопМодульТекст);

// Пример выгрузки модуля при завершении
Если глДопМодуль > 0 Тогда
    Сервис = СоздатьОбъект("Service");
    Сервис.УдалитьГлобальныйМодуль(глДопМодуль);
КонецЕсли;

Причина 2. Отсутствие или неправильная загрузка внешней компоненты

Выясним причину поведения платформы при создании объектов внешних библиотек. Платформа 1С 7.7 при выполнении метода СоздатьОбъект() сначала ищет зарегистрированный класс среди уже загруженных в память внешних компонент. Если библиотека не загружена или функция инициализации вернула 0, платформа перенаправляет поиск в системный реестр Windows (пытаясь инициализировать его как системный COM/OLE-сервер). Если класс не зарегистрирован в реестре ОС, возникает сообщение «Неудачная попытка создания объекта».

Решение 2. Проверка размещения DLL и корректная загрузка в коде

Разберем по шагам правильное размещение и инициализацию необходимых файлов:

  1. Скопируем файл библиотеки (FormEx.dll или 1cpp.dll требуемой версии) либо в каталог базы данных, либо в каталог исполняемых файлов платформы ...\1Cv77\BIN\.
  2. Убедимся, что в предопределенной процедуре ПриНачалеРаботыСистемы глобального модуля присутствует явная инициализация компоненты.

Посмотрим на типовой безопасный блок загрузки внешней компоненты с перехватом ошибок:


Процедура ПриНачалеРаботыСистемы()
    // Проверяем попытку подключения компоненты
    Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
        Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "FormEx.dll") = 0 Тогда
            Предупреждение("Не удалось загрузить внешнюю компоненту FormEx.dll!");
            СтатусВозврата(0);
            Возврат;
        КонецЕсли;
    КонецЕсли;
    
    // Инициализируем объект расширения
    Попытка
        Формекс = СоздатьОбъект("Service");
    Исключение
        Сообщить("Ошибка создания объекта Service: " + ОписаниеОшибки(), "!");
    КонецПопытки;
КонецПроцедуры

Причина 3. Особенности безопасности и 64-битной подсистемы Windows 8

Платформа 1С:Предприятие 7.7 является 32-разрядным приложением. В операционной системе Windows 8 действуют строгие политики безопасности (UAC, DEP) и архитектурные ограничения эмулятора WoW64, которые отсутствовали в Windows XP:

  1. Запуск от имени администратора: Для первичной инициализации библиотек и корректного создания COM-записей первый запуск базы 1С необходимо выполнять с правами администратора («Запуск от имени администратора»).
  2. Блокировка скачанных файлов (Zone.Identifier): Если файл FormEx.dll был скачан из интернета или распакован из архива в Windows 8, система безопасности могла заблокировать его. Откроем свойства файла DLL, перейдем на вкладку «Общие» и нажмем кнопку «Разблокировать», затем «Применить».
  3. Механизм DEP (Предотвращение выполнения данных): Библиотеки FormEx и 1С++ используют модификацию памяти и перехват системных вызовов в рантайме. В Windows 8 аппаратный DEP может аварийно блокировать загрузку таких модулей. Рекомендуется добавить исполняемый файл платформы 1cv7s.exe (или 1cv7.exe) в список исключений DEP операционной системы.
  4. Регистрация 32-битной компоненты через утилиту SysWOW64: Если библиотека используется как COM-объект, стандартный вызов regsvr32 в 64-битной Windows 8 запускает 64-разрядную версию утилиты. Корректную ручную регистрацию следует производить через командную строку от имени администратора следующей командой:

    C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКБазе\FormEx.dll"

  5. Наличие библиотек среды выполнения (Visual C++ Runtime): Для динамической компоновки внешних DLL на чистой Windows 8 могут потребоваться 32-разрядные пакеты распространяемых библиотек Visual C++ (x86), а также устаревшие модули msvcr71.dll / msvcp71.dll, которые присутствовали в базовой поставке Windows XP.
← На главную