|
Как лучше всего отловить такие события? | ☑ | ||
---|---|---|---|---|
0
lanc2233
14.08.15
✎
01:36
|
Мне нужно писать в лог, изменение одного измерения в регистре накопления (тоесть отлавливать измения этого регистра), со следующими условиями :
- меняется хоть одно измерение или ресурс. - отмену проведения тоже отлавливать. В модуле объекта регистра, в при записи или после записи, можно получить уже новые значения через ЭтотОбъект.Выгрузить(), а как получить старые? Или можно как-то проще сделать? |
|||
1
patria0muerte
14.08.15
✎
02:07
|
В типовых вроде делается так, что:
1. Перед записью старые записи помещаются во временную таблицу и кладутся в дополнительные свойств набора записей. 2. При записи сравнивается новый набор записей и старый (полученный из доп. свойств) |
|||
2
lanc2233
14.08.15
✎
02:09
|
(1) а получить старые записи - это сделать запрос к регистру с отбором по регистратору?
|
|||
3
patria0muerte
14.08.15
✎
02:10
|
(2) Да. Вот тебе пример из типовой:
Процедура ПередЗаписью(Отказ, Замещение) Если ОбменДанными.Загрузка Или Не ПроведениеСервер.РассчитыватьИзменения(ДополнительныеСвойства) Тогда Возврат; КонецЕсли; ТребуетсяКонтроль = Истина; Для Каждого Запись Из ЭтотОбъект Цикл Если (Запись.ВидДвижения = ВидДвиженияНакопления.Расход И Запись.ВНаличии <> 0) Или (Запись.ВидДвижения = ВидДвиженияНакопления.Приход И Запись.КОтгрузке <> 0)Тогда ТребуетсяКонтроль = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Запись.Склад,"КонтролироватьОперативныеОстатки"); Прервать; КонецЕсли; КонецЦикла; Если Не ТребуетсяКонтроль Тогда ДополнительныеСвойства.РассчитыватьИзменения = Ложь; Возврат; КонецЕсли; СтруктураВременныеТаблицы = ДополнительныеСвойства.ДляПроведения.СтруктураВременныеТаблицы; БлокироватьДляИзменения = Истина; // Текущее состояние набора помещается во временную таблицу "ДвиженияТоварыВЯчейкахЗаписью", // чтобы при записи получить изменение нового набора относительно текущего. Запрос = Новый Запрос; Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение); Запрос.УстановитьПараметр("ЭтоНовый", ДополнительныеСвойства.ЭтоНовый); Запрос.МенеджерВременныхТаблиц = СтруктураВременныеТаблицы.МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | Таблица.Номенклатура КАК Номенклатура, | Таблица.Характеристика КАК Характеристика, | Таблица.Назначение КАК Назначение, | Таблица.Серия КАК Серия, | Таблица.Склад КАК Склад, | Таблица.Помещение КАК Помещение, | ВЫБОР | КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) | ТОГДА Таблица.ВНаличии | ИНАЧЕ -Таблица.ВНаличии | КОНЕЦ КАК ВНаличииПередЗаписью, | ВЫБОР | КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) | ТОГДА Таблица.КОтгрузке | ИНАЧЕ -Таблица.КОтгрузке | КОНЕЦ КАК КОтгрузкеПередЗаписью |ПОМЕСТИТЬ ДвиженияТоварыНаСкладахПередЗаписью |ИЗ | РегистрНакопления.ТоварыНаСкладах КАК Таблица |ГДЕ | Таблица.Регистратор = &Регистратор | И (НЕ &ЭтоНовый) | И Таблица.КонтролироватьОстатки"; Запрос.Выполнить(); КонецПроцедуры Процедура ПриЗаписи(Отказ, Замещение) Если ОбменДанными.Загрузка Или Не ПроведениеСервер.РассчитыватьИзменения(ДополнительныеСвойства) Тогда Возврат; КонецЕсли; СтруктураВременныеТаблицы = ДополнительныеСвойства.ДляПроведения.СтруктураВременныеТаблицы; // Рассчитывается изменение нового набора относительно текущего с учетом накопленных изменений // и помещается во временную таблицу. Запрос = Новый Запрос; Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение); Запрос.МенеджерВременныхТаблиц = СтруктураВременныеТаблицы.МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ТаблицаИзменений.Номенклатура КАК Номенклатура, | ТаблицаИзменений.Характеристика КАК Характеристика, | ТаблицаИзменений.Назначение КАК Назначение, | ТаблицаИзменений.Серия КАК Серия, | ТаблицаИзменений.Склад КАК Склад, | ТаблицаИзменений.Помещение КАК Помещение, | СУММА(ТаблицаИзменений.ВНаличииИзменение) КАК ВНаличииИзменение, | СУММА(ТаблицаИзменений.КОтгрузкеИзменение) КАК КОтгрузкеИзменение |ПОМЕСТИТЬ ДвиженияТоварыНаСкладахИзменение |ИЗ | (ВЫБРАТЬ | Таблица.Номенклатура КАК Номенклатура, | Таблица.Характеристика КАК Характеристика, | Таблица.Назначение КАК Назначение, | Таблица.Серия КАК Серия, | Таблица.Склад КАК Склад, | Таблица.Помещение КАК Помещение, | Таблица.ВНаличииПередЗаписью КАК ВНаличииИзменение, | Таблица.КОтгрузкеПередЗаписью КАК КОтгрузкеИзменение | ИЗ | ДвиженияТоварыНаСкладахПередЗаписью КАК Таблица | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | Таблица.Номенклатура, | Таблица.Характеристика, | Таблица.Назначение, | Таблица.Серия, | Таблица.Склад, | Таблица.Помещение, | ВЫБОР | КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) | ТОГДА -Таблица.ВНаличии | ИНАЧЕ Таблица.ВНаличии | КОНЕЦ, | ВЫБОР | КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) | ТОГДА -Таблица.КОтгрузке | ИНАЧЕ Таблица.КОтгрузке | КОНЕЦ | ИЗ | РегистрНакопления.ТоварыНаСкладах КАК Таблица | ГДЕ | Таблица.Регистратор = &Регистратор | И Таблица.КонтролироватьОстатки) КАК ТаблицаИзменений | |СГРУППИРОВАТЬ ПО | ТаблицаИзменений.Номенклатура, | ТаблицаИзменений.Склад, | ТаблицаИзменений.Характеристика, | ТаблицаИзменений.Назначение, | ТаблицаИзменений.Серия, | ТаблицаИзменений.Помещение | |ИМЕЮЩИЕ | (СУММА(ТаблицаИзменений.ВНаличииИзменение) > 0 | ИЛИ СУММА(ТаблицаИзменений.КОтгрузкеИзменение) < 0) |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ДвиженияТоварыНаСкладахПередЗаписью"; Выборка = Запрос.ВыполнитьПакет()[0].Выбрать(); Выборка.Следующий(); // Добавляется информация о ее существовании и наличии в ней записей об изменении. СтруктураВременныеТаблицы.Вставить("ДвиженияТоварыНаСкладахИзменение", Выборка.Количество > 0); КонецПроцедуры |
|||
4
lanc2233
14.08.15
✎
02:16
|
Спасибо!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |