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

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

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

Причина поведения: свойство элемента управления «ИзменяетДанные»

В обычных формах платформа регистрирует интерактивные действия пользователя не для всех элементов подряд. Для каждого элемента управления формы (включая табличные поля) предусмотрено специальное свойство — ИзменяетДанные.

Если для табличного поля этот флаг снят, платформа воспринимает таблицу исключительно как инструмент отображения данных. Любые интерактивные действия (добавление строк, редактирование колонок, удаление) не приводят к изменению признака модифицированности формы. Это стандартное поведение, например, для вспомогательных таблиц значений или форм редактирования состава наборов.

Рассмотрим, как включить регистрацию изменений:

  1. Откроем форму в конфигураторе в режиме визуального редактора.
  2. Выделим необходимое табличное поле или элемент ввода и откроем окно его свойств (клавиша F4).
  3. Найдем свойство ИзменяетДанные и установим для него значение Истина (поставим флажок).
  4. Сохраним изменения в конфигурации.

После включения этой настройки любое интерактивное редактирование ячейки или добавление строки в таблицу будет автоматически переводить свойство формы Модифицированность в значение Истина, а в заголовке окна появится символ «*» (звездочка).

Влияние свойства «ИзменяетДанные» на поведение системы

Установка свойства ИзменяетДанные влечет за собой несколько важных системных механизмов платформы, о которых важно помнить:

  1. Пессимистическая блокировка данных. Как только пользователь начинает редактировать элемент с установленным свойством «ИзменяетДанные», платформа пытается наложить блокировку на соответствующий объект информационной базы. Если объект уже занят другим пользователем, система сразу же выдаст предупреждение.
  2. Поведение в режиме «Только просмотр». Если для всей формы программно задано ЭтаФорма.ТолькоПросмотр = Истина;, все элементы с включенным свойством ИзменяетДанные автоматически блокируются от редактирования и нажатия.

Программное изменение данных и флаг модифицированности

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

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


// Программное заполнение данных
Для Каждого Стр Из ВнешниеДанные Цикл
    НоваяСтрока = ТаблицаНабора.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
КонецЦикла;

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

Различие между модифицированностью формы и модифицированностью объекта

Проанализируем частую архитектурную ошибку: путаницу между свойством формы Модифицированность и методом объекта Модифицированность().

  1. Свойство ЭтаФорма.Модифицированность (Булево, доступно для чтения и записи) сигнализирует интерфейсу о том, что в экранной форме есть несохраненные правки. Именно оно отвечает за вывод диалога с вопросом «Сохранить изменения?» при попытке закрыть окно крестиком.
  2. Метод объекта базы данных ЭтотОбъект.Модифицированность() (возвращает Булево) показывает, изменились ли непосредственно реквизиты или стандартные табличные части самого документа/справочника.

Если вы редактируете вспомогательную таблицу обработки (например, состав набора), то изменяется только форма. Чтобы данные действительно попали в базу при сохранении, необходимо явно предусмотреть перенос из временных таблиц в реквизиты объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Переносим состав набора из интерфейсной таблицы в данные объекта
    ЭтотОбъект.ТабличнаяЧастьСостав.Загрузить(ТаблицаНабора);
КонецПроцедуры

Ложное взведение модифицированности при открытии

Нередко возникает обратная проблема: форма открывается пользователем только для просмотра, но при закрытии система неожиданно требует сохранения. Проанализируем типичные причины:

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

Аналог в управляемых формах

Если в будущем потребуется перенести аналогичный механизм на управляемый интерфейс (тонкий клиент), обратите внимание на следующие отличия:

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