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

Программирование - Практика программирования

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

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

https://awards.infostart.ru/img/3.png

https://awards.infostart.ru/img/infostartawards.png 2018

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

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

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

 

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

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

 

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

 

225

Скачать файлы

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

См. также

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

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

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

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

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


Если конфигурация на замке - можно с расширениями попробовать.
Прикрепленные файлы:
котКакВывестиДополнительныеСвойства.epf
user874207; +1 Ответить
Остальные комментарии
Избранное Подписка Сортировка: Древо
1. palsergeich 19.01.18 13:14 Сейчас в теме
Код приятный.
Нужно только понимать, после ПриСозданииНаСервере добавление\удаление реквизитов - очень дорогая операция...
vovan_victory; rpgshnik; +2 Ответить
2. rpgshnik 884 19.01.18 14:04 Сейчас в теме
(1) спасибо, учту про стоимость операции.
3. pm74 129 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 884 24.01.18 12:53 Сейчас в теме
(5) Дельные хотелки, когда есть обратная связь особенно интересно.

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

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


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

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

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

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


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

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


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

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

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

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

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

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

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

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


Если конфигурация на замке - можно с расширениями попробовать.
Прикрепленные файлы:
котКакВывестиДополнительныеСвойства.epf
user874207; +1 Ответить
15. antont 9 03.07.18 11:41 Сейчас в теме
(13) Можно и без изменения запроса.
В качестве пути к данным указывается имя доступного поля выбора компоновщика настроек динамического списка.

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

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

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

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

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

upd Уже неактуально
rpgshnik; +1 Ответить
Оставьте свое сообщение