Имя: Пароль:
1C
1С v8
Независимый регистр сведений. Как увидеть изменения набора без гл. переменных
0 Crush
 
19.04.13
12:37
Пытаюсь определить что поменялось в записи РС, но чет ни чего не выходит.

Процедура ПередЗаписью(Отказ, Замещение) //модуль набора записей
   ИсходныйНабор    = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
   Для каждого ЭлОтбора Из Отбор Цикл
       ЗаполнитьЗначенияСвойств(ИсходныйНабор.Отбор.Найти(ЭлОтбора.Имя),ЭлОтбора);
   КонецЦикла;
   ИсходныйНабор.Прочитать();
   ДополнительныеСвойства.Вставить("ИсходныйНабор",ИсходныйНабор);
КонецПроцедуры

Событие вызывается 2 раза:
1. Очистка набора (Замещение = Истина)
Чтение регистра дает исходные данные (ИсходныйНабор)
Записываемый набор пустой.

2. Запись нового набора (Замещение = Ложь)
Записываемый набор - это измененные данные
Чтение регистра - дает пустой набор
Дополнительные свойства очищаются при втором вызове.

Можно конечно загнать данные исходного набора в структуру и положить в глобальную переменную, но интуиция подсказывает, что это не есть хорошо.
Подскажите как правильно отследить изменения независимого регистра сведений. В частности интересует старое значение измерения и новое.
1 Crush
 
19.04.13
15:27
Решил:) Но теперь записи просто так не удалить. Только интерактивно, передав ключ в ДопСвойства набора.
Если у кого есть напильник, буду благодарен!:)

Процедура ЗаполнитьНабор(Приемник, Источник)
   Для каждого текЗапись Из Источник Цикл
       ЗаполнитьЗначенияСвойств(Приемник.Добавить(),текЗапись);    
   КонецЦикла;
КонецПроцедуры

Процедура СообщитьОбИзменениях(Было, Стало)
   Для каждого киз Из Новый Структура("рес,рек",Метаданные().Ресурсы,Метаданные().Реквизиты) Цикл
       Для каждого ирр Из киз.Значение Цикл
           Если Было[ирр.Имя]<>Стало[ирр.Имя] Тогда
               Сообщить(ирр.Имя + ": было " + Было[ирр.Имя] + " Стало " + Стало[ирр.Имя]);
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
КонецПроцедуры


Процедура ПередЗаписью(Отказ, Замещение)
   Если не ДополнительныеСвойства.Свойство("йетоКлючьKотoрыйНиктoHеДолженЗнаtь") Тогда
       Если Замещение Тогда
           ЭтотОбъект.Прочитать();
       Иначе
           новыйНабор    = РегистрыСведений[Метаданные().Имя].СоздатьНаборЗаписей();
           ЗаполнитьНабор(новыйНабор,ЭтотОбъект);
           ЭтотОбъект.Прочитать();
           СообщитьОбИзменениях(ЭтотОбъект[0],новыйНабор[0]);
           ЭтотОбъект.Очистить();
           ЭтотОбъект.ДополнительныеСвойства.Вставить("йетоКлючьKотoрыйНиктoHеДолженЗнаtь");
           ЭтотОбъект.Записать(Истина);
           ЗаполнитьНабор(ЭтотОбъект,новыйНабор);
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры
2 Crush
 
19.04.13
15:30
При первом вызове события очистка не происходит, а при втором вызове сначала читаю новые данные, потом старые. Очищаю старые и записываю новые.
И что разработчики платформы не могут сделать что то подобное, но более культурно?
Или хотя бы определили бы событие-родитель, для двух событий записи регистра.