При переносе информационных баз 1С:Предприятия 7.7 со старых операционных систем (Windows XP) на современные платформы (Windows 8, 8.1, 10) разработчики и администраторы часто сталкиваются с фатальной ошибкой при запуске:
Формекс=СоздатьОбъект("ServiceFormEx");
{Глобальный Модуль(2299)} Неудачная попытка создания объекта (ServiceFormEx)
В операционной системе Windows XP конфигурация работала без сбоев, но в новой среде выполнение глобального модуля аварийно прерывается. Разберем по шагам, почему возникает эта ошибка и как восстановить работоспособность базы данных.
Проанализируем архитектуру используемых внешних компонент. Идентификатор класса ServiceFormEx (или его русскоязычный синоним СервисРасшФормы) применялся исключительно в старых версиях универсальной библиотеки 1cpp.dll (ветки 1.x и ранние 2.x), когда функционал FormEx поставлялся встроенным непосредственно внутрь 1С++.
В актуальных версиях библиотеки 1С++ модуль FormEx был полностью выделен в отдельный независимый проект. Если в новой операционной системе была установлена свежая сборка внешней компоненты или подключена оригинальная библиотека FormEx.dll, класс ServiceFormEx перестает существовать.
В отдельной официальной библиотеке FormEx.dll данный базовый класс называется Сервис (на английском языке — Service). Соответственно, обращение к старому идентификатору вызывает сбой инициализации объекта в памяти.
Рассмотрим, как изменить код создания объекта в глобальном модуле или подключаемых обработках. Если в рабочей среде используется актуальная версия FormEx.dll, необходимо заменить обращение к классу ServiceFormEx на Service или Сервис.
Посмотрим на пример вызова:
// Вместо устаревшего вызова:
// Сервис = СоздатьОбъект("ServiceFormEx");
// Используем актуальный идентификатор:
Сервис = СоздатьОбъект("Service");
// Или на русском языке:
// Сервис = СоздатьОбъект("Сервис");
Если данный объект использовался, например, для динамической компиляции и внедрения дополнительного глобального модуля программного кода, вызовы его методов сохраняются:
// Пример загрузки глобального модуля
Сервис = СоздатьОбъект("Service");
глДопМодуль = Сервис.ДобавитьГлобальныйМодуль(глДопМодульТекст);
// Пример выгрузки модуля при завершении
Если глДопМодуль > 0 Тогда
Сервис = СоздатьОбъект("Service");
Сервис.УдалитьГлобальныйМодуль(глДопМодуль);
КонецЕсли;
Выясним причину поведения платформы при создании объектов внешних библиотек. Платформа 1С 7.7 при выполнении метода СоздатьОбъект() сначала ищет зарегистрированный класс среди уже загруженных в память внешних компонент. Если библиотека не загружена или функция инициализации вернула 0, платформа перенаправляет поиск в системный реестр Windows (пытаясь инициализировать его как системный COM/OLE-сервер). Если класс не зарегистрирован в реестре ОС, возникает сообщение «Неудачная попытка создания объекта».
Разберем по шагам правильное размещение и инициализацию необходимых файлов:
FormEx.dll или 1cpp.dll требуемой версии) либо в каталог базы данных, либо в каталог исполняемых файлов платформы ...\1Cv77\BIN\.ПриНачалеРаботыСистемы глобального модуля присутствует явная инициализация компоненты.Посмотрим на типовой безопасный блок загрузки внешней компоненты с перехватом ошибок:
Процедура ПриНачалеРаботыСистемы()
// Проверяем попытку подключения компоненты
Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "FormEx.dll") = 0 Тогда
Предупреждение("Не удалось загрузить внешнюю компоненту FormEx.dll!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
// Инициализируем объект расширения
Попытка
Формекс = СоздатьОбъект("Service");
Исключение
Сообщить("Ошибка создания объекта Service: " + ОписаниеОшибки(), "!");
КонецПопытки;
КонецПроцедуры
Платформа 1С:Предприятие 7.7 является 32-разрядным приложением. В операционной системе Windows 8 действуют строгие политики безопасности (UAC, DEP) и архитектурные ограничения эмулятора WoW64, которые отсутствовали в Windows XP:
FormEx.dll был скачан из интернета или распакован из архива в Windows 8, система безопасности могла заблокировать его. Откроем свойства файла DLL, перейдем на вкладку «Общие» и нажмем кнопку «Разблокировать», затем «Применить».1cv7s.exe (или 1cv7.exe) в список исключений DEP операционной системы.regsvr32 в 64-битной Windows 8 запускает 64-разрядную версию утилиты. Корректную ручную регистрацию следует производить через командную строку от имени администратора следующей командой:
C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКБазе\FormEx.dll"
msvcr71.dll / msvcp71.dll, которые присутствовали в базовой поставке Windows XP.