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