Пользовательские настойки в СКД через общие макеты

1. CHELLL 53 23.09.25 10:38 Сейчас в теме
Всем привет.

Может кто сталкивался с ситуацией:

Был внешний отчет построенный на базе общей формы отчета. Сейчас необходимо сделать на базе его СКД обращение ещё с двух мест. Решил перенести СКД в общие макеты. В отчете убрал основную СКД и сделал получение в процедуре "ПриСозданииНаСервере"

	ОтчетОбъект     = РеквизитФормыВЗначение("Отчет");
	ОтчетМетаданные = ОтчетОбъект.Метаданные();
	ОтчетПолноеИмя  = ОтчетМетаданные.ПолноеИмя();
	ПредопределенныеВарианты = Новый СписокЗначений;
	ОтчетОбъект.СхемаКомпоновкиДанных = ПолучитьОбщийМакет("СКД_"); // _***_(2025/09/19)_[+] // вынес СКД в общие макеты 
	Если ОтчетОбъект.СхемаКомпоновкиДанных <> Неопределено Тогда
		Для Каждого Вариант Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
			ПредопределенныеВарианты.Добавить(Вариант.Имя, Вариант.Представление);
		КонецЦикла;
	КонецЕсли;
Показать


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

На форме нет положенных пользовательских настроек да и вообще ничего, даже полей.

Прописываю отдельно
		АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, УникальныйИдентификатор);
		Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));


Пытался еще вот так сделать, но результат отрицательный
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ОтчетОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию)


Что я делаю не так и куда стоит обратить внимание? Или может есть идеи как иначе реализовать общий источник (СКД). Спасибо
Прикрепленные файлы:
Вознаграждение за ответ
Показать полностью
Найденные решения
20. CHELLL 53 09.10.25 17:38 Сейчас в теме
Итог следующий - запуск в в фоне не заходил в процедуру "При компоновки результата" пока я не пометил на удаление отчет, который сохранен в справочнике "Дополнительные отчеты и обработки". Потом ошибки сыпались рандомные, включая "Схема компоновки данных не обнаружена". Изменил Имя отчета (т.е. его внутренний идентификатор не равен тому что сохранен в ИБ) и все запустилось.

Тема закрыта
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. MissionOnly 15 23.09.25 10:44 Сейчас в теме
Думаю, пользовательские настройки, это противоположность общим (концептуально). Поэтому, если смог записать настройки в регистр, то они общие, а не конкретного пользователя.
5. CHELLL 53 23.09.25 11:13 Сейчас в теме
(2) В какой регистр? Если в настройках СКД в отборах добавляешь свои настрой и ставишь им "Включать в пользовательские настройки" то они автоматом у всех пользователей должны появляться в шапке.
6. truba 23.09.25 11:20 Сейчас в теме
смотрите, у нас есть объект СКД программный тот что условно получается конструктором Новый СхемаКомпоновкиДанных и есть его пользовательское представление, имплементируемое формой отчета (а других GUI в 1С нет). Это очень и очень разные вещи, поэтому между "должны появляться" и "настройки варианта" есть очень много всего для связи элементов GUI, промежуточного объекта для этого КомпоновщикНастроек и собственно самих НастроекКомпоновкиДанных - тоже глубоко чисто программного объекта, которому на GUI наплевать.

Я пытаюсь понять, проблема в отсутствии этой корректной связи или я вообще мимо темы гляжу?
8. truba 23.09.25 11:25 Сейчас в теме
(6) ПС, что бы поведение формы корректно связывалось с инициализированным компоновщиком нужно что бы форма создалась в конфигураторе с установленным признаком "ИспользованиеСхемыКомпоновкиДанных" - там часть поведения формы глубоко под капотом и в общем случае не доступно программно для управления. Мы ж и форму не можем создать из средств языка - только в конфигураторе.
Попробуйте создать обычную форму отчета - сериализуйте ее в xml и форму отчета с использованием СКД - тоже сериализуйте и сравните эти xml - они внутри разные, а внешне одинаковые. И программно вы их одинаковыми на момент рантайма не сделаете, нет таких инструментов.
Вот это определяет часть проблем с подменой СКД отчета.
9. MissionOnly 15 23.09.25 14:55 Сейчас в теме
(5) Даже если они свои настройки сделали в отчете?
10. CHELLL 53 23.09.25 17:52 Сейчас в теме
(9) Если не ошибаюсь, то это уже вариант отчета и хранится он в соответствующем справочнике
3. truba 23.09.25 10:54 Сейчас в теме
Форма отчет то открывается? пользователь ее видит раз речь идет о пользовательских настройках?
При еще создании формы в конфигураторе была установлена галочка что отчет использует систему компоновки данных? Дай более детально описание процесса как будто дегенератам объясняешь, с утра не ахти телепатия работает.
4. truba 23.09.25 11:01 Сейчас в теме
Смотри - основной источник событий и команд это форма, форма может же быть только на сервере или на клиенте и на сервере.
Форма у тебя расширена скорее всего основным объектом отчет.
далее что важно - еще на этапе создания формы в конфигураторе там присутствует галка или настройка что это форма отчета использующая схему компоновки данных.
Т.е. взять просто форму отчета и пытаться в объект отчет загружать свое СКД не выйдет - форма внутри другая, ее поведение другое. Притом в настройках самой формы ты этого не увидишь.
Если сериализовать в хмл форму отчета и форму отчета скд - это разные формы будут.
Поэтому инициализация компоновщика настроек формы связанной с скд и формы не связанной разная.
У тебя форма связана с СКД на этапе создания ее в конфигураторе?
7. glek 119 23.09.25 11:24 Сейчас в теме
Скажем так. Когда мне необходимо было подменить схему компоновки (или вообще выводить отчет ака печатная форму), я всё равно добавлял пустую схему компоновки в отчет но рулил параметрами (без отборов). И дальше уже формировал.
11. truba 23.09.25 18:49 Сейчас в теме
https://infostart.ru/1c/articles/1339226/
Вот нашел про подмену схем. Там же вскользь о том, что форма должны создаваться с указанием что она работает с СКД.
12. CHELLL 53 24.09.25 15:16 Сейчас в теме
(11)
ИспользованиеСхемыКомпоновкиДанных

да, находил эту статью.

в итоге я понял что не доделал начатое, а именно не прописал .

Отчет.КомпоновщикНастроек.Восстановить();   


Должны быть так

Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ОтчетОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Отчет.КомпоновщикНастроек.Восстановить();   


Сейчас борюсь со схемой СКД. В статье её определяют в процедуре ПриКомпановкеРезультата, а у меня отчет в фоне формируется - ищу где теряется схема
13. truba 24.09.25 16:06 Сейчас в теме
(12) CHELL, мне не нужны стармани, но мне нужно понимание работы GUI форм 1С с методами объектов, которые они расширяют и как вообще генерится на движке при этом форма.

Я правильно понял, что у тебя есть Общая форма отчета в конфигурации и есть СКД?

При создании на сервере ты объекту общей формы отчета "Отчет" инициализируешь компоновщик настроек из СКД. Т.е. с этапом задания настроек все ок.
Дальше вопрос переназначения объекта Отчет? Т.к. в стандартном отчете существует Отчет заданный в конфигураторе, связанный с ним ОтчетОбъект с командой "СкомпоноватьРезультат" и событием "ПриКомпоновкеРезультата".

Из формы, расширенной отчетом, при нажатии "Сформировать" будет создан из основного объекта формы "Отчет" ОтчетОбъект и запущен его метод ".СкомпоноватьРезультат()" с ТабДоком Результат на форме и Данными расшифровки на форме же?

А поскольку ОтчетОбъект у нас особо не определен, то где перехватывать ПриКомпоновкеРезультата не очень понятно, так?

У ОтчетОбъект был реквизит ".СхемаКомпоновкиДанных" с доступностью на сервере с чтением и записью - при создании на сервере если его установить конструкция взлетит ли?

Прошу прощения, перечитал. ЗначениеВреквизитФормы() не дает результата, СКД отчета теряется?
Прошу прощения№2: Общая форма отчета может быть открыта только с уже заданным объектом отчет Т.е.

Вот тут надо: "В отчете убрал основную СКД и сделал получение в процедуре "ПриСозданииНаСервере""
т.е. какой то отчет есть и у него есть форма? Или отчета нет в принципе, а есть только СКД и ее нужно связать с GUI общей формы отчета конфигурации?
14. CHELLL 53 26.09.25 10:30 Сейчас в теме
(13) Мой вопрос решился только частично, сам сейчас "потерял" СКД...


Из вводной информации: Есть отчет внешний, форму которого "стянули" с общих форм "ФормаОтчета". В процессе формирования есть свои манипуляции, но не это важно. Отчет формируется в фоне, т.е. непосредственно в модуль объекта "ПриКомпоновкеРезультата" он не заходит.

Я переместил СКД в общие макеты для удобства обращения еще из двух мест к нему, в следствии чего потерял пользовательские настройки при открытии внешнего отчета. Но вот тут я ошибался - я потерял и само СКД, убрав его как основное из внешнего отчета.

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

Получается что ОтчетОбъект - это ВнешнийОтчетОбъект.

При этом восстановление пользовательских настроек прошло:

 АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, УникальныйИдентификатор);
Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ОтчетОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Отчет.КомпоновщикНастроек.Восстановить();   


Но им грош цена без СКД. Сегодня буду добивать и искать "потерявшуюся" СКД при формировании в фоне.
15. truba 26.09.25 11:49 Сейчас в теме
(14) Все равно теряю контекст в котором ты работаешь, прошу прощения) В платформе такая вариативность как это может быть сделано, что теряюсь в возможных ветках. Уже пару раз выкатывал гипотезы и все походу мимо.

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

Пока что понятно:
1) форма должна иметь основной объект Отчет еще на этапе создания в конфигураторе и этот Отчет объект должен иметь признак ИспользоватьСхемуКомпоновкиДанных. Тогда метаданные формы свою внутреннюю структуру, недоступную нам из языка, при создании в конфигураторе подгоняют под работу с СКД и что хорошо что с любым СКД, что в принципе понятно, т.к. СКД может меняться в процессе разработки, а форма уже нет.

2) При создании форма расширяется поведением своего основного объекта Отчета. Добавляются кнопки и события характерные для ее основного Объекта. Для Отчета "Сформировать". Как я понимаю там это связывается с методом "СкомпоноватьРезультат" Объект.Отчет и таб. док "Результат" на форме туда идет параметром.

3)Плюс инициализируется КомпоновщикНастроек отчета из основной СКД отчета. И элементы GUI КомпоновщикаНастроек уже инициализируются из него.

Тогда выходит так, что событие "ПриКомпоновкеРезультата" должно быть описано в метаданных, из которых создавался ОтчетОбъект для формы.

4) Тут вопрос - ПриСозданииНаСервере - это когда она уже создана, но еще не инициализирована свойствами основного объекта (компоновщик еще не инициализирован и т.д.)? Т.е. форма есть, а расширения команд еще нет и мы можем изменить Объект и соответственно форма переинициализируется под новый Объект. Или это так не работает и надо СтандартнаяОбработка выставлять в Ложь и инициализировать форму самому?

Но что значит СтандартнаяОбработка в этом случае? Кнопки то мы не переназначаем сами командам, у нас нет этой возможности, т.е. какая то часть СтандартнойОбработки все равно происходит, а нам доступно только та часть по сути которая относится к инициализации КомпоновщикаНастроек?


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

Гипотеза: Общая форма отчета конфигурации означает, что мастер создания формы отчета по умолчанию не будет ее создавать, а возьмет из конфигурации, загрузив в нее свойство ОтчетОбъект.

В общем комрад я как ни перекладываю этот пазл, но одного СКД мало, нужна промежуточная сущность ОтчетОбъект - форма связана с СКД через него. Если у тебя есть такой объект хорошо, значит там есть и "ПриКомпоновкеРезультата", где можно СКД перед СкомпоноватьРезультат подменить.

Хотя вроде по логике еще ПриСозданииНаСервере мы бы могли бы СКД подменить и вообще передавать свою СКД в параметр формы при создании - но не выходит. У меня не вышло. Еще конечно поизвращаюсь.
16. CHELLL 53 26.09.25 12:57 Сейчас в теме
(15)
Хотя вроде по логике еще ПриСозданииНаСервере мы бы могли бы СКД подменить и вообще передавать свою СКД в параметр формы при создании - но не выходит. У меня не вышло. Еще конечно поизвращаюсь.
- у меня тоже.

Если у тебя есть такой объект хорошо, значит там есть и "ПриКомпоновкеРезультата", где можно СКД перед СкомпоноватьРезультат подменить.
- у меня есть внешний отчет, но в "ПриКомпоновкеРезультата" он не заходит, т.к. выполняет в фоне формирование отчета.
17. truba 26.09.25 13:38 Сейчас в теме
(16) А что значит "выполняет в фоне" в твоем случае? И что значит "не заходит" - точка останова не срабатывает?

Я ж читаю буквально: "выполняет в фоне" - запуск отчета в фоновом задании - а там допустим нет предмета отладки и "не заходит" означает что отладчик в точке останова не срабатывает. А так может и заходит и код выполняет, может там просто СтандартнаяОбработка не сброшена в ЛОЖЬ, поэтому СКД не подменяется в итоге.

ПС. еще гипотеза если "не заходит" это значит не срабатывает точка останова в модуле объекта отчета - когда внешний отчет создается из доп. обработок 1С кидает в темп файлы с рандомным именем файл отчета из полученных метаданных и его уже запускает - тут емнип без чудес и точку останова нужно именно в этом вот темповом файле ставить. Его найти не сложно - по расширению и времени создания.
18. CHELLL 53 26.09.25 15:12 Сейчас в теме
(17) В процедуре "Сформировать"
ФоновоеЗаданиеЗапустить(ФормированиеПриОткрытии, НастройкиОтчета.Внешний Или НастройкиОтчета.Безопасный)


Я так понимаю что в моем случае отладчик туда просто не заходит (предмет отладки "фоновые задания" включен)
19. truba 26.09.25 16:15 Сейчас в теме
(18) 1) Напиши событие в ЖР какое нибудь типа Данные - "Отладка", ВидСобытия Информация и Коммент - "зашли в мой код, СтандартнаяОбработка при этом = "+СтандартнаяОбработка;
в методе ПриКомпоновкеРезультата()

2)Если запись в ЖР появится, то я не уверен что если не сбросить СтандартнуюОбработку в ЛОЖЬ в ПриКомпоновкеРезультата() что стандартное поведение системы не возьмет СКД из ОтчетОбъект.Метаданные() вне зависимости что мы там поустанавливали В ПриСозданииНаСервере() и ПриКомпоновкеРезультата().
Что подразумевается под СтандартнаяОбработка не сильно где объяснено.
20. CHELLL 53 09.10.25 17:38 Сейчас в теме
Итог следующий - запуск в в фоне не заходил в процедуру "При компоновки результата" пока я не пометил на удаление отчет, который сохранен в справочнике "Дополнительные отчеты и обработки". Потом ошибки сыпались рандомные, включая "Схема компоновки данных не обнаружена". Изменил Имя отчета (т.е. его внутренний идентификатор не равен тому что сохранен в ИБ) и все запустилось.

Тема закрыта
Для отправки сообщения требуется регистрация/авторизация

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