|
Как обрабатывать только измененные объекты? | ☑ | ||
---|---|---|---|---|
0
RomaH
naïve
13.04.21
✎
08:47
|
Вот есть "История изменения"
там можно увидеть изменения объекта, но версия объекта появляется только после записи (в обработчике "ПриЗаписи" её (версии) еще нет) Суть - делаю отложенную обработку объектов (справочник), обработка медленная и ресурсоемкая, поэтому хочу обрабатывать только реально измененные объекты Использую план обмена в качестве таблицы регистрации "измененных" вот как исключить из обработки не измененные объекты? может пнете в правильную структуру метаданных? |
|||
1
Волшебник
13.04.21
✎
08:50
|
При записи объекта надо сравнивать с предыдущим состоянием. Если изменилось что-то важное, то регистрировать в плане обмена, а иначе очищать регистрацию плана обмена.
Ту же самую проверку можно встроить в обработку. 10 чтений лучше, чем 1 запись. |
|||
2
RomaH
naïve
13.04.21
✎
08:51
|
если опираться на Историю изменений - надо хранить номер версии обработанной пост-обработчиком
|
|||
3
RomaH
naïve
13.04.21
✎
08:52
|
(1) сериализация? та что используется в Версионировании из БСП? "Историю" - не получится?
|
|||
4
Волшебник
13.04.21
✎
08:54
|
пост-обработчик должен удалять регистрацию из плана обмена.
|
|||
5
RomaH
naïve
13.04.21
✎
08:55
|
(4) т.е. надо регистр где хранить номер "Обработанной" версии объекта?
|
|||
6
Волшебник
13.04.21
✎
08:56
|
(5) достаточно плана обмена, который хранит ещё не обработанные объекты
|
|||
7
RomaH
naïve
13.04.21
✎
08:59
|
Имеем Справочник
Добавил элемент значение "1" Записал в план обмена Пост обработчиком выполнил алгоритм, записал в РС номер обработанной версии, удалил регистрацию Пользователь зашел в элемент и нажал кнопку "Записать" Записал в план обмена Пост обработчиком сравнил актуальную и обработанную версии - разницы нет, удалил регистрацию |
|||
8
RomaH
naïve
13.04.21
✎
08:59
|
(6) как исключить не измененные объекты?
|
|||
9
RomaH
naïve
13.04.21
✎
09:02
|
(6) откуда я узнаю какую версию объекта я обработал?
1-2-2-3-4-4-4-5 - меняли реквизит Обработчик обработал "3" ты же сам пишешь - "пост-обработчик должен удалять регистрацию из плана обмена." - т.е. в план обмена пишем ВСЕГДА но перед обработкой проверяем наличие изменений? |
|||
10
Волшебник
13.04.21
✎
09:05
|
(9)
Вариант 1. в план обмен пишем только то, что требует пост-обработки Вариант 2. в план обмен пишем всегда, но перед обработкой проверяем наличие изменений. Если пост-обработка не нужна, то удаляем регистрацию изменений. Если пост-обработка нужна, то проводим пост-обработку и удаляем регистрацию. |
|||
11
RomaH
naïve
13.04.21
✎
09:10
|
(10) ну - но при первом варианте использовать "Историю изменений" не получается - нет еще последней версии в базе
при втором - надо хранить номер обработанной версии - т.е. нужен отдельный РС |
|||
12
hhhh
13.04.21
✎
09:22
|
(11) зачем вообще нужны эти версии? Просто дату хранить влом что ли?
|
|||
13
Волшебник
13.04.21
✎
09:23
|
(11) в варианте 1 всё можно сделать в момент записи объекта, если сравнить ЭтотОбъект и Ссылка.Объект
в варианте 2 обработанную версию исключаем из плана обмена (удаляем регистрацию). Зачем хранить уже обработанные? В плане обмена остаются только необработанные? Если же нужен лог обработки, то тогда нужен ещё регистр сведений или журнал регистрации. |
|||
14
RomaH
naïve
13.04.21
✎
09:32
|
(13) может я чего не понимаю
при втором варианте вот есть у меня элемент зарегистрированный в плане обмена со значением реквизита "0" я его обработал - удалил пользователь зашел в форму справочника - нажал "Записать" - ничего не изменилось, но в плане обмена зарегистрировалось - как я узнаю, что объект не изменился? |
|||
15
RomaH
naïve
13.04.21
✎
09:33
|
(13) так я и спрашиваю про первый вариант - "Историю изменений" получится тут использовать - или как?
|
|||
16
Волшебник
13.04.21
✎
09:34
|
(14) в вашем варианте надо его опять обрабатывать
у вас же нет проверки, нужна обработка или нет |
|||
17
TormozIT
гуру
13.04.21
✎
10:33
|
Отключить авторегистрацию изменений в специальном плане обмена, созданном только для решения этой задачи.
Отключить автосоздание версий этого справочника. Процедура ПриЗаписи(Отказ) ИсторияДанных.ЗаписатьВерсию(); Если ПоследняяВерсияСОдержитЗначимыеИзмененияПоСравнениюСПредыдущей() ТОгда ПланыОбмена.ЗарегистироватьИзменения(ЭтотОбъект, УзелНапокитель); КонецЕсли; КонецПроцедуры |
|||
18
Serg_1960
13.04.21
✎
12:42
|
(17) :)
Процедура ПриЗаписи(Отказ) Если ВычислитьХэшОбъекта(ЭтотОбъект) <> ВычислитьХэшОбъекта(ЭтотОбъект.Ссылка) Тогда ИсторияДанных.ЗаписатьВерсию(); ПланыОбмена.ЗарегистироватьИзменения(ЭтотОбъект); КонецЕсли; КонецПроцедуры |
|||
19
Kassern
13.04.21
✎
12:46
|
(18) может изменения комментария в документе для ТС не значимое и перегружать такой не нужно)
|
|||
20
Serg_1960
13.04.21
✎
13:27
|
(19) Автор ветки про "значимость" изменения ничего не говорил. Это вольные фантазии на тему "ПоследняяВерсияСОдержитЗначимыеИзмененияПоСравнениюСПредыдущей" из (17)
|
|||
21
RomaH
naïve
13.04.21
✎
14:54
|
(17) спасибо
|
|||
22
RomaH
naïve
13.04.21
✎
14:54
|
(18) а что за ВычислитьХэшОбъекта?
|
|||
23
Serg_1960
13.04.21
✎
14:57
|
(22) А это функция, которую Вам ещё предстоит написать :)
Легко гуглится, много методов реализации. |
|||
24
RomaH
naïve
13.04.21
✎
15:00
|
(17) что-то не складывается
ИсторияДанных - это свойство справочника - у него нет методов ЗаписатьВерсию - там тоже не все так просто... - но надо попробывать (20) так я про историю и спрашивал - что бы не дергать сериализацию |
|||
25
Serg_1960
13.04.21
✎
15:05
|
Можно погуглить в конфигурации глобальным поиском подстроку "Хеширование" я у себя погуглил, нашёл:
Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) Экспорт Если Алгоритм = Неопределено Тогда Алгоритм = ХешФункция.MD5; КонецЕсли; ХешированиеДанных = Новый ХешированиеДанных(Алгоритм); Если ТипЗнч(Данные) <> Тип("Строка") И ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда Данные = ЗначениеВСтрокуXML(Данные); КонецЕсли; ХешированиеДанных.Добавить(Данные); Если ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("ДвоичныеДанные") Тогда Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); ИначеЕсли ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("Число") Тогда Результат = Формат(ХешированиеДанных.ХешСумма, "ЧГ="); КонецЕсли; Возврат Результат; КонецФункции |
|||
26
RomaH
naïve
13.04.21
✎
15:11
|
(25) да это не проблема - я хотел именно "историю данных" использовать
|
|||
27
TormozIT
гуру
13.04.21
✎
16:26
|
(24)
Глобальный контекст (Global context) ИсторияДанных (DataHistory) Использование: Только чтение. Описание: Тип: МенеджерИсторииДанных. |
|||
28
TormozIT
гуру
13.04.21
✎
16:29
|
Если таки нужен анализ изменений, то пригодится
МенеджерИсторииДанных (DataHistoryManager) ПолучитьРазличияВерсий (GetVersionDiff) Синтаксис: ПолучитьРазличияВерсий(<Данные>, <НомерВерсииПослеИзменения>, <НомерВерсииДоИзменения>) |
|||
29
RomaH
naïve
27.04.21
✎
10:30
|
спасибо всем
вроде получается у справочника выставил флаг "Выполнять обработку после записи истории" ПриЗаписи ТекущийПользователь = Пользователи.ТекущийПользователь(); ИсторияДанных.ЗаписатьВерсию( ЭтотОбъект, ТекущаяДата(), ТекущийПользователь.ИдентификаторПользователяИБ, ТекущийПользователь.Наименование, ТекущийПользователь.Наименование, ВидИзмененияДанных.Изменение); //Надо добавить проверку на ЭтоНовый ЗаписьИсторииДанных.Отказ = Истина;//Иначе делает еще одну запись типовым механизмом ну и в модуле менеджера: Процедура ОбработкаПослеЗаписиВерсийИсторииДанных(ИнформацияОЗаписиВерсий) ПоследнняЗапись = ИнформацияОЗаписиВерсий.Количество() - 1; ЗаписьВерсии = ИнформацияОЗаписиВерсий[ПоследнняЗапись]; Если ЗаписьВерсии.РазличияВерсий.Количество() Тогда Узел = ПланыОбмена.РегистрацияОбъектовУчета.ПолучитьСсылку(Новый УникальныйИдентификатор("cdafed17-6f41-11eb-a243-94188280c35b")); ПланыОбмена.ЗарегистрироватьИзменения(Узел,ЗаписьВерсии.Данные); Иначе ИсторияДанных.УдалитьВерсии(ЗаписьВерсии.Данные,ЗаписьВерсии.НомерВерсии,ЗаписьВерсии.НомерВерсии); КонецЕсли; ИсторияДанных.УдалитьИзОбработкиПослеЗаписиВерсий(ЗаписьВерсии.Данные); КонецПроцедуры таким образом в истории имею только записи с изменениями и в плане обмена регистрируются только изменения |
|||
30
mistеr
27.04.21
✎
10:58
|
(8) > как исключить не измененные объекты?
А стоит ли? Много ли таких случаев, как (7)? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |