Использование нескольких схем компоновки данных в одном отчете

Выгрузка отчета в таблицу/дерево значений
СКД. Вывод информации табличной части в одну ячейку.

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

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

Создадим внешний отчет. В отчете создадим две схемы компоновки данных, например: МакетНомерОдин и МакетНомерДва. Допустим, первая СКД в запросе содержит параметр НаОсновномСкладе:
1. Первая СКД

А вторая СКД в запросе содержит параметр ЮрФизЛицо:
2. Вторая СКД
Что бы иметь программный доступ к выше описанным параметрам, необходимо в каждой СКД для каждого параметра на закладке Параметры установить галочку Включать в доступные поля и снять галочку Ограничение доступности. Далее для каждого параметра создадим реквизит отчета ТолькоНаОсновномСкладе и ВидЛица, незабываем установить необходимый тип реквизита. Так же создаем реквизит НомерСКД, который будет отвечать за выбор необходимой СКД при формировании отчета. В итоге должна получиться следующая структура внешнего отчета:
3. Структура внешнего отчета
Обратите внимание, что свойство Основная схема компоновки данных должно быть пустое. Создаем основную форму отчета, её структура в моем случае (удалил элементы формы связанные с выбором варианта отчета и компоновщиком настроек, оставил единственную команду Сформировать, а так же добавил поле переключателя, связанное с реквизитом формы НомерСКД и поля ввода, связанные с реквизитами отчета ВидЛица и ТолькоНаосновномСкладе) выглядит так :
4. Структура основной формы отчета
Теперь необходимо внести изменения в стандартные события отчета. После нажатия на кнопку Сформировать, вызывается стандартная процедура модуля объекта отчета, которая отвечает за событие ПриКомпоновкеРезультата. В этой процедуре необходимо указать какая из СКД будет основной и загрузить настройки выбранной СКД в компоновщик настроек отчета, а так же установить значения параметров запроса СКД.

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

// Получаем необходимую СКД.
НеобходимаяСКД = Неопределено;
Если ЭтотОбъект.НомерСКД = 1 Тогда
НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерОдин");
ИначеЕсли ЭтотОбъект.НомерСКД = 2 Тогда
НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерДва");
КонецЕсли;

// Устанавливаем выбранную СКД как основную.
ЭтотОбъект.СхемаКомпоновкиДанных = НеобходимаяСКД;

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

// Устанавливаем настройки.
ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрВидЛица = Новый ПараметрКомпоновкиДанных("ЮрФизЛицо");
ЗначениеВидЛица = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрВидЛица);
Если ЗначениеВидЛица <> Неопределено Тогда
ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрВидЛица, ЭтотОбъект.ВидЛица);
КонецЕсли;
ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрТолькоНаОснСкладе = Новый ПараметрКомпоновкиДанных("НаОсновномСкладе");
ЗначениеТолькоНаОснСкладе = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрТолькоНаОснСкладе);
Если ЗначениеТолькоНаОснСкладе <> Неопределено Тогда
ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрТолькоНаОснСкладе, ЭтотОбъект.ТолькоНаОсновномСкладе);
КонецЕсли;

КонецПроцедуры


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

Отчет с несколькими СКД готов! Ссылка на отчет здесь.

UPD 28.04.2016
Что бы загрузить настройки выбранной СКД в управляемой форме и отобразить их пользователю, нужно на стороне сервера написать следующий код (см. рисунок 5):
Рисунок 5. Загрузка настроек СКД в модуле формы
Обратите внимание, для корректной загрузки настроек, объект ИсточникДоступныхНастроекКомпоновкиДанных создаётся на основании временного хранилища. Дело в том, что в управляемом приложении на клиенте схема компоновки данных отсутствует.

Комментарии

  1. Огромное спасибо за полезную статью! И отдельно - за пример отчета. Отличная работа. Довольно долго искал материалы по работе с СКД на управляемых формах. Уж и не чаял отыскать толковых примеров. Неделю бился с отчетом + несколько СКД, и вот сегодня сдал работу заказчику.

    ОтветитьУдалить
  2. Статья очень помогла! Большое спасибо!

    ОтветитьУдалить
  3. Хорошая статья. Помогла разобраться.

    ОтветитьУдалить
  4. А что делать с расшифровкой? Открытие ссылок не отрабатывает!

    ОтветитьУдалить
    Ответы
    1. Когда выполняется стандартный алгоритм формирования отчета, нужно указать среди параметров ДанныеРасшифровки :

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

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

      Удалить
  5. С параметрами понятно, а как быть с быстрыми отборами?

    ОтветитьУдалить

Отправить комментарий