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