воскресенье, 25 июля 2010 г.

Перехватчик 1cpp

Полезный класс, предназначенный для перехвата предопределенных событий 1С и ВК FormEx, вызываемых для групповых контекстов, модулей проведения документов и/или глобального модуля, с помощью специальных объектов пользовательских классов 1С++.

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

А) В модуле формы каждого документа, в процедуру ПриОткрытии добавить код:

Если СокрЛП(ТекущийДокумент().Автор) <> СокрЛП(ИмяПользователя()) Тогда
    Предупреждение("Нет прав на открытие документа",25);
    СтатусВозврата(0);
    Возврат;
КонецЕсли;

Б) В глобальном модуле использовать процедуру 1cpp ПослеОткрытия:

Процедура ПослеОткрытия(Конт)
    Если СокрЛП(Конт.ТекущийДокумент().Автор) <> СокрЛП(ИмяПользователя()) Тогда
        Предупреждение("Нет прав на открытие документа",25); СтатусВозврата(0);
        Возврат;
    КонецЕсли
КонецПроцедуры

В) Использовать Прерывание.
Глобальный модуль:

ЗагрузитьВнешнююКомпоненту("1cpp.dll");
глУпрНастройками =СоздатьОбъект("УправлениеНастройками");
глУпрНастройками.Установить("ПерехватитьСобытияГК",1);
глПерехватчикСобытийГМ = СоздатьОбъект("КлассПерехватСобытий");
глПерехватчик =СоздатьОбъект("Перехватчик");
глПерехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ);

Обработка "КлассПерехватСобытий":

Перем КонтФормы Экспорт, Док Экспорт;
Процедура СобытиеГМ_ПриОткрытии(Конт,ФлагЧтенияНастройки) Экспорт
    КонтФормы = Конт;
    Попытка
        Док = КонтФормы.ТекущийДокумент();
    Исключение
        Возврат;
    КонецПопытки;
    ПерехватчикСобытийГК=СоздатьОбъект("КлассПерехватСобытий");
    ПерехватчикСобытийГК.КонтФормы=КонтФормы;
    ПерехватчикСобытийГК.Док=Док;
    Перехватчик = СоздатьОбъект("Перехватчик");
    Перехватчик.ПерехватитьСобытияГК(КонтФормы,ПерехватчикСобытийГК);
КонецПроцедуры

Функция Событие_ПриОткрытии() Экспорт
    Если СокрЛП(Док.Автор) = СокрЛП(ИмяПользователя()) Тогда
        Предупреждение("Нет прав на открытие документа",25);
        Возврат 0;
    КонецЕсли;
    Возврат 1;
КонецФункции

Суть Перехвата: процедура "СобытиеГМ_ПриОткрытии" перехватывает событие любых форм 1С, в этой процедуре для открытой формы документа будет создаваться новый экземпляр пользовательского класса и назначаться обработчиком системных событий. В данном примере мы обрабатываем событие ПриОткрытии. Вот функция Событие_ПриОткрытии() будет выполнятся перед выполнением процедуры ПриОткрытии в форме документа(если Событие_ПриОткрытии() вернет 1).

Перехватчик может быть использован при организации прав доступа к объектам и т.д.

Его использование должно облегчить труд программиста при обновлении релиза конфигурации, которую он адаптировал под нужды заказчика.
 Документация по классу "Перехватчик":
http://www.1cpp.ru/docum/icpp/html/Hooker.html
Статья Венгера Александра "[Обучаловка] Преимущества класса «Перехватчик» внешней компоненты «1С++»"
http://infostart.ru/public/73221/

P.S. Лтично я еще не определился насколько полезен данный класс в использовании, но знать о возможностях использования класса "Перехватчик" не помешает.

Комментариев нет:

Отправить комментарий