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

15.04.22

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

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

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

 

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

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

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

 

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

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

 

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

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

6000 руб.

16.01.2015    61973    43    59    

81

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54599    16    21    

42

Управление дашбордами

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

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

2400 руб.

29.06.2020    16849    21    4    

35

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2236    25    progmaster    8    

3

Модель состояния для MVC

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

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

1 стартмани

05.07.2022    3867    kalyaka    4    

29

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12228    1    5    

10

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    8901    1    2    

6

Несколько простых приемов для удобной работы в конфигураторе

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

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С - в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021    17599    acces969    95    

148
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 4723 20.04.22 13:04 Сейчас в теме
(6) Ну. скажем так, они сами свои стандарты не очень-то соблюдают. Это не самое страшное из всей этой публикации.
+
8. Yashazz 4723 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 1321 21.04.22 09:24 Сейчас в теме
(8)
10. "ОбщегоНазначенияКлиентСервер.СообщитьПользователю" - это из БСП. А она далеко не у всех.

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

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


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

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

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

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

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

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


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