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