27 декабря 2015 г.

1С Программно добавляем кнопки на табличное поле

Задача:
Получить ДеревоЗначений из запроса и вывести в ТабличноеПоле. Для некоторых полей добавить кнопки и обработчики событий.
Если бы мы создавали и заполняли табличное поле не программно, то проблем особо не было бы, НО нам нужно программно. Речь пойдет о 8.2 и обычном приложении.

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

Процедура КоманднаяПанель1ЗагрузитьСписок(Кнопка)
       ЗагрузитьСписокГрупп()
КонецПроцедуры
Процедура ЗагрузитьСписокГрупп()
 ТекстЗапроса=Новый Запрос;
 ТекстЗапроса.Текст= "ВЫБРАТЬ
                     | Номенклатура.Ссылка КАК Группа,
                     | Номенклатура.СсылкаСайтГруппа КАК Ссылка,
                     | Номенклатура.СсылкаКартинкаГруппа КАК Картинка,
                     | Номенклатура.Ссылка.Наименование КАК Наименование
                     |ИЗ
                     | Справочник.Номенклатура КАК Номенклатура
                     |ГДЕ
                     | Номенклатура.Ссылка.ЭтоГруппа
                     |
                     |УПОРЯДОЧИТЬ ПО
                     | Номенклатура.Ссылка.ЭтоГруппа ИЕРАРХИЯ,
                     | Номенклатура.Ссылка.Наименование";
 Результат=ТекстЗапроса.Выполнить();
 Выгрузка=Результат.Выбрать();
 Обход=ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
 ТЧНаФормеТЗ=Новый ДеревоЗначений;
 ТЧНаФормеТЗ=Результат.Выгрузить(Обход);
 ЭлементыФормы.ТЧНаФормеТЗ.СоздатьКолонки();
 ОбработатьКолонки();
КонецПроцедуры

Далее нужно определиться, где что будет. В моем случае мне нужно в первую колонку добавить кнопку "Открыть" (тип поля Справочники.Номенклатура.Ссылка, т.е. кнопка выбора и очистки там уже есть). Для последней колонки (тип Строка (ПолеВвода)) мне нужна кнопка выбора со своим обработчиком (выбор файла). В процедура ЗагрузитьСписокГрупп() последняя строка вызывает другую процедуру, отвечающую за обработку колонок.

Процедура ОбработатьКолонки()
  //Колонку мне надо было скрыть
  ЭлементыФормы.ТЧНаФормеТЗ.Колонки[3].Видимость=Ложь;
  //Добавляем кнопку выбора для колонки 2
  ЭлементыФормы.ТЧНаФормеТЗ.Колонки[2].ЭлементУправления.КнопкаВыбора=Истина;
  //Указываем свой обработчик событий для События
  ЭлементыФормы.ТЧНаФормеТЗ.Колонки[2].ЭлементУправления.УстановитьДействие("НачалоВыбора",Новый Действие("ВыборГиперссылки"));
  //Добавляем кнопку открытия для СправочникЭлемент
  ЭлементыФормы.ТЧНаФормеТЗ.Колонки[0].ЭлементУправления.КнопкаОткрытия=Истина;
  //Включаем Непосредственно редактирование (без двойного клика) для всех колонок через цикл
  Для Каждого Колонка Из ЭлементыФормы.ТЧНаФормеТЗ.Колонки Цикл
    Колонка.РежимРедактирования=РежимРедактированияКолонки.Непосредственно; 
  КонецЦикла; 
КонецПроцедуры


Теперь создаем процедуру с названием ВыборГиперссылки(), с параметрами Элемент (кто вызвал событие) и СтандартнаяОбработка (Ложь, типа мы сами определим что хотим). В моем случае нужен выбор файла, и запись в Элемент его пути.

Процедура ВыборГиперссылки(Элемент,СтандартнаяОбработка=Ложь)
 // Вставить содержимое обработчика.
 Файл=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
 Файл.Фильтр="Картинки (*.jpeg;*.png;*.jpg;*.gif)|*.jpeg;*.png;*.jpg;*.gif|";
 Если Файл.Выбрать() Тогда
  Элемент.Значение=Файл.ПолноеИмяФайла;
 КонецЕсли;
КонецПроцедуры


Ну вот и все )))

Комментариев нет:

Отправка комментария