СКД: все, что вы хотели знать о подмене схемы компоновки данных в отчетах и обработках

07.12.20

Разработка - СКД

Довольно часто на различных тематических форумах задается вопрос, можно ли использовать в отчете/обработке несколько схем компоновки данных, подменяя одну другой по мере надобности? При этом желательно, чтобы и пользовательские настройки при смене схемы менялись соответственно.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Использование нескольких схем компоновки данных в обработке
.epf 11,30Kb
21 2 500 руб. Купить
Использование нескольких схем компоновки данных в отчете
.erf 11,56Kb
37 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

    Для написания примеров отчета и обработки я воспользовался типовой конфигурацией "Библиотека Стандартных Подсистем (демо)" версии 3.0.3.341 (платформа 8.3.13.1472). Итак, поехали! Начнем с простого.

    1. Подмена схемы компоновки данных в отчете.

    Создадим новый внешний отчет, назовем его, скажем "_СКДОтчетЗаменаСхемы". Добавим в макеты две простеньких схемы компоновки данных (для примера этого вполне достаточно): Номенклатура и ДоговорыКонтрагентов. 

 
 Запрос для набора данных СКД "Номенклатура":

    

    Для номенклатуры настроим группировки и добавим отбор по реквизиту "Родитель", который включим в пользовательские настройки:

 

 
 Запрос для набора данных СКД "ДоговорыКонтрагентов":

    Для договоров настроим группировки и добавим отборы по реквизитам "Контрагент" и "Организация", которые также включим в пользовательские настройки:


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

    Добавляем для реквизита "ИмяОтчета" событие "ПриИзменении" и переходим в модуль формы. Здесь добавляем событие "ПриСозданииНаСервере" из которого вызываем процедуру ЗаполнитьСписокОтчетов():

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЗаполнитьСписокОтчетов();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокОтчетов()
    
    СписокМакетов = Новый Структура("Номенклатура, ДоговорыКонтрагентов");
    
    Для Каждого Макет Из СписокМакетов Цикл
        Элементы.ИмяОтчета.СписокВыбора.Добавить(Макет.Ключ, Макет.Ключ);
    КонецЦикла;    
    
КонецПроцедуры

    А из события "ИмяОтчетаПриИзменении" вызовем процедуру УстановитьМакетОтчета()

&НаКлиенте
Процедура ИмяОтчетаПриИзменении(Элемент)
    УстановитьМакетОтчета()
КонецПроцедуры

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

    Процедура ЗаполнитьСписокОтчетов() принципиальной роли не играет, а вот на процедуре УстановитьМакетОтчета() остановимся подробнее:

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

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

//инициализируем компоновщик настроек 
    Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет.АдресСхемы));

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

    Сохраняем, запускаем обработку и смотрим, что получилось. Меняем имя отчета и смотрим, как соответственно меняются пользовательские настройки:


 

    То что нужно! Нажимаем "Сформировать" иииии.... получаем ошибку:

 

    Да, мы загрузили настройки в компоновщик, но отчет все равно не знает, какую схему использовать. Если бы мы оставили схему по умолчанию, то использовалась бы она, и в случае использования ее настроек отчет бы сформировался, а вот случае использования настроек другой схемы мы получили бы ошибку "Такое-то поле не найдено".

    Не беда! Идем в модуль отчета и создаем обработчик события "ПриКомпоновкеРезультата" где и присваиваем нужную схему(вот для чего нужен был реквизит "АдресСхемы"):

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(АдресСхемы);
КонецПроцедуры

    Запускаем отчет и наслаждаемся результатом:

    Как видим, схемы меняются, отчеты строятся, отборы работают. И всего-то потребовалось 5 ключевых строчек кода. 

    Теперь давайте немного усложним задачу.

    2. Использование нескольких схем компоновки данных в обработках. 

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

    Создадим новую внешнюю обработку "_СКДЗаменаСхемы". Чтобы не повторятся, закинем в нее схемы компоновки из нашего предыдущего отчета.

    Создадим форму отчета и добавим следующие реквизиты формы:

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

    Также добавим команду "СформироватьОтчет" и обработчики для нее на клиенте и на сервере.

    А теперь, внимание, очень важный момент, делаем "КомпоновщикНастроек" основным реквизитом формы:

    Это откроет нам доступ к расширению управляемой формы для компоновщика настроек и позволит использовать метод СоздатьЭлементыФормыПользовательскихНастроек().

    Теперь, добавим группу без отображения "ГруппаПользовательскиеНастройкиОтчеты" и переходим в модуль формы.
По аналогии с отчетом, добавим события "ИмяОтчетаПриИзменении" и "ПриСозданииНаСервере", с соответствующими вызовами процедур  ЗаполнитьСписокОтчетов() и УстановитьМакетОтчета(). Только теперь в процедуре УстановитьМакетОтчета() добавляется вызов метода СоздатьЭлементыФормыПользовательскихНастроек():

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

    В качестве первого параметра метода СоздатьЭлементыФормыПользовательскихНастроек() мы указываем элемент формы, в котором будут генерироваться пользовательские настройки. Второй параметр указывает, какие настройки будут добавлены: все или только быстрые. И третий параметр показывает количество настроек выводимых в одном ряду.

    Теперь осталось добавить обработчики команды "Сформировать" и механизм динамической замены СКД в обработке готов:

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

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

&НаКлиенте
Процедура СформироватьОтчет(Команда)
    СформироватьОтчетНаСервере();
КонецПроцедуры

    Сохраняем, запускаем, наслаждаемся:

    Как видим, задача оказалась не намного сложнее, чем подмена СКД в отчете. Ключевым моментом возможности использования автоматической генерации пользовательских настроек является установка реквизита "КомпоновщикНастроек" основным реквизитом формы, что открывает доступ к соответствующему расширению формы.

    Ну и чтоб совсем все было красиво, осталось добавить обработчик расшифровки.
    Добавим реквизит формы "АдресДанныхРасшифровки" тип Строка.
    В конце процедуры СформироватьОтчетНаСервере() добавим строку:

    АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, Новый УникальныйИдентификатор);

    Добавим обработчик "ОбработкаРасшифровки" для элемента формы Результат:

&НаКлиенте
Процедура ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
    
    Данные = ОбработатьРасшифровки(Элемент.Имя, Расшифровка, СтандартнаяОбработка);
    ОткрытьЗначение(Данные);
    
КонецПроцедуры

и функцию:

&НаСервере
Функция ОбработатьРасшифровки(Инд, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    ДанныеРасшифровок = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);
    
    Если ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") тогда
        
        ЭлементРасшифровки = ДанныеРасшифровок.Элементы[Расшифровка];
        
        Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
            
            Для Каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
                
                Возврат Поле.Значение;
                
            КонецЦикла;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецФункции

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

    P.S. И немного о практическом применении. Например, если реализовать добавление и хранение СКД в базе, допустим, в регистре сведений в реквизите с типом "ХранилищеЗначения", то подобную обработку можно использовать для просмотра динамически добавляемых/обновляемых отчетов, что очень выручает в случаях, когда нет возможности обновить конфигурацию в данный момент, а срочно нужно подправить отчет или создать новый "на вчера".
    СКД является невероятно мощным механизмом, и я постоянно открываю для себя все новые и новые его возможности и нахожу новые, неочевидные и нестандартные способы применения. Чего и вам желаю :)
    Enjoy!

Вступайте в нашу телеграмм-группу Инфостарт

СКД схема компоновки данных отчет обработка

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    250528    1389    421    

1143

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    5790    304    shapa_pro    25    

67

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    17284    ovetgana    112    

107

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    10060    krasnoshchekovpavel    5    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    9324    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

27.02.2025    16000    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

СКД – инструмент, на базе которого в современных конфигурациях реализованы практически все отчеты. СКД используется в динамических списках, печатных формах и универсальных механизмах. Если построить простейший отчет может каждый разработчик, то с нюансами знакомы далеко не все. Расскажем о неочевидных на первый взгляд приемах, способных значительно повысить качество отчетов.

24.12.2024    13641    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    10225    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 2141 07.12.20 10:26 Сейчас в теме
А без формы отчета получится такое провернуть?
2. user1502278 257 07.12.20 14:13 Сейчас в теме
(1) Конечно, второй пример как раз для формы обработки.
3. ixijixi 2141 07.12.20 14:14 Сейчас в теме
(2) Ненене, нужно для отчета без формы
4. user1502278 257 07.12.20 14:18 Сейчас в теме
(3) Не совсем понял, что значит отчет без формы? Если у вас нет формы и вы генерите отчет где-то программно, без участия пользователя, например для рассылки, то вам и не нужна настройка пользовательских полей, а именно это основная тема данной статьи.
Формировать отчеты СКД программно довольно просто, есть множество статей на эту тему.
5. ixijixi 2141 07.12.20 14:31 Сейчас в теме
(4)
значит отчет без формы
Значит, что у него не назначена основная форма, а используется либо общая форма, либо генерируемая платформой.
6. user1502278 257 07.12.20 14:38 Сейчас в теме
(5) А ну т.е. форма все-таки есть, тогда получится конечно. Принцип тот же.
7. ixijixi 2141 07.12.20 14:40 Сейчас в теме
(6) Форма есть, но ее менять нельзя)
16. NikeeNik 80 04.03.21 14:52 Сейчас в теме
(7) В модуле отчёта можно переопределить свойство отчёта "СхемаКомпоновкиДанных"
#Область ОбработчикиСобытий

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	УправлениеРазграничениемДоступа.НастроитьОтборыОтчета(ЭтотОбъект)
	
КонецПроцедуры

#КонецОбласти

СхемаКомпоновкиДанных = ПолучитьМакет("АльтернативнаяСхемаКомпоновки");
Показать
17. ixijixi 2141 10.06.21 11:08 Сейчас в теме
(16) А как название в модуль как передать? И в какой момент?
18. NikeeNik 80 05.07.21 12:14 Сейчас в теме
(17) По идее это нужно для того чтобы переопределить типовую схему на нашу при стандартных вызовах отчета с типовой формой, когда негде вводить никакие названия, соответственно никак. Если отчет запускается программно - то там можно переопределить схему компоновки для объекта отчета без изменений в модуле отчета, тогда при вызове можно указывать какие схемы использовать с какими названиями.
8. СергейК 51 13.12.20 09:21 Сейчас в теме
Подскажите, в первой части про отчет почему нужно в процедуре ПриКомпоновке устанавливать СхемаКомпоновкиДанных, мы же ее уже присвоили в проц УстановитьМакетОтчета()? Почему она не запомнилась?
9. user1502278 257 13.12.20 15:04 Сейчас в теме
(8) Нет, в процедуре УстановитьМакетОтчета()(не очень удачно выбрал название процедуры, согласен) мы установили только настройки компоновки, т.е. пользовательские настройки, отборы, группировки - вот это вот все. Но отчет по прежнему не знает, как получить данные, какую схему ему использовать, (поскольку основную мы сознательно выключили). Для этого в событии отчета ПриКомпоновкеРезультата мы и устанавливаем реквизит отчета СхемаКомпоновкиДанных.
23. Roootru 7 15.03.23 08:26 Сейчас в теме
(9) Спасибо за полезный материал, добавлю 5 копеек насчет комментария, т.к. тоже задумался над этим моментом и может такие же как я и СергейК всплывут. В модуле объекта можно обращаться напрямую к переменной "СхемаКомпоновкиДанных" (которая по сути и является основной схемой и при работе с СКД уже привыкаешь к наименованию), но тут работа в модуле формы и не стоит путать ту переменную и эту. Я сразу не обратил внимание . Если бы тут переменная допустим называлась "ДействующаяСхемаКомпоновкиДанных" сразу становится понятно что переменная создана в процедуре и просто создана для помещения во временное хранилище
10. szv 175 14.12.20 19:51 Сейчас в теме
Если пользователь создал свой вариант отчета и по кнопке "Выбрать вариант" желает его получить. Как отработать эту ситуацию?
11. user1502278 257 14.12.20 20:17 Сейчас в теме
(10)
В приведенном отчете типовой механизм редактирования/сохранения варианта работает по умолчанию, но все варианты для всех ваших схем будут сохранятся в рамках общего отчета. Соответственно, вы можете загрузить вариант не соответствующий текущей СКД, что при попытке формирования отчета выкинет в ошибку. Чтобы сохранять/загружать варианты, соответствующие текущей схеме, надо обрабатывать события ПриСохраненииВариантаНаСервере, ПередЗагрузкойВариантаНаСервере.
12. szv 175 17.12.20 03:44 Сейчас в теме
Вы бы могли усилить свою статью этой темой?
13. szv 175 17.12.20 14:24 Сейчас в теме
"В приведенном отчете типовой механизм редактирования/сохранения варианта работает по умолчанию" - цитата

У меня не получилось. Пришлось использовать - КлючТекущегоВарианта

Вариант = СхемаКомпоновкиДанных.ВариантыНастроек[ЭтаФорма.КлючТекущегоВарианта];

Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);
VinnieThePOOH; +1 Ответить
14. Shaldryn 15.01.21 09:50 Сейчас в теме
Думаю чистка основной схемы лишнее, можно было оставить какую то основную и при открытии в списке устанавливать ее.

А так спасибо за статью, маленько просветился на счет разных схем, а то у меня как бы были "разные" на самом деле одинаковые, просто запрос немного менялся, а поля и структура были одинаковы и я не получал ошибки при изменении и формировании и поэтому ПриКомпоновкеРезультата не дописывал указанный вами код.
15. user1502278 257 15.01.21 21:51 Сейчас в теме
(14)
Думаю чистка основной схемы лишнее, можно было оставить какую то основную и при открытии в списке устанавливать ее

Конечно, я очистил для примера, чтобы показать, что недостаточно только установки настроек компоновщика, схема тоже нужна.
19. user1559729 30.03.22 14:26 Сейчас в теме
Не удается установить КомпоновщикНастроек основным реквизитом формы. Открывает пустые свойства.
Прикрепленные файлы:
20. user1559729 30.03.22 14:54 Сейчас в теме
Сделал по первому варианту для 2-х схем - вроде бы работает...
Только добавил только УстановитьМакетОтчета() в ПриСозданииНаСервере() и установку имени отчета при старте.
21. user1559729 30.03.22 18:44 Сейчас в теме
И ещё сохранение параметров добавил при смене схемы, которые у меня одинаковые для двух схем. Может кому пригодится:

&НаСервере
Процедура УстановитьМакетОтчета()
	
	// Сохраним значение параметра КонецПериода для сохранения значения при смене схемы
	ПараметрКонецПериода = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
	ПользовательскийПараметрКонецПериода = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрКонецПериода.ИдентификаторПользовательскойНастройки);   
	КонецПериодаЗначение = ПользовательскийПараметрКонецПериода.Значение;
	// Используется всегда (не устанавливаем использование)
	
	// Сохраним значение параметра Подразделение для сохранения значения при смене схемы
	ПараметрПодразделение = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Подразделение");
	ПользовательскийПараметрПодразделение = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрПодразделение.ИдентификаторПользовательскойНастройки);   
	ПодразделениеЗначение = ПользовательскийПараметрПодразделение.Значение;
	ПодразделениеИспользование = ПользовательскийПараметрПодразделение.Использование;
			
	ИмяМакета = ?(ИмяОтчета = "Подразделение, Склад", "МакетНомерОдин", "МакетНомерДва");
	
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет(ИмяМакета);
    
	Отчет.АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор);
    
	Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет.АдресСхемы));
	
	Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
	
	// Восстановим сохраненное значение параметра КонецПериода
	ПараметрКонецПериода = Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
	ПараметрКонецПериода.Значение = КонецПериодаЗначение;
	
	// Восстановим сохраненное значение параметра Подразделение
	ПараметрПодразделение = Настройки.ПараметрыДанных.Элементы.Найти("Подразделение");
	ПараметрПодразделение.Значение = ПодразделениеЗначение;
	ПараметрПодразделение.Использование = ПодразделениеИспользование;
			
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
    Отчет.КомпоновщикНастроек.Восстановить();    
    
КонецПроцедуры
Показать
22. PavelTihonov 04.02.23 00:17 Сейчас в теме
(21) а как перенести настройки (значения параметров) если этих параметров много? Имеется ввиду не писать код для каждого параметра
24. Rafaraf 38 15.09.23 16:13 Сейчас в теме
для крясоты можно дописать в УстановитьМакетОтчета последней строкой
Результат.Очистить();
25. big_ooo 39 04.10.24 11:13 Сейчас в теме
К сожалению для первого варианта не работает расшифровка. Команда Открыть не активна
в модуле отчета все равно надо перегружать процедуру
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	СхемаКомпоновки = ПолучитьИзВременногоХранилища(АдресСхемы);
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки, , Тип("ГенераторМакетаКомпоновкиДанных"));
	
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	
	
КонецПроцедуры
Показать
26. CHELLL 53 26.09.25 17:29 Сейчас в теме
А как быть с переопределением СКД, когда у отчет запускается в фоновом режиме, процедура ПриКомпановкеРезультата в этом случае не помогает
Для отправки сообщения требуется регистрация/авторизация