5 марта 2022 г.

1С УФ вывод на форму ТЗ с генерацией колонок

 Часто надо вывести таблицу значений не зная заранее состав колонок, просто оставлю здесь.

Обязательное условие - наличии на форме пустой ТЗ. Можно ее создать программно.

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

    


Варинат с реквизитом объекта (имя элемента (ИмяТЗ) совпадает с именем реквизита объекта). Создаем элемент и связываем с ТЧ объекта

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

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

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