Имя: Пароль:
1C
 
Как обрабатывать только измененные объекты?
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)?
Независимо от того, куда вы едете — это в гору и против ветра!