Имя: Пароль:
1C
1C 7.7
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)