Как программно изменить видимость кнопки выбора в конкретной строке табличной части 1С?

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

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

Почему нельзя просто обойти элементы формы в цикле?

Проанализируем ситуацию, с которой столкнулся автор темы. В управляемом приложении 1С 8.3 существует четкое разделение между данными (объектом) и их визуальным представлением (элементами формы). Элемент формы типа «Таблица» — это не набор физических ячеек, а описание того, как платформа должна отрисовывать данные. Колонка таблицы — это один-единственный объект метаданных формы. Если вы программно измените свойство Элементы.ИмяКолонки.КнопкаВыбора = Ложь, кнопка исчезнет сразу во всех строках этой колонки.

Для того чтобы интерфейс менялся динамически для каждой строки в отдельности, в 1С предусмотрены специальные механизмы: Условное оформление и События элементов формы. Рассмотрим их по порядку.

Способ №1: Условное оформление (Рекомендуемый)

Это наиболее правильный и производительный метод. Платформа 1С сама управляет визуальным состоянием ячеек на основе заданных правил. Хотя в параметрах условного оформления нет прямого флажка «Скрыть кнопку выбора», мы можем использовать свойство Только просмотр.

Разберем алгоритм настройки условного оформления:

  1. Перейдите на закладку «Условное оформление» в окне редактирования формы (находится в свойствах самой формы).
  2. Добавьте новое правило.
  3. В поле «Оформление» установите флажок Только просмотр в значение Истина.
  4. В поле «Условие» укажите ваш критерий. Например: Объект.Таблица.Реквизит1 Заполнено.
  5. В поле «Оформляемые поля» выберите конкретную колонку табличной части.

Результат: В тех строках, где условие выполняется, ячейка станет недоступной для редактирования, и кнопка выбора исчезнет автоматически. Это работает максимально быстро, так как выполняется на уровне платформы без лишних вызовов серверного кода при каждой активации строки.

Способ №2: Использование события НачалоВыбора

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

Рассмотрим пример кода:


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

В данном случае кнопка визуально может остаться (в зависимости от настроек), но при нажатии на нее ничего не произойдет. Это надежный способ контролировать логику выбора программно.

Способ №3: Динамическое изменение свойств при активизации строки

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

Посмотрим на реализацию:


&НаКлиенте
Процедура ТаблицаПриАктивизацииСтроки(Элемент)
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Если реквизит заполнен, скрываем кнопку выбора у ВСЕЙ колонки
    // Но так как это происходит при активации конкретной строки, 
    // пользователю будет казаться, что кнопка исчезает именно в этой строке.
    Если ЗначениеЗаполнено(ТекущиеДанные.Реквизит1) Тогда
        Элементы.ТаблицаРеквизит1.КнопкаВыбора = Ложь;
    Иначе
        Элементы.ТаблицаРеквизит1.КнопкаВыбора = Истина;
    КонецЕсли;
    
КонецПроцедуры

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

Тонкая настройка: Отображение кнопки выбора

Проанализируем еще одно важное свойство элемента формы «Поле ввода» — ОтображениеКнопкиВыбора. Оно имеет три значения:

  1. Авто — кнопка видна всегда, если тип данных подразумевает выбор.
  2. Всегда — кнопка отображается постоянно.
  3. В режиме редактирования — кнопка появляется только в тот момент, когда пользователь нажал на ячейку для ввода данных.

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

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

Для эффективного управления интерфейсом табличной части в 1С 8.3 следует придерживаться следующих правил:

Выбор конкретного метода зависит от требований к юзабилити вашего решения, но в 90% случаев связка Условного оформления и настройки свойств элемента является наиболее правильной и стабильной.

← На главную