Использование нескольких схем компоновки данных в одном отчете
Выгрузка отчета в таблицу/дерево значений
СКД. Вывод информации табличной части в одну ячейку.
Отчеты используются для получения сводной информации на основании данных, введенных в информационной системе. Обычно отчет содержит:
Что бы не плодить отчеты, которые схожи по смыслу, в дереве конфигурации, платформа 1С позволяет в одном отчете использовать несколько схем компоновки данных, и в зависимости от условий использовать ту или иную СКД для получения отчетной информации. Рассмотрим пример реализации использования нескольких СКД в одном отчете.
Создадим внешний отчет. В отчете создадим две схемы компоновки данных, например: МакетНомерОдин и МакетНомерДва. Допустим, первая СКД в запросе содержит параметр НаОсновномСкладе:
А вторая СКД в запросе содержит параметр ЮрФизЛицо:
Что бы иметь программный доступ к выше описанным параметрам, необходимо в каждой СКД для каждого параметра на закладке Параметры установить галочку Включать в доступные поля и снять галочку Ограничение доступности. Далее для каждого параметра создадим реквизит отчета ТолькоНаОсновномСкладе и ВидЛица, незабываем установить необходимый тип реквизита. Так же создаем реквизит НомерСКД, который будет отвечать за выбор необходимой СКД при формировании отчета. В итоге должна получиться следующая структура внешнего отчета:
Обратите внимание, что свойство Основная схема компоновки данных должно быть пустое. Создаем основную форму отчета, её структура в моем случае (удалил элементы формы связанные с выбором варианта отчета и компоновщиком настроек, оставил единственную команду Сформировать, а так же добавил поле переключателя, связанное с реквизитом формы НомерСКД и поля ввода, связанные с реквизитами отчета ВидЛица и ТолькоНаосновномСкладе) выглядит так :
Теперь необходимо внести изменения в стандартные события отчета. После нажатия на кнопку Сформировать, вызывается стандартная процедура модуля объекта отчета, которая отвечает за событие ПриКомпоновкеРезультата. В этой процедуре необходимо указать какая из СКД будет основной и загрузить настройки выбранной СКД в компоновщик настроек отчета, а так же установить значения параметров запроса СКД.
Напишем код для события отчета ПриКомпоновкеРезультат:
Описание алгоритма: в зависимости от значения реквизита НомерСКД, получаем необходимую СКД и устанавливаем как основную. С помощью объекта ИсточникДоступныхНастроекКомпоновкиДанных инициализируем компоновщик настроек отчета. Далее производится поиск параметра в компоновщике настроек, если значение параметра удалось получить, то он существует и устанавливаем для него новое значение. После выполняется стандартный алгоритм формирования отчета.
Отчет с несколькими СКД готов! Ссылка на отчет здесь.
UPD 28.04.2016
Что бы загрузить настройки выбранной СКД в управляемой форме и отобразить их пользователю, нужно на стороне сервера написать следующий код (см. рисунок 5):
Обратите внимание, для корректной загрузки настроек, объект ИсточникДоступныхНастроекКомпоновкиДанных создаётся на основании временного хранилища. Дело в том, что в управляемом приложении на клиенте схема компоновки данных отсутствует.
СКД. Вывод информации табличной части в одну ячейку.
Отчеты используются для получения сводной информации на основании данных, введенных в информационной системе. Обычно отчет содержит:
- алгоритмы, при помощи которых получается и обрабатывается информация;
- формы, при помощи которых организуется интерфейс для ввода параметров алгоритмов и представления результатов их работы;
- макеты, при помощи которых выводится результат выполнения алгоритма в табличный документ.
Что бы не плодить отчеты, которые схожи по смыслу, в дереве конфигурации, платформа 1С позволяет в одном отчете использовать несколько схем компоновки данных, и в зависимости от условий использовать ту или иную СКД для получения отчетной информации. Рассмотрим пример реализации использования нескольких СКД в одном отчете.
Создадим внешний отчет. В отчете создадим две схемы компоновки данных, например: МакетНомерОдин и МакетНомерДва. Допустим, первая СКД в запросе содержит параметр НаОсновномСкладе:
![]() |
1. Первая СКД |
А вторая СКД в запросе содержит параметр ЮрФизЛицо:
![]() |
2. Вторая СКД |
![]() |
3. Структура внешнего отчета |
![]() |
4. Структура основной формы отчета |
Напишем код для события отчета ПриКомпоновкеРезультат:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем необходимую СКД.
НеобходимаяСКД = Неопределено;
Если ЭтотОбъект.НомерСКД = 1 Тогда
НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерОдин");
ИначеЕсли ЭтотОбъект.НомерСКД = 2 Тогда
НеобходимаяСКД = ЭтотОбъект.ПолучитьМакет("МакетНомерДва");
КонецЕсли;
// Устанавливаем выбранную СКД как основную.
ЭтотОбъект.СхемаКомпоновкиДанных = НеобходимаяСКД;
// Загружаем настройки выбранной СКД в компоновщик настроек.
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(НеобходимаяСКД);
ЭтотОбъект.КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НеобходимаяСКД.НастройкиПоУмолчанию);
// Устанавливаем настройки.
ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрВидЛица = Новый ПараметрКомпоновкиДанных("ЮрФизЛицо");
ЗначениеВидЛица = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрВидЛица);
Если ЗначениеВидЛица <> Неопределено Тогда
ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрВидЛица, ЭтотОбъект.ВидЛица);
КонецЕсли;
ПараметрыДанных = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрТолькоНаОснСкладе = Новый ПараметрКомпоновкиДанных("НаОсновномСкладе");
ЗначениеТолькоНаОснСкладе = ПараметрыДанных.НайтиЗначениеПараметра(ПараметрТолькоНаОснСкладе);
Если ЗначениеТолькоНаОснСкладе <> Неопределено Тогда
ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрТолькоНаОснСкладе, ЭтотОбъект.ТолькоНаОсновномСкладе);
КонецЕсли;
КонецПроцедуры
Описание алгоритма: в зависимости от значения реквизита НомерСКД, получаем необходимую СКД и устанавливаем как основную. С помощью объекта ИсточникДоступныхНастроекКомпоновкиДанных инициализируем компоновщик настроек отчета. Далее производится поиск параметра в компоновщике настроек, если значение параметра удалось получить, то он существует и устанавливаем для него новое значение. После выполняется стандартный алгоритм формирования отчета.
Отчет с несколькими СКД готов! Ссылка на отчет здесь.
UPD 28.04.2016
Что бы загрузить настройки выбранной СКД в управляемой форме и отобразить их пользователю, нужно на стороне сервера написать следующий код (см. рисунок 5):
![]() |
Рисунок 5. Загрузка настроек СКД в модуле формы |
Огромное спасибо за полезную статью! И отдельно - за пример отчета. Отличная работа. Довольно долго искал материалы по работе с СКД на управляемых формах. Уж и не чаял отыскать толковых примеров. Неделю бился с отчетом + несколько СКД, и вот сегодня сдал работу заказчику.
ОтветитьУдалитьСтатья очень помогла! Большое спасибо!
ОтветитьУдалитьХорошая статья. Помогла разобраться.
ОтветитьУдалитьА что делать с расшифровкой? Открытие ссылок не отрабатывает!
ОтветитьУдалитьКогда выполняется стандартный алгоритм формирования отчета, нужно указать среди параметров ДанныеРасшифровки :
УдалитьКомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
НастройкиСКД = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиСКД,ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
Огромное спасибо.
ОтветитьУдалитьС параметрами понятно, а как быть с быстрыми отборами?
ОтветитьУдалить