Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Перехватчик. ПриЗаписи (число прочтений - 6782 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Перехватчик. ПриЗаписи
26. Августа 2010 :: 11:34
Печать  
Есть документ. На форме есть кнопка с формулой:
Цитата:
ЗаписатьСПроверкой()#Закрыть

Модуль формы:
Код
Выбрать все
Процедура ПриОткрытии()
	ПриЗаписиПерепроводить(1);
КонецПроцедуры
//==================
Процедура ПриЗаписи()
	Сообщить("При записи в Документе!");
КонецПроцедуры // ПриЗаписи

//==================
Процедура ЗаписатьСПроверкой()
	ПриЗаписи();
	Провести();
КонецПроцедуры // ЗаписатьСПроверкой 


В таком варианте в перехватчике НЕ попадаем в Событие_ПриЗаписи.

Изменяем формулу кнопки на такую:
Цитата:
ЗаписатьСПроверкой()#Провести#Закрыть

Тогда в это событие попадаем! Но вроде бы как тоже не совсем так как нужно. Вот цепочка вызова при таком варианте:
Цитата:
При записи в Документе!
Отрабатывает модуль проведения документа.
Проведение в перехватчике! Проводим Новый1 1
После записи в классе!
Событие ПриЗаписи в Перехватчике
При записи в Документе!
Отрабатывает модуль проведения документа.
Проведение в перехватчике! Проводим Новый1 1
После записи в классе!


вы уж извините, что я так зачастил. просто разбираюсь и походу наталкиваюсь на непонятные мне вещи
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #1 - 26. Августа 2010 :: 11:37
Печать  
Тестовая конфа всё та же (1С++ положить в каталог ИБ)
  

1cpp3_test_conf.rar ( 15 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. ПриЗаписи
Ответ #2 - 26. Августа 2010 :: 11:38
Печать  
Это же очевидно - в первом случае ты сам вызвал в ПриЗаписи()..
во втором - она автоматом вызывается как предопределенная проца, отсюда и перехват сработал.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #3 - 26. Августа 2010 :: 11:43
Печать  
Eprst писал(а) 26. Августа 2010 :: 11:38:
Это же очевидно - в первом случае ты сам вызвал в ПриЗаписи()..

А так перехватчик срабатывать и не должен?
Eprst писал(а) 26. Августа 2010 :: 11:38:
во втором - она автоматом вызывается как предопределенная проца, отсюда и перехват сработал.

Я ж "#Записать" не ставил. Наверное она неявно вызывается в "#Провести"....

В общем итог такой:
Перехватчик реагирует только на "#Записать" и "#Провести". хреново....
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. ПриЗаписи
Ответ #4 - 26. Августа 2010 :: 11:49
Печать  
Например, формулы кнопок:

1.#Записать - системная команда, вызывает предопределенную команду ПриЗаписи
выполняется следующим образом:
#Записать" = "ПриЗаписи(); Если СтатусВозврата()=1 Тогда Записать() КонецЕсли;

2.#Провести - системная команда, вызывает предопределенную команду ПриЗаписи, + модуль проведения

аналогично:
#Провести" = "ПриЗаписи(); Если СтатусВозврата()=1 Тогда Записать(); Провести(); КонецЕсли;
3.Записать() - метод документа, просто записывает документ
4.Провести() - метод документа, просто проводит документ

5.#Записать Провести - системная команда, вызывает предопределенную команду ПриЗаписи + модуль проведения
6.Записать();Провести() - выполняет п.3 + п.4

При установленном флаге ПриЗаписиПроводить(1) - любая запись проведенного документа приводит к его проведению..хоть команда хоть метод

Отсюда п. 5 - это 1 команда - 1 раз перепровод
п.6  - это 2 метода - итого 2 раза перепровод.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. ПриЗаписи
Ответ #5 - 26. Августа 2010 :: 11:51
Печать  
JohnyDeath писал(а) 26. Августа 2010 :: 11:43:
А так перехватчик срабатывать и не должен?


Конечно нет.. это же не предопределенная проца сработала сама, а ты сам её вызвал.. Мог бы с таким же успехом "ловить" свои процедуры модуля.

  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #6 - 26. Августа 2010 :: 11:53
Печать  
аналог глВзятьКонтекст(Контекст).ПриЗаписи можно юзать вместо простого ПриЗаписи.
В этом случае перехватчик поймает подобный вызов ПриЗаписи.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #7 - 26. Августа 2010 :: 11:57
Печать  
artbear писал(а) 26. Августа 2010 :: 11:53:
аналог глВзятьКонтекст(Контекст).ПриЗаписи можно юзать вместо простого ПриЗаписи.
В этом случае перехватчик поймает подобный вызов ПриЗаписи.

если ты имеешь ввиду переделать ф-ию на такую:
Код
Выбрать все
//======================================================================
Процедура ЗаписатьСПроверкой()
	глВзятьКонтекст(Контекст).ПриЗаписи();
	Провести();
КонецПроцедуры // ЗаписатьСПроверкой 


то всё равно не срабатывает.
Если документ модифицируется, то всё отрабатывается нормально. Спасиб. пойду капать дальше.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. ПриЗаписи
Ответ #8 - 26. Августа 2010 :: 12:06
Печать  
artbear писал(а) 26. Августа 2010 :: 11:53:
аналог глВзятьКонтекст(Контекст).ПриЗаписи можно юзать вместо простого ПриЗаписи.
В этом случае перехватчик поймает подобный вызов ПриЗаписи.


А можно на пальцах объяснить сей феномен ?
За счет чего такой вызов ловится ?
За счет возможности выполнения процедур через контекст формы ?
И.. так будет ловиться любая проца из модуля формы ?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #9 - 26. Августа 2010 :: 12:09
Печать  
(0) Даже без перехватчиков  у меня сделано так

ЗаписатьСПроверкой()#Записать # Провести #Закрыть

В зависимости от условий задачи функция
ЗаписатьСПроверкой() должна переопределить строку
СтрокаДействийФормы
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #10 - 26. Августа 2010 :: 12:11
Печать  
Первый вариант был неверным.
Вот точный вариант, в котором перехватчиком ловится ручной вызов ПриЗаписи.
Цитата:
Процедура ЗаписатьСПроверкой()
     Перехватчик=СоздатьОбъект("Перехватчик");
     контФормы = ВзятьКонтекст(Контекст);
     перехватчикГК = Перехватчик.ПолучитьПерехватчикСобытийГК(КонтФормы);
     
     Если Перехватчик.ВыполнитьСобытиеГК(перехватчикГК, контФормы, "ПриЗаписи")=0 Тогда
           Возврат;
     КонецЕсли;
     
     Провести();      
КонецПроцедуры // ЗаписатьСПроверкой


Данный способ я рекомендую для любого случая программного вызова события ГК, даже если нет установленных перехватчиков.
чтобы в будущем не пришлось переписывать код для совместной работы с перехватчиком Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #11 - 26. Августа 2010 :: 12:19
Печать  
Z1 писал(а) 26. Августа 2010 :: 12:09:
(0) Даже без перехватчиков  у меня сделано так

ЗаписатьСПроверкой()#Записать # Провести #Закрыть

В зависимости от условий задачи функция
ЗаписатьСПроверкой() должна переопределить строку
СтрокаДействийФормы

Конфа просто не вся моя. На такой документ чисто случайно нарвался. Придется, наверное, пробежаться по всем документам и справочникам и проверить такие кнопки.


Я тут пытаюсь сделать логгирование изменений реквизитов документов/справочников. Схема примерно такая:
1. В ПриЗаписи делаю слепок документа и помещаю его в глобальный буфер
2. В ФормаПослеЗаписи делаю второй слепок и сравниваю с первым через ИТЗ.Разность.
3. Полученную разность записываю во внешнюю БД.
Вроде бы всё более-менее красиво, но тут в обязательном порядке у всех документов/справочников должно вызываться "ПриЗаписи" (которая #Записать).
Или и у этой моей логике есть подводные камни?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #12 - 26. Августа 2010 :: 12:26
Печать  
JohnyDeath писал(а) 26. Августа 2010 :: 12:19:
тут в обязательном порядке у всех документов/справочников должно вызываться "ПриЗаписи" (которая #Записать).
Или и у этой моей логике есть подводные камни?

откуда обязательность-то?
от наличия обработчика ПриЗаписи в форме документа Перехватчик не зависит Улыбка

ИМХО фраза должна звучать по-другому:
1. не должно быть программной записи документа через Записать()
2. не должно быть простого вызова в форме документа ПриЗаписи - его нужно исправить на код Артура
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #13 - 26. Августа 2010 :: 12:27
Печать  
JohnyDeath писал(а) 26. Августа 2010 :: 12:19:
Z1 писал(а) 26. Августа 2010 :: 12:09:
(0) Даже без перехватчиков  у меня сделано так

ЗаписатьСПроверкой()#Записать # Провести #Закрыть

В зависимости от условий задачи функция
ЗаписатьСПроверкой() должна переопределить строку
СтрокаДействийФормы

Конфа просто не вся моя. На такой документ чисто случайно нарвался. Придется, наверное, пробежаться по всем документам и справочникам и проверить такие кнопки.


Я тут пытаюсь сделать логгирование изменений реквизитов документов/справочников. Схема примерно такая:
1. В ПриЗаписи делаю слепок документа и помещаю его в глобальный буфер
2. В ФормаПослеЗаписи делаю второй слепок и сравниваю с первым через ИТЗ.Разность.
3. Полученную разность записываю во внешнюю БД.
Вроде бы всё более-менее красиво, но тут в обязательном порядке у всех документов/справочников должно вызываться "ПриЗаписи" (которая #Записать).
Или и у этой моей логике есть подводные камни?

По моему
ПриЗаписи() может срабатывать и без всяких кнопок.
Вошли в существующий документ.
Изменили документ.
Нажали крестик в правом верхнем углу.
на вопрос сохранитьдокумент
Ответили Да
Вызывается метод формы ПриЗаписи()
так я что-то не вижу изъянов логики  твоего логирования.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. ПриЗаписи
Ответ #14 - 26. Августа 2010 :: 12:29
Печать  
artbear писал(а) 26. Августа 2010 :: 12:26:
1. не должно быть программной записи документа через Записать()
2. не должно быть простого вызова в форме документа ПриЗаписи - его нужно исправить на код Артура

Да, наверное, ты прав.
От этого становится грустно
Одно радует - завтра отпуск начинается!  Очень довольный
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать