Миникласс ТПерехватчик - методология работы с несколькими перехватчиками формы

03.07.12

Разработка - Инструментарий разработчика

Небольшое пособие "Как правильно накладывать несколько перехватчиков на одну форму" + мини-класс, реализующий описанную технологию.

Скачать файлы

Наименование Файл Версия Размер
ТПерехватчик
.ert 7,00Kb
6
.ert 7,00Kb 6 Скачать

Данный мини-класс, по сути, описывает технологию относительно удобной работы с множественными перехватчиками формы.

 

 Например, вы хотите нарисовать журнал документов, при этом у вас уже есть класс, реализующий привязки и класс, реализующий табличное поле на запросе.

Как человек ленивый, вы уже не занимаетесь вызовом методов классов по событиям формы (например, метода класса привязок, который необходимо вызывать при изменении размера окна) , а повесили это все на перехватчик.

 Теперь возникает проблема - каждый из двух классов перехватывает события формы, и их действия необходимо согласовывать. Ибо каждый последующий навешаный перехватчик забирает все на себя ("кто последний - тот и папа").

 Собственно, в согласовании работы нет ничего сложного - достаточно запоминать предыдущий перехватчик в момент вызова ПерехватитьСобытияГК(), а потом, в обработчике перехваченного события, не забыть сделать ВыполнитьСобытиеГК.

 Правда, есть еще один маленький нюанс - если во втором навешенном перехватчике нет какого-то обработчика события, то до первого событие просто не дойдет.

 А значит в каждом классе необходимо описывать полный набор методов.

 

 Но мы же с вами люди ленивые! Зачем делать ручками то, что можно успешно автоматизировать?

 Мы возьмем, и унаследуем оба наших класса (привязок и табличного поля на запросе) от приложенного класса ТПерехватчик.

При инициализации класса-наследника делаем

Сам.ПолучитьБазовыйКласс("ТПерехватчик").Инит(_Контекст);   //_Контекст - контекст перехватываемой формы

 И дальше, единственное, что требуется от нас - после своих телодвижений не забывать в классе-наследнике вызывать событие базового класса.

Например, так:

 Процедура Событие_ПриОтжатииЛевойКнопки(Сост, Гор, Верт, ФСО) Экспорт
 _ПриОтжатииЛевойКнопки(Сост, Гор, Верт);
 
 Сам(Контекст).ПолучитьБазовыйКласс("ТПерехватчик").Событие_ПриОтжатииЛевойКнопки(Сост, Гор, Верт, ФСО);
КонецПроцедуры // Событие_ПриОтжатииЛевойКнопки



Если же нам обработчик события не нужен - то вообще ничего не нужно делать: в качестве обработчика выступит метод базового класса, который перенаправит событие туда, куда нужно.

 

http://www.1cpp.ru/forum/YaBB.pl?num=1340972871 

См. также

Консоль запросов

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Консоль запросов к базе SQL, не требующая внешних компонент

10 стартмани

29.04.2015    21529    54    Gvozdod    8    

14

StartManager 1.4 - Развитие альтернативного стартера

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.

1 стартмани

23.04.2014    165609    1863    Alexoniq    1596    

496

Tray Informer

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Россия Абонемент ($m)

Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))

1 стартмани

04.09.2013    32868    61    O-Planet    78    

49

Изменение структуры баз 1С 7.7 без долгой реструктуризации. Часть 1. Справочники

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема. Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы. Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме. Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.

1 стартмани

13.08.2013    21180    Reptile    5    

35

v7.7 1CDialogControls: Инструмент в помощь разработчику на 7.7.

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Давным давно, когда я еще плотно писал на 7.7 работа с формами была мучительной и неудобной. Приходилось каждый элемент выкладывать, выравнивать на форме ручками, прописывать код в модуле. Иногда при разработке очередной формы приходила в голову мысль: "а где-то я уже похожее делал..." и начинался мучительный поиск подходящего кода в своих запасах........

1 стартмани

21.02.2013    18023    35    MarSeN    14    

16

[Разработчику] Любая таблица значений в OLAP

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Анализируем различные данные в 1С, используя OLAP-технологии со всеми прелестями. Т.е. наглядное отображение данных, быстрые расчеты, горизонтальные и вертикальные группировки любой вложенности, удобная фильтрация, Drag'n'Drop и ещё много приятных вещей от MS. Обработка на входе принимает практически любую таблицу значений (ТЗ в которой колонкам указаны типы значений, строка, число и т.п.), на выходе имеем на форме 1С сводную таблицу и график по этой ТЗ, с которой работаем, как и в Excel со сводной таблицей и диаграммой. Взял за основу разработку «OLAP Анализ счёта» ( http://infostart.ru/public/14964/ ) от JohnyDeath и переделал под любую ТЗ. Опционально используется «Прогресс бар для 1С 77» (http://infostart.ru/public/14061/ ) от Gmix.

1 стартмани

21.12.2012    36095    51    venger    7    

23

Библиотека кода 1С 7.7 (накопленная за 8 лет)

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Весь код на 1С 7.7, собранный для повторного использования за 8 лет работы.

10 стартмани

25.11.2012    34944    248    adhocprog    51    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. zk96 30.06.12 21:58 Сейчас в теме
Я использую один класс-перехватчик. А в тех классах, где нужно обрабатывать события формы, пописываюсь на нужные мне события нужного контекста.
Например вот так:
Процедура Инит(Конт)
КонтекстФормы = Конт;
Перехватчик = СоздатьОбъект("Перехватчик");
ПерехватчикСобытийГК = Перехватчик.ПолучитьПерехватчикСобытийГК(КонтекстФормы);
МойКласс = СоздатьОбъект("МойКласс");
МойКласс.Инит(КонтекстФормы);
ПерехватчикСобытийГК.ДобавитьПодписчикаСобытия(МойКласс,ТипЗначенияСтр("МойКласс),"ПриИзмененииРазмераОкна");
КонецПроцедуры
Ну а дальше создаю нужные процедуры.
Ну а в классе-перехватчике при событии вызываю его у всех подписчиков.
Лично мне такой метод больше нравится.
2. SatanClaws 143 02.07.12 07:39 Сейчас в теме
(1) Похоже, не совсем понял.
Давай, на примере Привязок и ТТабличноеПоле.

Если я правильно понял тебя, то в форме (на которую ты хочешь прицепить привязки и ТП), ты создаешь 3 объекта:
ТТвойПерехватчик (обязательно первым)
ТПривязки
ТТабличноеПоле
так?

Дальше, как у тебя идет взаимодействие между ТПривязки и ТТабличноеПоле? Скажем, в ПриЗакрытии один из них вернул статус возврата 0 - второй в состоянии это увидеть?
Ну или на примере события ПриОтжатииКнопкиКлавиатуры - можно ли передать будет ли передан ФСО из одного обработчика в другой?
3. SatanClaws 143 02.07.12 07:47 Сейчас в теме
(1) Более внимательно прочитал твой комментарий и еще меньше понял тебя:

Я предположил, что ты используешь такую методологию:

1. на форму вешаешь перехватчиком класс ТТвойПерехватчик
2. в форме создаешь класс (оПривязки = СоздатьОбъект("ТПривязки");) и говоришь оПривзяи.Инит(...)
3. в методе ТПривязки:Инит делаешь следующее: получаешь текущий перехватчик формы (подразумевается, что это объект класса ТТвойПерехватчик) и вызываешь у него метод ДобавитьПодписчикаСобытия(...) (передавая туда объект привязок и события, которые необходимы привязкам).

Так, нет?
4. zk96 02.07.12 17:15 Сейчас в теме
У меня есть класс-перехватчик "ФабрикаСобытий", который инициализируется ПриНачалеРаботыСистемы. При открытии ЛЮБОЙ формы, а точнее в событии СобытиеГМ_СозданиеКонтекста, создаю новый объект класса "ФабрикаСобытий" и вешаю на эту форму.
Любой класс, обработка и т.п. который хочет обрабатывать события этой формы, подписывается на них. Например при инициализации класс привязок делаю так:
Перехватчик = СоздатьОбъект("Перехватчик");
ПерехватчикСобытийГК = Перехватчик.ПолучитьПерехватчикСобытийГК(КонтекстФормы);
ТПривязки = вирт();
ПерехватчикСобытийГК.ДобавитьПодписчикаСобытия(ТПривязки,ТипЗначенияСтр(ТПривязки),"ПриИзмененииРазмераОкна");


В классе "ФабрикаСобытий" :

//==========================================================­====================
Функция СообщитьПодписчикам(ИДСобытия,Параметры = "") Экспорт
ВозвратноеЗначение=1;
Если ПодписчикиСобытий.НайтиКлюч(ИДСобытия,0) = -1 Тогда
Возврат ВозвратноеЗначение;
КонецЕсли;
Если ПустоеЗначение(Параметры) = 1 Тогда
Параметры = СоздатьОбъект("СписокЗначений");
КонецЕсли;
__ПодписчикиСобытия = ПодписчикиСобытий.Получить(ИДСобытия);
КвоПодписчиков=ПодписчикиСобытия.Количество();
Для НомерКонтекста = 0 По КвоПодписчиков-1 Цикл
КонтекстПодписчика = ПодписчикиСобытия.Получить(НомерКонтекста);
Если Информатор.МетодСуществует(КонтекстПодписчика,ИДСобытия)=1 Тогда
Если Информатор.ЯвляетсяФункцией(КонтекстПодписчика,ИДСобытия)=1 Тогда
РезультатРаботыФункции=0;
ВыполняемыйМодуль.ВыполнитьФункциюКонтекста(КонтекстПодписчика,ИДСобытия,Параметры,РезультатРаботыФункции);
Если РезультатРаботыФункции=0 Тогда
ВозвратноеЗначение=0;
Прервать;
КонецЕсли;
Иначе
ВыполняемыйМодуль.ВыполнитьПроцедуруКонтекста(КонтекстПодписчика,ИДСобытия,Параметры);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ВозвратноеЗначение;
КонецФункции

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

Эти куски кода я вырезал с рабочей конфигурации. Может чего-то не так подправил. Если нужно могу поделится классами.
5. SatanClaws 143 02.07.12 20:08 Сейчас в теме
(4) Примерно понятно.
Немного более сложно технологически (Перехватчик сам по себе моск неплохо выносит, а тут еще и Фабрика событий), но тоже неплохо.
6. zk96 02.07.12 22:02 Сейчас в теме
(5) Почему сложнее? Ничего сложного нет. ФабрикаСобытий - это просто имя класса, не более. Я у кого-то увидел и мне понравилось слово :-)
И перехватчик не сложнее любого другого 1С++-объекта. Да, есть несколько фич, но это мелочи.
Хотя это мое личное мнение.
8. SatanClaws 143 03.07.12 04:33 Сейчас в теме
(6)перехватчик сложнее тем, что за потоком исполнения следить сложнее
9. zk96 03.07.12 10:50 Сейчас в теме
(8)
Я не понял. Объясни, пожалуста.
10. SatanClaws 143 03.07.12 19:53 Сейчас в теме
(9) Скажем, есть баг - при отжатии кнопки клавиатуры 1Ска падает

без перехватчика:
открываешь модуль формы, находишь обработчик события, ставишь брейкпоинт, топаешь отладчиком сначала "шагом через" - определяешь, какой используемый объект валит 1Ску, во второй раз - уже конкретно внутри класса.
Все легко и прозрачно.

С перехватчиком - сначала рыщешь по модулю, определяешь, какие объекты создаются, какие из них используют перехватчик.
Потом разбираешься, какие имеют обработчик этого события. Потом ставишь брейкпоинты в этих классах (а отладка, начавшаяся с брейкпоинта внутри класса - то еще развлечение, ибо не безглючно там все).
А в конце концов выясняется, что объект класса А, не использующего перехватчик, создает для своих нужд объект класса Б, уже использующего перехватчик - и валит 1Ску именно он.

В этом плане твой подход немного лучше - ибо можно поставить брейкпоинт в классе ФабрикаСобытий и уже там топать по явному потоку исполнения.
Хотя в моей схеме тоже есть "помошники" (втыкание сообщить() непосредственно в ТПерехватчик - будет видно, какие объекты отработали нормально, остается лишь определить порядок подключения перехватчиков).
12. Dolly_EV 269 05.07.12 11:47 Сейчас в теме
(4) zk96, Поделись классом. Нужно!
13. zk96 05.07.12 15:18 Сейчас в теме
(12) Dolly_EV,
У меня не один класс, а несколько. В прилагаемом архиве на всякий случай есть кусок глобального модуля.
Только повырезай из классов лишний код, а то я мог пропустить.
Прикрепленные файлы:
ФабрикаСобытий.rar
15. Dolly_EV 269 05.07.12 15:55 Сейчас в теме
(13) Ок, спасиб, завтра будем посмотреть!
(14) Я так думаю, "текущий вариант" всяко лучше, чем "старый вариант"?))
7. zk96 02.07.12 22:03 Сейчас в теме
Как по мне подписка на события удобней.
11. zk96 04.07.12 01:29 Сейчас в теме
Для отладки я иногда использую команды препроцессора 1С++ #curmeth и #exinfo.
Очень удобно их устанавливать в тех местах, где проблематично остановится.
14. zk96 05.07.12 15:46 Сейчас в теме
О, нашел. У меня есть старый вариант моей "ФабрикиСобытий". Раньше это был один класс. Если надо, то тоже дам.
16. zk96 05.07.12 16:07 Сейчас в теме
Если что, пиши в личку.
17. begemot 269 02.10.13 15:44 Сейчас в теме
(16) Пытаюсь подключить Ваш "новый" вариант Фабрики событий:

Неудачная попытка создания объекта
СервисныеМетоды = СоздатьОбъект("СервисныеМетоды");

Подскажите, где искать данный класс?
Оставьте свое сообщение