|   |   | 
| 
 | 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)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |