Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Журнализация изменений документов (число прочтений - 7627 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Журнализация изменений документов
24. Ноября 2008 :: 12:44
Печать  
Встала тут задача анализа изменений документов: кто, когда и что именно в них менял.

Соответственно, смежные задачи:
- получение снимка документа на определенный момент времени
- анализ изменений документов по определенным критериям

Формат базы - SQL.
Может, кто-нибудь реализовывал или сталкивался с чем-нибудь подобным?
Задача, в принципе, довольно универсальная.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #1 - 24. Ноября 2008 :: 12:49
Печать  
Почему не сталкивались? работает...
Код
Выбрать все
//_____________________________________________________________________________
Функция глИзмененыРеквизиты(Конт)  Экспорт
	Вид = Конт.Вид();
	Если Конт.ДатаДок <> Конт.ТекущийДокумент().ДатаДок Тогда
	    Возврат 1;
	КонецЕсли;
	Для Н=1 По Метаданные.Документ(Вид).РеквизитШапки() Цикл
		Ид=Метаданные.Документ(Вид).РеквизитШапки(Н).Идентификатор;
		Если Конт.ПолучитьАтрибут(Ид)<>Конт.ТекущийДокумент().ПолучитьАтрибут(Ид) Тогда
			Возврат 1;
		КонецЕсли;
	КонецЦикла;
	Док = Конт.ТекущийДокумент();
	Если Док.КоличествоСтрок()<>Конт.КоличествоСтрок() Тогда
	    Возврат 1;
	КонецЕсли;
	Для Н=1 По Метаданные.Документ(Вид).РеквизитТабличнойЧасти() Цикл

		Конт.ВыбратьСтроки();
		Пока Конт.ПолучитьСтроку()=1 Цикл

			Док.ПолучитьСтрокуПоНомеру(Конт.НомерСтроки);

			Ид=Метаданные.Документ(Вид).РеквизитТабличнойЧасти(Н).Идентификатор;

			Если Конт.ПолучитьАтрибут(Ид)<>Док.ПолучитьАтрибут(Ид) Тогда
				Возврат 1;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Возврат 0;
КонецФункции //глИзмененыРеквизиты


//_____________________________________________________________________________
Процедура глРегистрацияИзменений(Конт) Экспорт
	Если Конт.Выбран() = 0 Тогда
	    Возврат;
	КонецЕсли;
	Если глИзмененыРеквизиты(Конт) = 0 Тогда
		Возврат;
	КонецЕсли;
КонецПроцедуры //глРегистрацияИзменений(Конт)
 

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



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #2 - 24. Ноября 2008 :: 12:50
Печать  
А дальше, как фантазия подскажет...
  
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #3 - 24. Ноября 2008 :: 12:59
Печать  
toypaul когда-то делал.
Цитата:
Плагин ToySpy предназначен для настройки отслеживания изменений в базе данных 1С на платформе SQL Server. Под изменениями понимаются действия удаления, добавления, редактирования объектов базы данных – справочников, документов. С помощью специального отчета можно просмотреть список изменений, который включает в себя следующие данные: дата изменения, пользователь, компьютер, значения старых и новых реквизитов.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #4 - 24. Ноября 2008 :: 13:10
Печать  
trdm писал(а) 24. Ноября 2008 :: 12:49:
Почему не сталкивались? работает...

Какой знакомый код Улыбка
http://www.mista.ru/articles1c/hare/article.80.html
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Журнализация изменений документов
Ответ #5 - 24. Ноября 2008 :: 13:16
Печать  
trdm

Дим, а где это у тебя используется?
В ПриЗаписи?

Здесь ведь есть некая проблема: можно зарегистрировать изменения, а записи как таковой, например, не произойдет (не проведется/не запишется).

Конечно, можно продолжить изыскания и вытащить из 1C событие типа "ПослеЗаписи".
Если бы это получилось, можно было бы сделать более стабильное решение.

Вторая проблема - все это работает для интерактивных и принудительных регистраций.
Стоит забыться и изменения зарегистрированы не будут.
Именно в текущей задаче меня это не заботит, но тем не менее.

berezdetsky

О, спасибо.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #6 - 24. Ноября 2008 :: 13:33
Печать  
fez писал(а) 24. Ноября 2008 :: 13:10:
trdm писал(а) 24. Ноября 2008 :: 12:49:
Почему не сталкивались? работает...

Какой знакомый код Улыбка
http://www.mista.ru/articles1c/hare/article.80.html

гы...
вообще вытащил из конфигурации, которая была под рукой Улыбка
  
Наверх
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #7 - 24. Ноября 2008 :: 14:59
Печать  
kms писал(а) 24. Ноября 2008 :: 13:16:
Конечно, можно продолжить изыскания и вытащить из 1C событие типа "ПослеЗаписи".
Если бы это получилось, можно было бы сделать более стабильное решение.

У меня для документов работает эмулятор этого события, сделанный из ПриЗаписи() и ПослеОбновленияФормы() и ещё чего-то. Могу это дело выложить. Только скажи - пойдет ли оно тебе "как есть" (придется поработать напильником), или чтобы проще разбираться - вырезать сам эмуль?
Да. Событие у меня - ПослеУспешнойЗаписи() а не абы как Улыбка
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Журнализация изменений документов
Ответ #8 - 24. Ноября 2008 :: 15:06
Печать  
Пойдет, конечно.
Когда задача стоит - пойдет в любом виде. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Журнализация изменений документов
Ответ #9 - 24. Ноября 2008 :: 15:23
Печать  
berezdetsky писал(а) 24. Ноября 2008 :: 12:59:
toypaul когда-то делал.
Цитата:
Плагин ToySpy предназначен для настройки отслеживания изменений в базе данных 1С на платформе SQL Server. Под изменениями понимаются действия удаления, добавления, редактирования объектов базы данных – справочников, документов. С помощью специального отчета можно просмотреть список изменений, который включает в себя следующие данные: дата изменения, пользователь, компьютер, значения старых и новых реквизитов.


Достойный вариант, кстати, - для моей задачи.
Это как раз реализация системы, построенной на триггерах.
Отчеты, конечно, надо будет написать свои.
Но все желания, в принципе, по этой схеме реализуются.
Про проблемы (с производительностью, например) пока ничего сказать не могу.
Ну, подозреваю, что серьезных проблем в принципе быть не должно.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #10 - 24. Ноября 2008 :: 15:53
Печать  
kms писал(а) 24. Ноября 2008 :: 15:06:
Пойдет, конечно.
Когда задача стоит - пойдет в любом виде. Улыбка

В общем, вот наборчик. По твоему вопросу - смотри файл класс_ПерехватФормыДокумент.txt.
Остальное бросил до кучи, чтоб контекст и вызовы проще понять было. Если вздумаешь заюзать КОП ДетекторИзменений - предупрездаю, там есть баг в подготовке данных изменения табличной части. С этим багом проработали год, поэтому пока не исправляю, думаю... (косяк в нумерации записей в таблице изменений, улетающей на SQL, лишний инкремент...)
  

dnp_s_com_cls.zip ( 17 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Dimitry
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 9
Зарегистрирован: 21. Апреля 2008
Re: Журнализация изменений документов
Ответ #11 - 25. Ноября 2008 :: 08:42
Печать  
Я решил эту задачу на триггерах, т.к. нужно было журнализировать изменения только 3-х типов документов. Анализ изменений производится отчетом. Скорость работы базы не изменилась. Если надо кину примером. Да и основной плюс - пользователь ни при каких обстоятельствах не сможет скрыть своих действий.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #12 - 25. Ноября 2008 :: 10:35
Печать  
Dimitry писал(а) 25. Ноября 2008 :: 08:42:
Я решил эту задачу на триггерах, т.к. нужно было журнализировать изменения только 3-х типов документов. Анализ изменений производится отчетом. Скорость работы базы не изменилась. Если надо кину примером. Да и основной плюс - пользователь ни при каких обстоятельствах не сможет скрыть своих действий.

На шапку хорошо. а по табличной части?
  
Наверх
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Журнализация изменений документов
Ответ #13 - 25. Ноября 2008 :: 11:28
Печать  
dnp

О, идея понятна.
Ну надо же, и правда какая элегантная эмуляция события ПослеЗаписи!
Я, правда, теперь намерен отправить ее в прошлое, если получится.

trdm

Дык Дим, а погляди, к примеру, как это у Павла реализовано.
Очень даже юзабельно, просто консолидация изменений происходит уже в момент формирования отчета.

Под консолидацией я понимаю, например, обработку простой перестановки строк в документе.
Тут ведь зависит от задачи - мы можем считать это существенным либо несущественным.
Если это несущественно, то в твоей реализации это будет отсеиваться на этапе записи.
А в реализации на триггерах - на этапе анализа данных.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Журнализация изменений документов
Ответ #14 - 25. Ноября 2008 :: 11:28
Печать  
Dimitry писал(а) 25. Ноября 2008 :: 08:42:
Я решил эту задачу на триггерах, т.к. нужно было журнализировать изменения только 3-х типов документов. Анализ изменений производится отчетом. Скорость работы базы не изменилась. Если надо кину примером. Да и основной плюс - пользователь ни при каких обстоятельствах не сможет скрыть своих действий.

Конечно кидай, интересно.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #15 - 25. Ноября 2008 :: 12:46
Печать  
Меня вот всегда интересовало, как в подобных системах должны отыгрываться административные действия типа восстановление из архива, загрузка/выгрузка, обмен УРБД, обновление MD?
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #16 - 25. Ноября 2008 :: 13:08
Печать  
Alex_Bob писал(а) 25. Ноября 2008 :: 12:46:
Меня вот всегда интересовало, как в подобных системах должны отыгрываться административные действия типа восстановление из архива, загрузка/выгрузка, обмен УРБД, обновление MD?

шо значит отыгрываться?
  
Наверх
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #17 - 25. Ноября 2008 :: 13:56
Печать  
1. После загрузки/выгрузки или восстановления базы из архива некоторая часть изменений, сделанных пользователями может стать неактуальной, хотя с другой стороны, появляется шанс их восстановить.
2. Если система на триггерах в БД, то после изменения MD триггеры надо скорее всего восстанавливать заново.
3. Как отслеживать программные изменения данных, если используется перехват интерактивных действий пользователей. (Например ОбработкаДокументов)

Я собственно хотел спросить, заморачивался ли кто-нибудь по этому поводу и наступал ли на подобные грабли?
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Журнализация изменений документов
Ответ #18 - 25. Ноября 2008 :: 15:25
Печать  
Alex_Bob писал(а) 25. Ноября 2008 :: 13:56:
1. После загрузки/выгрузки или восстановления базы из архива некоторая часть изменений, сделанных пользователями может стать неактуальной, хотя с другой стороны, появляется шанс их восстановить.

Ну, тут правильно было бы рассматривать обе части архива как единое целое - т.е. и саму базу и журнал изменений.
Если восстановил только часть - ну что ж поделаешь, ССЗБ, как говорится.

Цитата:
2. Если система на триггерах в БД, то после изменения MD триггеры надо скорее всего восстанавливать заново.

Думал над этим - триггеры-то не беда, можно и пересоздать.
А вот то, что после реструктуризации базы надо заодно реструктуризировать и журнал - это, пожалуй, посложнее будет.
toypaul, как я понял, решал эту задачу: первоначально и триггеры и журналы изменений после реструктуризации у него очищались и создавались заново.
Сейчас, как я понимаю, информация в журнале реструктуризируется, но сохраняется.

Цитата:
3. Как отслеживать программные изменения данных, если используется перехват интерактивных действий пользователей. (Например ОбработкаДокументов)

Пока не понял, в чем отличие от какого-либо другого метода изменения документа.
А в чем может быть проблема?

Цитата:
Я собственно хотел спросить, заморачивался ли кто-нибудь по этому поводу и наступал ли на подобные грабли?

Пока вот только собираемся, тем интереснее обсуждение.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #19 - 26. Ноября 2008 :: 07:12
Печать  
kms писал(а) 25. Ноября 2008 :: 15:25:
А вот то, что после реструктуризации базы надо заодно реструктуризировать и журнал

А кто мешает развернуть все объекты в простую длинную таблицу в которой - один реквизит - одна строка?
Я таким образом развернул и табличные части и шапку и общие и системные реквизиты. Реструктуризация не требуется, хотя получение данных может вызвать некоторый гемороген -- собирать шапку документа из нескольких строк журнала, а табличную часть - из ещё более нескольких строк. Я посчитал, что частота обращения на чтение к журналу на столько низкая, что сложность извлечения ни что по сравнению с простотой обслуживания.
  
Наверх
ICQ  
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #20 - 26. Ноября 2008 :: 08:11
Печать  
Цитата:
Цитата:
Цитата:
3. Как отслеживать программные изменения данных, если используется перехват интерактивных действий пользователей. (Например ОбработкаДокументов)

Пока не понял, в чем отличие от какого-либо другого метода изменения документа.
А в чем может быть проблема?


Как я понял, в ветке рассматривается 2 альтернативных метода создания журнала изменений.
1. Перехват всех интерактивных событий и формирование журнала методами 1С. Минус в том, что таким методом нельзя перехватить изменения документов программным путем (например при запуске пользователем обработки массового перепроведения документов). Можно конечно изменить все используемые обработки и найти все места в конфигурации, где встречается метод Записать(), но это большой гемор с дальнейшим сопровождением.
2. Перехват всех событий с базой с помощью триггеров SQL и формирование журнала средствами SQL. Невозможно использовать для DBF и сложность с реструктуризацией.

Оптимальным наверно был бы подход как в восьмерке - там на уровне модуля объекта перехватываются любые события записи в базу. Но можно ли это реализовать в семерке без подмены dbeng32 я не знаю.

Если говорить о журнализации изменений только документов (а перечисленные выше методы в принципе могут работать и со справочниками и с константами и со счетами), то задачу можно сузить, рассматривая изменения только проведенных документов. Тогда можно перехватывать только событие проведения.
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Журнализация изменений документов
Ответ #21 - 26. Ноября 2008 :: 08:19
Печать  
Alex_Bob писал(а) 26. Ноября 2008 :: 08:11:
Цитата:
Цитата:
Цитата:
3. Как отслеживать программные изменения данных, если используется перехват интерактивных действий пользователей. (Например ОбработкаДокументов)

Пока не понял, в чем отличие от какого-либо другого метода изменения документа.
А в чем может быть проблема?


Как я понял, в ветке рассматривается 2 альтернативных метода создания журнала изменений.
1. Перехват всех интерактивных событий и формирование журнала методами 1С. Минус в том, что таким методом нельзя перехватить изменения документов программным путем (например при запуске пользователем обработки массового перепроведения документов). Можно конечно изменить все используемые обработки и найти все места в конфигурации, где встречается метод Записать(), но это большой гемор с дальнейшим сопровождением.
2. Перехват всех событий с базой с помощью триггеров SQL и формирование журнала средствами SQL. Невозможно использовать для DBF и сложность с реструктуризацией.

Оптимальным наверно был бы подход как в восьмерке - там на уровне модуля объекта перехватываются любые события записи в базу. Но можно ли это реализовать в семерке без подмены dbeng32 я не знаю.

Если говорить о журнализации изменений только документов (а перечисленные выше методы в принципе могут работать и со справочниками и с константами и со счетами), то задачу можно сузить, рассматривая изменения только проведенных документов. Тогда можно перехватывать только событие проведения.


Да можно при проведении пиши куда либо что либо
но во первых это плохо если много писать так как идет транзакция очень дорого,
во вторых документ(реквизиты документа) может меняться и в модуле проведения а если мы запишем раньше то получим не то
значение.
Третье сам сказал что делать при откате базы данных.
Четвертое при подгрузке УРБД событие проведение не получишь
и следовательно данные в другой таблице будут неправильными
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать