Часто надо вывести таблицу значений не зная заранее состав колонок, просто оставлю здесь.
Обязательное условие - наличии на форме пустой ТЗ. Можно ее создать программно.
&НаСервере
Процедура ВывестиСписокДокументовНаФорму(ТзВыборкаИзБД)
//ТзВыборкаИзБД - например выгрузка из БД запросом
ИмяТЗ_НаФорме="ТЗ"; //реквизит формы, а не элемент
//Сначала очищаем ТЗ
//если есть реквизиты созданные интерактивно, то вылезет ошибка
УдаляемыеРеквизиты = Новый Массив;
РеквизитыДляУдаления = ПолучитьРеквизиты(ИмяТЗ_НаФорме);
Для Каждого РеквизитУдаления Из РеквизитыДляУдаления Цикл
УдаляемыеРеквизиты.Добавить(ИмяТЗ_НаФорме+"."+РеквизитУдаления.Имя);
Элементы.Удалить(Элементы[ИмяТЗ_НаФорме+РеквизитУдаления.Имя]);
КонецЦикла;
ДобавляемыеРеквизиты = Новый Массив;
Для каждого Колонка Из ТзВыборкаИзБД.Колонки Цикл
ИмяКолонки=Колонка.Имя;
// пытаемся определить тип значения, иначе при попытке запихать ТЗ в Запрос получим ошибку "тип не может быть выбран в запросе"
// Также, побочный эффект - это нормальное представление флажка на форме
// Также прошу обратиться внимание на тот факт, что в первой строке в какой либо из колонок может быть NULL,
// что привидет к неправильному определению типа всей колонки, поэтому в запросе необходимо заблаговременно
//ИмяТипа=Строка(ТипЗнч(ТЗ[0][ИмяКолонки]));
//Если Метаданные.Справочники.Найти(ИмяТипа)<> Неопределено Тогда
// ИмяТипа=""+"СправочникСсылка."+ИмяТипа;
//ИначеЕсли Метаданные.Документы.Найти(ИмяТипа)<>Неопределено Тогда
// ИмяТипа=""+"ДокументСсылка."+ИмяТипа;
//КонецЕсли;
//ТипЗначенияКолонки=Новый ОписаниеТипов(ИмяТипа);
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонки, Колонка.ТипЗначения,ИмяТЗ_НаФорме, Синонимайзер(ИмяКолонки)));
КонецЦикла;
ИзменитьРеквизиты(ДобавляемыеРеквизиты,УдаляемыеРеквизиты);
// Добавление элементов форму
Для каждого Колонка Из ТзВыборкаИзБД.Колонки Цикл
ИмяКолонки=СтрЗаменить(Колонка.Имя,"Скрытый","");
ЭлементРеквизита = Элементы.Добавить(ИмяТЗ_НаФорме + ИмяКолонки, Тип("ПолеФормы"), Элементы[ИмяТЗ_НаФорме]);
ЭлементРеквизита.ПутьКДанным = ИмяТЗ_НаФорме + "." + ИмяКолонки;
ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
ЭлементРеквизита.Видимость=Не ЭтоСкрытый;
ЭлементРеквизита.ТолькоПросмотр=Истина;
ЭлементРеквизита.Заголовок=Синонимайзер(ИмяКолонки);
//как раз флажок
Если Колонка.имя="Загрузить" Тогда
ЭлементРеквизита.ТолькоПросмотр=Ложь;
ЭлементРеквизита.ПоложениеЗаголовка=ПоложениеЗаголовкаЭлементаФормы.Нет;
ЭлементРеквизита.вид=ВидПоляФормы.ПолеФлажка;
ЭлементРеквизита.ОграничениеТипа=новый ОписаниеТипов("Булево");
КонецЕсли;
Колонка.Имя=ИмяКолонки;
КонецЦикла;
ЗначениеВРеквизитФормы(ТзВыборкаИзБД, ИмяТЗ_НаФорме);
КонецПроцедуры
// Это интересный Синониминайзер за авторством ildarovich https://infostart.ru/1c/articles/306536/
&НаСервере
Функция Синонимайзер(Имя, Ответ = "", Стэйт = 7, б = "") Экспорт
Для ё = 1 По СтрДлина(Имя) Цикл
а = Сред(Имя, ё, 1);
Стэйт = (НРег(а) <> а) * 4 + Цел(Стэйт / 2);
Ответ = Ответ + ?(Стэйт = 2, НРег(б), ?(ё = 2, ВРег(б), б)) + ?(Стэйт = 4 ИЛИ Стэйт = 5, " ", "");
б = а
КонецЦикла;
Возврат Ответ + б
КонецФункции
Вывод заполненной ТЧ объекта на форму (имя элемента (ИмяТЗ) совпадает с именем реквизита объекта). Создаем элемент и связываем с ТЧ объекта
&НаСервере
Процедура ВывестиТЗНаФорму(ИмяТЗ)
//этот блок нужен только для скрытия уже подгруженной ТЧ
Если ЭтаФорма.Элементы.Найти(ИмяТЗ)<>Неопределено тогда
ЭтаФорма.Элементы[ИмяТЗ].Видимость=не ЭтаФорма.Элементы[ИмяТЗ].Видимость;
Возврат
КонецЕсли;
нЭлемент = ЭтаФорма.Элементы.вставить(ИмяТЗ, Тип("ТаблицаФормы"),Элементы.ГруппаТовары,);
нЭлемент.ПутьКДанным = "Объект."+ИмяТЗ;
ТаблицаЗнач=Объект[ИмяТЗ].Выгрузить();
Для каждого Колонка Из ТаблицаЗнач.Колонки Цикл
ИмяКолонки=Колонка.Имя;
Если ИмяКолонки="ИсходныйНомерСтроки" Тогда
Продолжить //иначе получаем ошибку
КонецЕсли;
ЭлементРеквизита = Элементы.Добавить(ИмяТЗ + ИмяКолонки, Тип("ПолеФормы"), Элементы[ИмяТЗ]);
ЭлементРеквизита.ПутьКДанным ="Объект."+ИмяТЗ + "." + ИмяКолонки;
ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
ЭлементРеквизита.Заголовок=Синонимайзер(ИмяКолонки);
КонецЦикла;
КонецПроцедуры
Комментариев нет:
Отправить комментарий