Переключение на Главную Страницу Страницы: [1] 2 3 4 ОтправитьПечать
Очень популярная тема (более 25 ответов) Перехват Объект.Записать() (число прочтений - 11992 )
freagle
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 87
Зарегистрирован: 21. Июня 2006
Перехват Объект.Записать()
24. Сентября 2007 :: 10:24
Печать  
Приветствую, коллеги!

Необходимо перехватывать вызовы методов "Записать()" у агрегатных типов 1С - справочников, документов, и т.д. У кого-нибудь есть идеи?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #1 - 24. Сентября 2007 :: 10:34
Печать  
Через Перехватчик Артур пока еще не делал.

Идея пока одна - делай класс, наследник твоего объекта и переопределяй Записать()
  
Наверх
 
IP записан
 
freagle
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 87
Зарегистрирован: 21. Июня 2006
Re: Перехват Объект.Записать()
Ответ #2 - 24. Сентября 2007 :: 10:39
Печать  
Нет. Идея с наследником рассматривалась, но в том-то и дело, что мне нужен прозрачный перехват - в любой конфе, ничего не меняя (или практически ничего) как минимум, записать в лог все измененения объектов. Ведь в журнал регистрации движок 1с пишет?. Как максимум, надо знать какие реквизиты объекта поменялись, и возможность установить/снять флаг стандартной обработки.
  
Наверх
 
IP записан
 
freagle
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 87
Зарегистрирован: 21. Июня 2006
Re: Перехват Объект.Записать()
Ответ #3 - 24. Сентября 2007 :: 11:02
Печать  
Цитата:
Через Перехватчик Артур пока еще не делал.


То есть мысли есть? Артур aka artbear? И на когда это в планах?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #4 - 24. Сентября 2007 :: 11:13
Печать  
Ага, это я.
В планах есть, но сроки не скажу Улыбка - очень/очень далеко Улыбка
Пока можешь попробовать хоть как-то использовать перехват записи в журнал регистрации и анализ сообщений, добавленный мной в 1С++ - см. доку

Коряво,конечно, но универсально Улыбка
  

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


I Love YaBB 2!

Сообщений: 87
Зарегистрирован: 21. Июня 2006
Re: Перехват Объект.Записать()
Ответ #5 - 24. Сентября 2007 :: 11:21
Печать  
Спасибо. До кучи: Если еще будут перехваты вызовов любых методов а если помечтать - то перехват вызова конструктора... То тогда - просто нет слов (с) Улыбка
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #6 - 25. Сентября 2007 :: 13:54
Печать  
А так не пойдет?
Код
Выбрать все
// глЭмулироватьПослеЗаписиДокумента( псКонт )
/// ваызывается из формы документа из процедуры "ПриЗаписи"
/// Эмулирует запись и проведение.
Функция глЭмулироватьПослеЗаписиДокумента( псКонт, псКонтекстФормыДокумента  = "" ) Экспорт
	ЗначВозврата = 0;
	вВидКонта = псКонт.вид();

	Если ТипЗначенияСтр(псКонтекстФормыДокумента) = "СписокЗначений" Тогда
	    Если псКонтекстФормыДокумента.Получить(глИД_ОтменитьПослеЗаписи) = Да Тогда
			Возврат 1;
	    КонецЕсли;
	КонецЕсли;

	/// Расчитываем на то, что Активный элемент формы
	/// кнопка из стандартного набора: "кнПровести, кнЗаписать, кнОК"
	/// Надо ухватить в часном случае вариант проведения,
	/// 	т.е. если нажата "кнПровести или кнОК"
	///		или нажата "кнЗаписать" при проведенном документе.
	вАктивныйЭлемент = "";
	Попытка
		вАктивныйЭлемент = псКонт.Форма.АктивныйЭлемент();
	Исключение
		вАктивныйЭлемент = "";
	КонецПопытки;

	вНужноПровести = 0;

	// часто эмуляция прерывается при выполнении команды по кнопке с формулой: "#Записать, Провести? Закрыть"
	// если выставим тут статус возврата в (0) то само закрытие не произойдет, по этому нужно скомандовать Форма.Закрыть()
	вНужноЗакрыть = 0;


	Если
	(вАктивныйЭлемент = "кнПровести") ИЛИ
	(вАктивныйЭлемент = "кнОК") ИЛИ
	(вАктивныйЭлемент = "ОК") ИЛИ
	(вАктивныйЭлемент = "КнПровестиЧастично") ИЛИ
	(вАктивныйЭлемент = "Провести")
	Тогда

		вНужноЗакрыть = ?((вАктивныйЭлемент = "кнОК") ИЛИ (вАктивныйЭлемент = "ОК"),1,0);

		вНужноПровести = 1 * (1 - псКонт.Проведен());

	КонецЕсли;


	вСтарСтатусИзврата = СтатусВозврата();

	Если вСтарСтатусИзврата = 0 Тогда
		Возврат ЗначВозврата;
	КонецЕсли;

	Попытка
		СтатусВозврата(0);
		псКонт.Записать();
	Исключение
		вСтрокаСообщения = ОписаниеОшибки();
		Сообщить(ОписаниеОшибки()+"[2007-06-07-13-27]");
		Возврат 0;
	КонецПопытки;

	Если вНужноПровести = 1 Тогда
		Попытка
			псКонт.Провести();
		Исключение
			Сообщить(ОписаниеОшибки()+"[2007-06-07-13-28]");
			Возврат 0;
		КонецПопытки;
	КонецЕсли;
	СтатусВозврата(0);
	Если вНужноЗакрыть = 1 Тогда
	    псКонт.Форма.Закрыть();
	КонецЕсли;
	Возврат 1;
КонецФункции // глЭмулироватьПослеЗаписиДокумента()
 



и в ПриЗаписи:
Код
Выбрать все
Процедура ПриЗаписи()
	вСписЗначАтрибутов = "ОсновноеСредство,Стоимость,Количество";
	Если глМожноЗаписатьДокумент(Контекст,  КонтекстФормыДокумента,вСписЗначАтрибутов)=0 Тогда
		СтатусВозврата(0); Возврат;
	КонецЕсли;
	Если глКонтрольДатыДокумента(Контекст, ДатаДок)=1 Тогда
		СтатусВозврата(0); Возврат;
	КонецЕсли;

	Если глЭмулироватьПослеЗаписиДокумента(Контекст ) = 1 Тогда
	    УправлениеДиалогом();
	КонецЕсли;

КонецПроцедуры // ПриЗаписи()


 

  
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #7 - 25. Сентября 2007 :: 14:04
Печать  
Эээ... разговор шел про Док.Записать(), а не про интерактивную запись Подмигивание
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #8 - 25. Сентября 2007 :: 14:06
Печать  
Arta писал(а) 25. Сентября 2007 :: 14:04:
Эээ... разговор шел про Док.Записать(), а не про интерактивную запись Подмигивание

блин, ну тогда все проще  Смех Смех Смех Смех
Ставим МОД, он фигачит процедуры, пользуемся ))))
  
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #9 - 25. Сентября 2007 :: 14:46
Печать  
Дим, это по 1С-овски. Хочется чтобы работало везде и всегда.
Именно для этого Артур и делал Перехватчик. Остается только ждать, когда у него дойдут до этого руки.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #10 - 25. Сентября 2007 :: 15:08
Печать  
Шуток не понимаешь?
  
Наверх
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #11 - 25. Сентября 2007 :: 15:43
Печать  
понял только теперь  Смех
  
Наверх
 
IP записан
 
freagle
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 87
Зарегистрирован: 21. Июня 2006
Re: Перехват Объект.Записать()
Ответ #12 - 26. Сентября 2007 :: 04:52
Печать  
Цитата:
Ставим МОД, он фигачит процедуры, пользуемся ))))


Надо, чтобы штуковина типа МОД'а не ставила процедуры, а пользовалась перехватом. в МОДе указал вместо ОбъектЗаписать(...) просто Записать() - и ищешь, почему же у тебя обмен неправильный...

Говорю же, нужен именно прозрачный перехват - в том числе и для удобства программиста.
Типа того, который имеем в .NET (это, я конечно, хватил, но для примера, только для примера)

Случай с МОД - частный, но на его примере хорошо видно соотношение ООП и АОП - это как в "Братва и кольцо" было сказано: "Саурон и кольцо, Федор - это как корпускулярно-волновая теория света"  Улыбка То есть в сложных системах мы имеем код, который должен быть "размазан" по всему остальному коду приложения - например, как в МОД размазан код отвечающий за запись объекта. А это не есть гуд. Поэтому перехват Записать() в частности, и перехват вызовов методов вообще - это способ уменьшить энтропию программного кода Улыбка И продолжать четко следовать генеральной линии ООП.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехват Объект.Записать()
Ответ #13 - 26. Сентября 2007 :: 05:49
Печать  
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Перехват Объект.Записать()
Ответ #14 - 26. Сентября 2007 :: 14:51
Печать  
К сожалению это не промышленная библиотека
Да и она только видит что объект поменялся, а что с ним сделали автор сам говорит что пока не реализовывал.
Да плюс Симантек на нее ругается.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать