Имя: Пароль:
1C
1C 7.7
v7: 1С++ Перехватчик.
,
0 varelchik
 
07.06.13
14:50
Народ подскажите кто сталкивался?
Есть пользовательский класс ПерехватГМ

Перем _Перехватчик;

Процедура ВключитьПерехватСобытий() Экспорт
   
   лУправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
   лУправлениеНастройками.Включить("ПерехватитьСобытияГК");

   _Перехватчик = СоздатьОбъект("Перехватчик");  
   _Перехватчик.ПерехватитьСобытияГлобальногоМодуля(Контекст);
   _Перехватчик.ПодключитьСобытие_ЗаписьПользовательскогоСобытияЖурналаРегистрации();
   _Перехватчик.ПодключитьСобытие_ЗаписьСобытияЖурналаРегистрации();
КонецПроцедуры    // ВключитьПерехватСобытий


Функция СобытиеГМ_ВводНаОсновании(Конт,Основание) Экспорт
   рФорма=СоздатьОбъект("РасширениеФормы");
   рФорма.УстановитьФорму(Конт.Форма);
   Тип=рФорма.ТипОбъекта();
   Вид=Конт.Вид();
   Если Тип="Документ" Тогда
       Если Метаданные.ОбщийРеквизитДокумента("IDD").Выбран()=1 Тогда
           Конт.IDD="";
       КонецЕсли;
       Если Основание.Вид()="Перемещение" Тогда
           Если Основание.ВнешнПерем=1 Тогда
               Предупреждение("Запрещено вводить на основании внешних перемещений!
                               |        Используйте копирование.",50);
               Возврат 0;
           КонецЕсли;
       КонецЕсли;
   ИначеЕсли Тип="Справочник" Тогда
       Если Метаданные.Справочник(Вид).Реквизит("IDD").Выбран()=1 Тогда
           Конт.IDD="";
       КонецЕсли;
   КонецЕсли;
   стат=_Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт,"ВводНаОсновании",Основание);
   Сообщить(стат);
   Возврат стат;
КонецФункции // СобытиеГМ_ВводНаОсновании
1 varelchik
 
07.06.13
14:55
Так вот суть в следующем.
Если сделать Какой либо документ вводом на основании,
то в случае когда Это условие
          Если Основание.ВнешнПерем=1 Тогда
               Предупреждение("Запрещено вводить на основании внешних перемещений!
                               |        Используйте копирование.",50);
               Возврат 0;
           КонецЕсли;

не отрабатывается, ввод работает нормально.
Но если попадаем в это условие, тогда дальнейший вводнаосновании отключается для все документов.
что у меня нетак?
2 Mikeware
 
07.06.13
14:57
не понял.
3 varelchik
 
07.06.13
14:57
_Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт,"ВводНаОсновании",Основание);
нормально заходит в форму документа,т.е. оригинальное событие срабатывает.
НО после таких движений всегда стат = 0.
4 varelchik
 
07.06.13
14:57
что непонял?
5 varelchik
 
07.06.13
14:58
после первого предупреждения перестает работать ВводНаОсновании
6 varelchik
 
07.06.13
14:59
пока из базы не выйдешь и не зайдешь назад нехочет работать хто ты тресни.
7 Mikeware
 
07.06.13
15:02
(6) а переххват - входит?
8 varelchik
 
07.06.13
15:03
(7)в том то и дело.
9 varelchik
 
07.06.13
15:04
специально в форме у перехвата сделал сообщить("форма").
Выводиться в слюбом случае.
10 varelchik
 
07.06.13
15:14
И вот что интересно.
Если отрабатывется правильно то последовательность действий какая-то странная.
Повесил сообщить в 3 местах.
1.В начеле События СобытиеГМ_ВводНаОсновании
2.В модуле формы в оригинальном событии.
3.после _Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт,"ВводНаОсновании",Основание);
а именно
В нормальном режиме конгда стат=1
Сообщает что
1. защел в перехват.
2. зашел в модуль формы.
3. о том что стат=1
4.опять о том что запущена процедура ВводНаОсновании() в форме.
11 varelchik
 
07.06.13
15:25
Начал эксперементы дальше.
Так вот после блокировки, если открыть любой документ.
То ввод ввостанавливатеся.
Если же после предупреждения попытаться снова сделать ввод на основании то ничего не происходит.
12 varelchik
 
07.06.13
16:35
Короче забил.
Перевел из ранга функции в процедуру.
Если кому понадобиться вот:

Процедура СобытиеГМ_ВводНаОсновании(Конт,Основание) Экспорт
   рФорма=СоздатьОбъект("РасширениеФормы");
   рФорма.УстановитьФорму(Конт.Форма);
   Тип=рФорма.ТипОбъекта();
   Вид=Конт.Вид();
   ОчиститьОснование=0;
   Если Тип="Документ" Тогда
       Если Метаданные.ОбщийРеквизитДокумента("IDD").Выбран()=1 Тогда
           Конт.IDD="";
       КонецЕсли;
       Если Основание.Вид()="Перемещение" Тогда
           Если Основание.ВнешнПерем=1 Тогда
               Предупреждение("Запрещено вводить на основании внешнего перемещения!",50);
               ОчиститьОснование=1;
           КонецЕсли;
       КонецЕсли;
   ИначеЕсли Тип="Справочник" Тогда
       Если Метаданные.Справочник(Вид).Реквизит("IDD").Выбран()=1 Тогда
           Конт.IDD="";
       КонецЕсли;
   КонецЕсли;
   Если ОчиститьОснование=1 Тогда
       Основание=ПолучитьПустоеЗначение("Документ."+Основание.Вид());
       Конт.Форма.Закрыть(0);
   КонецЕсли;
КонецПроцедуры //СобытиеГМ_ВводНаОсновании