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

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

При разработке прикладных решений часто возникает задача создания обработок, редактирующих данные документов или справочников. В стандартных формах объектов признак модифицированности (символ звездочки * в заголовке окна) и запрос на сохранение изменений появляются автоматически. Однако в произвольных формах обработок такое поведение по умолчанию отсутствует. Разберем по шагам, как устроена работа со свойством Модифицированность и как настроить автоматическое отслеживание изменений данных.

Механизм работы свойства СохраняемыеДанные

Проанализируем, почему платформа 1С автоматически отслеживает изменения в документах, но игнорирует их в произвольных обработках. В стандартных формах объектов основной реквизит (например, Объект типа ДокументОбъект) имеет признак сохранения данных.

Для реквизитов управляемой формы доступно специальное свойство СохраняемыеДанные (тип Булево). Согласно синтакс-помощнику, если данное свойство установлено в значение Истина, платформа начинает автоматически:

  1. Отслеживать интерактивные изменения значений реквизита пользователем.
  2. Устанавливать свойство формы Модифицированность = Истина.
  3. Выводить системный вопрос о необходимости сохранения при попытке закрыть форму с несохраненными изменениями.

Важное ограничение: флаг СохраняемыеДанные доступен для включения только у реквизитов формы верхнего уровня. У вложенных колонок или подчиненных элементов этот признак наследуется от родительского реквизита.

Интерактивные изменения против программных

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

  1. Интерактивное редактирование: модифицированность формы автоматически взводится только тогда, когда пользователь физически меняет значение в элементе управления на форме (вводит текст, выбирает значение из списка, добавляет строку в связанную таблицу).
  2. Программное изменение: если значение реквизита меняется программно в коде процедур (на клиенте или на сервере), платформа не устанавливает модифицированность автоматически. В этом случае разработчик обязан явно взводить признак в коде:

// Явная установка признака изменения данных формы
ЭтаФорма.Модифицированность = Истина;

Особенности работы с коллекциями (ТаблицаЗначений, ДеревоЗначений)

Рассмотрим распространенную ситуацию, когда на форму обработки добавлена таблица (например, таблица значений для пакетного редактирования строк документа). Если у реквизита формы верхнего уровня установлен признак СохраняемыеДанные = Истина, интерактивное добавление, удаление и редактирование строк пользователем будет взводить Модифицированность. Однако если таблица заполняется алгоритмом при нажатии кнопки или считывании данных документа, флаг необходимо взводить вручную.

Групповое назначение обработчиков событий

Если на форме расположено множество реквизитов и элементов управления, а свойство СохраняемыеДанные по какой-либо причине не подходит, применим практический прием группового назначения событий в конфигураторе:

  1. Откроем форму обработки в конфигураторе.
  2. В дереве элементов формы выделим все необходимые поля ввода, флажки и таблицы с помощью клавиш Shift или Ctrl.
  3. В палитре свойств найдем событие ПриИзменении и укажем для всех элементов единую процедуру-обработчик.

&НаКлиенте
Процедура ЭлементПриИзменении(Элемент)
    ЭтаФорма.Модифицированность = Истина;
КонецПроцедуры

Контроль закрытия формы и сохранение данных

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


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

&НаКлиенте
Процедура ПослеОтветаНаВопросОЗакрытии(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        ЭтаФорма.Модифицированность = Ложь;
        ЭтаФорма.Закрыть();
    КонецЕсли;
КонецПроцедуры

Рекомендации при изменении сторонних документов через обработку

При пакетном или внешнем редактировании документов обработкой обратим внимание на следующие аспекты надежности:

  1. Блокировка данных: форма обработки сама по себе не защищает редактируемый документ от изменений другими пользователями информационной базы. Перед началом редактирования рекомендуется вызывать ЗаблокироватьДанныеДляРедактирования() для ссылки целевого документа, а по завершении — освобождать блокировку.
  2. Оповещение интерфейса: после программной записи изменений в базу данных обязательно вызовем метод ОповеститьОбИзменении(СсылкаНаДокумент). Это гарантирует обновление данных во всех открытых списках и журналах у пользователей.
← На главную