Как программно добавить компоновщик настроек на управляемую форму?

1. Aleksandr_prof 192 05.08.21 13:07 Сейчас в теме
На форме в конфигураторе создан и инициализирован реквизит КомпоновщикНастроекКомпоновкиДанных.
Но как ЭЛЕМЕНТ формы - он создаётся - ПРОГРАММНО:
НастройкаКомпоновщика = Элементы.Добавить("Компоновщик00", Тип("ТаблицаФормы"), Элементы.ГруппаШапкаПравая);
НастройкаКомпоновщика.ПутьКДанным = "Компоновщик0.ПользовательскиеНастройки";

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

При этом, если в конфигураторе добавить таблицу формы и прописать путь к данным, тогда он отображается корректно.
В этом и вопрос. Как создать и проинициализировать этот элемент формы программно?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
15. SlavaKron 05.08.21 15:17 Сейчас в теме +0.5 $m
(14) В результате экспериментов выяснилось, что действительно, если скопировать существующий элемент со всеми его подчиненными элементами рекурсивно, то взлетит. Следующий код будет работать для любого объекта Компоновщика при условии, что есть элемент для копирования. Для примера взял Отбор:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	КоличествоКопий = 3;
	
	МассивРеквизитов = Новый Массив;
	ТипРеквизита = Новый ОписаниеТипов("КомпоновщикНастроекКомпоновкиДанных");
	Для Сч = 1 По КоличествоКопий Цикл
		Индекс = XMLСтрока(Сч + 1);
		НовыйРеквизит = Новый РеквизитФормы("Компоновщик" + Индекс, ТипРеквизита);
		МассивРеквизитов.Добавить(НовыйРеквизит);
	КонецЦикла;
	
	ИзменитьРеквизиты(МассивРеквизитов);
	
	Для Сч = 1 По КоличествоКопий Цикл
		Индекс = XMLСтрока(Сч + 1);
		НовыйЭлемент = СкопироватьЭлементРекурсивно(Элементы.Компоновщик1НастройкиОтбор, ЭтотОбъект, Индекс);
	КонецЦикла;	
	
КонецПроцедуры

Функция СкопироватьЭлементРекурсивно(Элемент, Родитель, Индекс)
	
	НовоеИмя = СтрЗаменить(Элемент.Имя, "1", Индекс);
	ТипЭлемента = Тип(Элемент);
	НовыйЭлемент = Элементы.Добавить(НовоеИмя, ТипЭлемента, Родитель);
	
	// копируем свойства элемента
	Если ТипЭлемента = Тип("ТаблицаФормы") Тогда
		НовыйЭлемент.ПутьКДанным = СтрЗаменить(Элемент.ПутьКДанным, "1", Индекс);
		ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным,ДополнительныеПараметрыСоздания");
	ИначеЕсли ТипЭлемента = Тип("ГруппаФормы") Тогда
		ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДаннымШапки");
	ИначеЕсли ТипЭлемента = Тип("ПолеФормы") Тогда
		НовыйЭлемент.ПутьКДанным = СтрЗаменить(Элемент.ПутьКДанным, "1", Индекс);
		Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
			ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным,ВыделенныйТекст");
		Иначе
			ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным");
		КонецЕсли;
	Иначе
		ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя");
	КонецЕсли;
	
	// Проверяем наличие подчиненных элементов	
	Структура = Новый Структура("ПодчиненныеЭлементы");
	ЗаполнитьЗначенияСвойств(Структура, Элемент);	
	
	Если Структура.ПодчиненныеЭлементы <> Неопределено Тогда
		
		Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл
			СкопироватьЭлементРекурсивно(ПодчиненныйЭлемент, НовыйЭлемент, Индекс)
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат НовыйЭлемент
	
КонецФункции
Показать
Прикрепленные файлы:
ВнешняяОбработка1.epf
dandykry; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 05.08.21 13:11 Сейчас в теме
(1) Никак. Меняйте логику решения.
3. Aleksandr_prof 192 05.08.21 13:11 Сейчас в теме
(2) Это прям точно?) Или есть метод?
4. SlavaKron 05.08.21 13:12 Сейчас в теме
(3) Я пробовал создавать программно – безрезультатно. Элементы формы, связанные с компоновщиком, видимо, генерируются только в конфигураторе.
5. Aleksandr_prof 192 05.08.21 13:16 Сейчас в теме
(4)
Я пробовал создавать программно

Вы пробовали именно компоновщик? Программно? Это хорошо, что есть кто-то, кто это тоже пробовал))

А если я создам эти недостающие элементы программно? Напишу отдельную большую функцию?
6. SlavaKron 05.08.21 13:20 Сейчас в теме
(5) Создавал элемент и на основе существующего компоновщика и на основе программно созданного реквизита.
Вы пробовали именно компоновщик?
Разные его элементы, отборы, например. Но не торопитесь, это только моё мнение, возможно, появится кто-то, у кого получилось.
А если я создам эти недостающие элементы программно?
Там очень сложная система элементов. Даже если вы каждый будете создавать программно, вряд ли это всё заработает.
7. Aleksandr_prof 192 05.08.21 13:22 Сейчас в теме
(6) Да, я видел эту систему. У меня не хватает 25 элементов (кнопки, поля, группы, декорации, группы и прочее). Ладно, буду дальше думать.
8. SlavaKron 05.08.21 13:24 Сейчас в теме
(7) Трудно представить задачу, когда на форме требуется несколько компоновщиков. Попробуйте использовать один и тот же компоновщик, добавленный в конфигураторе для разных задач.
9. Aleksandr_prof 192 05.08.21 13:26 Сейчас в теме
(8)
Трудно представить задачу, когда на форме требуется несколько компоновщиков

Мне бы такое и не приснилось, если бы не попалась такая задача. Если не найдём решение, будем менять логику.
10. dandykry 10 05.08.21 13:32 Сейчас в теме
(1)
Магия тут Screenshot_1

Можно руками создать вот эти Screenshot_2
КомпоновщикНастроек.ПользовательскиеНастройки.ВидСравнения и т д
Прикрепленные файлы:
12. Aleksandr_prof 192 05.08.21 13:57 Сейчас в теме
(10) Ваши ссылки (или это скрины) - не работают.
13. dandykry 10 05.08.21 14:02 Сейчас в теме
(12) скриншотер заблокировали))))))))))) Обновил там картинки
14. Aleksandr_prof 192 05.08.21 14:36 Сейчас в теме
(10) Интересную наводку дали "Автозаполнение колонок". Вот только я не могу программно установить этот признак. Вопрос. А могу ли я программно скопировать элемент формы, который был создан интерактивно?
15. SlavaKron 05.08.21 15:17 Сейчас в теме +0.5 $m
(14) В результате экспериментов выяснилось, что действительно, если скопировать существующий элемент со всеми его подчиненными элементами рекурсивно, то взлетит. Следующий код будет работать для любого объекта Компоновщика при условии, что есть элемент для копирования. Для примера взял Отбор:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	КоличествоКопий = 3;
	
	МассивРеквизитов = Новый Массив;
	ТипРеквизита = Новый ОписаниеТипов("КомпоновщикНастроекКомпоновкиДанных");
	Для Сч = 1 По КоличествоКопий Цикл
		Индекс = XMLСтрока(Сч + 1);
		НовыйРеквизит = Новый РеквизитФормы("Компоновщик" + Индекс, ТипРеквизита);
		МассивРеквизитов.Добавить(НовыйРеквизит);
	КонецЦикла;
	
	ИзменитьРеквизиты(МассивРеквизитов);
	
	Для Сч = 1 По КоличествоКопий Цикл
		Индекс = XMLСтрока(Сч + 1);
		НовыйЭлемент = СкопироватьЭлементРекурсивно(Элементы.Компоновщик1НастройкиОтбор, ЭтотОбъект, Индекс);
	КонецЦикла;	
	
КонецПроцедуры

Функция СкопироватьЭлементРекурсивно(Элемент, Родитель, Индекс)
	
	НовоеИмя = СтрЗаменить(Элемент.Имя, "1", Индекс);
	ТипЭлемента = Тип(Элемент);
	НовыйЭлемент = Элементы.Добавить(НовоеИмя, ТипЭлемента, Родитель);
	
	// копируем свойства элемента
	Если ТипЭлемента = Тип("ТаблицаФормы") Тогда
		НовыйЭлемент.ПутьКДанным = СтрЗаменить(Элемент.ПутьКДанным, "1", Индекс);
		ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным,ДополнительныеПараметрыСоздания");
	ИначеЕсли ТипЭлемента = Тип("ГруппаФормы") Тогда
		ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДаннымШапки");
	ИначеЕсли ТипЭлемента = Тип("ПолеФормы") Тогда
		НовыйЭлемент.ПутьКДанным = СтрЗаменить(Элемент.ПутьКДанным, "1", Индекс);
		Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
			ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным,ВыделенныйТекст");
		Иначе
			ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным");
		КонецЕсли;
	Иначе
		ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя");
	КонецЕсли;
	
	// Проверяем наличие подчиненных элементов	
	Структура = Новый Структура("ПодчиненныеЭлементы");
	ЗаполнитьЗначенияСвойств(Структура, Элемент);	
	
	Если Структура.ПодчиненныеЭлементы <> Неопределено Тогда
		
		Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл
			СкопироватьЭлементРекурсивно(ПодчиненныйЭлемент, НовыйЭлемент, Индекс)
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат НовыйЭлемент
	
КонецФункции
Показать
Прикрепленные файлы:
ВнешняяОбработка1.epf
dandykry; +1 Ответить
16. Aleksandr_prof 192 05.08.21 15:26 Сейчас в теме
(15) Завтра буду пробовать! Отпишусь по результату!)
17. Aleksandr_prof 192 06.08.21 07:36 Сейчас в теме
(15) Успешно! Ваш код я почти даже не менял, он работает. И сам код меня устраивает)
11. dandykry 10 05.08.21 13:47 Сейчас в теме
(1) Как вариант Предопределить 5-10 компановщиков и отражать их на форме скрытыми, если они требуются показывать, если больше, чем 10, то выводить сообщение, что 10 это ограничение системы - меняйте логику)
Оставьте свое сообщение

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