|
v7: Как отловить интерактивный ввод нового документа в журнале | ☑ | ||
---|---|---|---|---|
0
Duke1C
13.03.14
✎
11:00
|
Чёй то в СП подходящих процедур не нашел,
погуглив нарыл - http://www.abelov.com/kuban/149417.html, там Альф в конце темы привел ссылку с ответом, но она нерабочая :( Релиз платформы 27. 1C++, Formex заюзаны. Или тока через перехват событий ГК? |
|||
1
Ёпрст
13.03.14
✎
11:15
|
Перехват..это не наш метод. Всё делается штатно.
|
|||
2
Ёпрст
13.03.14
✎
11:16
|
Ибо при перехвате, тебе придётся отлавливать события из контекстного меню, панели инструментов и меню из "Действия", помимо отлова нажатия Ins
|
|||
3
Duke1C
13.03.14
✎
11:18
|
(1) Ёпрст, я тебя как мегаспеца оченно уважаю, поэтому давай сократим затягивание интриги :)
|
|||
4
Ёпрст
13.03.14
✎
11:18
|
Хотя, разве что, если не охота править конфу, то Класс.Перехватчик в помощь и там событие
|
|||
5
Duke1C
13.03.14
✎
11:18
|
(2) Про разные способы интерактивного ввода я в курсе
|
|||
6
Duke1C
13.03.14
✎
11:19
|
(4) у меня свой самописный журнал, а задача примерно такая же как в ссылке в сабже
|
|||
7
Ёпрст
13.03.14
✎
11:20
|
+4
Событие_ВводНового или СобытиеГМ_СозданиеКонтекста |
|||
8
Ёпрст
13.03.14
✎
11:22
|
(6)
короче, если штатно, то журнал общий, используется фича вот эта http://my1c-archive.narod.ru/knowhow/fijd.html + служебный док + СтатусВозврата(0) + открытие любой формы нового документа какой хочешь.. |
|||
9
Ёпрст
13.03.14
✎
11:23
|
Ну, или прямой правкой компаунда сделать то, что на синьоре написано.. Там просто ид документа в журнале остается (не очищается)..
|
|||
10
Ёпрст
13.03.14
✎
11:24
|
Хотя, мне проще через Перехватчик усё слепить, быстрее и конфа не изменяется.
|
|||
11
Duke1C
13.03.14
✎
11:25
|
(8,9) Понятно, лучше уж тады через Перехватчик,
я думал может есть чё-нить штатно, типа как в форме списка справочника ПриВводеСтроки() |
|||
12
Ёпрст
13.03.14
✎
11:28
|
в (8) вполне себе штатно.. раньше mszus эту фичу за 5 $ продавал..
|
|||
13
Duke1C
13.03.14
✎
11:54
|
(7) Млин, чёт не перехватывается событие_ВводНового :(((
|
|||
14
Duke1C
13.03.14
✎
11:56
|
Хотя класс Перехватчик у меня используется, и события ПриОткрытии и ПриЗаписи ловятся нормально
|
|||
15
Ёпрст
13.03.14
✎
11:59
|
(13) у тебя перехват реализован в одном классе или в 2-х ?
Если че, это событие локального контекста. |
|||
16
varelchik
13.03.14
✎
12:03
|
(0) Не забудь еще про событие:
ВводНаОсновании() |
|||
17
Duke1C
13.03.14
✎
13:06
|
(15) В 2-х. Делал по твоему, образцу, выложенному на ИСе (Ctrl+Z для отмены действий в формах доков).
Т.е. ПриНачалеРаботыСистемы: Настройки=СоздатьОбъект("УправлениеНастройками"); Настройки.Включить("ПерехватитьСобытияГК"); ПерехватчикСобытийГМ = СоздатьОбъект("ПерехватчикГМ"); Перехватчик = СоздатьОбъект("Перехватчик"); Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ); В классе "ПерехватчикГМ": Процедура СобытиеГМ_ПриОткрытии(Конт, ФлагЧтенияНастройки) Экспорт ПерехватчикСобытийФормы = СоздатьОбъект("ПерехватчикГК"); ПерехватчикСобытийФормы.ВключитьПерехватСобытийГК(Конт); КонецПроцедуры И уже в классе "ПерехватчикГК": Функция Событие_ВводНового() Экспорт Сообщить(ТипЗначенияСтр(КонтФормы)); // Вот тут не выводит никуа Если Sv_ВводНового()=1 Тогда Возврат Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ВводНового"); КонецЕсли; КонецФункции |
|||
18
Duke1C
13.03.14
✎
13:14
|
Упс, забыл. В классе "ПерехватчикГК" присутствует:
Перем Перехватчик; Перем Сам; Перем КонтФормы Экспорт; Перем МетаДата; //====================================================================== Функция Сам(Конт) Возврат Конт; КонецФункции //====================================================================== Процедура Конструктор() Сам = Сам(Контекст); КонтФормы = Сам(Контекст).ПолучитьКонтекстОкружения(); Перехватчик = СоздатьОбъект("Перехватчик"); КонецПроцедуры //====================================================================== Процедура ВключитьПерехватСобытийГК(Конт = "") Экспорт Если ТипЗначенияСтр(Конт) = "ГрупповойКонтекст" Тогда КонтФормы = Конт; КонецЕсли; Перехватчик.ПерехватитьСобытияГК(КонтФормы,Контекст); КонецПроцедуры Может тут где собака порылась... |
|||
19
Ёпрст
13.03.14
✎
13:34
|
На пример.. "всё в одном"
|
|||
20
Duke1C
13.03.14
✎
13:38
|
кстати, версия 1С++ 3.2.2.0, FormEx 2.0.5.107
|
|||
21
Ёпрст
13.03.14
✎
13:40
|
В ПриНачалеРаботыСистемы()
ЗагрузитьВнешнююКомпоненту("1cpp.dll"); Настройки=СоздатьОбъект("УправлениеНастройками"); Настройки.Сбросить("Проверка типов"); Настройки.Сбросить("Отладка"); //Настройки.Сбросить("Оптимизация"); Настройки.Включить("Оптимизация"); Настройки.Включить("TurboBL"); Настройки.Включить("ПерехватитьСобытияГК"); Перехватчик = СоздатьОбъект("Перехватчик"); ПерехватчикСобытийГМ = СоздатьОбъект("ПерехватСобытий"); Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ); ПерехватчикСобытийГМ.ПерехватитьПроведение(); ЗагрузитьВнешнююКомпоненту("formex.dll"); сам класс тут |
|||
22
Ёпрст
13.03.14
✎
13:41
|
||||
23
Duke1C
13.03.14
✎
13:55
|
(22) Спасибо, чуть попозжа попробую такой вариант, надо только будет все мои примочки перетащить
А всё-таки чего ему в моём то варианте не хватает |
|||
24
Ёпрст
13.03.14
✎
14:02
|
В твоём варианте - неверное создание перехватчика для локального контекста, нужно не в
СобытиеГМ_ПриОткрытии создавать перехват, а в СобытиеГМ_СозданиеКонтекста(Конт) ибо ПриОткрытии возникает позже, чем вводНового.. |
|||
25
Duke1C
13.03.14
✎
14:06
|
(24) Аааа, Семен Семеныч...
Вот что значит делать по шаблону А что за функция/процедура такая "вирт()" в твоём классе? |
|||
26
Ёпрст
13.03.14
✎
14:12
|
позволяет получить контекст самого базового класса
|
|||
27
Duke1C
13.03.14
✎
16:00
|
(26) Спасибо за помощь.
Переписал все свои приблуды на твой вариант с одним классом. Все вроде работает. Теперь новый вопрос :) Как мне отменить этот ввод нового? Делаю так: Процедура Событие_ВводНового(Признак,Объект) Экспорт Если Sv_ВводНового()=1 Тогда Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ВводНового",Признак,Объект); КонецЕсли; КонецПроцедуры Я, чессно говоря, думал что если не выполнять оригинальное событие, то будет что-то типа СтатусВозврата(0), ан нет форма нового документа все равно открывается |
|||
28
Duke1C
13.03.14
✎
16:02
|
Хочу в итоге сделать следующее:
Для избранных юзверей заполнять некоторые реквизиты нового документа предопределенными значениями и сделать их недоступными для редактирования |
|||
29
Duke1C
13.03.14
✎
19:46
|
+28 либо вообще не давать вводить новый документ, типа:
"какие вам накуй сандалики вы еще конечки не износили" |
|||
30
Ёпрст
14.03.14
✎
09:16
|
(29) Так сделай и привет
Функция Событие_ВводНового(Признак,Объект) Экспорт Если глПолучитьПраво(НаборПрав,"Ввод нового")="-" Тогда ЛегкоеСообщение("Вам запрещено создание объекта ");//+РазделительСтрок+" "+Объект); Возврат 0; КонецЕсли; Если (ТипОбъекта = "Документ")или (ТипОбъекта="Справочник") Тогда Возврат Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ВводНового",Признак,Объект); Иначе Возврат Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ВводНового"); КонецЕсли; КонецФункции |
|||
31
Duke1C
14.03.14
✎
10:19
|
(30) Упс, про возврат 0 не догадался
Хотя у меня аналогично событие ПриОткрытии работает, т.е. если моя функция возвращает 0, то оригинальное событие не выполнялось и форма не открывалась |
|||
32
Duke1C
14.03.14
✎
10:29
|
Кстати, переписав все на один класс, 1С-ина теперь постоянно требует переиндексацию, хотя завершаю работу корректно.
Даже если просто запущу в режиме предприятия, и не совершая никаких действий, закрою её. |
|||
33
Mikeware
14.03.14
✎
10:46
|
(32) где-то ссылка на объект остается...
|
|||
34
Duke1C
14.03.14
✎
11:12
|
(33) На какой объект? Перехватчик?
И раньше не оставалась, а теперь вдруг начала... Хотя изменилось только подключение перехватчика (с 2-х классов на 1) (26) А эта функция "Вирт()" она какая-то предопределенная или в модуле перехватчика должна быть описана (типа как в (18) функция "Сам")? |
|||
35
varelchik
14.03.14
✎
11:32
|
(34) Предопределенная.
как и я() |
|||
36
eshtrey
14.03.14
✎
13:33
|
Решил изучить "Перехватчик", но что то не получается
глобальный модуль: ЗагрузитьВнешнююКомпоненту("1cpp.dll"); Настройки=СоздатьОбъект("УправлениеНастройками"); Настройки.Установить("ПерехватитьСобытияГК",1); Перехватчик = СоздатьОбъект("Перехватчик"); ПерехватчикСобытийГМ = СоздатьОбъект("ПерехватСобытий"); Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ); Класс: Перем Перехватчик; Процедура Конструктор() Перехватчик = СоздатьОбъект("Перехватчик"); КонецПроцедуры // Конструктор Функция СобытиеГМ_СозданиеКонтекста(Конт) Экспорт //сюда не заходит Сообщить("Создание"); Возврат 1; КонецФункции Функция СобытиеГМ_ПриОткрытии(Конт) Экспорт //сюда заходит ПерехватчикСобытийФормы = СоздатьОбъект("ПерехватСобытий"); Перехватчик.ПерехватитьСобытияГК(Конт,ПерехватчикСобытийФормы); Возврат 1; КонецФункции Функция Событие_ПриОткрытии() Экспорт //сюда не заходит Сообщить("Открыли"); Возврат 1; КонецФункции Функция Событие_ПриЗакрытии() Экспорт //сюда не заходит Сообщить("Закрыли"); Возврат 1; КонецФункции Функция Событие_ПриЗаписи() Экспорт //сюда не заходит Сообщить("Записали"); Возврат 1; КонецФункции Почему не срабатывает СобытиеГМ_СозданиеКонтекста() и функции Событие_....? пользовался http://www.1cpp.ru/docum/icpp/html/Hooker.html#runoriginaleventofgroupcontext и примером [Обучаловка] Преимущества класса «Перехватчик» внешней компоненты «1С++» |
|||
37
Duke1C
14.03.14
✎
14:06
|
(35) Ну, в принципе, я так и понял уже. Иначе бы в осадок выпало при компиляции.
А все-таки по поводу (32), может при таком подключении перехватчика теперь "обнулить" че-нить надо в ПриЗавершенииРаботы например (36) скачай (22) и подключи как в (21), заодно скажешь будет ли у тебя такая трабла, как у меня в (32) |
|||
38
eshtrey
14.03.14
✎
14:08
|
(37) все так и скачано и подключено было(просто почищено для изучения)
ошибки как у тебя не вылетало |
|||
39
eshtrey
14.03.14
✎
14:46
|
(37) не подскажешь, где у меня ошибка?
|
|||
40
Ёпрст
14.03.14
✎
14:57
|
(39) 1cpp какой хоть версии ?
|
|||
41
Ёпрст
14.03.14
✎
14:57
|
у тебя нет нигде опрделения перехватчика для локального контекста, поэтому локальные события не работают
Функция Событие_ПриЗакрытии() Экспорт //сюда не заходит |
|||
42
eshtrey
14.03.14
✎
15:09
|
(40)3.2.4.1
|
|||
43
eshtrey
14.03.14
✎
15:13
|
(41)это не то?
ПерехватчикСобытийФормы = СоздатьОбъект("ПерехватСобытий"); Перехватчик = СоздатьОбъект("Перехватчик"); Перехватчик.ПерехватитьСобытияГК(Конт,ПерехватчикСобытийФормы); |
|||
44
eshtrey
14.03.14
✎
15:19
|
(24) почему у меня в СобытиеГМ_ПриОткрытии() заходит а в
СобытиеГМ_СозданиеКонтекста(Конт) нет? |
|||
45
eshtrey
14.03.14
✎
15:33
|
проблема частично решилась
Как было ЗагрузитьВнешнююКомпоненту("1cpp.dll"); ЗагрузитьВнешнююКомпоненту("TurboMD.dll"); ЗагрузитьВнешнююКомпоненту("Formex.dll"); регистрацию TurboMD сделал первой |
|||
46
eshtrey
14.03.14
✎
15:39
|
теперь последовательность правильная
СобытиеГМ_СозданиеКонтекста СобытиеГМ_ПриОткрытии Событие_ПриОткрытии Событие_ПриЗакрытии |
|||
47
Ёпрст
14.03.14
✎
15:46
|
turbomd у теббя не той версии
|
|||
48
Ёпрст
14.03.14
✎
15:46
|
а так, 1cpp должна быть всегда первой.
|
|||
49
Mikeware
14.03.14
✎
15:49
|
(48) Ёп, напомни, как продцепить классы и в МД, и внешние, плз...
а то чойто я отупел... |
|||
50
eshtrey
14.03.14
✎
15:51
|
(47) 1.0.1.1
|
|||
51
Ёпрст
14.03.14
✎
16:08
|
(49) в мд обработку с идентификатором Defcls
и унутри //#include Classes\Defcls.prm и пути к классам в мд. а в самом Defcls.prm, который в каталоге .\Classes ужо пути к классам наружним |
|||
52
Ёпрст
14.03.14
✎
16:09
|
(50) я и грю не верная, правильная 1.0.0.1
и валяется она тут.. |
|||
53
Ёпрст
14.03.14
✎
16:10
|
||||
54
Mikeware
14.03.14
✎
16:11
|
(51) так и сделал. чой-то не видит внешние.
наеборот вообще не получилось Спаибо, проверю сейчас первый способ еще раз |
|||
55
Ёпрст
14.03.14
✎
16:16
|
не, всё видит..
|
|||
56
Duke1C
15.03.14
✎
14:36
|
Вобчем, ежели кому интересно, опосля продолжительных мытарств
выяснилось, что 1С-ина валится в ПриЗавершенииРаботыСистемы на: ОткрытьФормуМодально("Обработка.ТорговоеОборудование", "Отключить"); где именно валится в этой обработке пока не выяснял, заремил эту строку все стало нормуль. Будем продолжать изыскания попозжа |
|||
57
Duke1C
15.03.14
✎
14:57
|
Упс, оказывается Обработка.ТорговоеОборудование ни причем.
Валится при открытии любого модального окна. :((( Епрст, что скажешь по сему поводу? (50) проверь у себя тоже, плиз |
|||
58
Duke1C
16.03.14
✎
13:44
|
(52) Кстати, а разве турбомд не включена в состав 1С++?
|
|||
59
Duke1C
18.03.14
✎
07:32
|
Апну, ибо проблема актуальна
|
|||
60
Mikeware
18.03.14
✎
07:33
|
(59) какая проблема-то нынче?
|
|||
61
Duke1C
18.03.14
✎
08:54
|
(60) см (32), (56), (57)
|
|||
62
Ёпрст
21.03.14
✎
13:20
|
(57) в зависимости от версии формекса, не срабатывает предопределенное событие ПослеОткрытия в модальных формах , нужно искать формекс подревнее..
(58) в состав 1cpp включена turboBL, turboMD - это для динамического обновления форм и модулей.. |
|||
63
Duke1C
21.03.14
✎
13:21
|
(62) А у тебя с какой работает? :)
|
|||
64
Ёпрст
21.03.14
✎
15:44
|
(63) последний.. я избавился от события ПослеОткрытия.. переписав его на ПослеСозданияФормы
|
|||
65
Duke1C
21.03.14
✎
18:17
|
(64) Кстати, а в "Обработка.ТорговоеОборудование" нет там ничего "криминального" такого (типа ПослеОткрытия и пр. прибамбасов), тупо штатная, и все равно на ней падает
|
|||
66
Duke1C
25.03.14
✎
07:27
|
(64) + падает вообще при открытии любого отчета или обработки
|
|||
67
Mikeware
25.03.14
✎
07:37
|
(66) Значит, ссылка на контекст уже несуществующей формы где-то остается...
|
|||
68
Duke1C
25.03.14
✎
08:07
|
(67) Млин, и как её искать?
Тем более, пробую сразу после запуска 1С-ины в режиме предприятия открыть какую-либо обработку или отчет и привет. Журналы, справочники, документы открываются нормально и перехватчик свои действия отрабатывает. Пробовал даже закомментить функцию Событие_ПриОткрытии в перехватчике, всё равно вылет |
|||
69
Duke1C
25.03.14
✎
08:11
|
Чуть позже попробую переписать обратно на 2 класса, с учетом (24)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |