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