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

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

При разработке обработок часто возникает необходимость зафиксировать факты изменения данных пользователем. В отличие от справочников или документов, имеющих ссылки на объекты в базе данных, обработка не обладает постоянной ссылкой в БД. Из-за этого стандартное сравнение через Ссылка[ИмяРеквизита] и ЭтотОбъект[ИмяРеквизита] на управляемых формах не работает.

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

Принцип работы отслеживания изменений на управляемой форме

Для реализации истории изменений или контроля модификации реквизитов обработки используется следующий подход:

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

Шаг 1. Фиксация первоначальных значений реквизитов

Проанализируем жизненный цикл управляемой формы. Назначить замер первоначальных значений непосредственно в процедуре ПриСозданииНаСервере не всегда правильно, так как после нее могут восстанавливаться автосохраняемые данные формы. По этой причине фиксацию значений лучше производить в событии ПриОткрытии на клиенте с вызовом серверного обработчика или в событии ПриЗагрузкеДанныхИзНастроекНаСервере.

Разберем пример обхода реквизитов формы и сохранения их первоначальных значений во временном хранилище:


&НаСервере
Функция СохранитьПервоначальныеЗначенияНаСервере()
    
    СнимокДанных = Новый Структура;
    
    // Получаем массив реквизитов управляемой формы
    МассивРеквизитов = ЭтаФорма.ПолучитьРеквизиты();
    
    Для Каждого РеквизитФормы Из МассивРеквизитов Цикл
        ИмяРеквизита = РеквизитФормы.Имя;
        
        // Фильтруем системные или ненужные реквизиты при необходимости
        Если ИмяРеквизита = "АдресХранилищаСнимка" Тогда
            Продолжить;
        КонецЕсли;
        
        СнимокДанных.Вставить(ИмяРеквизита, ЭтаФорма[ИмяРеквизита]);
    КонецЦикла;
    
    // Помещаем структуру во временное хранилище с привязкой к УИД формы
    Возврат ПоместитьВоВременноеХранилище(СнимокДанных, ЭтаФорма.УникальныйИдентификатор);
    
КонецФункция

Для сохранения адреса хранилища создадим реквизит формы АдресХранилищаСнимка с типом Строка. Вызовем логику сохранение снимка при открытии формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    АдресХранилищаСнимка = СохранитьПервоначальныеЗначенияНаСервере();
КонецПроцедуры

Шаг 2. Сравнение значений при закрытии или записи

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

Рассмотрим пример функции, которая формирует текстовое описание изменений:


&НаСервере
Функция ПолучитьИсториюИзмененийНаСервере(АдресХранилища)
    
    ТекстИзменений = "";
    
    Если Не ЗначениеЗаполнено(АдресХранилища) Тогда
        Возврат ТекстИзменений;
    КонецЕсли;
    
    ИсходныйСнимок = ПолучитьИзВременногоХранилища(АдресХранилища);
    
    Если ТипЗнч(ИсходныйСнимок) <> Тип("Структура") Тогда
        Возврат ТекстИзменений;
    КонецЕсли;
    
    МассивРеквизитов = ЭтаФорма.ПолучитьРеквизиты();
    
    Для Каждого РеквизитФормы Из МассивРеквизитов Цикл
        ИмяРеквизита = РеквизитФормы.Имя;
        
        Если ИсходныйСнимок.Свойство(ИмяРеквизита) Тогда
            СтароеЗначение = ИсходныйСнимок[ИмяРеквизита];
            НовоеЗначение  = ЭтаФорма[ИмяРеквизита];
            
            Если СтароеЗначение <> НовоеЗначение Тогда
                ТекстИзменений = ТекстИзменений + СтрШаблон("Изменен реквизит '%1': с '%2' на '%3'", 
                    РеквизитФормы.Заголовок, СтароеЗначение, НовоеЗначение) + Символы.ПС;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат ТекстИзменений;
    
КонецФункция

Важные особенности и частые ошибки

При реализации контроля реквизитов на управляющих формах необходимо учитывать следующие нюансы платформы 1С:Предприятие:

← На главную