Имя: Пароль:
1C
 
Как лучше всего отловить такие события?
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
Спасибо!
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.