Как сохранить предыдущее значение реквизита на форме в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки конфигураций на платформе 1С 8.3 возникает задача — отследить изменения, которые вносит пользователь в конкретный реквизит непосредственно в интерфейсе формы. Например, нам нужно не просто знать текущее состояние поля, но и понимать, какое значение было установлено до последнего изменения, чтобы сравнить их или выполнить логические операции при нажатии кнопки.

Рассмотрим, как правильно организовать такой механизм, чтобы избежать ошибок и лишних обращений к базе данных.

Решение с использованием переменных модуля формы

Самый простой и эффективный способ для отслеживания изменений реквизитов, которые существуют только в памяти формы (не привязаны напрямую к объекту базы данных), — это использование переменных модуля формы. Переменные модуля живут до тех пор, пока форма открыта, поэтому они идеально подходят для хранения временной истории.

Разберем реализацию этого метода по шагам:

  1. Объявим в начале модуля формы две переменные: ТекущееЗначение и СтароеЗначение.
  2. При открытии формы (событие ПриСозданииНаСервере или ПриОткрытии) инициализируем эти переменные начальным состоянием реквизита.
  3. В процедуре обработчика события ПриИзменении для нашего элемента формы будем обновлять эти значения.

Посмотрим на пример кода, который реализует данную логику:


&НаКлиенте
Перем ПредыдущееЗначение;

&НаКлиенте
Процедура МойРеквизитПриИзменении(Элемент)
    // Сохраняем текущее состояние как старое перед тем, как реквизит обновится
    ПредыдущееЗначение = ТекущееЗначение;
    
    // Обновляем текущее значение новым введенным пользователем
    ТекущееЗначение = ЭтотОбъект.МойРеквизит;
    
    Сообщить("Было: " + ПредыдущееЗначение + ", стало: " + ТекущееЗначение);
КонецПроцедуры

При таком подходе, когда пользователь нажмет кнопку, у нас в переменной ПредыдущееЗначение всегда будет находиться то состояние, которое предшествовало текущему вводу. Это избавляет от необходимости перебирать массивы данных или искать записи в ТаблицаЗначений.

Особенности работы с реквизитами объекта

Если же ваш реквизит является частью объекта (например, реквизит документа или справочника), ситуация немного меняется. Здесь старым значением считается то, которое уже записано в информационной базе.

Рассмотрим важные аспекты:

Почему не стоит использовать таблицу значений?

В ходе анализа мы убедились, что попытка сохранять все промежуточные изменения в ТаблицаЗначений часто приводит к избыточности и ошибкам. Если пользователь быстро меняет значение несколько раз подряд, поиск «предыдущего» элемента в такой таблице становится нетривиальной задачей: можно легко найти не то, что было секунду назад, а значение, установленное много шагов назад. Поэтому для оперативного сравнения всегда отдавайте предпочтение хранению пары «Текущее — Предыдущее» в переменных.

Применяя эти методы, вы сможете создать надежный и быстрый механизм отслеживания правок пользователя, который не будет нагружать систему и сделает ваш код чистым и понятным.

← На главную