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

15.04.22

Разработка - Работа с интерфейсом

Функционал данного механизма служит для программного вывода "Таблицы значений" в реквизит управляемой  формы с типом "ДанныеФормыКоллекция". Может быть полезен в задачах, где состав колонок выгружаемой таблицы значений может меняться.

Механизм предусматривает работу как с реквизитом объекта, так и с реквизитом формы.

 

И по сути является аналогом метода обычных форм:

СоздатьКолонки()

Также реализована возможность быстрого добавления колонки «Отметка» и настройки доступности кнопок полей. Процедура должна быть размещена в модуле формы.

 

Пример вызова:

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

 

См. также

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63097    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    18965    26    6    

41

Работа с интерфейсом Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

1500 руб.

06.10.2020    10324    7    7    

10

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

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

28.08.2023    15088    YA_418728146    7    

169

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3668    57    progmaster    8    

4

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    6054    kalyaka    6    

33
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 19.04.22 10:14
Сообщение было скрыто модератором.
...
2. пользователь 19.04.22 11:22
Сообщение было скрыто модератором.
...
3. пользователь 19.04.22 16:35
Сообщение было скрыто модератором.
...
4. пользователь 20.04.22 00:31
Сообщение было скрыто модератором.
...
13. пользователь 21.04.22 10:33
Сообщение было скрыто модератором.
...
5. пользователь 20.04.22 11:08
Сообщение было скрыто модератором.
...
9. пользователь 20.04.22 18:34
Сообщение было скрыто модератором.
...
6. skeptik2105 20.04.22 12:14 Сейчас в теме
Использование метода "Сообщить" - нарушение стандартов и методик разработки.

https://its.1c.ru/db/v8std/content/418/hdoc

Для вывода сообщений пользователю во всех случаях следует использовать объект СообщениеПользователю, даже когда сообщение не «привязывается» к некоторому элементу управления формы. Метод Сообщить применять не следует.
sapervodichka; +1 Ответить
7. Yashazz 4794 20.04.22 13:04 Сейчас в теме
(6) Ну. скажем так, они сами свои стандарты не очень-то соблюдают. Это не самое страшное из всей этой публикации.
8. Yashazz 4794 20.04.22 13:25 Сейчас в теме
1. Случай, когда "ИмяРеквизитаФормы" не строка, не обработан. Взялись делать "защиту от дурака", как для типа "ТаблицаЗначенийДляВывода", так уж везде.
2. Подход, при котором сперва все колонки и элементы удаляются, может быть неверен - правильнее выяснять, есть ли нужный реквизит (и элемент формы) и просто его не трогать, либо донастраивать. А уж добавленные в конфигураторе вы так вообще не удалите.
3. Обращение "ПутьКДаннымФормыКоллекция = "Объект." + ИмяРеквизитаФормы;" не покрывает все случаи. Есть ещё "Отчёт", есть "Запись", в их формах тоже могут понадобиться таблицы значений. Равно как и само обращение к переменной "Объект".
4. Конструкция "Новый ОписаниеТипов(Колонка.ТипЗначения.Типы())" неверна - так вы не установите квалификаторы простых типов, и будет у вас всё для них по умолчанию. Правильнее было напрямую передать "Колонка.ТипЗначения". А ещё в типах Null попадается, и некоторые релизы при попытке объявить реквизит такого типа падают.
5. Проверять только на наличие типа "Тип" мало. Там любая "прелесть" может попасться, включая такую, что в данных формы фигурировать не может, и налетите на ошибку. Правильнее проверять на допустимые - их меньше, и их чётко видно при описании типа реквизита коллекции. И отдельно думать, что, если тип "Произвольный". Это очень такой подводный камень. Есть вообще такие, что храниться в коллекции могут, а вот в элементе будет показано только их строковое представление, вроде "Массив". И составные типы бывают очень не айс, и характеристики.
6. Мысль с флажками, может, и неплоха, но... Нет проверки на тип "Булево", да и, раз уж правка, вместо "РежимРедактированияКолонки.ВходПриВводе" хорошо бы "Непосредственно", так пользователям удобнее. Ну и картинки в колонках тогда уж, раз такая пьянка. Иконки, это бывает очень даже нужно. А ещё порой бывает надо 3 состояния флажка...
7. "НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода" - всегда прям? А ничего другого не бывает нужно? И править прям можно? См. вопрос про возможные типы. Много ли смысла для такого имеет кнопка открытия без перехвата её события?
8. Почему кнопка создания всегда "Ложь" и нельзя быстрый выбор, непонятно, т.к. бывает очень надо. Лучше бы, помимо умолчаний, передавать некое "описание" для нужных реквизитов, вроде массива структур или отдельной таблицы - кому чего включать и выключать.
9. Не скажу за все релизы, но некоторые не любят, когда путь к данным указывается после настройки кнопок, и сбрасывают эти настройки на умолчания.
10. "ОбщегоНазначенияКлиентСервер.СообщитьПользователю" - это из БСП. А она далеко не у всех.

Ну и по мелочам: "НЕ ЭлементКолонки = Неопределено" это два логических действия, лучше писать "ЭлементКолонки<>Неопределено".

Так - конкретнее?))
ixijixi; user612295_death4321; sapervodichka; Batman; +4 Ответить
10. RocKeR_13 1366 21.04.22 09:24 Сейчас в теме
(8)
10. "ОбщегоНазначенияКлиентСервер.СообщитьПользователю" - это из БСП. А она далеко не у всех.

Более того, на актуальных версиях БСП:
// Устарела. Следует использовать ОбщегоНазначенияКлиент.СообщитьПользователю или ОбщегоНазначения.СообщитьПользователю
11. пользователь 21.04.22 09:42
Сообщение было скрыто модератором.
...
12. пользователь 21.04.22 10:27
Сообщение было скрыто модератором.
...
14. lvictor58 137 25.04.22 16:19 Сейчас в теме
На просторах инета нашел простую функцию, которой с успехом пользуюсь

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


пример применения:
На форме размещаю реквизит "ТаблицаРезультат" типа таблица значений
и там где надо посмотреть то, что имеем заполняем эту таблицу

	ТаблицаДанных = ПолучитьИзВременногоХранилища(АдресФайлаЗагрузки); 

	Если ФлагОтладки Тогда
		Попытка
			СоздатьТаблицуФормы("ТаблицаРезультат", "ТаблицаРезультат", ТаблицаДанных);
			ТаблицаРезультат.Загрузить(ТаблицаДанных);

			Элементы.ТаблицаРезультат.Обновить();
		Исключение
			Сообщить("Показать итоги "+ОписаниеОшибки());
		КонецПопытки;
		возврат;
	КонецЕсли;

Показать
t278; vtsuganov; user594753_holidaytmp; vladir; twiny; assa; TheOldGuard; +7 Ответить
15. AnPet 3 13.07.23 21:24 Сейчас в теме
Спасибо Вам, добрый человек!
Бился несколько часов с ЗначениеВРеквизитФормы чтобы передать ТЗ в "Табличную часть".
А оно все ругалось на неверный параметр 2. Вот вам и просторы интернета - везде про эту ЗначениеВРеквизитФормы
И только у Вас по делу ))

Объект.ТЧСписокТоваров.Загрузить(ТЗТест);


Все гениальное просто! ))
16. loginovvn 10.03.24 16:06 Сейчас в теме
вай! красавчик!!!... время не было писать самому... атут нашел вашу наработку - вставил куда надо - и готово....ну прям очень помог мил человек!!!
Оставьте свое сообщение