Часто в процессе разработки конфигураций на платформе 1С 8.3 возникает задача — отследить изменения, которые вносит пользователь в конкретный реквизит непосредственно в интерфейсе формы. Например, нам нужно не просто знать текущее состояние поля, но и понимать, какое значение было установлено до последнего изменения, чтобы сравнить их или выполнить логические операции при нажатии кнопки.
Рассмотрим, как правильно организовать такой механизм, чтобы избежать ошибок и лишних обращений к базе данных.
Самый простой и эффективный способ для отслеживания изменений реквизитов, которые существуют только в памяти формы (не привязаны напрямую к объекту базы данных), — это использование переменных модуля формы. Переменные модуля живут до тех пор, пока форма открыта, поэтому они идеально подходят для хранения временной истории.
Разберем реализацию этого метода по шагам:
ТекущееЗначение и СтароеЗначение.ПриСозданииНаСервере или ПриОткрытии) инициализируем эти переменные начальным состоянием реквизита.ПриИзменении для нашего элемента формы будем обновлять эти значения.Посмотрим на пример кода, который реализует данную логику:
&НаКлиенте
Перем ПредыдущееЗначение;
&НаКлиенте
Процедура МойРеквизитПриИзменении(Элемент)
// Сохраняем текущее состояние как старое перед тем, как реквизит обновится
ПредыдущееЗначение = ТекущееЗначение;
// Обновляем текущее значение новым введенным пользователем
ТекущееЗначение = ЭтотОбъект.МойРеквизит;
Сообщить("Было: " + ПредыдущееЗначение + ", стало: " + ТекущееЗначение);
КонецПроцедуры
При таком подходе, когда пользователь нажмет кнопку, у нас в переменной ПредыдущееЗначение всегда будет находиться то состояние, которое предшествовало текущему вводу. Это избавляет от необходимости перебирать массивы данных или искать записи в ТаблицаЗначений.
Если же ваш реквизит является частью объекта (например, реквизит документа или справочника), ситуация немного меняется. Здесь старым значением считается то, которое уже записано в информационной базе.
Рассмотрим важные аспекты:
В ходе анализа мы убедились, что попытка сохранять все промежуточные изменения в ТаблицаЗначений часто приводит к избыточности и ошибкам. Если пользователь быстро меняет значение несколько раз подряд, поиск «предыдущего» элемента в такой таблице становится нетривиальной задачей: можно легко найти не то, что было секунду назад, а значение, установленное много шагов назад. Поэтому для оперативного сравнения всегда отдавайте предпочтение хранению пары «Текущее — Предыдущее» в переменных.
Применяя эти методы, вы сможете создать надежный и быстрый механизм отслеживания правок пользователя, который не будет нагружать систему и сделает ваш код чистым и понятным.