Имя: Пароль:
1C
1С v8
Определить что объект изменился
,
0 Franchiser
 
гуру
31.10.18
18:40
Как быстро определить что объект изменился?
Есть загруженный документ, далее документ перезагружается, нужно перезаписать документ только в случае если в нем изменилось что-либо.
Поможет ли здесь, например, хеш-функция?
1 Franchiser
 
гуру
31.10.18
18:42
Сравнение реквизитов по ссылке и в объекте не предлагайте, про него знаю.
2 Вафель
 
31.10.18
18:43
проще по полям пробежаться.
ведб хэш функцию нужно было вычислять заранее
3 Franchiser
 
гуру
31.10.18
18:48
(2) даже если есть табличная часть?
4 palsergeich
 
31.10.18
18:49
(3) И табличные части на вход хэш функции
Один из вариантов - сериализуете в XML и подаете на вход хэш функции
5 Cyberhawk
 
31.10.18
18:57
Зачем это узнавать? Включи платформенную историю данныхили БСПшную историю изменений и спи спокойно.
6 Franchiser
 
гуру
31.10.18
18:57
(4) наверно это долго...
7 Franchiser
 
гуру
31.10.18
19:00
(5) хочу оптимизировать скорость перезагрузки документов. Сейчас для целостности документы все помечаются на удаление, затем записываются и проводятся. 0.3 сек пометка, 0.25 сек запись и проведение. Документов более 10 тыс.
8 Cyberhawk
 
31.10.18
19:01
(7) Зачем при регулярном обмене помечать на удаление, когда достаточно просто отменить проведение?
А если обмен разовый, так пометь на удаление до начала загрузки, а потом уже грузи без этой пометки на удаление.
9 Franchiser
 
гуру
31.10.18
19:05
(8) хм, кстати да. Отмена проведения быстрее работает? Где то я встречал, что при восстановлении последовательности непроверенные документы становятся проведенными, поэтом помечаю
10 Franchiser
 
гуру
01.11.18
02:01
Нашел такую функцию тут Как быстро и красиво сравнить ВСЕ реквизиты документа? из подсистемы версионирования.



Функция СравнитьОбъекты(Объект1,Объект2)

    ЗаписьXML = Новый ЗаписьFastInfoset;
    ЗаписьXML.УстановитьДвоичныеДанные();
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписатьXML(ЗаписьXML, Объект1, НазначениеТипаXML.Явное);    
    ДанныеДвоичные1 = ЗаписьXML.Закрыть();
    
    ЗаписьXML = Новый ЗаписьFastInfoset;
    ЗаписьXML.УстановитьДвоичныеДанные();
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписатьXML(ЗаписьXML, Объект2, НазначениеТипаXML.Явное);
    ДанныеДвоичные2 = ЗаписьXML.Закрыть();

    Возврат (ДанныеДвоичные1 = ДанныеДвоичные2);

КонецФункции
11 Злопчинский
 
01.11.18
02:03
(10) и чо? вопрос-то был в т.ч. и "как быстро"...
эта функция - быстрая?
12 Franchiser
 
гуру
01.11.18
02:12
(11) человек пишет что это быстрее, чем повторная запись объектов через кд
13 Franchiser
 
гуру
01.11.18
02:15
Shved_72
66 - 29.11.15 - 09:42
(61) замерю потом отладчиком на большом объеме. пока стало в разы быстрей, за счет пропуска записи не измененных объектов
14 Franchiser
 
гуру
01.11.18
02:17
Скорее всего остановлюсь на том, что сверю структуру записываемых реквизитов и реквизитами, помещенными в структуру из ссылки с помощью значениевстрокувнутр(), т.к. их не очень много
15 Franchiser
 
гуру
01.11.18
02:20
Ещё нужно проверить правда ли быстрее получить отдельные реквизиты из ссылки запросом, чем обращаться через точку, это же запрос в цикле будет при проведении ...

https://its.1c.eu/db/metod8dev#content:2754:hdoc
16 Mankubus
 
01.11.18
05:50
(15) обращение через точку это тоже запрос
17 0xFFFFFF
 
01.11.18
05:54
(0) сравнить ВерсияДанных, не?
18 Cyberhawk
 
01.11.18
08:23
(10) Через ФастИнфоСет не рекомендую, если сравнивать хочешь объекты с ТЧ, т.к. он в этом плане багнутый (может терять строки ТЧ или всю ТЧ вообще) и это кажись за 10 лет так и не починили.