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

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

При разработке интерфейсов на управляемых формах 1С часто возникает задача добавить в табличную часть (ТЧ) справочника или документа вспомогательный флажок. Этот флажок может быть нужен для временного отбора строк, массовой обработки или других интерактивных действий, при этом сохранять его состояние в базе данных не требуется. Однако разработчики сталкиваются с неприятным эффектом: при установке флажка пользователем форма помечается как модифицированная, и при попытке закрытия программа выдает стандартный запрос: "Данные были изменены. Сохранить изменения?".

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

Почему форма становится модифицированной?

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

Способ 1. Добавление реквизита формы в табличную часть объекта

Это наиболее правильный и "чистый" способ с точки зрения архитектуры управляемых форм. Мы не создаем лишних полей в базе данных, а добавляем колонку только на уровне интерфейса конкретной формы.

Рассмотрим по шагам, как это реализовать:

  1. Откроем редактор управляемой формы и перейдем на вкладку Реквизиты.
  2. Найдем в списке реквизит Объект и раскроем его структуру до нужной табличной части.
  3. Нажмем правой кнопкой мыши на табличную часть и выберем Добавить колонку реквизита. Обратите внимание, что эта колонка будет выделена красным цветом — это означает, что она существует только в рамках этой формы и не будет сохранена в БД.
  4. Дадим колонке имя, например, Выбран, и установим тип Булево.
  5. Перетащим этот реквизит в элементы формы (в дерево элементов), чтобы он отобразился в таблице.

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

Способ 2. Отключение свойства «Сохраняемые данные»

Даже если колонка является реквизитом формы, платформа может отслеживать ее изменение для контроля целостности данных. Чтобы флажок стал полностью «невидимым» для механизма модифицированности, выполним следующие действия:

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

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

Способ 3. Программная инверсия значения через событие

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

Рассмотрим пример кода в обработчике события ПередНачаломИзменения для таблицы формы. Идея заключается в том, чтобы отменить стандартное начало редактирования (которое и взводит флаг изменения данных) и вручную поменять значение булева поля.


&НаКлиенте
Процедура СписокНоменклатурыПередНачаломИзменения(Элемент, Отказ)
    // Проверяем, что нажата именно колонка с нашим флажком
    Если Элемент.ТекущийЭлемент.Имя = "СписокНоменклатурыФлажок" Тогда
        // Отменяем стандартный вход в режим редактирования ячейки
        Отказ = Истина;
        
        // Инвертируем значение флажка вручную
        ТекущиеДанные = Элемент.ТекущиеДанные;
        Если ТекущиеДанные <> Неопределено Тогда
            ТекущиеДанные.Флажок = Не ТекущиеДанные.Флажок;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Способ 4. Сброс модифицированности в обработчиках событий

Иногда разработчики используют более простой, но "опасный" метод — принудительный сброс признака модифицированности формы после изменения флажка. Проанализируем пример кода для события ПриОкончанииРедактирования:


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

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

Способ 5. Использование системного механизма выделения строк

Если ваша задача — просто дать пользователю возможность пометить строки для групповой обработки, можно рассмотреть стандартную возможность таблицы управляемой формы. У элемента формы Таблица есть свойство Отображать флажок.

Разберем особенности этого механизма:

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

Подведем итоги

Мы проанализировали ситуацию и выяснили, что для реализации удобного флажка в управляемых формах 1С лучше всего:

  1. Создавать его как колонку реквизита табличной части на форме (не в метаданных).
  2. Отключать свойство Сохраняемые данные у элемента формы.
  3. Устанавливать Режим редактирования колонки в значение Непосредственно, чтобы флажок срабатывал от одного клика.

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

← На главную