]> Перехватчик

Перехватчик

1C++ :: </a> </em> </td> <td style="text-align: right;"> <!-- Во второй ячейке пропишем ссылки на следующий/предыдущий топики и оставим возможность в каждом топике добавить свои линки, разместив их в otherlinks. По умолчанию otherlinks отсутствует. --> <subst nodes="chminfo/otherlinks/node()"/> | Ранее: <a href="prev" title="Перейти к предыдущей статье"><title to="prev"/></a> | Далее: <a href="next" title="Перейти к следующей статье"><title to="next"/></a> </td> </tr> <tr> <!-- Вторая строка таблицы будет заголовок топика. Чтобы каждый топик мог при необходимости изменить правило составления заголовка, сделаем здесь subst, а само правило пропишем ниже. Будем брать его из <topictitle> --> <td colspan="2" style="font-size:11pt;font-weight:bold"> <subst nodes="chminfo/topictitle/node()"/> </td> </tr> </table> <!-- А сюда собственно, вставим топик --> <topic/> </decoration> <!-- Основной стиль формирования ссылок на вынесенные топики --> <href> <a href="self"><title to="self"/></a> </href> <!-- Основной принцип объединения ссылок на вынесенные топики --> <hrefcombine> <ul> <foreach> <li><item/></li> </foreach> </ul> </hrefcombine> <!-- Содержимое данного тега подставляется в основной decoration через subst в каждом топике, для формирования заголовка топика. Его можно переопредеделить в топике, для задания другого правила составления заголовка. По умолчанию просто вставляется текст заголовка топика, а сам заголовок удаляется --> <topictitle> <title to="selfremove"/> </topictitle> </maininfo> <!-- Основная разметка для секций "Свойства", "Методы", "События" Задаем другие правила формирования ссылок на вынесенные топики, и объединения ссылок, а также формирования заголовка в дочерних секциях. --> <propsmethods> <!-- Ссылки на вынесенные топики объединим в таблицу --> <hrefcombine> <table border="1" cellspacing="0" cellpadding="3"> <foreach> <tr><item/></tr> </foreach> </table> </hrefcombine> <!-- Зададим разметку потомков, чтобы не писать ее в каждом топике --> <childs> <!-- Формирование ссылки на себя в родительском топике. Сформируем строку таблицы, где первая ячейка - ссылка на топик, а вторая - копия абзаца, в котором есть жирное слово "Описание", но без самого слова "Описание" --> <href> <td style="vertical-align:top"><a class="toc-backref" href="self"><title to="self"/></a></td> <td><subst nodes=".//p[strong='Описание:'][1]/node()[not(name()='strong' and .='Описание:')]"/></td> </href> <!-- Зададим другое правило составления заголовка. Пусть будет "Ссылка на описание объекта::ИмяМетода/Свойства" --> <topictitle> <a class="toc-backref" href="parent[1]" title="Перейти к описанию объекта"><title to="parent[1]"/></a> :: <title to="selfremove"/> </topictitle> <!-- Зададим другой способ задания <html><title> в формируемом файле. Он будет появлятся как имя топика во всех "founded topics" --> <chmtitle> <title to="parent[1]"/>::<title to="self"/> </chmtitle> <!-- Заставим дочерние секции добавлять слова из заголовка в индекс --> <autokw mode="2"/> <!-- На случай, если в описания метода есть еще подсекции, восстановим для них старые правила. --> <insert nodes="//common/maininfo/*[name()='hrefcombine']"/> <childs> <insert nodes="//common/maininfo/*[name()='href']"/> <insert nodes="//common/maininfo/*[name()='topictitle']"/> <chmtitle/> <autokw/> </childs> </childs> </propsmethods> </common></xml><chminfo> <insert nodes="//common/maininfo/*"/> <alinks>_1cpp_hooker_</alinks> <klinks> Перехватчик Hooker </klinks> </chminfo> <div class="contents topic"> <p class="topic-title first"><a id="id2" name="id2">Содержание</a></p> <ul class="simple"> <li><a class="reference" href="#id3" id="id11" name="id11">Методы</a><ul> <li><a class="reference" href="#hookeventsofgroupcontext" id="id12" name="id12">ПерехватитьСобытияГК / HookEventsOfGroupContext</a></li> <li><a class="reference" href="#calloriginaleventofgroupcontext" id="id13" name="id13">ВызватьОригинальноеСобытиеГК / CallOriginalEventOfGroupContext</a></li> <li><a class="reference" href="#gethookobjectforeventsofgroupcontext" id="id14" name="id14">ПолучитьПерехватчикСобытийГК / GetHookObjectForEventsOfGroupContext</a></li> <li><a class="reference" href="#k-unhookeventsofgroupcontext" id="id15" name="id15">СнятьПерехватСобытийГK / UnHookEventsOfGroupContext</a></li> <li><a class="reference" href="#hookeventsofglobalmodule" id="id16" name="id16">ПерехватитьСобытияГлобальногоМодуля / HookEventsOfGlobalModule</a></li> <li><a class="reference" href="#calloriginaleventofglobalmodule" id="id17" name="id17">ВызватьОригинальноеСобытиеГлобальногоМодуля / CallOriginalEventOfGlobalModule</a></li> <li><a class="reference" href="#gethookobjectforeventsofglobalmodule" id="id18" name="id18">ПолучитьПерехватчикСобытийГлобальногоМодуля / GetHookObjectForEventsOfGlobalModule</a></li> <li><a class="reference" href="#unhookeventsofglobalmodule" id="id19" name="id19">СнятьПерехватСобытийГлобальногоМодуля / UnHookEventsOfGlobalModule</a></li> </ul> </li> </ul> </div> <p><strong>Класс "Перехватчик" / "Hooker".</strong></p> <p>Специальный класс, предназначенный для перехвата предопределенных событий 1С и ВК FormEx, вызываемых для групповых контекстов и/или глобального модуля, с помощью специальных объектов пользовательских классов 1С++.</p> <p><strong>Версия: релиз 2.5 и выше.</strong></p> <p><strong>Общая схема перехвата:</strong></p> <p>0. Для использования перехвата должна быть включена настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " См. <a class="reference" href="SettingsManager.chm::/SettingsManager0.html">SettingsManager</a></p> <p>1. Необходимо использовать пользовательский класс 1С++, в котором должны быть определены <strong>обработчики соответствующих событий с названием события</strong> (ПриЗакрытии, ПриНачалеВыбораЗначения, ПриЗавершенииРаботыСистемы) или <strong>со специальным названием в виде Событие_НаименованиеСобытия</strong> (Событие_ПриЗакрытии, Событие_ПриНачалеВыбораЗначения, Событие_ПриЗавершенииРаботыСистемы)</p> <p>2. Каждый обработчик должен быть определен <strong>с атрибутом Экспорт</strong>, иначе перехват указанного события будет невозможен.</p> <p>Например, для перехвата событий ПриЗакрытии и ПриНачалеВыбораЗначения в классе-перехватчике необходимо написать</p> <blockquote> <dl class="docutils"> <dt>Процедура ПриЗакрытии() Экспорт</dt> <dd>// текст обработчика события</dd> </dl> <p>КонецПроцедуры</p> <dl class="docutils"> <dt>Процедура ПриНачалеВыбораЗначения(НужныеПараметры и т.д.) Экспорт</dt> <dd>// текст обработчика события</dd> </dl> <p>КонецПроцедуры</p> </blockquote> <p>Или для перехвата события ПриЗавершенииРаботыСистемы в классе-перехватчике необходимо написать</p> <blockquote> <dl class="docutils"> <dt>Процедура ПриЗавершенииРаботыСистемы() Экспорт</dt> <dd>// текст обработчика события</dd> </dl> <p>КонецПроцедуры</p> </blockquote> <p>3. Для включения перехвата конкретного контекста формы нужно использовать код</p> <blockquote> <blockquote> <ul class="simple"> <li>ОбъектПерехватчикГК = СоздатьОбъект("КлассПерехватчикГК");</li> </ul> </blockquote> <div class="system-message"> <p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">.\Hooker.txt</tt>, line 252)</p> Block quote ends without a blank line; unexpected unindent.</div> <ul> <li><dl class="first docutils"> <dt>Перехватчик = СоздатьОбъект("Перехватчик");</dt> <dd><ul class="first simple"> <li>Перехватчик. <a class="reference" href="#id4">ПерехватитьСобытияГК</a> (КонтФормы, ОбъектПерехватчикГК);</li> </ul> <p>или</p> <ul class="last simple"> <li>Перехватчик. <a class="reference" href="#id7">ПерехватитьСобытияГлобальногоМодуля</a> (ОбъектПерехватчикГК);</li> </ul> </dd> </dl> </li> </ul> </blockquote> <p>4. В перехваченном контексте или перехваченном глобальном модуле <strong>обработчики событий могут вообще отсутствовать или быть определены без атрибута Экспорт</strong>.</p> <p>5. После установки перехвата при вызове системой события управление будет передано в соответствующий обработчик события в классе-перехватчике. В этом случае встроенные обработчики предопределенных событий в перехваченном контексте или глобальном модуле автоматически вызываться не будут. Разработчик сам должен вызвать данные обработчики (см. п.7), когда это необходимо.</p> <p>6. Для включения перехвата событий глобального модуля необходимо использовать код</p> <blockquote> <ul class="simple"> <li>ОбъектПерехватчикСобытийГлобальногоМодуля = СоздатьОбъект("КлассПерехватчикСобытийГлобальногоМодуля");</li> <li>Перехватчик = СоздатьОбъект("Перехватчик");</li> <li>Перехватчик. <a class="reference" href="#id7">ПерехватитьСобытияГлобальногоМодуля</a> (ОбъектПерехватчикСобытийГлобальногоМодуля);</li> </ul> </blockquote> <p>7. При необходимости вызова обработчиков событий, которые определены в контексте или в глобальном модуле, в обработчике события внутри пользовательского класса нужно использовать код</p> <blockquote> <p>Процедура ПриЗакрытии() Экспорт</p> <ul class="simple"> <li>Перехватчик = СоздатьОбъект("Перехватчик");</li> <li>СписокАргументов = СоздатьОбъект("СписокЗначений");</li> <li>Перехватчик. <a class="reference" href="#id5">ВызватьОригинальноеСобытиеГК</a> (КонтПерехваченнойФормы, "ПриЗакрытии", СписокАргументов);</li> </ul> <p>КонецПроцедуры</p> </blockquote> <p>или</p> <blockquote> <p>Процедура ПриЗавершенииРаботыСистемы() Экспорт</p> <ul class="simple"> <li>Перехватчик = СоздатьОбъект("Перехватчик");</li> <li>СписокАргументов = СоздатьОбъект("СписокЗначений");</li> <li>Перехватчик. <a class="reference" href="#id5">ВызватьОригинальноеСобытиеГК</a> (КонтПерехваченнойФормы, "ПриЗавершенииРаботыСистемы", СписокАргументов);</li> </ul> <p>КонецПроцедуры</p> </blockquote> <p>При этом неважно, существует ли обработчик в модуле формы или глобальном модуле.</p> <p>8. <strong>Важно помнить, что после установки перехвата на контекст формы или глобальный модуль на пользовательский объект-перехватчик добавляется еще одна ссылка.</strong> В результате деструктор данного объекта-перехватчика будет вызван только при закрытии формы или завершении работы 1С соответственно или снятии перехвата вручную.</p> <p>Например, код</p> <blockquote> <ul class="simple"> <li>ОбъектПерехватчикГК = СоздатьОбъект("КлассПерехватчикГК");</li> <li>Перехватчик = СоздатьОбъект("Перехватчик");</li> <li>Перехватчик. <a class="reference" href="#id4">ПерехватитьСобытияГК</a> (КонтФормы, ОбъектПерехватчикГК);</li> <li>ОбъектПерехватчикГК = 0;</li> </ul> </blockquote> <p>не вызывет деструктор немедленно!</p> <ol class="arabic simple" start="9"> <li><strong>Все вышесказанное относится также и к предопределенным событиям ВК FormEx.</strong></li> </ol> <div class="section"> <h1><a id="id3" name="id3">Методы</a></h1> <chminfo split="0" splitchild="1"> <insert nodes="//common/propsmethods/*"/> </chminfo> <div class="section"> <h2><a id="hookeventsofgroupcontext" name="hookeventsofgroupcontext"><span id="id4"></span>ПерехватитьСобытияГК / HookEventsOfGroupContext</a></h2> <blockquote> <p><strong>Синтаксис:</strong> ПерехватитьСобытияГК(ГрупповойКонтекстФормы, ОбъектПользовательскогоКлассаОбработчикаПерехвата)</p> <blockquote> <dl class="docutils"> <dt><strong>Параметры:</strong></dt> <dd><ul class="first last simple"> <li><strong>ГрупповойКонтекстФормы</strong> - тип: ГрупповойКонтекст.</li> </ul> </dd> </dl> <div class="system-message"> <p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">.\Hooker.txt</tt>, line 336)</p> Definition list ends without a blank line; unexpected unindent.</div> <ul class="simple"> <li><strong>ОбъектПользовательскогоКлассаОбработчикаПерехвата</strong> - тип: Класс КОП.</li> </ul> <p>Пользовательский класс, в котором определены обработчики событий контекста формы.</p> </blockquote> <p><strong>Описание:</strong> Перехватывает любые предопределенные события контекста формы, как 1С, так и FormEx. Снять перехват можно с использованием метода <a class="reference" href="#k">СнятьПерехватСобытийГK</a> .</p> <p>Если настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " не включена, будет выдано исключение. В случае, если первый параметр не является групповым контекстом, выдается исключение. В случае, если второй параметр не является пользовательским классом, выдается исключение.</p> </blockquote> </div> <div class="section"> <h2><a id="calloriginaleventofgroupcontext" name="calloriginaleventofgroupcontext"><span id="id5"></span>ВызватьОригинальноеСобытиеГК / CallOriginalEventOfGroupContext</a></h2> <blockquote> <p><strong>Синтаксис:</strong> ВызватьОригинальноеСобытиеГК(ГрупповойКонтекстФормы, ИмяСобытия, СписокАргументов)</p> <blockquote> <dl class="docutils"> <dt><strong>Параметры:</strong></dt> <dd><ul class="first last simple"> <li><strong>ГрупповойКонтекстФормы</strong> - тип: ГрупповойКонтекст.</li> </ul> </dd> </dl> <div class="system-message"> <p class="system-message-title">System Message: WARNING/2 (<tt class="docutils">.\Hooker.txt</tt>, line 357)</p> Definition list ends without a blank line; unexpected unindent.</div> <ul> <li><dl class="first docutils"> <dt><strong>ИмяСобытия</strong> - тип: Строка.</dt> <dd><ul class="first last simple"> <li><strong>СписокАргументов</strong> - тип: СписокЗначений. Список аргументов для данного события.</li> </ul> </dd> </dl> </li> </ul> </blockquote> <p><strong>Описание:</strong> Вызывает обработчик события контекста формы, который опреден в модуле этой формы. Если обработчика в форме не существует, ошибки не выдается.</p> <p>Если настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " не включена, будет выдано исключение. В случае, если первый параметр не является групповым контекстом, выдается исключение. В случае, если второй параметр не является строкой или строка пуста, выдается исключение. В случае, если третий параметр не является списком значений, выдается исключение.</p> </blockquote> </div> <div class="section"> <h2><a id="gethookobjectforeventsofgroupcontext" name="gethookobjectforeventsofgroupcontext"><span id="id6"></span>ПолучитьПерехватчикСобытийГК / GetHookObjectForEventsOfGroupContext</a></h2> <blockquote> <p><strong>Синтаксис:</strong> ПолучитьПерехватчикСобытийГК(ГрупповойКонтекстФормы)</p> <blockquote> <dl class="docutils"> <dt><strong>Параметры:</strong></dt> <dd><ul class="first last simple"> <li><strong>ГрупповойКонтекстФормы</strong> - тип: ГрупповойКонтекст.</li> </ul> </dd> </dl> <p><strong>Возвращает:</strong> тип: объект КОП, если для данной формы был включен перехват или Неопределено, если нет.</p> </blockquote> <p><strong>Описание:</strong> Возвращает объект-перехватчик событий, если для данной формы был включен перехват.</p> <p>Если настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " не включена, будет выдано исключение. В случае, если параметр не является групповым контекстом, выдается исключение.</p> </blockquote> </div> <div class="section"> <h2><a id="k-unhookeventsofgroupcontext" name="k-unhookeventsofgroupcontext"><span id="k"></span>СнятьПерехватСобытийГK / UnHookEventsOfGroupContext</a></h2> <blockquote> <p><strong>Синтаксис:</strong> СнятьПерехватСобытийГK(ГрупповойКонтекстФормы)</p> <blockquote> <dl class="docutils"> <dt><strong>Параметры:</strong></dt> <dd><ul class="first last simple"> <li><strong>ГрупповойКонтекстФормы</strong> - тип: ГрупповойКонтекст.</li> </ul> </dd> </dl> </blockquote> <dl class="docutils"> <dt><strong>Описание:</strong> Снимает перехват событий контекста формы, если перехват был</dt> <dd><p class="first">установлен для данной формы.</p> <p class="last">Если на пользовательский объект-перехватчик больше нет ссылок, будет вызван деструктор данного объекта.</p> </dd> </dl> <p>Если настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " не включена, будет выдано исключение. В случае, если параметр не является групповым контекстом, выдается исключение.</p> </blockquote> </div> <div class="section"> <h2><a id="hookeventsofglobalmodule" name="hookeventsofglobalmodule"><span id="id7"></span>ПерехватитьСобытияГлобальногоМодуля / HookEventsOfGlobalModule</a></h2> <blockquote> <p><strong>Синтаксис:</strong> ПерехватитьСобытияГлобальногоМодуля(ОбъектПользовательскогоКлассаОбработчикаПерехвата)</p> <blockquote> <p><strong>Параметры:</strong> - <strong>ОбъектПользовательскогоКлассаОбработчикаПерехвата</strong> - тип: Класс КОП.</p> <p>Пользовательский класс, в котором определены обработчики событий глобального модуля.</p> </blockquote> <p><strong>Описание:</strong> Перехватывает любые предопределенные события глобального модуля, как 1С, так и FormEx. Снять перехват можно с использованием метода <a class="reference" href="#id10">СнятьПерехватСобытийГлобальногоМодуля</a> .</p> <p>Если настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " не включена, будет выдано исключение. В случае, если переданный параметр не является пользовательским классом, выдается исключение.</p> </blockquote> </div> <div class="section"> <h2><a id="calloriginaleventofglobalmodule" name="calloriginaleventofglobalmodule"><span id="id8"></span>ВызватьОригинальноеСобытиеГлобальногоМодуля / CallOriginalEventOfGlobalModule</a></h2> <blockquote> <p><strong>Синтаксис:</strong> ВызватьОригинальноеСобытиеГлобальногоМодуля(ИмяСобытия, СписокАргументов)</p> <blockquote> <p><strong>Параметры:</strong> - <strong>ИмяСобытия</strong> - тип: Строка.</p> <div class="system-message"> <p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">.\Hooker.txt</tt>, line 250)</p> Unexpected indentation.</div> <blockquote> <ul class="simple"> <li><strong>СписокАргументов</strong> - тип: СписокЗначений. Список аргументов для данного события.</li> </ul> </blockquote> </blockquote> <p><strong>Описание:</strong> Вызывает обработчик события глобального модуля, который опреден в глобальном модуле. Если обработчика в глобальном модуле не существует, ошибки не выдается.</p> <p>Если настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " не включена, будет выдано исключение. В случае, если первый параметр не является строкой или строка пуста, выдается исключение. В случае, если второй параметр не является списком значений, выдается исключение.</p> </blockquote> </div> <div class="section"> <h2><a id="gethookobjectforeventsofglobalmodule" name="gethookobjectforeventsofglobalmodule"><span id="id9"></span>ПолучитьПерехватчикСобытийГлобальногоМодуля / GetHookObjectForEventsOfGlobalModule</a></h2> <blockquote> <p><strong>Синтаксис:</strong> ПолучитьПерехватчикСобытийГлобальногоМодуля()</p> <blockquote> <strong>Возвращает:</strong> тип: объект КОП, если был включен перехват событий глобального модуля или Неопределено, если нет.</blockquote> <p><strong>Описание:</strong> Возвращает объект-перехватчик событий, если был включен перехват событий глобального модуля.</p> <p>Если настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " не включена, будет выдано исключение.</p> </blockquote> </div> <div class="section"> <h2><a id="unhookeventsofglobalmodule" name="unhookeventsofglobalmodule"><span id="id10"></span>СнятьПерехватСобытийГлобальногоМодуля / UnHookEventsOfGlobalModule</a></h2> <blockquote> <p><strong>Синтаксис:</strong> СнятьПерехватСобытийГлобальногоМодуля()</p> <dl class="docutils"> <dt><strong>Описание:</strong> Снимает перехват событий глобального модуля, если перехват был</dt> <dd><p class="first">установлен.</p> <p class="last">Если на пользовательский объект-перехватчик больше нет ссылок, будет вызван деструктор данного объекта.</p> </dd> </dl> <p>Если настройка 1С++ " <strong>ПерехватитьСобытияГК / EnableHookEventsGroupContext</strong> " не включена, будет выдано исключение.</p> </blockquote> </div> </div> </div> </body> </html>