|
|
|
Быстрое сравнение объектов | ☑ | ||
|---|---|---|---|---|
|
0
Dimon1C
29.10.25
✎
10:25
|
Добрый день. Подскажите, как можно быстро сравнить ПередЗаписью объекта изменился ли объект (хотя бы один реквизит)?
Пока вижу 2 подхода: 1. Сравнить все реквизиты (по метаданным) 2. Сериализация в XML (функция ЗаписатьXML) и потом сравнение Может что еще есть? |
|||
|
1
Garykom
гуру
29.10.25
✎
10:32
|
ЗаписьFastInfoset или ЗаписьJSON будет быстрее
|
|||
|
2
Ненавижу 1С
гуру
29.10.25
✎
10:33
|
(0) может достаточно проверить Модифицированность? хотя конечно это не совсем то. Еще ВерсияДанных
|
|||
|
3
Dimon1C
29.10.25
✎
10:42
|
(2) Версия данных меняется даже если никакой реквизит не изменился.
|
|||
|
4
Garykom
гуру
29.10.25
✎
10:44
|
Тут главный вопрос зачем это сравнивать?
Для чего это требуется? |
|||
|
5
Ильф
29.10.25
✎
10:49
|
(4) что бы не записывать, например
пользователи постоянно открывают "посмотреть" и закрывают через "Провести закрыть" |
|||
|
6
Garykom
гуру
29.10.25
✎
10:51
|
(5) В этом случае прекрасно работает Модифицированность
|
|||
|
7
Dimon1C
29.10.25
✎
10:51
|
(4) Для регистрации обмена со сторонними ИС
|
|||
|
8
Garykom
гуру
29.10.25
✎
10:53
|
(7) Не страдать фигней и регистрировать к обмену
Или можно получить дикие тормоза в некоторых случаях Дешевле лишний раз отправить чем отличать что поменялось и надо ли отправлять |
|||
|
9
arsik
гуру
29.10.25
✎
10:58
|
(7) Посмотри как это работает в БСП ВерсионированиеОбъектов.
Нам наоборот пришлось уйти от стандартной схемы, т.к. в документах есть общий реквизит "ДатаОперации" и другие, незначащие - и у нас писалось даже и при перезаписи объекта. Функция ВерсияОтличаетсяОтРанееЗаписанной(Объект)
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ВерсииОбъектов.КонтрольнаяСумма
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
|ГДЕ
| ВерсииОбъектов.Объект = &Объект
|
|УПОРЯДОЧИТЬ ПО
| ВерсииОбъектов.НомерВерсии УБЫВ";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Объект", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Не ПустаяСтрока(Выборка.КонтрольнаяСумма) Тогда
Возврат Выборка.КонтрольнаяСумма <> КонтрольнаяСумма(ДанныеДляХранения(Объект));
КонецЕсли;
Возврат Объект.ЭтоНовый() Или КонтрольнаяСумма(ДанныеДляХранения(Объект)) <> КонтрольнаяСумма(ДанныеДляХранения(Объект.Ссылка.ПолучитьОбъект()));
КонецФункции
Функция КонтрольнаяСумма(Данные) Экспорт
ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
Если ТипЗнч(Данные) = Тип("Структура") Тогда
ХешированиеДанных.Добавить(Данные.Объект);
Если Данные.Свойство("ДополнительныеРеквизиты") Тогда
ХешированиеДанных.Добавить(ОбщегоНазначения.ЗначениеВСтрокуXML(Данные.ДополнительныеРеквизиты));
КонецЕсли;
Иначе
ХешированиеДанных.Добавить(Данные);
КонецЕсли;
Возврат СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
КонецФункции
(8) Да с чего тормоза. Версионирование во всех типовых работает и норм. |
|||
|
10
Garykom
гуру
29.10.25
✎
10:59
|
Если есть случаи лишних массовых отправок - надо решать их первопричину
Например если юзеры наслаждаются перепроведением старых документов и оно пытается снова улетать в обмен - надо решать эту проблему, а не следствие |
|||
|
11
Garykom
гуру
29.10.25
✎
11:01
|
(9) Включение версионирования в типовых резко их тормозит
И да там сохраняются версии через ЗаписьFastInfoset |
|||
|
12
arsik
гуру
29.10.25
✎
11:16
|
(11) так я и не против фастинфосета
|
|||
|
13
H A D G E H O G s
29.10.25
✎
11:38
|
(0) Храни Хэш и сравнивай с ним.
|
|||
|
14
Garykom
гуру
29.10.25
✎
11:44
|
(13) В том и вопрос каким образом лучше получать хеш
Вот в (9) например функция ДанныеДляХранения() не описана |
|||
|
15
Garykom
гуру
29.10.25
✎
11:51
|
Если конфа типовая ERP/КА - то там в обмене-бесшовке с ДО уже есть требуемый функционал с Хешем
Хранением его в отдельном РС и сравнением перед выгрузкой в регзадании Но в очередь (регистрация в плане обмена) просто при каждой записи помещается, без лишних извратов |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |