Как вывести два отчета в одной скд 1с
Возникла задачи создать отчёт по взаиморасчётам с контрагентами в валюте взаиморасчётов с выводом таблицы курсов валют на текущую дату. Отчёт, разумеется, должен быть реализован с помощью системы компоновки данных.
Ниже приведён алгоритм создания подобного отчёта.
1. Создать новый отчёт, открыть основную схему компоновки данных.
2. Добавить 2 набора данных типа "запрос". В первом наборе данных будем получать данные по взаиморасчётам, во втором - курсы валют.
Важно! Псевдонимы полей запросов не должны повторяться.
3. На вкладке "Настройки" создать новую группировку без заполнения значения "Поле".
4. Настроить список полей для вывода первой таблицы (Курсы валют).
5. Повторить пп.3 и 4 для второй таблицы (Взаиморасчёты).
6. Сохранить отчёт.
В результате сформированный отчёт будет иметь подобный вид:
Пример отчёта для конфигураций Управление торговлей 10.3 и Управление производственным предприятием 1.3
Цель : не вникая в особенности логики отчетов-источников, необходимо сформировать сводный отчет, объединяющий и сопоставляющий исходные данные.
Добавим отчет СКД1. Основная схема содержит единственный набор данных получаемых простым запросом. Результат выборки - одна строка детальных записей, состоящая из двух полей: Ключ и Ресурс1.
Пояснение: на картинке ниже, имя варианта отчета равно имени отчета (аналогично типовому решению УП ЕРП)
Добавим копированием отчет СКД 2. При этом по смыслу заменим "1" на "2" в основной схеме СКД:
4. Эталонные данные.
Сохраним конфигурацию и проверим оба отчета. Полученный результат будем считать эталонными данными.
Создадим отчёт СКД 3.
Пояснение: отчет является обёрткой для единой настройки, последовательного вызова и получения данных каждого отчета-источника с последующим выводом объединенных данных, например, в разрезе общего ключа.
Схема отчета СКД3:
Набор данных содержит объединение нескольких объектов, где каждый объект - это результат очередного склеиваемого отчета, взятый как таблица значений.
В момент выполнения отчета СКД 3, перехватывается исполнение типового алгоритма. Предварительно вызывается программное исполнение каждого отчета, входящего по имени в объединенный набор СКД 3. Далее происходит программное формирование отчета СКД 3.
Реализация логики СКД3
Опишем набор данных СКД3:
- добавим группу наборов вида объединение;
- внутри группы добавим объекты с наименованием объекта, содержащего данные, по шаблону "тз"+ИмяОчередногоСклеиваемогоОтчета. Отчет должен быть включен в состав конфигурации;
- В каждом наборе опишем требуемые поля исходного отчета. Здесь можно задать свои псевдонимы полей и типы значений.
Алгоритм СКД 3 "ПриКомпоновкеРезультата"
В модуле отчета СКД 3 опишем алгоритм исполнения предопределенной процедуры "ПриКомпоновкеРезультата"
Схема универсальной логики "ПриКомпоновкеРезультата":
0. Прочитаем настройки СКД 3;
1. Определим схемы СКД используемых отчетов-источников, прочитав имена объединяемых наборов определив метаимена соответствующих отчетов;
2. Выполним СКД используемых источников программно на уровне детальных записей с заданными параметрами и отборами. Получим массив таблиц ;
примечание: здесь используются приемы программной настройки СКД:
2.1 Переформируем СКД источник, добавив новую структуру вывода "детальные данные" на основе требуемых здесь к выводу полей:
2.1.1 Выбор полей выводимой группировки на основе требуемых здесь к выводу полей;
2.1.2 Выбор полей выводимой группировки на основе вычисляемых полей;
2.1.3 Скопируем параметры СКД;
2.1.4 Скопируем отборы СКД;
2.1.5 Отключим вывод итогов;
2.2 Получим результат СКД источник в ТаблицуЗначений;
3. Выведем результат:
3.1 зададим Типовой макет оформления
3.2 выполним Программный вывод в табличный документ
Специальные предложения
За идею "+", за качество подачи материала "-". Итого, к сожалению, - "0".
Тема полезная, но когда, читая с нуля, перечитываешь текст по 2-3 раза, чтобы понять, что автор имел ввиду. тебя накрывает ощущение когнитивного диссонанса. Это как в пустыне плюнуть в сторону умирающего от жажды: технически - вроде как жидкостью поделился и это хорошо, а с этической точки зрения - ну, всё-таки плюнул же, а не попить дал.
Написано крайне небрежно, скриншоты - отдельная тема (у меня ребёнок в 6 лет аккуратнее вырезает), иллюстрации (обязательные для сложных тем полностью отсутствуют), примеры полностью синтетические (от того крайне тяжело воспринимаются).
Илья, не воспринимайте моё мнение, как попытку оскорбить лично Вас. Просто уже начинает конкретно "бомбить" (извиняюсь за блогерский сленг) от деградации качества подачи материалов на ИС (не путать с качеством самого материала). Причём больше всего бесит именно то, что понимаешь прекрасно - автор реально нормально "рубит" в теме, но в процессе чтения не покидает ощущение, что он скорее делает тебе какое-то одолжение, а не стремится поделиться полезной информацией.
Большая просьба, пересмотрите подходы к подготовке материала и, вот увидите, это обязательно положительно отразится на рейтингах Ваших статей! Делайте свои статьи так, чтобы они не только несли полезную информацию, но и читались легко и приятно, а не как сложный математический ребус.
Удачи и успехов в новых работах!
Для использования в отчёте на СКД произвольной таблицы значений необходимо настроить соответствующим образом схему компоновки данных и прописать программный вывод отчёта.
1. Настройка схемы компоновки данных.
1.1. Создаём основную схему компоновки данных.
1.2. На закладке "Наборы данных" добавляем набор данных - объект.
1.3. Добавляем необходимые поля набора данных (достаточно указать Поле) и указываем Имя объекта, содержащего данные.
1.4. Если в СКД есть другие наборы данных (например, Запрос), то создаём связи наборов данных на закладке "Связи наборов данных".
1.5. Настраиваем вывод отчёта нужным образом.
2. Программный вывод отчёта.
2.1. В модуле объекта отчёта создаём процедуру-обработчик ПриКомпоновкеРезультата.
2.2. В процедуре ПриКомпоновкеРезультата отключаем стандартную обработку.
2.3. Формируем таблицу значений произвольным образом. Имена колонок таблицы значений должны совпадать с полями набора данных в СКД (п.1.3).
2.4. Получаем схему компоновки данных из макета.
2.5. Из схемы получаем настройки по умолчанию.
2.6. Помещаем данные о расшифровке в соответствующую переменную.
2.7. Формируем макет с помощью компоновщика макета.
2.8. Передаём в макет компоновки схему, настройки и данные расшифровки.
2.9. Выполняем компоновку с помощью процессора компоновки. Для этого выполняем метод процессора компоновки данных Инициализировать(). В качестве параметров передаём макет компоновки данных, внешние наборы данных (тип: Структура, ключ структуры должен совпадать с именем объекта в схеме компоновки данных (п.1.3), значение - сформированная таблица значений), данные расшифровки.
2.10. Очищаем поле табличного документа.
2.11. Выводим результат в табличный документ.
Помимо таблиц значений в качестве внешних наборов данных могут использоваться результаты запросов, табличные части.
Пример сформированного отчёта:
Справочная информация из синтакс-помощника:
Тип: Структура.
Ключ структуры соответствует имени внешнего набора данных. Значение структуры - внешнему набору данных.
Тип: ДанныеРасшифровкиКомпоновкиДанных.
Объект, в котором нужно заполнить данные расшифровки. Если не указан, то расшифровка заполняться не будет.
Тип: Булево.
Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.
Значение по умолчанию: Ложь.
Пример использования внешних наборов данных в СКД (для УТ 10.3)
Комментарии
Обычный Александр (не проверено)
вт, 13/09/2016 - 10:25
Спасибо огромное за статью и прикреплённый пример. Очень помогло в работе.
Щукина Татьяна (не проверено)
пт, 16/12/2016 - 15:28
Спасибо - просто спасли. Только у меня Период не видит в модуле
пт, 16/12/2016 - 16:03
Можете файл отчёта выложить?
Щукина Татьяна (не проверено)
пт, 16/12/2016 - 17:14
положила все в модуль Объекта(база ЗиК 3), в СКД в Параметры добавила "Период" =стандартный период,НачалоПериода=&Период.ДатаНачала ; КонецПериода.. Не видит здесь Период и все..
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) экспорт
СтандартнаяОбработка = Ложь;
//ДанныеПечати = ПолучитьИзВременногоХранилища(Адр);
Запрос = Новый Запрос;
Запрос.Текст ;
//Запрос.УстановитьПараметр("НачалоПериода", Период.ДатаНачала);
//Запрос.УстановитьПараметр("КонецПериода", Период.ДатаОкончания);
НачалоПериода=Дата("01.11.2016 00:00:00"); ;
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Запрос.УстановитьПараметр("СовмПроф", "Доплата за совм. проф. (4)");
//Если СовмещСотрудник.Пустой() тогда
// //Сообщить("В ЭТОЙ ГРУППЕ НЕТ КОНТРАГЕНТОВ " );
//конецесли;
Запрос = Новый Запрос;
Запрос.Текст ;
ффф= Перечисления.ГруппыНачисленияУдержанияВыплаты.Начислено ;
//Запрос.УстановитьПараметр("НачалоПериода", Период.ДатаНачала);
//Запрос.УстановитьПараметр("КонецПериода", Период.ДатаОкончания);
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода",КонецПериода);
Запрос.УстановитьПараметр("ВидДеят", "Вид деятельности (Сотрудники)");
Запрос.УстановитьПараметр("ВидКат", "Категория (Сотрудники)");
Запрос.УстановитьПараметр("ДОП_1", "Вид з/п (Начисления)");
Запрос.УстановитьПараметр("ДОП_2", "Призн.н/о прибыли (Начисления))");
Запрос.УстановитьПараметр("ДОП_3", "Резерв отпусков (участие) (Начисления)");
Запрос.УстановитьПараметр("ДОП_4", "Код н/у (Начисления)");
Запрос.УстановитьПараметр("ДОП_5", "Фонд з/п (Начисления)");
Запрос.УстановитьПараметр("начисл",ффф);
ПланВидовРЕЗ= РезультатПакета[6].Выгрузить();
ПланВидовРЕЗ.сортировать("ПланВидовРасчетаНаименование");
СотрРез = РезультатПакета[9].Выгрузить();
ДанныеПечати = РезультатПакета[10].Выгрузить(); //окончательный итог Сотрудник
//начисл_Сотр_подр = РезультатПакета[9].Выгрузить();
//начисл_Сотр_подр.сортировать("Группа");
//РезультатЗапроса.сортировать("Группа,СпрОтрВБух_ВидДеятельности,ВидДеятельностиНАШ");
ДанныеПечати.сортировать("Сотрудник");
ДанныеПечати.Колонки.Добавить("ПодразделенияРодитель", Новый ОписаниеТипов("строка"));
ДанныеПечати.Колонки.Добавить("ВидДеятельностиНаш", Новый ОписаниеТипов("строка"));
Если ДанныеПечати.Количество()=0 тогда
Сообщить("Запрос Пустой " );
иначе
Для каждого Стр ИЗ ДанныеПечати Цикл //КОНТРАГЕНТ
если сокрЛП(Стр.НаименованиеНачисления) = "Доплата за совм. проф. (4)" тогда
СтруктураОтбор = Новый Структура();
СтруктураОтбор.Вставить("СовмещСотрудник", Стр.Сотрудник);
СтруктураОтбор.Вставить("СовмещСумма", Стр.Сумма);
СтруктураОтбор.Вставить("СовмещПодразделениеОТКуда_отдел", Стр.Подразделение);
Если МассивНайденныеСтроки.Количество() > 0 Тогда
Для Каждого Ст Из МассивНайденныеСтроки Цикл
Стр.ВидДеятельностиНаш = Ст.СовмещСпособОтражения;
Если Ст.СовмещПодразделениеКуда = NULL Тогда
Счет ="";
СубСчет ="";
ПодразделениеСпрОтр ="";
ВидДеятельностиСпрОтр ="";
резЗапр = 0;
если резЗапр = 0 Тогда
ааа = "ОШИБКА нет в спр.СовмещСпособОтраженияСсылка записи = "+Ст.СовмещСпособОтраженияСсылка+" по "+Стр.Сотрудник +" cумма = "+ Стр.Сумма+" => ПодразделенияРодитель И ВидДеятельностиНаш берем из спр.Сотрудники" ;
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
иначе
Стр.ПодразделенияРодитель = ПодразделениеСпрОтр ;
Стр.ВидДеятельностиНаш = ВидДеятельностиСпрОтр;
конецесли;
иначе
Стр.ПодразделенияРодитель = Ст.СовмещПодразделениеКуда ; //это должен быть родитель подразделения
Стр.ВидДеятельностиНаш = Ст.СовмещСпособОтражения;
конецесли;
конецЦикла;
ИНАЧЕ
ааа = "ОШИБКА нет в табл.СовмещСотрРЕЗУЛЬТАТ "+Стр.Сотрудник +" cумма = "+ Стр.Сумма+" => ПодразделенияРодитель И ВидДеятельностиНаш берем из спр.Сотрудники" ;
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
конецЕсли ;
ИНАЧЕ
Стр.ПодразделенияРодитель = Стр.ПодразделениеРод;
Стр.ВидДеятельностиНаш = Стр.ВидДеятельностиСотр;
конецЕсли ;
КонецЦикла;
КонецЕсли;
ДанныеПечати.сортировать("Сотрудник");
//***************************************************************
//Получаем схему из макета
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//Из схемы возьмем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
//Помещаем в переменную данные о расшифровке данных
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, Новый Структура("ДанныеПечати", ДанныеПечати), ДанныеРасшифровки);
//Очищаем поле табличного документа
ДокументРезультат.Очистить();
//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
В инете множество примеров отчетов на нескольких схемах компоновки. Но не встречал вариантов с работающими пользовательскими параметрами, т.к. для корректной работы схем в компоновщик загружаются настройки по умолчанию. При загрузке в компоновщик настроек по умолчанию загружаются также и параметры по умолчанию, что не дает возможности указать их в пользовательских настройках(указанные параметры будут скидываться на параметры по умолчанию).
Суть идеи в том, чтобы загружать настройки по умолчанию только при выборе другой схемы.
Пример реализации ниже:
Создаем два реквизита(булево). Реквизит Изменение выносим на форму - для смены Схемы компоновки.
Соответственно создаем два макета, например я использовал в тестовой конфе следующие:
Код модуля формы:
Код модуля объекта отчета:
Процедура ПриКомпоновкеРезультата ( ДокументРезультат , ДанныеРасшифровки , СтандартнаяОбработка )
СтандартнаяОбработка = Ложь;
Если Изменение Тогда
СхемаКомпоновкиДанных = ПолучитьМакет ( "Макет" );
Иначе
СхемаКомпоновкиДанных = ПолучитьМакет ( "ОсновнаяСхемаКомпоновкиДанных" );
КонецЕсли;
// Загружаем настройки по умолчанию, только если изменили Схему компоновки
Если ПроверкаНаИзменение Тогда
КомпоновщикНастроек . ЗагрузитьНастройки ( СхемаКомпоновкиДанных . НастройкиПоУмолчанию );
КонецЕсли;
Настройки = КомпоновщикНастроек . ПолучитьНастройки ();
ПроверкаНаИзменение = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ;
МакетКомпоновки = КомпоновщикМакета . Выполнить ( СхемаКомпоновкиДанных , Настройки , ДанныеРасшифровки );
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновки . Инициализировать ( МакетКомпоновки , , ДанныеРасшифровки );
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент ;
ПроцессорВывода . УстановитьДокумент ( ДокументРезультат );
ПроцессорВывода . Вывести ( ПроцессорКомпоновки );
Т.е. в процедуре ПриКомпоновкеРезультата() выбираем макет компоновки (если на форме установлена галка в реквизите Изменение, то выбирается схема компоновки Макет, иначе Основная схема).
В модуле формы пишем в реквизит ПроверкаНаИзменение, когда соответственно изменяем галку на форме. При каждом формировании отчета сбрасываем это значение в ложь, чтобы загружать настройки СКД по умолчанию только когда меняется схема.
Результат: работающие пользовательские параметры при смене схемы компоновки
Войдите как ученик, чтобы получить доступ к материалам школы
Система компоновки данных 1С 8.3 для начинающих: объединяем наборы данных
Автор уроков и преподаватель школы: Владимир Милькин
На прошлом уроке мы познакомились с соединением наборов данных. Сегодня же мы научимся объединять различные наборы данных в один набор.
Ставим цель
- Создать новый отчёт, в котором будут выводиться закупки (дата, поставщик) и продажи (дата, клиент) одновременно.
- Для этого сделаем два отдельных набора данных с выборкой из таблиц документов "ПоступлениеЕды" и "ПродажаЕды", а затем объединим их в один набор.
Создаем новый отчет
Открываем базу "Гастроном" в конфигураторе и через главное меню "Файл->Новый. " создаём отчёт:
Вид документа - "Внешний отчет":
В форме нового отчёта указываем имя "Урок7" и нажимаем кнопку "Открыть схему компоновки данных":
Соглашаемся с именем макета по умолчанию:
Создаем первый набор данных
Создаём новый набор данных - запрос (через зелёный плюсик), выделяем его и вызываем конструктор запроса:
Делаем выборку из таблицы документов "ПоступлениеЕды" следующих полей:
Вот он, текст нашего запроса к таблице по закупкам:
Создаем второй набор данных
Выделяем мышкой пункт "Наборы данных".
. и добавляем ещё один набор данных - запрос:
Выделяем его и вызываем конструктор запроса:
Делаем выборку из таблицы документов "ПродажаЕды" следующих полей:
Текст запроса будет таким:
Сделаем имена более читабельными. Для этого двойным щелчком переименуем "НаборДанных1" в "Покупки" и поле "Дата" в "ДатаПокупки":
Второй же набор "НаборДанных2" переименуем в "Продажи", а поле "Дата" переименуем в "ДатаПродажи":
Мы получили два набора данных. В первом - информация по покупкам (дата покупки и поставщик), во втором- информация по продажам (дата продажи и клиент). Давайте попробуем теперь вывести всё это в отчет.
Проверяем результат
Переходим на закладку "Настройки" и нажимаем волшебную палочку для вызова конструктора:
Тип отчета - "Список. ":
Выбираем поля для отчёта из обоих наборов:
Сохраняем отчёт и формируем в режиме пользователя:
Получилось не совсем то, что ожидали. Получилось перекрёстное соединение одного набора данных с другим. А нам нужно именно объединение. Исправим.
Создаем объединение наборов данных
Для этого переходим на закладку "Наборы данных".
Снова выделяем мышкой пункт "Наборы данных".
. и добавляем туда набор данных - объединение:
Видим, что этот набор добавился и у него совершенно другая картинка (не таблица, как у двух других, а два объединяющихся круга):
Затем перетаскиваем мышкой наборы "Покупки" и "Продажи" в "НаборДанных1":
Вот это и значит, что теперь "Покупки" и "Продажи" будут не соединяться, а именно объединяться в отчёте.
Сохраним отчёт и сформируем в режиме пользователя:
Отлично. То, что надо.
А давайте зададимся целью объединить столбцы "Поставщик" и "Клиент" в один? И пусть этот новый столбец будет называться "Контрагент".
Для этого заходим на закладку "Наборы данных" и меняем имя поля "Поставщик" в наборе "Покупки" на имя "Контрагент":
Затем в наборе "Продажи" меняем имя поля "Клиент" на имя "Контрагент":
Переходим на закладку "Настройки", выделяем пункт "Отчет", переходим внизу на закладку "Выбранные поля", удаляем уже не существующие поля "Поставщик" и "Клиент" и перетаскиваем из первой колонки во вторую новое поле "Контрагент":
Должно получится вот так:
Готово
Сохраняем отчёт и проверяем в режиме пользователя:
Замечательно всё получилось.
Войдите на сайт как ученик
Для учеников
Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.
На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .
Читайте также: