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