Вход | Регистрация
 

Как обрабатывать только измененные объекты?

Как обрабатывать только измененные объекты?
Я
   RomaH
 
13.04.21 - 08:47
Вот есть "История изменения"

там можно увидеть изменения объекта, но версия объекта появляется только после записи (в обработчике "ПриЗаписи" её (версии) еще нет)

Суть - делаю отложенную обработку объектов (справочник), обработка медленная и ресурсоемкая, поэтому хочу обрабатывать только реально измененные объекты

Использую план обмена в качестве таблицы регистрации "измененных"

вот как исключить из обработки не измененные объекты?
может пнете в правильную структуру метаданных?
   Волшебник
 
1 - 13.04.21 - 08:50
При записи объекта надо сравнивать с предыдущим состоянием. Если изменилось что-то важное, то регистрировать в плане обмена, а иначе очищать регистрацию плана обмена.

Ту же самую проверку можно встроить в обработку. 10 чтений лучше, чем 1 запись.
   RomaH
 
2 - 13.04.21 - 08:51
если опираться на Историю изменений - надо хранить номер версии обработанной пост-обработчиком
   RomaH
 
3 - 13.04.21 - 08:52
(1) сериализация? та что используется в Версионировании из БСП? "Историю" - не получится?
   Волшебник
 
4 - 13.04.21 - 08:54
пост-обработчик должен удалять регистрацию из плана обмена.
   RomaH
 
5 - 13.04.21 - 08:55
(4) т.е. надо регистр где хранить номер "Обработанной" версии объекта?
   Волшебник
 
6 - 13.04.21 - 08:56
(5) достаточно плана обмена, который хранит ещё не обработанные объекты
   RomaH
 
7 - 13.04.21 - 08:59
Имеем Справочник

Добавил элемент значение "1"
Записал в план обмена
Пост обработчиком выполнил алгоритм, записал в РС номер обработанной версии, удалил регистрацию

Пользователь зашел в элемент и нажал кнопку "Записать"
Записал в план обмена
Пост обработчиком сравнил актуальную и обработанную версии - разницы нет, удалил регистрацию
   RomaH
 
8 - 13.04.21 - 08:59
(6) как исключить не измененные объекты?
   RomaH
 
9 - 13.04.21 - 09:02
(6) откуда я узнаю какую версию объекта я обработал?

1-2-2-3-4-4-4-5 - меняли реквизит
Обработчик обработал "3"

ты же сам пишешь - "пост-обработчик должен удалять регистрацию из плана обмена." - т.е. в план обмена пишем ВСЕГДА
но перед обработкой проверяем наличие изменений?
   Волшебник
 
10 - 13.04.21 - 09:05
(9)
Вариант 1. в план обмен пишем только то, что требует пост-обработки

Вариант 2. в план обмен пишем всегда, но перед обработкой проверяем наличие изменений.
   Если пост-обработка не нужна, то удаляем регистрацию изменений.
   Если пост-обработка нужна, то проводим пост-обработку и удаляем регистрацию.
   RomaH
 
11 - 13.04.21 - 09:10
(10) ну - но при первом варианте использовать "Историю изменений" не получается - нет еще последней версии в базе
при втором - надо хранить номер обработанной версии - т.е. нужен отдельный РС
   hhhh
 
12 - 13.04.21 - 09:22
(11) зачем вообще нужны эти версии? Просто дату хранить влом что ли?
   Волшебник
 
13 - 13.04.21 - 09:23
(11) в варианте 1 всё можно сделать в момент записи объекта, если сравнить ЭтотОбъект и Ссылка.Объект

в варианте 2 обработанную версию исключаем из плана обмена (удаляем регистрацию). Зачем хранить уже обработанные?
В плане обмена остаются только необработанные?
Если же нужен лог обработки, то тогда нужен ещё регистр сведений или журнал регистрации.
   RomaH
 
14 - 13.04.21 - 09:32
(13) может я чего не понимаю 
при втором варианте вот есть у меня элемент зарегистрированный в плане обмена со значением реквизита "0"

я его обработал - удалил

пользователь зашел в форму справочника - нажал "Записать" - ничего не изменилось, но в плане обмена зарегистрировалось - как я узнаю, что объект не изменился?
   RomaH
 
15 - 13.04.21 - 09:33
(13) так я и спрашиваю про первый вариант - "Историю изменений" получится тут использовать - или как?
   Волшебник
 
16 - 13.04.21 - 09:34
(14) в вашем варианте надо его опять обрабатывать

у вас же нет проверки, нужна обработка или нет
   TormozIT
 
17 - 13.04.21 - 10:33
Отключить авторегистрацию изменений в специальном плане обмена, созданном только для решения этой задачи.
Отключить автосоздание версий этого справочника.

Процедура ПриЗаписи(Отказ)
    ИсторияДанных.ЗаписатьВерсию();
    Если ПоследняяВерсияСОдержитЗначимыеИзмененияПоСравнениюСПредыдущей() ТОгда
        ПланыОбмена.ЗарегистироватьИзменения(ЭтотОбъект, УзелНапокитель);
    КонецЕсли;
КонецПроцедуры
   Serg_1960
 
18 - 13.04.21 - 12:42
(17) :)
Процедура ПриЗаписи(Отказ)
   
   Если ВычислитьХэшОбъекта(ЭтотОбъект) <> ВычислитьХэшОбъекта(ЭтотОбъект.Ссылка) Тогда
      ИсторияДанных.ЗаписатьВерсию();
      ПланыОбмена.ЗарегистироватьИзменения(ЭтотОбъект);
   КонецЕсли;
  
КонецПроцедуры
   Kassern
 
19 - 13.04.21 - 12:46
(18) может изменения комментария в документе для ТС не значимое и перегружать такой не нужно)
   Serg_1960
 
20 - 13.04.21 - 13:27
(19) Автор ветки про "значимость" изменения ничего не говорил. Это вольные фантазии на тему "ПоследняяВерсияСОдержитЗначимыеИзмененияПоСравнениюСПредыдущей" из (17)
   RomaH
 
21 - 13.04.21 - 14:54
(17) спасибо
   RomaH
 
22 - 13.04.21 - 14:54
(18) а что за ВычислитьХэшОбъекта?
   Serg_1960
 
23 - 13.04.21 - 14:57
(22) А это функция, которую Вам ещё предстоит написать :)
Легко гуглится, много методов реализации.
   RomaH
 
24 - 13.04.21 - 15:00
(17) что-то не складывается
ИсторияДанных - это свойство справочника - у него нет методов

ЗаписатьВерсию - там тоже не все так просто... - но надо попробывать

(20) так я про историю и спрашивал - что бы не дергать сериализацию
   Serg_1960
 
25 - 13.04.21 - 15:05
Можно погуглить в конфигурации глобальным поиском подстроку "Хеширование" я у себя погуглил, нашёл:

Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) Экспорт
    
    Если Алгоритм = Неопределено Тогда
        Алгоритм = ХешФункция.MD5;
    КонецЕсли;
    
    ХешированиеДанных = Новый ХешированиеДанных(Алгоритм);
    Если ТипЗнч(Данные) <> Тип("Строка") И ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
        Данные = ЗначениеВСтрокуXML(Данные);
    КонецЕсли;
    ХешированиеДанных.Добавить(Данные);
    
    Если ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("ДвоичныеДанные") Тогда 
        Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
    ИначеЕсли ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("Число") Тогда
        Результат = Формат(ХешированиеДанных.ХешСумма, "ЧГ=");
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции
   RomaH
 
26 - 13.04.21 - 15:11
(25) да это не проблема - я хотел именно "историю данных" использовать
   TormozIT
 
27 - 13.04.21 - 16:26
(24)
Глобальный контекст (Global context)
ИсторияДанных (DataHistory)
Использование:
Только чтение.
Описание:
Тип: МенеджерИсторииДанных.
   TormozIT
 
28 - 13.04.21 - 16:29
Если таки нужен анализ изменений, то пригодится

МенеджерИсторииДанных (DataHistoryManager)
ПолучитьРазличияВерсий (GetVersionDiff)
Синтаксис:
ПолучитьРазличияВерсий(<Данные>, <НомерВерсииПослеИзменения>, <НомерВерсииДоИзменения>)
   RomaH
 
29 - 27.04.21 - 10:30
спасибо всем
вроде получается

у справочника выставил флаг "Выполнять обработку после записи истории"
ПриЗаписи

    ТекущийПользователь = Пользователи.ТекущийПользователь();
    
    ИсторияДанных.ЗаписатьВерсию(
        ЭтотОбъект,
        ТекущаяДата(),
        ТекущийПользователь.ИдентификаторПользователяИБ,
        ТекущийПользователь.Наименование,
        ТекущийПользователь.Наименование,
        ВидИзмененияДанных.Изменение);//Надо добавить проверку на ЭтоНовый

        
    ЗаписьИсторииДанных.Отказ = Истина//Иначе делает еще одну запись типовым механизмом



ну и в модуле менеджера:

Процедура ОбработкаПослеЗаписиВерсийИсторииДанных(ИнформацияОЗаписиВерсий)

    ПоследнняЗапись = ИнформацияОЗаписиВерсий.Количество() - 1;
    
    ЗаписьВерсии = ИнформацияОЗаписиВерсий[ПоследнняЗапись];
    
    Если ЗаписьВерсии.РазличияВерсий.Количество() Тогда
        
        Узел = ПланыОбмена.РегистрацияОбъектовУчета.ПолучитьСсылку(Новый УникальныйИдентификатор("cdafed17-6f41-11eb-a243-94188280c35b"));
        
        ПланыОбмена.ЗарегистрироватьИзменения(Узел,ЗаписьВерсии.Данные);
        
    Иначе
        
        ИсторияДанных.УдалитьВерсии(ЗаписьВерсии.Данные,ЗаписьВерсии.НомерВерсии,ЗаписьВерсии.НомерВерсии);

    КонецЕсли;
    
    ИсторияДанных.УдалитьИзОбработкиПослеЗаписиВерсий(ЗаписьВерсии.Данные);
    
КонецПроцедуры


таким образом в истории имею только записи с изменениями
и в плане обмена регистрируются только изменения
   mistеr
 
30 - 27.04.21 - 10:58
(8) > как исключить не измененные объекты?

А стоит ли? Много ли таких случаев, как (7)?
 
 


Список тем форума
 
Независимо от того, куда вы едете — это в гору и против ветра!
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.