Сколько ни пробовал, во внешнем отчете на УФ подменяй схему не подменяй, при нажатии ИзменитьВариант или ВыбратьВариант открывается схема по умолчанию.
Единственный способ - рисовать интерфейс настроек вручную и собирать потом схему программно, впрочем, как и сделаны все отчеты в Бух 3.0.
(17) anig99, стоп, так каков должен быть конечный результат? т.к. возможно переинициализировать компоновщик, значит и выполнение произвольной схемы будет работать в одной форме. И все штатные возможности будут
(44) ben19791010, это не под управляемые формы.
(43) 32ops, этот вариант у меня лежит как крайний случай - создавать функционал редактирования настроек отчета и выбора варианта самому, а не использовать генерируемые платформой.
(2) mymyka, это программное выполнение отчета. Мне нужно сменить схему для отчета, чтобы можно было дальше настраивать его пользователю штатными средствами платформы перед формированием.
(3)Тогда просто измените
АдресСхемы = ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы);
на
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
(59) Без разницы в какой момент менять схему. Всё равно в определенные моменты 1с лезет за отчетом, которые сохранён в конфигураторе и всё обламывается. Т.е. использовать уже существующий в конфигурации отчёт ради управляемой формы - нельзя. Никак. Переназначить основной реквизит - тоже нельзя. Нашел только один рабочий вариант. Сделал свои общие управляемые формы для отчета и его настроек. Просто это оказалось намного проще, чем я думал. А дальше уже я при открытии внешнего отчета отменяю открытие формы и вызываю общую форму с передачей через параметры схемы отчета. При это мне доступно и варианты и настройки. Немного поменяв стандартный код и сохранять настройки получается. В общем влезть в конфигураторо всё же пришлось, но только 1 раз. Публикация сейчас отправлена на модерацию. Чуть позже раздам вознаграждение. Извините, что так пропал - работа, да и протестировать нужно было подсистему.
(71) это кусочек того, что пришлось в итоге дописать.
(70) какой-то замудрённый способ. есть попроще для моего случая. Но это всё равно не поможет. При формировании отчета схема перечитывается из конфигурации.
(66) не обязательно интерактивное. Главное - смена. Решено через общую форму. В принципе можно её допилить и до интерактивной смены прямо из формы.
(74) anig99, да там замудрен только код изменения самого запроса в СКД - само изменение очень простое...
ТекстЗапроса = ЭтотОбъект.СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос;
// + алгоритм изменения запроса
// ...
//- алгоритм изменения запроса
ЭтотОбъект.СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ИзмененныйЗапрос;
Прилагаю пример переделки отчета просроченных долгов (без учета корректности привязки документов оплат) для конфигурации УТ 11.1 (тоже долго не мог понять как подогнать отчет для обычных форм под управляемые). В отладчике можно увидеть запрос ДО и запрос ПОСЛЕ, ну и открывается непосредственно в отчете запрос ПОСЛЕ (что и надо было). Т.е. таким образом можно изменять текст запроса при выполнении тех или иных условий (права пользователей, те или иные остатки и т.п.).
Функция ПолучитьСхему() Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СхемаСКД);
Попытка
Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("СхемаКомпоновкиДанных"));
Исключение
Результат = Неопределено;
КонецПопытки;
Если Результат = Неопределено Тогда
Возврат Новый СхемаКомпоновкиДанных;
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции //
Процедура УстановитьСхему(ОбъектСхемы) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектСхемы, "dataCompositionSchema", "http://v8.1c.ru/8.1/data-composition-system/schema");
СхемаСКД = ЗаписьXML.Закрыть();
КонецПроцедуры
(11) anig99, вставила в модуль отчета (на одних курсах по скд так показывали) вроде работает
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Вставить содержимое обработчика.
СхемаКомпоновкиДанных = ПолучитьМакет("Макет");
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КонецПроцедуры
(16) spezc, хотелось бы точно узнать на основании чего такое поведение платформы. Может всё-таки есть выход? Мне нужно подменить основную схему своей при старте отчета. Я нашёл 2 решения, но там возникает несколько ньюансов. Одно решение муторное, другое костыльное. Хотелось сделать красиво.
(23) давно пытался, форумы перерыл. сейчас еще раз глянул новое по этой теме - ничего не изменилось.
почему - ответа нет. партнерский форум и разработчика молчат
Сколько ни пробовал, во внешнем отчете на УФ подменяй схему не подменяй, при нажатии ИзменитьВариант или ВыбратьВариант открывается схема по умолчанию.
Единственный способ - рисовать интерфейс настроек вручную и собирать потом схему программно, впрочем, как и сделаны все отчеты в Бух 3.0.
ну не знаю насколько это красивое по вашим меркам - сделайте сделайте две вложенные схемы (или сколько у вас разных схем), сделайте два варианта - в каждом варианте своя схема.
таким образом выбирая вариант (при открытии) - вы сможете выбирать нужную схему
(28) spezc,
1. Через обработку. Создаем все нужные элементы формы для работы с отчетом (выбор варианта, изменение настройки и т.д.) сами.
2. Через отчет. Через процедуру в модуле отчета. Определенного успеха тут я добился. Компоновка настроек подгружается, но не сама схема. Её приходится грузить ПриКомпоновкеРезультата повторно. Соответственно не работают нормально остальные настройки.
делаешь как-то так. Т.е. схема меняется до создания управляемой формы. НО! Такой вариант устраивает только если Макет фиксирован в коде. Я не знаю нормального способа передать в модуль отчета ПЕРЕД созданием формы что-либо. Т.е. передать информацию о том, какой именно макет мне нужен, например.
У меня для вас плохие новости - к сожалению, никак.
Если посмотреть на реквизит Отчет в УФ, то мы увидим, что это ДанныеФормыСтруктура, содержащие только 2 поля - ИдентификаторТипаОтчета и КомпоновщикНастроек. Т.е. СКД там по-просту нет!
А теперь представим как выполняется отчет в УФ, как клиент-серверная система. Вот у тебя есть настроенная форма, НО! - в данный момент существует она только на клиенте! Т.е. хранит инфу только о Компоновщике настроек. Для выполнения эта форма передается на сервер, там генерируется уже объект-отчет (естественно, с настройками по-умолчанию, т.е со своим стандартным СКД), в него загружаются настройки из формы (компоновщик), и... собственно все, дальше уже вызывается исполнение компоновки. (проследить это можно, поставив в модуле Сообщить("вызов отчета") , и обратить внимание когда эти сообщения вылезут).
Таким образом, подменяй-не подменяй СКД в форме - это ничего не даст.
Можно поробовать обойти (что вы и пытались сделать): подменять непосредсвенно перед выпонением, в модуле, ПриКомпоновкеРезультата(). Передавать инфу туда можно либо добавив еще один реквизит отчета (ИмяМакета, например), либо пользуясь реквзитом ДополнительныеСвойства настроек компоновщика (это структура, куда можно запихать все чего надо). Последний вариант даже более предпочтителен, т.к. ДополнительныеСвойства вместе с остальными настройками компоновщика работают через стандартный механизм настроек - т.е. в сохранении/восстановлении и расшифровках показателей.
Да, и, для того чтобы не сбивались настройки (если доступные поля у компоновок разные) можно попробовать поиграться с методами Получитьнастройки/ЗагрузитьНастройки/Восстановить.
А зачем такие сложности? Если нужно что-то подшаманить то по-моему лучше инициировать настройки из одной схемы и применять их к исполнению на другую вот и все. естественно придется доделывать обработчик "ПриКомпоновкеРезультата".
(41) tristarr1, чтобы можно было открывать для внешних отчетов управляемую форму под толстым клиентом. А управляемая форма нужна, чтобы можно было нормально пользоваться вариантами отчетов и пользовательскими настройками.
Добавить реквизит1 в отчет типа "КомпоновщикНастроекКомпоновкиДанных". Создать форму варианта (на форме изменить путь к данным у "КопоновщикНастроеНастройки" на Отчет.Реквизит1.Настройки), в ней при создании на сервере
СхемаДляОтбора = Отчеты.Отчет1.ПолучитьМакет("Макет");
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаДляОтбора,УникальныйИдентификатор);
Отчет.Реквизит1.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
Отчет.Реквизит1.ЗагрузитьНастройки(СхемаДляОтбора.НастройкиПоУмолчанию);
Отчет.Реквизит1.Восстановить();
Схема редактируется.
На 8.2 99.99% что не получится сделать.
Самый простой вариант - сделать отчетов сколько нужно разных схем на СКД и одной обработкой стартером ими управлять.
Для пользователя это будет практически то же самое.
Вот рабочий вариант смены компоновки данных на управляемых формах. Без наворотов, просто интересен был сам факт того, что это можно сделать.
Добавлено.
разумеется, формировать список желательно по метаданным, перебирая макеты и варианты.
На обычных формах я использовал такую конструкцию:
Для Каждого МакетСхемы Из ЭтотОбъект.Метаданные().Макеты Цикл
СхемаКД = ПолучитьМакет(МакетСхемы.Имя);
Для Каждого ВариантНастроек Из СхемаКД.ВариантыНастроек Цикл
СписокВариантов.Добавить(МакетСхемы.Имя + "$" + ВариантНастроек.Имя, ВариантНастроек.Представление);
КонецЦикла;
КонецЦикла;
Дальше при смене варианта настроек:
//Загрузим схему компоновки данных
МногострочныйТекст = СтрЗаменить(ВыбранноеЗначение,"$", Символы.ПС);
ИмяСхемы = СтрПолучитьСтроку(МногострочныйТекст, 1);
Вариант = СтрПолучитьСтроку(МногострочныйТекст, 2);
МакетКД = ПолучитьМакет(ИмяСхемы);
КомпоновщикНастроек.Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных(МакетКД));
КомпоновщикНастроек.ЗагрузитьНастройки(МакетКД.ВариантыНастроек.Найти(Вариант).Настройки);
парам = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ВариантФормированияОтчета");
парам.Значение = ЭтаФорма.ЭлементыФормы.ВариантФормирования.Значение;
Показать
При некотором желании то же самое можно сделать и на управляемых формах.
Мне было некогда сильно разбираться, поэтому список (он же "шписок") я просто прописал при создании на сервере.
Вот вроде получилось сделать то, что требуется, но формы настроек походу берутся их схемы, может их как-то можно изменить, но пока нет времени копать дальше
(61) Хотя подозреваю, что это даже не настройки, а использование метода ПолучитьФорму() аналогично толстому клиенту в обычном режиме, и в результате открывается именно форма для обычного режима.
Вариант открытия стандартной формы СКД (а также изменения варианта, можно и настроек) внешнего отчета в упр. форме.
Хотя понял, что скорее всего требовалось не совсем это.
(64) adva, у вас нет интерактивной смены схемы СКД. Вопрос к топикстартеру и всем остальным - (60) никто не смотрел? Мне кажется, это близко к тому, что требовалось - интерактивная смена схемы компоновки данных с возможностью редактирования настроек. Все на булочке с кунжутом управляемых формах.
(66) Вы сами пробовали это (60) сделать на управляемых формах? У меня получалось подсунуть настройки в упр. формах, но они без схемы были нерабочими (заданные по умолчанию настройки есть, а возможности их изменения нет). У меня нет интерактивной смены схемы, но в итоге, я думаю, мой вариант более рабочий, открывается форма внешнего отчета на СКД с типовыми настройками, а если все же требуется использовать форму самого отчета, то в (65) предложено вроде как рабочее решение.
(67) adva, в (60) - как раз мной написанный отчет на управляемых формах, с двумя схемами компоновки данных :)
На базе УТ 11.1 в тонком клиенте на управляемом интерфейсе все работает. Вы бы проверяли, прежде чем писать...
Ниже - скриншоты.
(68) тогда еще и покажите, пожалуйста на скрине, какие поля доступны при добавлении отбора / группировки. Я ж говорю, при моих попытках выполнить аналогичные действия, настройки внешне выглядели так, как требовалось, но при этом ничего нельзя было изменить. Возможно я чего-то не доделал.
А если нужна именно первоначальная форма отчета, то может быть стоит попробовать так. Делаем СКД, в которой перечисляем N полей типа "Поле1, Поле2, Поле3 ...", максимум, сколько может понадобиться (в т.ч. и в ресурсы).
А при создании на сервере, обзываем эти поля для пользователя так, как требуется, исходя из схемы требуемого отчета, (лишние поля отключаем для доступа). Пользователь производит настройки. При компоновке результата, производим обратное преобразование настроенных пользователем полей, в поля нужной схемы (при этом предварительно надо будет задать соответствие полей вида Поле1 полям нужной схемы)
На диске итс есть внешний отчет "КонсольСистемыКомпоновкиДанных.erf", в котором в режиме предприятия даже можно изменять сам макет скд, через "конструктор схемы компоновки данных" или прямо в тексте схемы компоновки данных. поковыряй его, возможно найдешь ответ.
привет, возникла необходимость создать 5 разных отчетов УФ, лениво их делать, поэтому - хочу сделать один отчет, в котором параметром будет вид отчета.
в зависимости от вида - буду выбирать нужную схему.
почитала ветку - думаю будет полезно, спасибо.
поделюсь когда будет чем.
привет, возникла необходимость создать 5 разных отчетов УФ, лениво их делать, поэтому - хочу сделать один отчет, в котором параметром будет вид отчета.
в зависимости от вида - буду выбирать нужную схему.
почитала ветку - думаю будет полезно, спасибо.
поделюсь когда будет чем.
&НаСервере
Процедура Инициализация()
О = РеквизитФормыВЗначение("Отчет");
Если Отчет.ЭтоДанныеПоПоказателям Тогда
О.СхемаКомпоновкиДанных = О.ПолучитьМакет("Показатели");
Иначе
О.СхемаКомпоновкиДанных = О.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КонецЕсли;
// Для инициализации схемы нам нужен адрес в хранилище
АдресСхемы = ПоместитьВоВременноеХранилище(О.СхемаКомпоновкиДанных,УникальныйИдентификатор);
Отчет.КомпоновщикНастроек.Инициализировать(
Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)
);
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(О.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
ЗначениеВРеквизитФормы(О,"Отчет");
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(О.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КонецПроцедуры
(81) Спасибо большое! Так действительно работает. Только не нужно указывать основную схему, иначе компоновщик настроек будет брать настройки из неё. И соответственно в модуле объекта в процедуре при компоновке результата нужно тоже указывать макет. Я добавил реквизит внешней обработки, чтобы имя схемы было доступно и в модуле формы, и в модуле объекта.