Пользовательские настойки в СКД через общие макеты
Всем привет.
Может кто сталкивался с ситуацией:
Был внешний отчет построенный на базе общей формы отчета. Сейчас необходимо сделать на базе его СКД обращение ещё с двух мест. Решил перенести СКД в общие макеты. В отчете убрал основную СКД и сделал получение в процедуре "ПриСозданииНаСервере"
Но появилась проблема - пользовательские настройки не показываются и рушится отчет (да там прописаны обращения к элементам быстрых настроек...)
На форме нет положенных пользовательских настроек да и вообще ничего, даже полей.
Прописываю отдельно
Пытался еще вот так сделать, но результат отрицательный
Что я делаю не так и куда стоит обратить внимание? Или может есть идеи как иначе реализовать общий источник (СКД). Спасибо
Может кто сталкивался с ситуацией:
Был внешний отчет построенный на базе общей формы отчета. Сейчас необходимо сделать на базе его СКД обращение ещё с двух мест. Решил перенести СКД в общие макеты. В отчете убрал основную СКД и сделал получение в процедуре "ПриСозданииНаСервере"
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
ОтчетМетаданные = ОтчетОбъект.Метаданные();
ОтчетПолноеИмя = ОтчетМетаданные.ПолноеИмя();
ПредопределенныеВарианты = Новый СписокЗначений;
ОтчетОбъект.СхемаКомпоновкиДанных = ПолучитьОбщийМакет("СКД_"); // _***_(2025/09/19)_[+] // вынес СКД в общие макеты
Если ОтчетОбъект.СхемаКомпоновкиДанных <> Неопределено Тогда
Для Каждого Вариант Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
ПредопределенныеВарианты.Добавить(Вариант.Имя, Вариант.Представление);
КонецЦикла;
КонецЕсли;
ПоказатьНо появилась проблема - пользовательские настройки не показываются и рушится отчет (да там прописаны обращения к элементам быстрых настроек...)
На форме нет положенных пользовательских настроек да и вообще ничего, даже полей.
Прописываю отдельно
АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, УникальныйИдентификатор);
Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));Пытался еще вот так сделать, но результат отрицательный
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ОтчетОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию)Что я делаю не так и куда стоит обратить внимание? Или может есть идеи как иначе реализовать общий источник (СКД). Спасибо
Прикрепленные файлы:
Найденные решения
Итог следующий - запуск в в фоне не заходил в процедуру "При компоновки результата" пока я не пометил на удаление отчет, который сохранен в справочнике "Дополнительные отчеты и обработки". Потом ошибки сыпались рандомные, включая "Схема компоновки данных не обнаружена". Изменил Имя отчета (т.е. его внутренний идентификатор не равен тому что сохранен в ИБ) и все запустилось.
Тема закрыта
Тема закрыта
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
смотрите, у нас есть объект СКД программный тот что условно получается конструктором Новый СхемаКомпоновкиДанных и есть его пользовательское представление, имплементируемое формой отчета (а других GUI в 1С нет). Это очень и очень разные вещи, поэтому между "должны появляться" и "настройки варианта" есть очень много всего для связи элементов GUI, промежуточного объекта для этого КомпоновщикНастроек и собственно самих НастроекКомпоновкиДанных - тоже глубоко чисто программного объекта, которому на GUI наплевать.
Я пытаюсь понять, проблема в отсутствии этой корректной связи или я вообще мимо темы гляжу?
Я пытаюсь понять, проблема в отсутствии этой корректной связи или я вообще мимо темы гляжу?
(6) ПС, что бы поведение формы корректно связывалось с инициализированным компоновщиком нужно что бы форма создалась в конфигураторе с установленным признаком "ИспользованиеСхемыКомпоновкиДанных" - там часть поведения формы глубоко под капотом и в общем случае не доступно программно для управления. Мы ж и форму не можем создать из средств языка - только в конфигураторе.
Попробуйте создать обычную форму отчета - сериализуйте ее в xml и форму отчета с использованием СКД - тоже сериализуйте и сравните эти xml - они внутри разные, а внешне одинаковые. И программно вы их одинаковыми на момент рантайма не сделаете, нет таких инструментов.
Вот это определяет часть проблем с подменой СКД отчета.
Попробуйте создать обычную форму отчета - сериализуйте ее в xml и форму отчета с использованием СКД - тоже сериализуйте и сравните эти xml - они внутри разные, а внешне одинаковые. И программно вы их одинаковыми на момент рантайма не сделаете, нет таких инструментов.
Вот это определяет часть проблем с подменой СКД отчета.
Форма отчет то открывается? пользователь ее видит раз речь идет о пользовательских настройках?
При еще создании формы в конфигураторе была установлена галочка что отчет использует систему компоновки данных? Дай более детально описание процесса как будто дегенератам объясняешь, с утра не ахти телепатия работает.
При еще создании формы в конфигураторе была установлена галочка что отчет использует систему компоновки данных? Дай более детально описание процесса как будто дегенератам объясняешь, с утра не ахти телепатия работает.
Смотри - основной источник событий и команд это форма, форма может же быть только на сервере или на клиенте и на сервере.
Форма у тебя расширена скорее всего основным объектом отчет.
далее что важно - еще на этапе создания формы в конфигураторе там присутствует галка или настройка что это форма отчета использующая схему компоновки данных.
Т.е. взять просто форму отчета и пытаться в объект отчет загружать свое СКД не выйдет - форма внутри другая, ее поведение другое. Притом в настройках самой формы ты этого не увидишь.
Если сериализовать в хмл форму отчета и форму отчета скд - это разные формы будут.
Поэтому инициализация компоновщика настроек формы связанной с скд и формы не связанной разная.
У тебя форма связана с СКД на этапе создания ее в конфигураторе?
Форма у тебя расширена скорее всего основным объектом отчет.
далее что важно - еще на этапе создания формы в конфигураторе там присутствует галка или настройка что это форма отчета использующая схему компоновки данных.
Т.е. взять просто форму отчета и пытаться в объект отчет загружать свое СКД не выйдет - форма внутри другая, ее поведение другое. Притом в настройках самой формы ты этого не увидишь.
Если сериализовать в хмл форму отчета и форму отчета скд - это разные формы будут.
Поэтому инициализация компоновщика настроек формы связанной с скд и формы не связанной разная.
У тебя форма связана с СКД на этапе создания ее в конфигураторе?
Скажем так. Когда мне необходимо было подменить схему компоновки (или вообще выводить отчет ака печатная форму), я всё равно добавлял пустую схему компоновки в отчет но рулил параметрами (без отборов). И дальше уже формировал.
(11)
да, находил эту статью.
в итоге я понял что не доделал начатое, а именно не прописал .
Должны быть так
Сейчас борюсь со схемой СКД. В статье её определяют в процедуре ПриКомпановкеРезультата, а у меня отчет в фоне формируется - ищу где теряется схема
ИспользованиеСхемыКомпоновкиДанных
да, находил эту статью.
в итоге я понял что не доделал начатое, а именно не прописал .
Отчет.КомпоновщикНастроек.Восстановить();
Должны быть так
Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ОтчетОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Отчет.КомпоновщикНастроек.Восстановить();
Сейчас борюсь со схемой СКД. В статье её определяют в процедуре ПриКомпановкеРезультата, а у меня отчет в фоне формируется - ищу где теряется схема
(12) CHELL, мне не нужны стармани, но мне нужно понимание работы GUI форм 1С с методами объектов, которые они расширяют и как вообще генерится на движке при этом форма.
Я правильно понял, что у тебя есть Общая форма отчета в конфигурации и есть СКД?
При создании на сервере ты объекту общей формы отчета "Отчет" инициализируешь компоновщик настроек из СКД. Т.е. с этапом задания настроек все ок.
Дальше вопрос переназначения объекта Отчет? Т.к. в стандартном отчете существует Отчет заданный в конфигураторе, связанный с ним ОтчетОбъект с командой "СкомпоноватьРезультат" и событием "ПриКомпоновкеРезультата".
Из формы, расширенной отчетом, при нажатии "Сформировать" будет создан из основного объекта формы "Отчет" ОтчетОбъект и запущен его метод ".СкомпоноватьРезультат()" с ТабДоком Результат на форме и Данными расшифровки на форме же?
А поскольку ОтчетОбъект у нас особо не определен, то где перехватывать ПриКомпоновкеРезультата не очень понятно, так?
У ОтчетОбъект был реквизит ".СхемаКомпоновкиДанных" с доступностью на сервере с чтением и записью - при создании на сервере если его установить конструкция взлетит ли?
Прошу прощения, перечитал. ЗначениеВреквизитФормы() не дает результата, СКД отчета теряется?
Прошу прощения№2: Общая форма отчета может быть открыта только с уже заданным объектом отчет Т.е.
Вот тут надо: "В отчете убрал основную СКД и сделал получение в процедуре "ПриСозданииНаСервере""
т.е. какой то отчет есть и у него есть форма? Или отчета нет в принципе, а есть только СКД и ее нужно связать с GUI общей формы отчета конфигурации?
Я правильно понял, что у тебя есть Общая форма отчета в конфигурации и есть СКД?
При создании на сервере ты объекту общей формы отчета "Отчет" инициализируешь компоновщик настроек из СКД. Т.е. с этапом задания настроек все ок.
Дальше вопрос переназначения объекта Отчет? Т.к. в стандартном отчете существует Отчет заданный в конфигураторе, связанный с ним ОтчетОбъект с командой "СкомпоноватьРезультат" и событием "ПриКомпоновкеРезультата".
Из формы, расширенной отчетом, при нажатии "Сформировать" будет создан из основного объекта формы "Отчет" ОтчетОбъект и запущен его метод ".СкомпоноватьРезультат()" с ТабДоком Результат на форме и Данными расшифровки на форме же?
А поскольку ОтчетОбъект у нас особо не определен, то где перехватывать ПриКомпоновкеРезультата не очень понятно, так?
У ОтчетОбъект был реквизит ".СхемаКомпоновкиДанных" с доступностью на сервере с чтением и записью - при создании на сервере если его установить конструкция взлетит ли?
Прошу прощения, перечитал. ЗначениеВреквизитФормы() не дает результата, СКД отчета теряется?
Прошу прощения№2: Общая форма отчета может быть открыта только с уже заданным объектом отчет Т.е.
Вот тут надо: "В отчете убрал основную СКД и сделал получение в процедуре "ПриСозданииНаСервере""
т.е. какой то отчет есть и у него есть форма? Или отчета нет в принципе, а есть только СКД и ее нужно связать с GUI общей формы отчета конфигурации?
(13) Мой вопрос решился только частично, сам сейчас "потерял" СКД...
Из вводной информации: Есть отчет внешний, форму которого "стянули" с общих форм "ФормаОтчета". В процессе формирования есть свои манипуляции, но не это важно. Отчет формируется в фоне, т.е. непосредственно в модуль объекта "ПриКомпоновкеРезультата" он не заходит.
Я переместил СКД в общие макеты для удобства обращения еще из двух мест к нему, в следствии чего потерял пользовательские настройки при открытии внешнего отчета. Но вот тут я ошибался - я потерял и само СКД, убрав его как основное из внешнего отчета.
В процедуре "ПриСозданииНаСервере" формы внешнего отчета я прописываю обращение к СКД
Получается что ОтчетОбъект - это ВнешнийОтчетОбъект.
При этом восстановление пользовательских настроек прошло:
Но им грош цена без СКД. Сегодня буду добивать и искать "потерявшуюся" СКД при формировании в фоне.
Из вводной информации: Есть отчет внешний, форму которого "стянули" с общих форм "ФормаОтчета". В процессе формирования есть свои манипуляции, но не это важно. Отчет формируется в фоне, т.е. непосредственно в модуль объекта "ПриКомпоновкеРезультата" он не заходит.
Я переместил СКД в общие макеты для удобства обращения еще из двух мест к нему, в следствии чего потерял пользовательские настройки при открытии внешнего отчета. Но вот тут я ошибался - я потерял и само СКД, убрав его как основное из внешнего отчета.
В процедуре "ПриСозданииНаСервере" формы внешнего отчета я прописываю обращение к СКД
ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); ОтчетОбъект.СхемаКомпоновкиДанных = ПолучитьОбщийМакет("СКД_")Получается что ОтчетОбъект - это ВнешнийОтчетОбъект.
При этом восстановление пользовательских настроек прошло:
АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, УникальныйИдентификатор);
Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(ОтчетОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Отчет.КомпоновщикНастроек.Восстановить(); Но им грош цена без СКД. Сегодня буду добивать и искать "потерявшуюся" СКД при формировании в фоне.
(14) Все равно теряю контекст в котором ты работаешь, прошу прощения) В платформе такая вариативность как это может быть сделано, что теряюсь в возможных ветках. Уже пару раз выкатывал гипотезы и все походу мимо.
При том платформа позволяет программно создать СКД даже из самого кода как и настройки, вообще без макетов, а вот связать это все с формами без бубна она не позволяет. И нет внятного описания как эта связь работает даже для стандартной работы двух форм (основная отчета и настроек) при работе их мастера при создании отчета из СКД.
Пока что понятно:
1) форма должна иметь основной объект Отчет еще на этапе создания в конфигураторе и этот Отчет объект должен иметь признак ИспользоватьСхемуКомпоновкиДанных. Тогда метаданные формы свою внутреннюю структуру, недоступную нам из языка, при создании в конфигураторе подгоняют под работу с СКД и что хорошо что с любым СКД, что в принципе понятно, т.к. СКД может меняться в процессе разработки, а форма уже нет.
2) При создании форма расширяется поведением своего основного объекта Отчета. Добавляются кнопки и события характерные для ее основного Объекта. Для Отчета "Сформировать". Как я понимаю там это связывается с методом "СкомпоноватьРезультат" Объект.Отчет и таб. док "Результат" на форме туда идет параметром.
3)Плюс инициализируется КомпоновщикНастроек отчета из основной СКД отчета. И элементы GUI КомпоновщикаНастроек уже инициализируются из него.
Тогда выходит так, что событие "ПриКомпоновкеРезультата" должно быть описано в метаданных, из которых создавался ОтчетОбъект для формы.
4) Тут вопрос - ПриСозданииНаСервере - это когда она уже создана, но еще не инициализирована свойствами основного объекта (компоновщик еще не инициализирован и т.д.)? Т.е. форма есть, а расширения команд еще нет и мы можем изменить Объект и соответственно форма переинициализируется под новый Объект. Или это так не работает и надо СтандартнаяОбработка выставлять в Ложь и инициализировать форму самому?
Но что значит СтандартнаяОбработка в этом случае? Кнопки то мы не переназначаем сами командам, у нас нет этой возможности, т.е. какая то часть СтандартнойОбработки все равно происходит, а нам доступно только та часть по сути которая относится к инициализации КомпоновщикаНастроек?
Дальше. ОтчетОбъект в форме создается из метаданных допустим внешнего файла или встроенного отчета. Насколько я понимаю, метаданные полюбому нужны.
Гипотеза: Общая форма отчета конфигурации означает, что мастер создания формы отчета по умолчанию не будет ее создавать, а возьмет из конфигурации, загрузив в нее свойство ОтчетОбъект.
В общем комрад я как ни перекладываю этот пазл, но одного СКД мало, нужна промежуточная сущность ОтчетОбъект - форма связана с СКД через него. Если у тебя есть такой объект хорошо, значит там есть и "ПриКомпоновкеРезультата", где можно СКД перед СкомпоноватьРезультат подменить.
Хотя вроде по логике еще ПриСозданииНаСервере мы бы могли бы СКД подменить и вообще передавать свою СКД в параметр формы при создании - но не выходит. У меня не вышло. Еще конечно поизвращаюсь.
При том платформа позволяет программно создать СКД даже из самого кода как и настройки, вообще без макетов, а вот связать это все с формами без бубна она не позволяет. И нет внятного описания как эта связь работает даже для стандартной работы двух форм (основная отчета и настроек) при работе их мастера при создании отчета из СКД.
Пока что понятно:
1) форма должна иметь основной объект Отчет еще на этапе создания в конфигураторе и этот Отчет объект должен иметь признак ИспользоватьСхемуКомпоновкиДанных. Тогда метаданные формы свою внутреннюю структуру, недоступную нам из языка, при создании в конфигураторе подгоняют под работу с СКД и что хорошо что с любым СКД, что в принципе понятно, т.к. СКД может меняться в процессе разработки, а форма уже нет.
2) При создании форма расширяется поведением своего основного объекта Отчета. Добавляются кнопки и события характерные для ее основного Объекта. Для Отчета "Сформировать". Как я понимаю там это связывается с методом "СкомпоноватьРезультат" Объект.Отчет и таб. док "Результат" на форме туда идет параметром.
3)Плюс инициализируется КомпоновщикНастроек отчета из основной СКД отчета. И элементы GUI КомпоновщикаНастроек уже инициализируются из него.
Тогда выходит так, что событие "ПриКомпоновкеРезультата" должно быть описано в метаданных, из которых создавался ОтчетОбъект для формы.
4) Тут вопрос - ПриСозданииНаСервере - это когда она уже создана, но еще не инициализирована свойствами основного объекта (компоновщик еще не инициализирован и т.д.)? Т.е. форма есть, а расширения команд еще нет и мы можем изменить Объект и соответственно форма переинициализируется под новый Объект. Или это так не работает и надо СтандартнаяОбработка выставлять в Ложь и инициализировать форму самому?
Но что значит СтандартнаяОбработка в этом случае? Кнопки то мы не переназначаем сами командам, у нас нет этой возможности, т.е. какая то часть СтандартнойОбработки все равно происходит, а нам доступно только та часть по сути которая относится к инициализации КомпоновщикаНастроек?
Дальше. ОтчетОбъект в форме создается из метаданных допустим внешнего файла или встроенного отчета. Насколько я понимаю, метаданные полюбому нужны.
Гипотеза: Общая форма отчета конфигурации означает, что мастер создания формы отчета по умолчанию не будет ее создавать, а возьмет из конфигурации, загрузив в нее свойство ОтчетОбъект.
В общем комрад я как ни перекладываю этот пазл, но одного СКД мало, нужна промежуточная сущность ОтчетОбъект - форма связана с СКД через него. Если у тебя есть такой объект хорошо, значит там есть и "ПриКомпоновкеРезультата", где можно СКД перед СкомпоноватьРезультат подменить.
Хотя вроде по логике еще ПриСозданииНаСервере мы бы могли бы СКД подменить и вообще передавать свою СКД в параметр формы при создании - но не выходит. У меня не вышло. Еще конечно поизвращаюсь.
(15)
Хотя вроде по логике еще ПриСозданииНаСервере мы бы могли бы СКД подменить и вообще передавать свою СКД в параметр формы при создании - но не выходит. У меня не вышло. Еще конечно поизвращаюсь.
- у меня тоже.
Если у тебя есть такой объект хорошо, значит там есть и "ПриКомпоновкеРезультата", где можно СКД перед СкомпоноватьРезультат подменить.
- у меня есть внешний отчет, но в "ПриКомпоновкеРезультата" он не заходит, т.к. выполняет в фоне формирование отчета.
(16) А что значит "выполняет в фоне" в твоем случае? И что значит "не заходит" - точка останова не срабатывает?
Я ж читаю буквально: "выполняет в фоне" - запуск отчета в фоновом задании - а там допустим нет предмета отладки и "не заходит" означает что отладчик в точке останова не срабатывает. А так может и заходит и код выполняет, может там просто СтандартнаяОбработка не сброшена в ЛОЖЬ, поэтому СКД не подменяется в итоге.
ПС. еще гипотеза если "не заходит" это значит не срабатывает точка останова в модуле объекта отчета - когда внешний отчет создается из доп. обработок 1С кидает в темп файлы с рандомным именем файл отчета из полученных метаданных и его уже запускает - тут емнип без чудес и точку останова нужно именно в этом вот темповом файле ставить. Его найти не сложно - по расширению и времени создания.
Я ж читаю буквально: "выполняет в фоне" - запуск отчета в фоновом задании - а там допустим нет предмета отладки и "не заходит" означает что отладчик в точке останова не срабатывает. А так может и заходит и код выполняет, может там просто СтандартнаяОбработка не сброшена в ЛОЖЬ, поэтому СКД не подменяется в итоге.
ПС. еще гипотеза если "не заходит" это значит не срабатывает точка останова в модуле объекта отчета - когда внешний отчет создается из доп. обработок 1С кидает в темп файлы с рандомным именем файл отчета из полученных метаданных и его уже запускает - тут емнип без чудес и точку останова нужно именно в этом вот темповом файле ставить. Его найти не сложно - по расширению и времени создания.
(18) 1) Напиши событие в ЖР какое нибудь типа Данные - "Отладка", ВидСобытия Информация и Коммент - "зашли в мой код, СтандартнаяОбработка при этом = "+СтандартнаяОбработка;
в методе ПриКомпоновкеРезультата()
2)Если запись в ЖР появится, то я не уверен что если не сбросить СтандартнуюОбработку в ЛОЖЬ в ПриКомпоновкеРезультата() что стандартное поведение системы не возьмет СКД из ОтчетОбъект.Метаданные() вне зависимости что мы там поустанавливали В ПриСозданииНаСервере() и ПриКомпоновкеРезультата().
Что подразумевается под СтандартнаяОбработка не сильно где объяснено.
в методе ПриКомпоновкеРезультата()
2)Если запись в ЖР появится, то я не уверен что если не сбросить СтандартнуюОбработку в ЛОЖЬ в ПриКомпоновкеРезультата() что стандартное поведение системы не возьмет СКД из ОтчетОбъект.Метаданные() вне зависимости что мы там поустанавливали В ПриСозданииНаСервере() и ПриКомпоновкеРезультата().
Что подразумевается под СтандартнаяОбработка не сильно где объяснено.
Итог следующий - запуск в в фоне не заходил в процедуру "При компоновки результата" пока я не пометил на удаление отчет, который сохранен в справочнике "Дополнительные отчеты и обработки". Потом ошибки сыпались рандомные, включая "Схема компоновки данных не обнаружена". Изменил Имя отчета (т.е. его внутренний идентификатор не равен тому что сохранен в ИБ) и все запустилось.
Тема закрыта
Тема закрыта
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот