Как зафиксировать факт изменения табличной части документа в 1С?

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

При разработке конфигураций на платформе 1С:Предприятие часто возникает задача отслеживания того, были ли внесены изменения в табличную часть документа пользователем. Это может потребоваться для ведения истории изменений, подтверждения действий оператора или реализации сложной логики проверки данных перед записью. Давайте разберем, как подступиться к этой задаче профессионально. Для анализа истории и отката внесённых правок можно использовать обработку для анализа и отката изменений пользователя.

Понимание модифицированности объекта

Первым делом важно осознать, что модифицированность формы — это общее состояние. Если пользователь изменил любой реквизит или добавил строку в табличную часть, свойство формы Модифицированность становится равным Истина. Это быстрый способ узнать, что данные на экране отличаются от данных в базе, однако этот метод не дает ответа на вопрос: «Что именно изменилось?» и «Является ли это изменение значимым для бизнес-логики?».

Метод сравнения объектов в обработчике ПередЗаписью

Для того чтобы зафиксировать именно факт изменения данных в табличной части перед записью объекта, мы можем использовать сравнение текущего состояния объекта в памяти с состоянием, которое уже записано в информационной базе. Рассмотрим алгоритм действий:

  1. В модуле объекта используем событие ПередЗаписью.
  2. Получаем ссылку на текущий объект из базы данных с помощью метода ПолучитьОбъект().
  3. Сравниваем коллекцию строк табличной части объекта в памяти с табличной частью объекта из базы.

Пример реализации сравнения табличных частей:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() Тогда
        Возврат;
    КонецЕсли;

    // Получаем текущую версию из базы
    ОбъектИзБазы = Ссылка.ПолучитьОбъект();
    
    // Сравниваем количество строк
    Если Объект.Товары.Количество() <> ОбъектИзБазы.Товары.Количество() Тогда
        Сообщить("Количество строк изменилось!");
    Иначе
        // Более глубокое сравнение, если нужно проверить содержимое
        Для Каждого СтрокаТЧ Из Объект.Товары Цикл
            // Логика сравнения по ключевым полям
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Проблема «возврата к исходному»

Важно учитывать особенность работы пользователя. Если оператор изменил количество товара, а затем вернул старое значение, форма все равно будет помечена как измененная (Модифицированность = Истина). Если ваша бизнес-задача требует фиксировать только «сутевые» изменения, простого флага формы недостаточно. В таких случаях необходимо сохранять контрольную сумму или слепок данных (например, во ВременноеХранилище) при открытии формы и сравнивать с ним текущее состояние при закрытии или записи.

Версионирование объектов: профессиональный подход

Если задача состоит не просто в обнаружении факта изменения «здесь и сейчас», а в полноценном аудите (кто, когда и что изменил), лучшим решением будет использование подсистемы Версионирование объектов, входящей в состав БСП (Библиотеки стандартных подсистем). Этот механизм:

Проверка данных на тип Булево

Автор вопроса упоминал проверку на Булево. В 1С для работы с типами данных в ячейках табличной части мы обычно используем функцию ТипЗнч(). Если вам нужно проверить, является ли значение в колонке логическим, используйте следующий подход:


ЗначениеЯчейки = Элементы.Товары.ТекущиеДанные.ЭтоАкция;

Если ТипЗнч(ЗначениеЯчейки) = Тип("Булево") Тогда
    // Обработка логического типа
КонецЕсли;

Помните, что при использовании событий ПриИзменении элементов формы, платформа уже передает в обработчик само событие. Вам остается только корректно обработать новые данные. Мы рекомендуем всегда ограничивать проверки только теми колонками, которые действительно влияют на учет, чтобы не перегружать систему при работе с документами, содержащими тысячи строк.

← На главную