Каталог решений - Динамический вывод таблицы значений на форму

Динамический вывод таблицы значений на форму

Динамический вывод таблицы значений на форму

В наличии

Вывести на форму таблицу значений, а потом на её место другую, третью, четвёртую? Не вопрос.

Категория:

Описание

Возможно, это уже где-то было, но мне не попалось.

Появилась необходимость выводить на форму таблицу значений в зависимости от загруженных данных, с различным количеством и названиями полей. На эту тему статей хватает. Но большинство из них касается только создания, а надо было не только создавать элементы, но ещё и удалять их при выводе туда же другой ТЗ с другими полями. А с этим пришлось немного повозиться.

В итоге получилась такая штука, в которую можно раз за разом пихать разные ТЗ, и она будет их показывать.

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

Процедура удаляет (если они были) уже имеющиеся программно созданные (возможно, этой же процедурой) элементы формы из ТабЭлементФормы  с реквизитами, в которых хранились выводимые значения. На основании переданной ТаблицаЗначений формируются новые реквизиты, которые в последнем цикле привязываются к вновь создаваемым элементам формы. Осталось заполнить ТабРеквизит данными из ТаблицаЗначений ,что и происходит в предпоследней строчке. На этом всё. Готово. Конец процедуры.


&НаСервере
Процедура ВывестиТаблицуЗначенияВТаблицуНаФорме(ТаблицаЗначений, ТабРеквизит, ТабЭлементФормы = Неопределено)
	Если ТабЭлементФормы = Неопределено Тогда
		ТабЭлементФормы = ТабРеквизит;
	КонецЕсли; 
	
	// Собирается инофрмация по добавленным ранее элементам формы и реквизитам, на которые элементы формы ссылаются.
	УдаляемыеРеквизиты = Новый Массив;
	УдаляемыеЭлементы = Новый Массив;
	Для каждого Эл Из Элементы[ТабЭлементФормы].ПодчиненныеЭлементы Цикл
		УдаляемыеРеквизиты.Добавить(Эл.ПутьКДанным);
		УдаляемыеЭлементы.Добавить(Эл);
	КонецЦикла; 
	Для каждого Эл Из УдаляемыеЭлементы Цикл
		Элементы.Удалить(Эл);
	КонецЦикла; 
	
	// Добавляются колонки из ТаблицыЗначений в реквизит таблицы ТабРеквизит
	НовыеРеквизиты = Новый Массив;
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		НовыйРеквизит = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ТабРеквизит, Колонка.Заголовок);
	   	НовыеРеквизиты.Добавить(НовыйРеквизит);
	КонецЦикла;

    //Удаляются старые и устанавливаются новые реквизиты
	ИзменитьРеквизиты(НовыеРеквизиты, УдаляемыеРеквизиты);
	
    // Добавляются колонки из ТаблицыЗначений в элементы ТабЭлементФормы со ссылкой на колонки в ТабРеквизит
    Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
        НовыйЭлемент = Элементы.Добавить( ТабРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТабЭлементФормы]);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи; //Или ПолеВвода, или что-то другое;
        НовыйЭлемент.ПутьКДанным = ТабРеквизит + "." + Колонка.Имя;
    КонецЦикла;
 
 	// В созданный реквизит загружается ТЗ
	ЭтаФорма[ТабРеквизит].Загрузить(ТаблицаЗначений);
КонецПроцедуры

 

has been added to your cart:
Оформление заказа