Добавление новых элементов на типовую форму отчёта средствами БСП

1. Stolz 04.05.26 11:36 Сейчас в теме
Всем доброго времени суток!

В типовой конфигурации «1С:ERP Управление предприятием 2» (2.5.22.145) среди общих форм есть форма ФормаОтчета, которую очень не хотелось бы изменять, в том числе расширениями. Есть самописный отчёт, использующий упомянутую типовую форму отчёта. В отображаемое пользователю диалоговое окно отчёта нужно добавить дополнительный элемент формы. Для таких нужд БСП, вроде бы, предусматривает специальный механизм программного изменения форм. Согласно описанию в документации БСП, в модуле отчёта создаю процедуры:

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

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


В отладчике вижу, что:

Форма.Элементы.КомпоновщикНастроекКомпоновкиДанныхНастройкиОтбор.Видимость = Истина

Тем не менее, добавленный элемент формы в диалоговом окне отчёта не отображается. У кого какие мысли по поводу того, как, всё же, добиться отображения добавленного элемента на форме?
По теме из базы знаний
Найденные решения
5. Stolz 06.05.26 14:36 Сейчас в теме
(1) В итоге, работающая процедура ПослеЗаполненияПанелиБыстрыхНастроек выглядит так:

Процедура ПослеЗаполненияПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
	ТипКомпоновщикНастроекКомпоновкиДанных = Тип("КомпоновщикНастроекКомпоновкиДанных");
	Для Каждого РеквизитФормы Из Форма.ПолучитьРеквизиты() Цикл
		Если РеквизитФормы.ТипЗначения.СодержитТип(ТипКомпоновщикНастроекКомпоновкиДанных) Тогда
			Возврат;
		КонецЕсли;
	КонецЦикла;
	ТипГруппаФормы = Тип("ГруппаФормы");
	ТипДекорацияФормы = Тип("ДекорацияФормы");
	ТипПолеФормы = Тип("ПолеФормы");
	ЭлементыФормы = Форма.Элементы;
	МсвРеквизитыФормыКДобавлению = Новый Массив;
	МсвРеквизитыФормыКДобавлению.Добавить(Новый РеквизитФормы("КомпоновщикНастроекКомпоновкиДанных", Новый ОписаниеТипов("КомпоновщикНастроекКомпоновкиДанных")));
	Форма.ИзменитьРеквизиты(МсвРеквизитыФормыКДобавлению);
	ТекСхемаКомпоновкиДанных = ПолучитьМакет("Отборы");
	Форма.КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПоместитьВоВременноеХранилище(ТекСхемаКомпоновкиДанных, Новый УникальныйИдентификатор)));
	Форма.КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(ТекСхемаКомпоновкиДанных.НастройкиПоУмолчанию);
	ЭлементФормыОтбор = ЭлементыФормы.Вставить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтбор", Тип("ТаблицаФормы"), ЭлементыФормы.КомпоновщикНастроекПользовательскиеНастройки);
	ЭлементФормыОтбор.Отображение = ОтображениеТаблицы.Список;
	ЭлементФормыОтбор.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор";
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборИспользова­ние", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;
	ЭлементФормы.Заголовок = " ";
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Использование";
	ЭлементФормы.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборПредставле­ние", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
	ЭлементФормы.Заголовок = " ";
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Представление";
	ЭлементФормы.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
	ЭлементФормыГруппаКолонокОтбор = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборГруппаКоло­нокОтбор", ТипГруппаФормы, ЭлементФормыОтбор);
	ЭлементФормыГруппаКолонокОтбор.Вид = ВидГруппыФормы.ГруппаКолонок;
	ЭлементФормыГруппаКолонокОсновныеЭлементыОтбора = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборГруппаКоло­нокОсновныеЭлементыОтбора", ТипГруппаФормы, ЭлементФормыГруппаКолонокОтбор);
	ЭлементФормыГруппаКолонокОсновныеЭлементыОтбора.Вид = ВидГруппыФормы.ГруппаКолонок;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборГруппаКоло­нокЛевоеЗначение", ТипГруппаФормы, ЭлементФормыГруппаКолонокОсновныеЭлементыОтбора);
	ЭлементФормы.Вид = ВидГруппыФормы.ГруппаКолонок;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборЛевоеЗначе­ние", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.ЛевоеЗначение";
	ЭлементФормы.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборВидСравнен­ия", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.ВидСравнения";
	ЭлементФормы.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборПравоеЗнач­ение", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.ПравоеЗначение";
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 04.05.26 11:47 Сейчас в теме
(1)
Тип("ТаблицаФормы")
Я конечно понимаю, что это платформенная таблица, но мне кажется, что программно в 1 элемент ее не добавить — колонки также нужно добавлять.
Ну и вот это нужно переписать в соответствии с параметрами метода. Пока этой какой-то бред:
Форма.КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПоместитьВоВременноеХранилище(ТекСхемаКомпоновкиДанных,
Форма.КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(ТекСхемаКомпоновкиДанных.НастройкиПоУмолчанию);
3. Stolz 06.05.26 14:23 Сейчас в теме
(2) Спасибо, загвоздка была именно в этом. Отчего-то полагал, что для отбора компоновщика настроек компоновки данных колонки таблицы формы должны добавляться автоматически, как это и делается при ручном перетаскивании реквизита в элементы формы.
4. Stolz 06.05.26 14:24 Сейчас в теме
(2)
Ну и вот это нужно переписать в соответствии с параметрами метода.


Этот код вполне рабочий, - проверено. То, для чего он был написан, он с успехом выполняет. Хотя, конечно же, более подробные соображения по поводу того, что в нём такого криминального, узнать было бы любопытно.
5. Stolz 06.05.26 14:36 Сейчас в теме
(1) В итоге, работающая процедура ПослеЗаполненияПанелиБыстрыхНастроек выглядит так:

Процедура ПослеЗаполненияПанелиБыстрыхНастроек(Форма, ПараметрыЗаполнения) Экспорт
	ТипКомпоновщикНастроекКомпоновкиДанных = Тип("КомпоновщикНастроекКомпоновкиДанных");
	Для Каждого РеквизитФормы Из Форма.ПолучитьРеквизиты() Цикл
		Если РеквизитФормы.ТипЗначения.СодержитТип(ТипКомпоновщикНастроекКомпоновкиДанных) Тогда
			Возврат;
		КонецЕсли;
	КонецЦикла;
	ТипГруппаФормы = Тип("ГруппаФормы");
	ТипДекорацияФормы = Тип("ДекорацияФормы");
	ТипПолеФормы = Тип("ПолеФормы");
	ЭлементыФормы = Форма.Элементы;
	МсвРеквизитыФормыКДобавлению = Новый Массив;
	МсвРеквизитыФормыКДобавлению.Добавить(Новый РеквизитФормы("КомпоновщикНастроекКомпоновкиДанных", Новый ОписаниеТипов("КомпоновщикНастроекКомпоновкиДанных")));
	Форма.ИзменитьРеквизиты(МсвРеквизитыФормыКДобавлению);
	ТекСхемаКомпоновкиДанных = ПолучитьМакет("Отборы");
	Форма.КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПоместитьВоВременноеХранилище(ТекСхемаКомпоновкиДанных, Новый УникальныйИдентификатор)));
	Форма.КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(ТекСхемаКомпоновкиДанных.НастройкиПоУмолчанию);
	ЭлементФормыОтбор = ЭлементыФормы.Вставить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтбор", Тип("ТаблицаФормы"), ЭлементыФормы.КомпоновщикНастроекПользовательскиеНастройки);
	ЭлементФормыОтбор.Отображение = ОтображениеТаблицы.Список;
	ЭлементФормыОтбор.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор";
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборИспользова­ние", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;
	ЭлементФормы.Заголовок = " ";
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Использование";
	ЭлементФормы.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборПредставле­ние", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
	ЭлементФормы.Заголовок = " ";
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Представление";
	ЭлементФормы.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
	ЭлементФормыГруппаКолонокОтбор = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборГруппаКоло­нокОтбор", ТипГруппаФормы, ЭлементФормыОтбор);
	ЭлементФормыГруппаКолонокОтбор.Вид = ВидГруппыФормы.ГруппаКолонок;
	ЭлементФормыГруппаКолонокОсновныеЭлементыОтбора = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборГруппаКоло­нокОсновныеЭлементыОтбора", ТипГруппаФормы, ЭлементФормыГруппаКолонокОтбор);
	ЭлементФормыГруппаКолонокОсновныеЭлементыОтбора.Вид = ВидГруппыФормы.ГруппаКолонок;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборГруппаКоло­нокЛевоеЗначение", ТипГруппаФормы, ЭлементФормыГруппаКолонокОсновныеЭлементыОтбора);
	ЭлементФормы.Вид = ВидГруппыФормы.ГруппаКолонок;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборЛевоеЗначе­ние", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.ЛевоеЗначение";
	ЭлементФормы.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборВидСравнен­ия", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.ВидСравнения";
	ЭлементФормы.ФиксацияВТаблице = ФиксацияВТаблице.Лево;
	ЭлементФормы = ЭлементыФормы.Добавить("КомпоновщикНастроекКомпоновкиДанныхНастройкиОтборПравоеЗнач­ение", ТипПолеФормы, ЭлементФормыОтбор);
	ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
	ЭлементФормы.ПутьКДанным = "КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.ПравоеЗначение";
КонецПроцедуры
Показать
Для отправки сообщения требуется регистрация/авторизация

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