Получение старого значения реквизита в момент записи объекта или OLD

Реляционные системы управления базами данных, такие как InterBase или FireBird, в своих триггерах поддерживают контекстные переменный NEW и OLD. Контекстная переменная NEW содержит новые значения записи, а вот переменная OLD содержит старые значения записи, следовательно, при обновлении записи (допустим BEFORE UPDATE) разработчик имеет доступ к записи до её обновления и после.

Стоит заметить что переменные OLD и NEW доступны не во всех типах триггера. Платформа 1С так же позволяет разработчику иметь доступ к старым значениям реквизита (до обновления) и одновременно к новым значениям реквизита (после обновления), но при одном условии, разработчик должен использовать события перед записью!

Допустим, у нас имеется справочник Договоры, у которого имеется реквизит ДатаПодписания. Что бы сравнить старое и новое значение реквизита, воспользуемся событием модуля объекта ПередЗаписью. Далее два варианта развития события.

1. Выполнить явный запрос

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Договоры.ДатаПодписания КАК ДатаПодписанияСтароеЗначение
|ИЗ
| Справочник.Договоры КАК Договоры
|ГДЕ
| Договоры.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ЭтотОбъект.ДатаПодписания = ВыборкаДетальныеЗаписи.ДатаПодписанияСтароеЗначение Тогда
// Вставить обработку
КонецЕсли;
КонецЦикла;

2. Выполнить неявный запрос

ДатаПодписанияСтароеЗначение = ЭтотОбъект.Ссылка.ДатаПодписания; // <-- неявный запрос
Если ЭтотОбъект.ДатаПодписания = ДатаПодписанияСтароеЗначение Тогда
// Вставить обработку
КонецЕсли;


Через переменную ЭтотОбъект доступно новое значение реквизита, а вот что бы получить старое значение реквизита, необходимо его прочитать из базы данных, поэтому мы используем событие ПередЗаписью.

Комментарии