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