При разработке прикладных решений часто возникает задача создания обработок, редактирующих данные документов или справочников. В стандартных формах объектов признак модифицированности (символ звездочки * в заголовке окна) и запрос на сохранение изменений появляются автоматически. Однако в произвольных формах обработок такое поведение по умолчанию отсутствует. Разберем по шагам, как устроена работа со свойством Модифицированность и как настроить автоматическое отслеживание изменений данных.
Проанализируем, почему платформа 1С автоматически отслеживает изменения в документах, но игнорирует их в произвольных обработках. В стандартных формах объектов основной реквизит (например, Объект типа ДокументОбъект) имеет признак сохранения данных.
Для реквизитов управляемой формы доступно специальное свойство СохраняемыеДанные (тип Булево). Согласно синтакс-помощнику, если данное свойство установлено в значение Истина, платформа начинает автоматически:
Модифицированность = Истина.Важное ограничение: флаг СохраняемыеДанные доступен для включения только у реквизитов формы верхнего уровня. У вложенных колонок или подчиненных элементов этот признак наследуется от родительского реквизита.
Выясним причину, почему признак модифицированности может не срабатывать даже при включенном свойстве СохраняемыеДанные:
// Явная установка признака изменения данных формы
ЭтаФорма.Модифицированность = Истина;
Рассмотрим распространенную ситуацию, когда на форму обработки добавлена таблица (например, таблица значений для пакетного редактирования строк документа). Если у реквизита формы верхнего уровня установлен признак СохраняемыеДанные = Истина, интерактивное добавление, удаление и редактирование строк пользователем будет взводить Модифицированность. Однако если таблица заполняется алгоритмом при нажатии кнопки или считывании данных документа, флаг необходимо взводить вручную.
Если на форме расположено множество реквизитов и элементов управления, а свойство СохраняемыеДанные по какой-либо причине не подходит, применим практический прием группового назначения событий в конфигураторе:
Shift или Ctrl.ПриИзменении и укажем для всех элементов единую процедуру-обработчик.
&НаКлиенте
Процедура ЭлементПриИзменении(Элемент)
ЭтаФорма.Модифицированность = Истина;
КонецПроцедуры
Поскольку форма обработки не привязана к стандартной записи объекта базы данных, важно предусмотреть корректное поведение при закрытии окна с несохраненными правками. Разберем реализацию проверки в событии ПередЗакрытием:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ЭтаФорма.Модифицированность И Не ЗавершениеРаботы Тогда
Отказ = Истина;
ПоказатьВопрос(
Новый ОписаниеОповещения("ПослеОтветаНаВопросОЗакрытии", ЭтотОбъект),
"Данные были изменены. Закрыть форму без сохранения?",
РежимДиалогаВопрос.ДаНет
);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеОтветаНаВопросОЗакрытии(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ЭтаФорма.Модифицированность = Ложь;
ЭтаФорма.Закрыть();
КонецЕсли;
КонецПроцедуры
При пакетном или внешнем редактировании документов обработкой обратим внимание на следующие аспекты надежности:
ЗаблокироватьДанныеДляРедактирования() для ссылки целевого документа, а по завершении — освобождать блокировку.ОповеститьОбИзменении(СсылкаНаДокумент). Это гарантирует обновление данных во всех открытых списках и журналах у пользователей.