Как сделать кнопку в колонке таблицы на управляемых формах 1С?

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

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

Метод 1. Использование поля картинки и события «Выбор»

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

Во-первых, нам необходимо подготовить данные. В объекте (или в реквизитах формы), который служит источником данных для таблицы, должна быть колонка с типом Число (для индекса картинки) или Картинка. На форме для соответствующего элемента устанавливаем вид Поле картинки.

Разберем программную часть. Нам нужно заполнить эту колонку изображением. Проанализируем пример кода для извлечения картинки из макета и передачи её в строку таблицы:


&НаСервере
Процедура ЗаполнитьКартинкуВТаблице()
    // Получаем объект для доступа к макетам
    ТекОбъект = РеквизитФормыВЗначение("Объект");
    
    // Вызываем экспортную функцию модуля объекта, которая возвращает картинку
    лКартинка = ТекОбъект.ВернутьКартинкуИзМакета(); 
    
    // Добавляем строку в таблицу (например, ТЗ на форме)
    НоваяСтрока = Объект.ТЧ_Товары.Добавить();
    НоваяСтрока.КартинкаКнопка = лКартинка;
КонецПроцедуры

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


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

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

Метод 2. Поле гиперссылки — наиболее современный подход

Рассмотрим альтернативу имитации картинкой. В управляемых формах гораздо удобнее использовать вид поля Поле гиперссылки или Поле ввода с установленным флагом Гиперссылка. Текст в такой ячейке будет подчеркнут и выделен синим цветом, что однозначно воспринимается пользователем как интерактивный элемент.

Для реализации этого метода выполним следующие действия:

  1. Создадим колонку с типом Строка.
  2. В свойствах элемента формы (колонки) установим свойство Вид в значение Поле гиперссылки.
  3. Создадим обработчик события Нажатие для этого поля.

Посмотрим на пример кода обработчика нажатия гиперссылки:


&НаКлиенте
Процедура ИмяКолонкиНажатие(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь; // Прерываем стандартный переход по ссылке
    
    // Получаем текущие данные строки
    ТекущиеДанные = Элементы.ИмяТаблицы.ТекущиеДанные;
    
    Если ТекущиеДанные <> Неопределено Тогда
        // Логика обработки нажатия
        ОткрытьФормуДляРедактирования(ТекущиеДанные.СсылкаНаОбъект);
    КонецЕсли;
КонецПроцедуры

Преимущество этого метода в том, что он работает от одного клика мыши и не требует манипуляций с серверными вызовами для получения картинок.

Метод 3. Кнопки выбора и выпадающего списка в ячейке

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

Для каждой из этих кнопок существует свой обработчик события (например, НачалоВыбора, Очистка). Рассмотрим пример использования НачалоВыбора как суррогата кнопки:


&НаКлиенте
Процедура ИмяКолонкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Ваш код, который должен выполниться по нажатию на кнопку "..."
    ВыполнитьСложныйРасчет();
КонецПроцедуры

Решение проблемы обрезки картинок

Как отмечалось в обсуждении, картинки в таблицах часто обрезаются или отображаются некорректно. Выясним причину: это происходит из-за несоответствия размера изображения и высоты строки таблицы. Чтобы решить эту проблему, проанализируем свойства поля картинки:

  1. Размер картинки: Установите значение Пропорционально. Это заставит платформу вписать изображение в границы ячейки без искажения пропорций.
  2. Высота строки таблицы: Если картинка всё равно слишком мелкая, увеличьте свойство ВысотаСтроки в свойствах всей таблицы (значение 1 или 2 обычно достаточно для стандартных иконок).
  3. Картинка значений: Если вы используете предопределенные картинки из конфигурации, лучше использовать свойство КартинкаЗначений и указывать индекс из коллекции БиблиотекаКартинок.

Оптимизация: Условное оформление

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

В настройках условного оформления мы можем динамически изменять для конкретной ячейки:

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

← На главную