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