Как подключить внешнюю компоненту FormEx в 1С 7.7 и использовать ее объекты?

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

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

Рассмотрим подробно, как правильно подключать эти компоненты, в чем заключаются особенности совместной работы 1cpp.dll и FormEx.dll, и проанализируем практические примеры вызова их методов.

Причины проблем при подключении объектов FormEx

Выясним причину, почему объект Сервис или другие объекты подсистемы FormEx не создаются после загрузки 1cpp.dll:

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

Шаг 1. Инициализация и подключение компонентов

Разберем, как корректно организовать подключение внешних компонент в глобальном модуле при запуске системы. Безопасный подход предполагает обязательную проверку успешности загрузки библиотеки с использованием конструкции Попытка ... Исключение.

Рассмотрим пример кода подключения FormEx.dll в глобальной процедуре ПриНачалеРаботыСистемы:


Перем глФормаСервис Экспорт;
Перем глФормЭксВключен Экспорт;

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

Шаг 2. Использование возможностей FormEx и объекта «Сервис»

После того как компонента успешно загружена, становятся доступны такие ключевые объекты, как Сервис, РасширениеФормы, Окна и другие. Рассмотрим пример использования объекта Сервис для взаимодействия с контекстом другой открываемой формы.

С помощью методов ВыполнитьПроцедуру() и ПолучитьПеременнуюКонтекста() мы можем передавать параметры, вызывать внутренние процедуры формы и читать ее реквизиты без изменения глобального кода:


Процедура ЗадатьШК(ТекЭлемент)
    Перем КонтекстФормы, Сервис, СписокПараметров, РезультатШК;
    
    Сервис = СоздатьОбъект("Сервис");
    
    // Открываем форму элемента и получаем ее контекст
    Если ОткрытьФорму(ТекЭлемент, КонтекстФормы) = 1 Тогда
        СписокПараметров = СоздатьОбъект("СписокЗначений");
        СписокПараметров.ДобавитьЗначение("Базовая");
        СписокПараметров.ДобавитьЗначение("Не спрашивать");
        
        // Вызываем процедуру открытой формы с передачей параметров
        РезультатВыполнения = Сервис.ВыполнитьПроцедуру(КонтекстФормы, "ПоКнопкеСформировать", СписокПараметров);
        Сообщить("Результат формирования ШК: " + РезультатВыполнения);
        
        // Считываем значение переменной из контекста открытой формы
        Сервис.ПолучитьПеременнуюКонтекста(КонтекстФормы, "РеквШтрихкодБазовой", РезультатШК);
        Сообщить("Получен штрихкод: " + РезультатШК);
        
        // Закрываем форму вызовом соответствующей процедуры
        Сервис.ВыполнитьПроцедуру(КонтекстФормы, "ЗаписатьЗакрыть");
    КонецЕсли;
КонецПроцедуры

Шаг 3. Работа с объектом «Окна» и другими классами

Для работы со специальными классами FormEx (например, для управления окнами платформы через СоздатьОбъект("Окна")) не требуется никаких дополнительных действий, кроме предварительного вызова ЗагрузитьВнешнююКомпоненту("FormEx.dll").

Посмотрим на пример работы с окнами системы:


Процедура УправлениеОкнами()
    Перем ОбжектОкна;
    Если глФормЭксВключен = 1 Тогда
        ОбжектОкна = СоздатьОбъект("Окна");
        // Теперь доступны методы управления окнами
        // Например, можно получить количество открытых окон или свернуть их
    Иначе
        Предупреждение("Компонента FormEx не загружена!");
    КонецЕсли;
КонецПроцедуры

Рекомендации по устранению неполадок

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

  1. Запуск от имени Администратора: При самом первом запуске 1С с новыми библиотеками запустите исполняемый файл 1cv7.exe с правами администратора (через контекстное меню «Запуск от имени администратора»). Это позволит библиотекам успешно зарегистрировать COM-классы в реестре Windows.
  2. Настройка DEP (Data Execution Prevention): Компоненты 1С 7.7 активно используют перехват сообщений Windows (хуки). Служба защиты памяти DEP может блокировать эти действия и принудительно закрывать 1С. Добавьте 1cv7.exe в исключения DEP в свойствах системы Windows.
  3. Расположение DLL: Размещайте файлы FormEx.dll и 1cpp.dll в каталоге информационной базы (КаталогИБ()) или в каталоге программы (КаталогПрограммы()), чтобы исключить проблемы с длинными сетевыми путями.
← На главную