gifts2017

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

Опубликовал george smith (gsmirnov) в раздел Программирование - Практика программирования

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

Недавно появилась у меня задача получить данные из MS SQL и загрузить их в 1СБП 3.0. И если задачу по получению данных я выполнил достаточно быстро, спасибо http://infostart.ru/public/137872/,   то с проблемой вывода этих данных на форму для визуального контроля как-то не складывалось. ТЗ на управляемой форме отображаться никак не хотела. Пришлось по-быстрому сделать табличный документ на форме и заполнять его.

Но, не бросив первоначальную идею и потратив вечер на поиск, как это правильно сделать, натыкался только на программное создание элементов на форме, что в конце-концов и пришлось сделать, но упростив для себя модуль. Я заранее вывожу нужные реквизиты на форму, чтобы это не определять программно, и точно видеть, где потом отобразятся мои данные.

Конфигуратор форма

 

Хотя на форме ТЗ и не видна, так как нет ни одной колонки, но после выполнения все встает на свои места.

В итоге предлагаю два варианта вывода ТЗ на Форму через ТЗ и через Табличный документ (чтобы можно было скопировать).

Модуль выполняется &НаСервере в форме объекта.

 ТаблицаЗапросаТЗ.Загрузить(База_ВыполнитьЗапросИВернутьТаблицуЗначений(ТекстЗапроса)); 
 
 // Далее если нужна ТЗ ...
 
 Для Каждого Колонка ИЗ ТаблицаЗапросаТЗ.Колонки Цикл 
	 Заг=СокрЛП(Колонка.Заголовок);
	 Заг=?(Заг="",Колонка.Имя, Заг); 
	 
	 //Определяем наличие такой же колонки
	 Если не Элементы.Найти(Заг) = неопределено тогда продолжить конецесли;   
	 
	 //Добавляем колонки на форму 
	 МассивДобавляемыхРеквизитов = Новый Массив; 
	 МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Заг, Колонка.ТипЗначения,"ТаблицаЗапросаТЗ" ,Заг)); 
	 
	 //Методы управляемой формы
	 ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); 
	 
	 //Добавляем отображение
	 НоваяКолонка =Элементы.Добавить(Заг,Тип("ПолеФормы"), Элементы.ТаблицаЗапросаТЗ); 
	 НоваяКолонка.Заголовок = Заг; 
	 НоваяКолонка.ПутьКДанным = "ТаблицаЗапросаТЗ."+Заг; 
	 НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; 
 КонецЦикла; 
 
		
		
// Далее если нужен табличный документ ... 
				
		
Т=Новый ТабличныйДокумент(); 
Для Каждого Колонка ИЗ ТаблицаЗапросаТЗ.Колонки Цикл 
	
	Заг=СокрЛП(Колонка.Заголовок); 
	Заг=?(Заг="",Колонка.Имя, Заг);       
	Т.Область("R1C"+Формат(ТаблицаЗапросаТЗ.Колонки.Индекс(Колонка)+1, "ЧГ=")).Текст=Заг; 
КонецЦикла;

Для Каждого СтрокаТЗ ИЗ ТаблицаЗапросаТЗ Цикл 
	Для Каждого Колонка ИЗ ТаблицаЗапросаТЗ.Колонки Цикл 
		Т.Область("R"+Формат(ТаблицаЗапросаТЗ.Индекс(СтрокаТЗ)+2, "ЧГ=")+"C"+Формат(ТаблицаЗапросаТЗ.Колонки.Индекс(Колонка)+1, "ЧГ=")).Текст=СтрокаТЗ[Колонка.Имя]; 
	КонецЦикла; 
КонецЦикла; 
ТаблицаЗапроса = Т; 

P.S. Здесь после всех своих поисков наткнулся на похожую статью 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Andrey Smirnov (dusha0020) 03.12.15 16:19
Статья, конечно, интересная... Но написана начинающим и для начинающих. Это, извините, то что в по простому называется быдлокодом. Не обижайтесь, но показывать начинающим, что "так" нужно и можно кодить - это больше для них вреда, чем пользы от Вашей статьи.
Во-первых, если Вы хотите показать как выводится ТЗ на форму для всех, то совершенно не нужно показывать как выводится конкретная Ваша таблица, на конкретную вашу форму. Тем кто захочет встроить Ваш код в свою обработку придется много править.
Во-вторых - зачем делать цикл в цикле и копировать ТЗ с данными в промежуточную ТЗ?
В-третьих - зачем в примере смешивать квадратное с мокрым? а именно вперемешку выводить тз в реквизит формы и табличный документ. Для тех кому хочется разобраться как делается то и другое по отдельности очень трудно это прочитать.
В-четвертых - для многократно повторяемых действий используйте отдельные логические блоки кода - процедуры и функции. Это сделает основной код короче и даст экономию времени и кармы в следующей жизни:)

На примере вывода в реквизит с типом "ТаблицаЗначений" я написал всего одну процедуру и теперь ее могут использовать без допилов все желающие в любом коде, а код для вывода нужной ТЗ на нужную форму теперь состоит всего из 2-х строк.

СоздатьТаблицуЗначенийВРеквизитеФормы(ЭтаФорма, "ТаблицаЗапросаТЗ", РезультатЗапроса);
	
ЗначениеВРеквизитФормы(РезультатЗапроса, "ТаблицаЗапросаТЗ");


Процедура СоздатьТаблицуЗначенийВРеквизитеФормы(Форма, ИмяРеквизитаФормы, ТаблицаЗначений)

	МассивДобавляемыхРеквизитов = Новый Массив;;
	МассивДобавляемыхПолей = Новый Массив;
	Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		
		МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,ИмяРеквизитаФормы , Колонка.Заголовок));  
        НоваяКолонка = Элементы.Добавить(Колонка.Имя,Тип("ПолеФормы"), Элементы.ТаблицаРезультата); 
        МассивДобавляемыхПолей.Добавить(НоваяКолонка);	
	
	КонецЦикла;
	
	ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

	Для каждого ПолеФормы Из МассивДобавляемыхПолей Цикл
	
		ПолеФормы.Заголовок = ПолеФормы.Имя; 
        ПолеФормы.ПутьКДанным = ИмяРеквизитаФормы +"."+ПолеФормы.Имя; 
        ПолеФормы.Вид = ВидПоляФормы.ПолеВвода;
	
	КонецЦикла; 
		

КонецПроцедуры
...Показать Скрыть


P.S. Прошу не обижаться, за мой несколько менторский тон, но хотелось бы, чтобы Вы и все читатели стремились к более качественному и осмысленному коду с "младых" так сказать "ногтей" . Не набивали лишних шишек себе и не добавляли проклятий в карму от тех, кто придет это после Вас править:)
Dr.ZIG; cheburashka; Гарин; TreeDogNight; nbv8608; infostart user; wolfsoft; premier; IgorS; Ali1976; Plasma; korppinen; ojiojiowka; karpik666; +14 Ответить 2
2. Андрей Карпов (karpik666) 03.12.15 16:27
(1) dusha0020, плюс тебе в карму :-)
3. Вася Пупкин (w.r.) 03.12.15 20:33
Автор, а чем внешние источники данных не устроили http://v8.1c.ru/overview/Term_000000795.htm с версии 8.3.5.1068 http://v8.1c.ru/o7/201402ext/ можно и редактировать данные. У меня работает на продуктиве. Для редактирования есть свои нюансы правда в настройке подключения
4. Александр В (Plasma) 08.12.15 06:41
(1) dusha0020, спасибо за готовый код!
Вопрос по нему сразу: как тут красиво проверку вставить на тип реквизита? Если в выходных полях запроса, результат которого в ТЗ идет, будет МоментВремени, то ошибка будет на строке ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа