При работе с платформой 1С 7.7 базовых возможностей ящика инструментов часто бывает недостаточно. Для расширения функционала интерфейса, раскраски табличных частей и выполнения процедур в контексте открытых форм активно используются внешние компоненты FormEx и 1С++. Однако начинающие разработчики часто сталкиваются с ситуацией, когда после загрузки библиотеки вызов СоздатьОбъект("Сервис") вызывает ошибку «Неудачная попытка создания объекта».
Рассмотрим подробно, как правильно подключать эти компоненты, в чем заключаются особенности совместной работы 1cpp.dll и FormEx.dll, и проанализируем практические примеры вызова их методов.
Выясним причину, почему объект Сервис или другие объекты подсистемы FormEx не создаются после загрузки 1cpp.dll:
1cpp.dll. Начиная с версии 1С++ 3.0, встроенный FormEx был удален. Поэтому при загрузке одной только библиотеки 1cpp.dll объект Сервис не зарегистрируется — библиотеку FormEx.dll необходимо подключать отдельно.ЗагрузитьВнешнююКомпоненту() внешняя библиотека пытается зарегистрировать свои COM-классы в Windows. Если у пользователя Windows недостаточно прав на запись в реестр, регистрация завершится сбоем.FormEx.dll может вызвать дублирование перехватчиков событий в памяти и падение платформы.Разберем, как корректно организовать подключение внешних компонент в глобальном модуле при запуске системы. Безопасный подход предполагает обязательную проверку успешности загрузки библиотеки с использованием конструкции Попытка ... Исключение.
Рассмотрим пример кода подключения FormEx.dll в глобальной процедуре ПриНачалеРаботыСистемы:
Перем глФормаСервис Экспорт;
Перем глФормЭксВключен Экспорт;
Процедура ПриНачалеРаботыСистемы()
// Пытаемся подключить внешнюю компоненту FormEx
Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 1 Тогда
Попытка
глФормаСервис = СоздатьОбъект("Сервис");
глФормаСервис.ВключитьРаскраскуТаблиц();
глФормЭксВключен = 1;
Сообщить("Внешняя компонента FormEx успешно подключена.");
Исключение
глФормЭксВключен = 0;
Сообщить("Не удалось создать объект 'Сервис'!");
КонецПопытки;
Иначе
глФормЭксВключен = 0;
Предупреждение("Файл FormEx.dll не найден или не может быть загружен!");
КонецЕсли;
// Подключение 1С++ (если требуется)
Если ЗагрузитьВнешнююКомпоненту("1cpp.dll") = 0 Тогда
Сообщить("Неудачная попытка загрузки 1cpp.dll");
Иначе
Сообщить("Внешняя компонента 1cpp.dll загружена успешно");
КонецЕсли;
КонецПроцедуры
После того как компонента успешно загружена, становятся доступны такие ключевые объекты, как Сервис, РасширениеФормы, Окна и другие. Рассмотрим пример использования объекта Сервис для взаимодействия с контекстом другой открываемой формы.
С помощью методов ВыполнитьПроцедуру() и ПолучитьПеременнуюКонтекста() мы можем передавать параметры, вызывать внутренние процедуры формы и читать ее реквизиты без изменения глобального кода:
Процедура ЗадатьШК(ТекЭлемент)
Перем КонтекстФормы, Сервис, СписокПараметров, РезультатШК;
Сервис = СоздатьОбъект("Сервис");
// Открываем форму элемента и получаем ее контекст
Если ОткрытьФорму(ТекЭлемент, КонтекстФормы) = 1 Тогда
СписокПараметров = СоздатьОбъект("СписокЗначений");
СписокПараметров.ДобавитьЗначение("Базовая");
СписокПараметров.ДобавитьЗначение("Не спрашивать");
// Вызываем процедуру открытой формы с передачей параметров
РезультатВыполнения = Сервис.ВыполнитьПроцедуру(КонтекстФормы, "ПоКнопкеСформировать", СписокПараметров);
Сообщить("Результат формирования ШК: " + РезультатВыполнения);
// Считываем значение переменной из контекста открытой формы
Сервис.ПолучитьПеременнуюКонтекста(КонтекстФормы, "РеквШтрихкодБазовой", РезультатШК);
Сообщить("Получен штрихкод: " + РезультатШК);
// Закрываем форму вызовом соответствующей процедуры
Сервис.ВыполнитьПроцедуру(КонтекстФормы, "ЗаписатьЗакрыть");
КонецЕсли;
КонецПроцедуры
Для работы со специальными классами FormEx (например, для управления окнами платформы через СоздатьОбъект("Окна")) не требуется никаких дополнительных действий, кроме предварительного вызова ЗагрузитьВнешнююКомпоненту("FormEx.dll").
Посмотрим на пример работы с окнами системы:
Процедура УправлениеОкнами()
Перем ОбжектОкна;
Если глФормЭксВключен = 1 Тогда
ОбжектОкна = СоздатьОбъект("Окна");
// Теперь доступны методы управления окнами
// Например, можно получить количество открытых окон или свернуть их
Иначе
Предупреждение("Компонента FormEx не загружена!");
КонецЕсли;
КонецПроцедуры
Проанализируем частые проблемы при развертывании компонент на рабочих местах:
1cv7.exe с правами администратора (через контекстное меню «Запуск от имени администратора»). Это позволит библиотекам успешно зарегистрировать COM-классы в реестре Windows.1cv7.exe в исключения DEP в свойствах системы Windows.FormEx.dll и 1cpp.dll в каталоге информационной базы (КаталогИБ()) или в каталоге программы (КаталогПрограммы()), чтобы исключить проблемы с длинными сетевыми путями.