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