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

03.12.15

Разработка - Механизмы платформы 1С

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

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

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

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

 

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

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

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

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

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

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

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4538    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5295    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6410    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18475    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8824    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

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

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

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


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

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

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

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


P.S. Прошу не обижаться, за мой несколько менторский тон, но хотелось бы, чтобы Вы и все читатели стремились к более качественному и осмысленному коду с "младых" так сказать "ногтей" . Не набивали лишних шишек себе и не добавляли проклятий в карму от тех, кто придет это после Вас править:)
Redoubtable; Bob_Dobr; stranik7777; ra9000; user1316148; smsfor1c; factor0; Capitullo; Famza; isteroid; Gadzhalik; esqado; ircKotlas; igee12; olololeg; SamS; sp18s; urukk; yad; Krasnyj; DrVitaly; Dr.ZIG; cheburashka; Гарин; TreeDogNight; nbv8608; infostart user; wolfsoft; premierex; IgorS; Ali1976; Plasma; korppinen; ojiojiowka; karpik666; +35 Ответить
2. karpik666 3760 03.12.15 16:27 Сейчас в теме
(1) dusha0020, плюс тебе в карму :-)
4. Plasma 08.12.15 06:41 Сейчас в теме
(1) dusha0020, спасибо за готовый код!
Вопрос по нему сразу: как тут красиво проверку вставить на тип реквизита? Если в выходных полях запроса, результат которого в ТЗ идет, будет МоментВремени, то ошибка будет на строке ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
5. Goga-Gola 11.08.17 03:13 Сейчас в теме
(1) А для чего параметр "Форма" в процедуре если он нигде не используется?
6. Goga-Gola 11.08.17 03:56 Сейчас в теме
(5) Все... дошло... Это если вне модуля формы размещать...
7. Goga-Gola 11.08.17 04:15 Сейчас в теме
(1) Можно тогда 1 строкой обойтись в последствии

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

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

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

КонецПроцедуры
Показать
dusha0020; +1 Ответить
8. urukk 16.03.18 11:40 Сейчас в теме
(1)
Andrey Smirnov, приветствую. Очень приятный, мудрый пост, да ещё и с универсальной функцией.

Но, мне кажется в ваш код закралась опечатка.

"НоваяКолонка = Элементы.Добавить(Колонка.Имя,Тип("ПолеФормы"), Элементы.ТаблицаРезультата); "
нужно заменить на
"НоваяКолонка = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), Элементы[ИмяРеквизитаФормы]);"

Спасибо за внимание. И хорошего дня)

javascript:void(0);
dusha0020; +1 Ответить
11. dusha0020 1103 22.05.19 16:31 Сейчас в теме
(8) Да. Каюсь. Есть опечатка. Спасибо, что исправили:)
10. newvideo 20.05.19 20:47 Сейчас в теме
(1)а что бы вы написали при выводе в табличный документ, у вас бы не было цикла в цикле? Можно как-то загрузить методом ТЗ в ТД?
12. esqado 17.04.20 15:36 Сейчас в теме
(1) мне почему-то пришлось ставить проверку существования полей.
При повторном запуске ругалось на существование поля.
3. w.r. 643 03.12.15 20:33 Сейчас в теме
Автор, а чем внешние источники данных не устроили http://v8.1c.ru/overview/Term_000000795.htm с версии 8.3.5.1068 http://v8.1c.ru/o7/201402ext/ можно и редактировать данные. У меня работает на продуктиве. Для редактирования есть свои нюансы правда в настройке подключения
9. newvideo 20.05.19 19:56 Сейчас в теме
А мне решение понравилось, и не смотря на то, что оно не универсальное, мне очень подошло, наверное потому, что я меньше новичка, новички копипастят универсальные решения, а я проанализировал частное решение и путем выяснения в коде что к чему, куда какой реквизит и зачем, прохожу тем самым обучение, тем более кода немного и есть скриншоты реквизитов. Спасибо автору.
13. 127.0.0.0 27.06.20 17:36 Сейчас в теме
На форме создаём ТЗ
Указываем колонки и их тип.

В модуле на форме Формируем запрос результат запроса по структуре точно должен соответствовать по наименованию и типу ТЗ на форме.

Зарос..
ИмяТЗнаФорме.загрузить(запрос.выполнить()). выгрузить();

Готово. На форме ТЗ заполнится.
vadim.gatalay; +1 Ответить
14. smsfor1c 81 16.04.22 09:14 Сейчас в теме
Тот случай, когда у комментария к публикации больше плюсов, чем у самой публикации.
15. userzak 06.02.23 18:50 Сейчас в теме
А вот у меня видимо руки совсем кривые и код автора не заработал...
ТаблицаЗапросаТЗ добавил в реквизиты и на форму.
	ТаблицаЗапросаТЗ.Загрузить(Запрос.Выполнить().Выгрузить());
	
	Для Каждого Колонка ИЗ ТаблицаЗапросаТЗ.Колонки Цикл 
		
		Заг=СокрЛП(Колонка.Заголовок);


Поле объекта не обнаружено (Колонки)
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(115)}: Для Каждого Колонка ИЗ ТаблицаЗапросаТЗ.Колонки Цикл
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(150)}: ПолучитьНаСервере();
16. gsmirnov 80 06.02.23 19:02 Сейчас в теме
(15) ТаблицаЗапросаТЗ - Вероятно не таблица значений.
И вероятно Запрос пустой
17. userzak 06.02.23 19:12 Сейчас в теме
(16)
Верно, не таблица значений, а ДанныеФормыКоллекция.
Запрос не пустой - есть колонки и строки. Это видно по ТабН,
Но вот ТаблицаЗапросаТЗ - ДанныеФормыКоллекции, количество строк совпадает с ТабН, но колонок нет.
	ТабН = Запрос.Выполнить().Выгрузить();
	
	ТаблицаЗапросаТЗ.Загрузить(Запрос.Выполнить().Выгрузить());
	
	Для Каждого Колонка ИЗ ТаблицаЗапросаТЗ.Колонки Цикл 
Прикрепленные файлы:
Оставьте свое сообщение