Программное создание динамического списка на управляемой форме. (Динамическое создание динамического списка). Готовая процедура + обработка - демонстрационный пример

31.08.20

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

Если у вас возникает необходимость на форму влиять динамически и создавать элементы управляемой формы программно, а особенно хотите вывести программно (динамически) динамический список, вам будет интересна эта процедура. Процедура включает также возможность формирования своей командной панели (а-ля снятие галочки "Автозаполнение" у стандартной командной панели списка).

Скачать исходный код

Наименование Файл Версия Размер
Демонстрационный пример работы процедуры и её использования (обработка которая показана в видео)
.epf 9,96Kb
136
.epf 1.0.0.1 9,96Kb 136 Скачать

 2018

Добрый день, Коллеги!

 

//+++ Обновление публикации от 31.08.2020 г.

//     Посмотрите новую статью "Динамическое формирование интерфейса"

//--- Обновление публикации от 31.08.2020 г.

Возникла необходимость в программном создании элементов формы, особенно такого как динамический список. Необходимо программно влиять на него полностью, включая и формирование необходимых мне колонок. Данная процедура может выполняться за сеанс формы N-ное количество раз, поэтому и была написана универсальная процедура формирования динамического списка:

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

	//Создание колонок на основание МассивКолонок
	Для Каждого Элемента Из МассивКолонок Цикл
		ПараметрыКолонки = СтрЗаменить(Элемента,",",Символы.ПС);
		Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
			Заголовок = СтрПолучитьСтроку(ПараметрыКолонки, 1);
			ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
		Иначе
			Заголовок = "";
			ИмяКолонки = ПараметрыКолонки; 
		КонецЕсли;	
		НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
		Если Заголовок <> "" Тогда НоваяКолонкаТаблицы.Заголовок = Заголовок; КонецЕсли;
		НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + "." + ИмяКолонки; 	
	КонецЦикла;
	
	//Задаем действия (События) на основание СписокДействий, если он определен
	Если СписокДействий <> Неопределено Тогда 	
		ПереченьСвойств = "ПриИзменении
						|Выбор
						|ПриАктивизацииСтроки
						|ВыборЗначения
						|ПриАктивизацииПоля
						|ПриАктивизацииЯчейки
						|ПередНачаломДобавления
						|ПередНачаломИзменения
						|ПередУдалением
						|ПриНачалеРедактирования
						|ПередОкончаниемРедактирования
						|ПриОкончанииРедактирования
						|ОбработкаВыбора
						|ПередРазворачиванием
						|ПередСворачиванием
						|ПослеУдаления
						|ПриСменеТекущегоРодителя
						|ОбработкаЗаписиНового
						|ПриСохраненииПользовательскихНастроекНаСервере
						|ПередЗагрузкойПользовательскихНастроекНаСервере
						|ПриЗагрузкеПользовательскихНастроекНаСервере
						|ПриОбновленииСоставаПользовательскихНастроекНаСервере
						|ОбработкаЗапросаОбновления
						|ПриПолученииДанныхНаСервере
						|НачалоПеретаскивания
						|ПроверкаПеретаскивания
						|ОкончаниеПеретаскивания
						|Перетаскивание";
		Для Счетчик = 1 по 28 Цикл
			ИмяСвойства = СтрПолучитьСтроку(ПереченьСвойств, Счетчик);
			Элементы[ИмяСписка].УстановитьДействие(ИмяСвойства,?(СписокДействий.Свойство(ИмяСвойства),СписокДействий[ИмяСвойства],""));
		КонецЦикла;
	КонецЕсли;	

КонецПроцедуры 
 
 
Процедура на момент публикации 19.01.18 10:59

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

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

КонецПроцедуры 

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

 

Пример использования (простой):

 


Пример использования (сложный):

Демонстрация работы показана на 1С:Комплексная автоматизация 2 (УТ11, ERP), но так же будет работать и в режиме мистической совместимости 8.2.13 (1С:Комплексная автоматизация 1.1), так как именно для старой доброй 1.1 и делалось и используется. Для простоты восприятия пример использования представлен на видео (без озвучки правда), сама обработка прилагается к публикации.

Как видно, в обработке программно (динамически) формируется динамический список на форме в зависимости от смены имени метаданных документа. Если углубиться, то динамически формируется в обработке также и список будущих колонок по наличию реквизитов у документа, а также сама выборка - текст запроса. Ниже демонстрирую, для чего всё это было, упрощение будущего сопровождения при расширение списка документов:

 

Пример из практики - история разработки этой процедуры

Есть некая разработка регистрации первичных документов. Управление производится через АРМы. Если в начале жизни разработки, АРМ был рассчитан всего на три документа, то мне было несложно разместить все элементы и описать логику их работы. Но время идёт и хотелки растут, вот уже документов стало пять... А потом попросили ещё пять добавить. И я чувствую, это их (бухгалтерию) не остановит. Тут я и понял, что дальнейшее сопровождение АРМа просто мучительно для меня. Переосмысление привело к разработке с нуля, не помню, кто сказал, но перефразирую: "Когда ты чувствуешь что обрастаешь г...внокодом - остановись и начни с нуля". Так и сделал.

Благодаря новой логике, дальнейшее расширение АРМа количеством документов делается просто - добавляются необходимые значения в перечисление ТипДокумента и без кодинга уже будет работать АРМ.

Визуально для конечного пользователя на форме ничего не изменилось за исключением исчезновения "страниц" и появления переключателя "ТипДокумента". Но с технической стороны, изменения колоссальные:

 

А теперь о неприятном!

При программном создании динамического списка естественно появляется желание программно влиять на весь элемент формы, а именно речь пойдёт о трудностях с командной панелью и контекстным меню. Программно я не нашел способа добраться до свойства "Автозаполнение":

Казалось бы, почему бы не обратиться просто... Элементы[ИмяЭлемента]КоманднаяПанель.Автозаполнение = ЛОЖЬ, но нет такого свойства. Поэтому пришлось применять хитрости (костыли).

 

Командная панель.

Вопрос с командной панелью решил в процедуре публикации следующим образом:

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

2. Создается программно в выше созданной группе элемент группа с видом командная панель. Именно она теперь будет основной командной панелью будущего динамического списка.

3. Добавляется создаваемый программно элемент таблица формы (динамический список).

4. У таблицы формы отключается вывод командной панели.

 

Контекстное меню.

Вопрос по отключению "Автозаполнения" в контекстном меню - решения не нашел. Подозреваю, что это невозможно технически.

 

Удачного кодинга!

 

Динамический список программное создание элементов элементы формы управляемая форма

См. также

Сервисы интеграции без Шины и интеграции

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    3377    dsdred    16    

65

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

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

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

24.01.2024    7898    YA_418728146    25    

69

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

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

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

11.12.2023    8071    dsdred    44    

117

1С-ная магия

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

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

06.10.2023    20352    SeiOkami    46    

125

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

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

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

14.09.2023    14296    human_new    27    

77

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

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

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

28.08.2023    10690    YA_418728146    7    

149

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

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

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

20.08.2023    7119    sebekerga    54    

99
Отзывы
14. rpgshnik 3727 26.01.18 05:26 Сейчас в теме
(13) Можно)
Но в моём случае пришлось изменить всё таки запроса (как без изменения запроса не в курсе).
Но нужно это делать аккуратно, чтобы таблица не слетела и колонки не уехали.
Пример прилагаю, на основание таблицы Партнёры, добавил после дополнительное свойства "Экспедитор"... на демки КА 2.2 делал. Обработку прилагаю.

&НаСервере
Процедура ИзменитьЗапросНаСервере()
	ТекстЗапроса = "ВЫБРАТЬ
	               |	Партнеры.Наименование КАК Наименование,
	               |	Партнеры.Клиент КАК Клиент,
	               |	Партнеры.ОсновнойМенеджер КАК ОсновнойМенеджер,
	               |	Партнеры.Комментарий КАК Комментарий,
	               |	ЕСТЬNULL(ВложенныйЗапрос.Значение, """") КАК Экспедитор,
	               |	Партнеры.Ссылка
	               |ИЗ
	               |	Справочник.Партнеры КАК Партнеры
	               |		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	               |			ПартнерыДополнительныеРеквизиты.Ссылка КАК Ссылка,
	               |			ПартнерыДополнительныеРеквизиты.Свойство КАК Свойство,
	               |			ПартнерыДополнительныеРеквизиты.Значение КАК Значение
	               |		ИЗ
	               |			Справочник.Партнеры.ДополнительныеРеквизиты КАК ПартнерыДополнительныеРеквизиты
	               |		ГДЕ
	               |			ПартнерыДополнительныеРеквизиты.Свойство.Наименование = ""Экспедитор"") КАК ВложенныйЗапрос
	               |		ПО Партнеры.Ссылка = ВложенныйЗапрос.Ссылка";
	
	дСписок.ТекстЗапроса = ТекстЗапроса;
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЗапрос(Команда)
	ИзменитьЗапросНаСервере();
КонецПроцедуры

&НаСервере
Процедура ДобавитьКолонкиПослеИзмененияЗапросаНаСервере()
	НоваяКолонкаТаблицы = Элементы.Вставить("Экспедитор",Тип("ПолеФормы"),Элементы.дСписок,Элементы.дСписокКомментарий);
	НоваяКолонкаТаблицы.ПутьКДанным = "дСписок.Экспедитор"; 
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьКолонкиПослеИзмененияЗапроса(Команда)
	ДобавитьКолонкиПослеИзмененияЗапросаНаСервере();
КонецПроцедуры
Показать


Если конфигурация на замке - можно с расширениями попробовать.
Прикрепленные файлы:
котКакВывестиДополнительныеСвойства.epf
unknown181538; Jesdva; nikson_1987; astafeva.tv; ldpr; ostap1972; user591389_aska_rabota; user693240_abramovskaya; Wishich; +9 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. palsergeich 19.01.18 13:14 Сейчас в теме
Код приятный.
Нужно только понимать, после ПриСозданииНаСервере добавление\удаление реквизитов - очень дорогая операция...
vovan_victory; rpgshnik; +2 Ответить
2. rpgshnik 3727 19.01.18 14:04 Сейчас в теме
(1) спасибо, учту про стоимость операции.
3. pm74 202 19.01.18 18:15 Сейчас в теме
(0) полезная публикация , спасибо
rpgshnik; +1 Ответить
4. Denis Nsk 21.01.18 16:36 Сейчас в теме
Спасибо большое!
Лично для меня, очень полезная публикация. Отметил в избранное на будущее.
Спасибо за потраченное время и подробное описание!
rpgshnik; +1 Ответить
5. Batchir 126 24.01.18 11:28 Сейчас в теме
Спасибо!
Появились хотелки к статье)))
1. Не хватает в статье описания того, как в таком случае устанавливать параметры динамического списка.
В "типовом" варианте это делается на сервере:
МойСписок.Параметры.УстановитьЗначениеПараметра("МойПараметр",ЗначениеМоегоПараметра);
При программном создании "МойСписок" отсутствует и будет валиться на синтаксис.
2. Было бы замечательно если бы описали формирование колонок динамического списка.
Причем с возможностью указания группировок колонок. Не всегда нужно сформировать линейный динамический список.
rpgshnik; +1 Ответить
6. rpgshnik 3727 24.01.18 12:53 Сейчас в теме
(5) Дельные хотелки, когда есть обратная связь особенно интересно.

1. Как-то я забыл про Параметры, у меня их не было, я как-то отборами привык уже))
Добавлю в саму процедуру, обновлю чуть позже.

2. Я конечно не хотел преследовать супер-универсальности, возможно подумаю, но не обещаю.
Да и цель была именно линейные списки. Возможно стоит проще постобработкой список скорректировать группировками... я и отборы не добавляю, так это точно перебор)))
9. rpgshnik 3727 25.01.18 05:54 Сейчас в теме
(5) функционал в процедуру по передачи параметров добавил, публикацию обновил.
	//Заполняем параметры если они были указаны
	Если ПараметрыЗапроса <> Неопределено Тогда
		Для Каждого Параметра из ПараметрыЗапроса Цикл
			РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);	
		КонецЦикла;		 
	КонецЕсли;


на второй ваше предложение, используйте группировки, ни их не отборы в процедуру добавлять не планирую
11. Batchir 126 25.01.18 10:13 Сейчас в теме
(9) Да я то что ))) Если мне нужно будет, то конечно буду использовать (и сам смогу дописать). Это хотелка была для полноты статьи: программное создание, размещение динамического списка есть, а программного управления колонками нет (размещение в группах вместе, горизонтально ...).
В любом случае ещё раз спасибо. Саму функцию закинул в шаблоны, думаю пригодиться.
rpgshnik; +1 Ответить
12. rpgshnik 3727 25.01.18 10:42 Сейчас в теме
7. Vlad_2008 16 24.01.18 13:04 Сейчас в теме
Ну синтаксис можно и обойти: ЭтаФорма["МойСписок"].Установить ...

А вот как быть с характеристиками (а-ля "доп. реквизиты" в типовых)? Их можно задать в конфигураторе в свойствах объекта, тут получается что надо все вставлять в запрос для каждой формы объекта.

И, может кто-нибудь знает, как программно добавить колонку с характеристикой, как будто пользователь вынес на форму поле Ссылка.[Мой доп реквизит] ? В запросе-то поля нет, а вот в "Изменить форму - Ссылка - Добавить поля" - есть.
8. rpgshnik 3727 25.01.18 04:44 Сейчас в теме
(7) интересно, но не сталкивался( вообще мало работаю с новыми конфигами, увяз в совместимости 8.2.13
10. rpgshnik 3727 25.01.18 06:19 Сейчас в теме
(7) Мне кажется я понял вас. Я почему-то подумал про ПВХ и дополнительные Свойства Объектов.
А вы говорите просто об реквизитах ссылочного объекта.
Тогда программно практически так же как в моей процедуре, за исключением указания пути к данным, как к объектной модели.

Пример, запрос динамического списка:
ВЫБРАТЬ
	РеализацияТоваровУслуг.Дата,
	РеализацияТоваровУслуг.Номер,
	РеализацияТоваровУслуг.Организация,
	РеализацияТоваровУслуг.Контрагент
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг


Код обработки события, к примеру по нажатию кнопки:
&НаКлиенте
Процедура ДобавитьКолонку(Команда)
	ДобавитьКолонки();
КонецПроцедуры

&НаСервере
Процедура ДобавитьКолонки()
	НоваяКолонкаТаблицы = Элементы.Вставить("дСписокКонтрагентИНН",Тип("ПолеФормы"),Элементы.дСписок,Элементы.дСписокОрганизация);
	НоваяКолонкаТаблицы.ПутьКДанным = "дСписок.Контрагент.ИНН"; 
	НоваяКолонкаТаблицы.Заголовок = "ИНН";
	НоваяКолонкаТаблицы = Элементы.Вставить("дСписокКонтрагентКПП",Тип("ПолеФормы"),Элементы.дСписок,Элементы.дСписокОрганизация);
	НоваяКолонкаТаблицы.ПутьКДанным = "дСписок.Контрагент.КПП"; 
	НоваяКолонкаТаблицы.Заголовок = "КПП";
	НоваяКолонкаТаблицы = Элементы.Добавить("дСписокОрганизацияИНН",Тип("ПолеФормы"),Элементы.дСписок);
	НоваяКолонкаТаблицы.ПутьКДанным = "дСписок.Организация.ИНН"; 
	НоваяКолонкаТаблицы.Заголовок = "ИНН";
КонецПроцедуры
Показать


Обработка прилагается:
Прикрепленные файлы:
котКакДобавитьКолонкуПрограммноВместоИзменитьФорму.epf
13. Vlad_2008 16 25.01.18 17:43 Сейчас в теме
(10)
Не, я как раз именно про ПВХ. С реквизитами все понятно и просто. А вот как с характеристиками - вопрос?

В отчете на СКД я могу добавить поле программно (например в отбор) так:
Новый ПолеКомпоновкиДанных("Организация.[Связанный контрагент]");

Дин. список тоже на СКД, характеристики можно описать в свойствах объекта или в конструкторе запроса.
Ес-но, можно программно задать текст запроса с характеристиками, после чего пользователь сможет вынести на форму колонку с произвольной характеристикой.

Так вот и не могу понять можем ли мы программно создать такую колонку? Как указать путь к данным?
14. rpgshnik 3727 26.01.18 05:26 Сейчас в теме
(13) Можно)
Но в моём случае пришлось изменить всё таки запроса (как без изменения запроса не в курсе).
Но нужно это делать аккуратно, чтобы таблица не слетела и колонки не уехали.
Пример прилагаю, на основание таблицы Партнёры, добавил после дополнительное свойства "Экспедитор"... на демки КА 2.2 делал. Обработку прилагаю.

&НаСервере
Процедура ИзменитьЗапросНаСервере()
	ТекстЗапроса = "ВЫБРАТЬ
	               |	Партнеры.Наименование КАК Наименование,
	               |	Партнеры.Клиент КАК Клиент,
	               |	Партнеры.ОсновнойМенеджер КАК ОсновнойМенеджер,
	               |	Партнеры.Комментарий КАК Комментарий,
	               |	ЕСТЬNULL(ВложенныйЗапрос.Значение, """") КАК Экспедитор,
	               |	Партнеры.Ссылка
	               |ИЗ
	               |	Справочник.Партнеры КАК Партнеры
	               |		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	               |			ПартнерыДополнительныеРеквизиты.Ссылка КАК Ссылка,
	               |			ПартнерыДополнительныеРеквизиты.Свойство КАК Свойство,
	               |			ПартнерыДополнительныеРеквизиты.Значение КАК Значение
	               |		ИЗ
	               |			Справочник.Партнеры.ДополнительныеРеквизиты КАК ПартнерыДополнительныеРеквизиты
	               |		ГДЕ
	               |			ПартнерыДополнительныеРеквизиты.Свойство.Наименование = ""Экспедитор"") КАК ВложенныйЗапрос
	               |		ПО Партнеры.Ссылка = ВложенныйЗапрос.Ссылка";
	
	дСписок.ТекстЗапроса = ТекстЗапроса;
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЗапрос(Команда)
	ИзменитьЗапросНаСервере();
КонецПроцедуры

&НаСервере
Процедура ДобавитьКолонкиПослеИзмененияЗапросаНаСервере()
	НоваяКолонкаТаблицы = Элементы.Вставить("Экспедитор",Тип("ПолеФормы"),Элементы.дСписок,Элементы.дСписокКомментарий);
	НоваяКолонкаТаблицы.ПутьКДанным = "дСписок.Экспедитор"; 
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьКолонкиПослеИзмененияЗапроса(Команда)
	ДобавитьКолонкиПослеИзмененияЗапросаНаСервере();
КонецПроцедуры
Показать


Если конфигурация на замке - можно с расширениями попробовать.
Прикрепленные файлы:
котКакВывестиДополнительныеСвойства.epf
unknown181538; Jesdva; nikson_1987; astafeva.tv; ldpr; ostap1972; user591389_aska_rabota; user693240_abramovskaya; Wishich; +9 Ответить
20. Vida 15 13.12.18 11:07 Сейчас в теме
(14) В отличие от автора статьи, у вас есть реквизит дСписок - динамический список. Поэтому в указанных вводных ваш код работать не будет, а именно

дСписок.ТекстЗапроса = ТекстЗапроса;

по причине из (5) часть 1

А вот как это обойти - не придумала.
21. Vida 15 13.12.18 18:16 Сейчас в теме
(14) Так вы и есть автор! Нашла свою ошибку почему не могла параметры поменять. Создаю программно "СписокМой", а потом пытаюсь изменить параметры у "МойСписок".

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

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
	Сообщить(Элемент.ТекущиеДанные.Дата);
	СписокПриАктивизацииСтрокиНаСервере(Элемент.ТекущиеДанные.Дата, Элемент.ТекущиеДанные.Номер, "СписокМой");
КонецПроцедуры
Показать
15. antont 14 03.07.18 11:41 Сейчас в теме
(13) Можно и без изменения запроса.
В качестве пути к данным указывается имя доступного поля выбора компоновщика настроек динамического списка.

ЕМаил = Элементы.Добавить("ЕМаил",Тип("ПолеФормы"),Элементы.Список);
	ЕМаил.ПутьКДанным ="Список.Ссылка.[E-mail]";
16. Vlad_2008 16 03.07.18 16:26 Сейчас в теме
(15)
Работает, спасибо!

Основная проблема была в том, что невозможно было определить колонку, которую пользователь добавил через "Изменить форму" ... ну я никак не смог до нее достучаться ... в элементах формы ее тоже нет.

С добавленной программно колонкой все хорошо, вот только в настройках формы она "автоматом" не сохраняется, но это уже другая история ...
17. t0202 9 17.08.18 10:11 Сейчас в теме
Спасибо, успешно воспользовался Вашей процедурой.

Заметил один недостаток.

В массиве колонок желательно поменять местами заголовок и имя колонки.
У меня заголовки колонок оказались с запятыми и пришлось это поправить.
rpgshnik; +1 Ответить
18. rpgshnik 3727 17.08.18 10:59 Сейчас в теме
19. Daynestro07 07.11.18 15:12 Сейчас в теме
Дельная статья. Интересно только, есть ли способ получить массив выводимых колонок автоматически, из запроса?

upd Уже неактуально
rpgshnik; +1 Ответить
22. mikl79 119 19.12.18 15:38 Сейчас в теме
Большое спасибо автору!!!
Очень нужная Процедура - воспользовался, применил в расширении, вообще стараюсь программно в расширении добавлять на форму реквизиты, табл.части, кнопки, теперь и динам.список смогу.
Единственное, мне нужно вывести динам.список на отдельную страницу.
rpgshnik; +1 Ответить
23. mikl79 119 19.12.18 16:21 Сейчас в теме
немного доработал Процедуру - добавил еще один параметр, чтобы выводилось на страницу
24. rpgshnik 3727 20.12.18 03:45 Сейчас в теме
(23) не смог понять, а параметра - "ДобавитьВ" не достаточно? Интересно.
25. mikl79 119 20.12.18 11:27 Сейчас в теме
(24), действительно воспользовался параметром "ДобавитьВ", но перед вызовом процедуры программно создал новую страницу
rpgshnik; +1 Ответить
26. mikl79 119 20.12.18 11:53 Сейчас в теме
Не сразу заметил, что вы используете при добавлении элементов на форму процедуры Добавить и Вставить, в чем их разница - не понял.
"Вставить" в отличие от "Добавить" только содержит 4-й параметр "Элемент" - Элемент, перед которым должен быть вставлен новый элемент. Если не указан, то элемент будет вставлен в конец.
А так вроде делают одно и тоже, но это наверное вопрос риторический - разработчикам.
rpgshnik; +1 Ответить
27. hamec 28.06.20 17:45 Сейчас в теме
Автору огромное спасибо!

Для себя проблему с командной панелью решил следующим образом.
Не знаю с какого релиза появилось, но после отрисовки формы в обработчике "ПриОткрытии" становится доступен список подчиненных элементов командной панели (Элементы["ИмяСписка"].КоманднаяПанель.ПодчиненныеЭлементы), по сути это стандартные команды.

Соответственно, стандартные команды скрыл, а свои добавил, и оставил те стандартные, которые были нужны.

Для контекстного меню та же ситуация.Элементы["ИмяСписка"].КонтекстноеМеню.ПодчиненныеЭлементы
Прикрепленные файлы:
rpgshnik; Vida; +2 Ответить
28. slawa 26 28.08.20 14:22 Сейчас в теме
Народ, а кто нить знает библиотеку для создания динамических форм.
Т.е. туже табличку представить на форме с разными группами
Группа1 (это строка 1)
Группа2 (строка 2)
и т.д
29. rpgshnik 3727 28.08.20 15:30 Сейчас в теме
(28) случайно речь не об этом? https://forum.infostart.ru/forum9/topic246787/#message2495803 там и вторая версия динамического списка, и всех других элементов формы
30. 7OH 69 27.10.20 04:03 Сейчас в теме
Думал тут решен вопрос, ан нет.
Список колонок я где должен взять ?
Надеялся, что тут будет реализован функционал "добавить колонки?" как при добавлении списка на форму.
31. rpgshnik 3727 27.10.20 04:09 Сейчас в теме
(30) данная публикация переосмыслена и значительно расширена в новом библиотеке функций по формированию динамического интерфейса https://infostart.ru/1c/articles/1284403/
Там есть возможность добавления колонок.
Ссылка кстати в начале публикации указана.
34. aalu14 27.07.22 16:56 Сейчас в теме
(31) Добрый день, подскажите, пожалуйста. Пытаюсь добавить колонки. Выдается ошибка " Ошибка: Ошибка при установке значения атрибута контекста (ПутьКДанным)". Делаю ровно как в посте. Заранее спасибо.
35. rpgshnik 3727 28.07.22 05:20 Сейчас в теме
(34) вы про модуль ДФИ или Про функцию динамическое формирования динамического списка?
Если про модуль-библиотеку ДФИ лучше скачайте свежую версию с ГитХаба... а если про функцию, то лучше используйте её в рамках модуля-библиотеки ДФИ так как он поддерживается и развивается. Так скажем функция переросла в новую сущность - большой модуль.

Модуль - https://infostart.ru/1c/articles/1284403/ и на гите https://github.com/KotovDima1C/DFI/blob/master/ModuleDFI.bsl

Так же посмотрите сообщение номер 10 в этой ветке, там пример есть обработка.
36. aalu14 28.07.22 09:02 Сейчас в теме
(35)Про функцию формирования динамического списка. Если будет возможность, взгляните, пожалуйста https://forum.infostart.ru/forum9/topic285209/#message2854645
32. userMKA 13.01.22 13:45 Сейчас в теме
33. userMKA 13.01.22 13:54 Сейчас в теме
37. ВИЛенин 2 02.02.23 06:01 Сейчас в теме
ОТ ДУШИ СПАСИБО!!!
и сразу вопрос. Для чего в куске ниже вставлено "ЛОЖЬ" и сразу после стоит ИЛИ. Это же не имеет смысла или есть какой-то глубокий смысл?

//Размещаем реквизит на форме
Если ЛОЖЬ
ИЛИ ВставитьПеред = ""
ИЛИ СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
Тогда
ТаблицаФормы = Элементы.Добавить(ИмяСписка,Тип("ТаблицаФормы"),?(СвояКоманднаяПанель,ГруппаДинамическогоСписка,?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ])));
Иначе
ТаблицаФормы = Элементы.Вставить(ИмяСписка,Тип("ТаблицаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);
КонецЕсли;
ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита
38. rpgshnik 3727 02.02.23 11:25 Сейчас в теме
(37) можно поискать на Инфостарте о данном стиле написания сложных условий, позволяет на против каждого написать свой комментарий или при необходимости его временно закомментировать.

Я бы рекомендовал использовать не отдельно функцию а уже в рамках библиотеки https://infostart.ru/1c/articles/1284403/ там есть ссылка на свежую версию на гите
39. alexey-simf 14 18.07.23 15:15 Сейчас в теме
Здравствуйте все.
Столкнулся с проблемой.
Конфигурация УТ 11.5
У документа "РеализацияТоваровУслуг" форма "ФормаСписка".
Основной реквизит формы "СписокРеализацииТоваровУслуг", который является динамическим списком с произвольным текстом запроса.
Пытаюсь в этот список добавить (реквизит) колонку "МояКолонка".

МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы("МояКолонка", Новый ОписаниеТипов("ПеречислениеСсылка.ит_МоиСтатусы"), "СписокРеализацииТоваровУслуг", "Моя колонка"));
ИзменитьРеквизиты(МассивРеквизитов);

Система ругается, что неправильно указан путь.

Есть подозрение, что для существующего динамического списка нельзя программно добавлять колонки.
40. psa247 18 11.10.23 08:28 Сейчас в теме
41. dj_tol 104 03.06.24 09:14 Сейчас в теме
Однозначно низкий поклон за труд.
Оставьте свое сообщение