Как программно добавить компоновщик настроек на управляемую форму?
На форме в конфигураторе создан и инициализирован реквизит КомпоновщикНастроекКомпоновкиДанных.
Но как ЭЛЕМЕНТ формы - он создаётся - ПРОГРАММНО:
Проблема в том, что на форме он не отображается, но при нажатии на "Изменить форму" он существует, но без вспомогательных элементов.
При этом, если в конфигураторе добавить таблицу формы и прописать путь к данным, тогда он отображается корректно.
В этом и вопрос. Как создать и проинициализировать этот элемент формы программно?
Но как ЭЛЕМЕНТ формы - он создаётся - ПРОГРАММНО:
НастройкаКомпоновщика = Элементы.Добавить("Компоновщик00", Тип("ТаблицаФормы"), Элементы.ГруппаШапкаПравая);
НастройкаКомпоновщика.ПутьКДанным = "Компоновщик0.ПользовательскиеНастройки";
Проблема в том, что на форме он не отображается, но при нажатии на "Изменить форму" он существует, но без вспомогательных элементов.
При этом, если в конфигураторе добавить таблицу формы и прописать путь к данным, тогда он отображается корректно.
В этом и вопрос. Как создать и проинициализировать этот элемент формы программно?
По теме из базы знаний
Найденные решения
(14) В результате экспериментов выяснилось, что действительно, если скопировать существующий элемент со всеми его подчиненными элементами рекурсивно, то взлетит. Следующий код будет работать для любого объекта Компоновщика при условии, что есть элемент для копирования. Для примера взял Отбор:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КоличествоКопий = 3;
МассивРеквизитов = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("КомпоновщикНастроекКомпоновкиДанных");
Для Сч = 1 По КоличествоКопий Цикл
Индекс = XMLСтрока(Сч + 1);
НовыйРеквизит = Новый РеквизитФормы("Компоновщик" + Индекс, ТипРеквизита);
МассивРеквизитов.Добавить(НовыйРеквизит);
КонецЦикла;
ИзменитьРеквизиты(МассивРеквизитов);
Для Сч = 1 По КоличествоКопий Цикл
Индекс = XMLСтрока(Сч + 1);
НовыйЭлемент = СкопироватьЭлементРекурсивно(Элементы.Компоновщик1НастройкиОтбор, ЭтотОбъект, Индекс);
КонецЦикла;
КонецПроцедуры
Функция СкопироватьЭлементРекурсивно(Элемент, Родитель, Индекс)
НовоеИмя = СтрЗаменить(Элемент.Имя, "1", Индекс);
ТипЭлемента = Тип(Элемент);
НовыйЭлемент = Элементы.Добавить(НовоеИмя, ТипЭлемента, Родитель);
// копируем свойства элемента
Если ТипЭлемента = Тип("ТаблицаФормы") Тогда
НовыйЭлемент.ПутьКДанным = СтрЗаменить(Элемент.ПутьКДанным, "1", Индекс);
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным,ДополнительныеПараметрыСоздания");
ИначеЕсли ТипЭлемента = Тип("ГруппаФормы") Тогда
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДаннымШапки");
ИначеЕсли ТипЭлемента = Тип("ПолеФормы") Тогда
НовыйЭлемент.ПутьКДанным = СтрЗаменить(Элемент.ПутьКДанным, "1", Индекс);
Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным,ВыделенныйТекст");
Иначе
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным");
КонецЕсли;
Иначе
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя");
КонецЕсли;
// Проверяем наличие подчиненных элементов
Структура = Новый Структура("ПодчиненныеЭлементы");
ЗаполнитьЗначенияСвойств(Структура, Элемент);
Если Структура.ПодчиненныеЭлементы <> Неопределено Тогда
Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл
СкопироватьЭлементРекурсивно(ПодчиненныйЭлемент, НовыйЭлемент, Индекс)
КонецЦикла;
КонецЕсли;
Возврат НовыйЭлемент
КонецФункции
ПоказатьПрикрепленные файлы:
ВнешняяОбработка1.epf
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(5) Создавал элемент и на основе существующего компоновщика и на основе программно созданного реквизита.
Вы пробовали именно компоновщик?
Разные его элементы, отборы, например. Но не торопитесь, это только моё мнение, возможно, появится кто-то, у кого получилось.
А если я создам эти недостающие элементы программно?
Там очень сложная система элементов. Даже если вы каждый будете создавать программно, вряд ли это всё заработает.
(14) В результате экспериментов выяснилось, что действительно, если скопировать существующий элемент со всеми его подчиненными элементами рекурсивно, то взлетит. Следующий код будет работать для любого объекта Компоновщика при условии, что есть элемент для копирования. Для примера взял Отбор:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КоличествоКопий = 3;
МассивРеквизитов = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("КомпоновщикНастроекКомпоновкиДанных");
Для Сч = 1 По КоличествоКопий Цикл
Индекс = XMLСтрока(Сч + 1);
НовыйРеквизит = Новый РеквизитФормы("Компоновщик" + Индекс, ТипРеквизита);
МассивРеквизитов.Добавить(НовыйРеквизит);
КонецЦикла;
ИзменитьРеквизиты(МассивРеквизитов);
Для Сч = 1 По КоличествоКопий Цикл
Индекс = XMLСтрока(Сч + 1);
НовыйЭлемент = СкопироватьЭлементРекурсивно(Элементы.Компоновщик1НастройкиОтбор, ЭтотОбъект, Индекс);
КонецЦикла;
КонецПроцедуры
Функция СкопироватьЭлементРекурсивно(Элемент, Родитель, Индекс)
НовоеИмя = СтрЗаменить(Элемент.Имя, "1", Индекс);
ТипЭлемента = Тип(Элемент);
НовыйЭлемент = Элементы.Добавить(НовоеИмя, ТипЭлемента, Родитель);
// копируем свойства элемента
Если ТипЭлемента = Тип("ТаблицаФормы") Тогда
НовыйЭлемент.ПутьКДанным = СтрЗаменить(Элемент.ПутьКДанным, "1", Индекс);
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным,ДополнительныеПараметрыСоздания");
ИначеЕсли ТипЭлемента = Тип("ГруппаФормы") Тогда
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДаннымШапки");
ИначеЕсли ТипЭлемента = Тип("ПолеФормы") Тогда
НовыйЭлемент.ПутьКДанным = СтрЗаменить(Элемент.ПутьКДанным, "1", Индекс);
Если Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным,ВыделенныйТекст");
Иначе
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя,ПутьКДанным");
КонецЕсли;
Иначе
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, ,"Имя");
КонецЕсли;
// Проверяем наличие подчиненных элементов
Структура = Новый Структура("ПодчиненныеЭлементы");
ЗаполнитьЗначенияСвойств(Структура, Элемент);
Если Структура.ПодчиненныеЭлементы <> Неопределено Тогда
Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл
СкопироватьЭлементРекурсивно(ПодчиненныйЭлемент, НовыйЭлемент, Индекс)
КонецЦикла;
КонецЕсли;
Возврат НовыйЭлемент
КонецФункции
ПоказатьПрикрепленные файлы:
ВнешняяОбработка1.epf
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот