Наборы данных. СКД и внешние источники данных

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

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

Внутри этой процедуры будем собирать данные и формировать отчет.
В процедуре ПриКомпоновкеРезультата отключаем стандартную обработку. СтандартнаяОбработка = Ложь;
Затем формируем таблицу значений произвольным образом. Имена колонок таблицы значений должны совпадать с будущими полями набора данных в СКД.:


Для примера добавим три строки данных. Далее по шагам создаем вывод отчета.

  • Из схемы получаем настройки по умолчанию.

  • В соответствующую переменную отправляем данные о расшифровке.

  • Формируем макет с помощью компоновщика макета.

  • Передаём в макет компоновки схему, настройки и данные расшифровки.

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

  • Очищаем поле табличного документа.

  • Выводим результат в табличный документ.
В итоге получается следующий код:
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных" ); //Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; // - Если сделать так, как показано выше(рекомендуют на некоторых ресурсах), то при изменении настроек в режиме клиента // этих изменений Вы не увидите, потому что настройки всегда будут по умолчанию. Как правильно - вариант ниже Настройки = КомпоновщикНастроек. ПолучитьНастройки(); ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета. Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); ВнешнийНаборДанных = Новый Структура("ПримерТаблицыЗначений" , ТЗВывод); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных. Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки); ДокументРезультат. Очистить(); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода. УстановитьДокумент(ДокументРезультат); ПроцессорВывода. Вывести(ПроцессорКомпоновкиДанных); Добавляем макет схемы компоновки. Название можем оставить по умолчанию.

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

Добавляем ресурсы, если это необходимо. По ним будут считаться итоги. В нашем случае это поля Количество и Сумма.

В закладке Настройки с помощью конструктора настроек формируем вариант отчета по умолчанию

Сохраняем наш отчет. Запускаем его в клиенте и формируем. Пример выполнения отчета СКД с использованием данных из таблицы значений приведен на картинке.


Вот и все. Достаточно просто, не правда ли?

Получившийся отчет для примера можно скачать

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

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

Запрос = Новый Запрос(
"ВЫБРАТЬ
| Таблица.Номенклатура,
| Таблица.Склад
|ИЗ
| &ТЗ КАК Таблица");
Запрос.УстановитьПараметр("ТЗ", ТЗ);

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

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

Детализируем задачу до некоторого примера. Имеется типовой отчет Расчетные ведомости организации конфигурации ЗиК 8. Необходимо что бы виды расчетов в отчете группировались по некоторым группам. Соответствия ВидРасчета-Группа хранятся во внешней таблице значений. Для подгрузки ее в основную схему компановки данных создаем "набор данных объект" с именем "Группы" (рисунок 2). Связь производим с "набором данных запрос" - "Начисления" по виду расчета (рисунок 3). В "наборе данных запрос" - "Начисления" значится информация по группам, удаляем все вхождения. После, на вкладке "Настройки" мы можем использовать поле "Группа", знаечние которого подгружается из внешнего источника данных (рисунок 4). В функции формирования отчета дополняем подгрузку внешних данных.

Функция СформироватьОтчет(Результат = Неопределено, ДанныеРасшифровки = Неопределено, ВыводВФормуОтчета = Истина) Экспорт

//получение или формирование искомой таблицы значений "Группы" и ее запись в одноименную переменную

ВнешниеДанные = Новый Структура();//создаем и заполняем структуру внешних данных
ВнешниеДанные.Вставить(Группы);

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

КонецФункции

В случае, если бы мы делали отчет "с нуля", то код запуска формирования отчета выглядел бы следующим образом:

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

Прочитано 9660 раз

41
Делал недавно отчет с неопределенным количеством колонок. Возиться с кодом было неохота, решил сделать на СКД. С этим проблема не возникла, необходимо было натянуть результат на произвольный макет (свой заголовок +... 27
Несмотря на то, изучающие СКД встречаются с этим на первый или второй день, это должно быть в разделе FAQ. Простой пример программного вывода отчета на компоновке, использующий настройки по умолчанию. //Получаем схему из... 18
При формировании отчетов на СКД по умолчанию все группировки развернуты, но бывает что необходимо сразу после формирования показать отчет со свернутыми группировками! Данный код в модуле отчета позволяет свернуть... 10
На этой закладке можно указать, какие осуществляются связи между двумя и более наборами дан-ных, по каким параметрам и условиям..png 1. «Источник связи» - указывается первый набор данных, от... 9
Что при разработке отчетов требуется чтобы у пользователя с ограниченными правами, отчет формировался полностью без проверки прав! Особенно если настроен RLS Есть несколько способов как это сделать: 1. Установить...

Использование системы компоновки данных 1С невозможно без наборов данных . В одной схеме компоновки данных их может быть несколько. И они могут связываться между собой определенным образом. А точнее либо , либо объединяться . В этой статье рассмотрим объединение наборов данных . Объединение наборов данных в СКД подобно .

Чтобы объединить два или более набора данных в СКД, необходимо на закладке Наборы данных предварительно создать специальный набор данных — объединение


Получаем вот такую картину


И уже в этот созданный объект добавляем наборы, которые будут непосредственно объединяться. Давайте добавим два набора данных. Один из которых будет запрос, а второй для разнообразия — объект (внешний источник данных). Вот так:


В качестве примера рассмотрим объединение наборов данных с остатками товаров.

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


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


Делаем простейший запрос

ВЫБРАТЬ ОстаткиТоваров.Товар.Представление КАК Товар, ОстаткиТоваров.КоличествоОстаток КАК Остатки {ВЫБРАТЬ Товар, Остатки} ИЗ РегистрНакопления.ТоварыОстатки.Остатки КАК ОстаткиТоваров

Чтобы избавиться от складов, пришлось задействовать в запросе компоновку данных (все, что в фигурных скобках) и отключить внизу флаг автозаполнения. Также в качестве товара был взят не элемент справочника, а его представление, чтобы тип был такой же как и в наборе с внешним источником данных. Чтобы данные из разных наборов попали в одно поле у них должно быть одинаковое наименование в поле Путь . Поэтому для поля Остатки путь был вручную исправлен на Количество , чтобы синхронизировать его со вторым набором данных. На самом деле лучше конечно же использовать нужный псевдоним сразу в запросе. В данном случае умышленно не стал это делать, чтобы заострить внимание на такой особенности.

Теперь обратимся непосредственно к данным
В регистре накопления у меня хранятся следующие остатки товаров

а во внешнем источнике данных вот такая картина

Выполним настройку схемы компоновки самым примитивным образом.
Поле Количество естественно сделаем ресурсом, а на закладке настройки в структуру просто добавим Детальные записи . Ну и конечно не забудем поместить Товар и Количество в выбранные поля. И для полного счастья сделаем упорядочивание по товару.


В результате выполнения отчета с такими настройками СКД получаем вот такую таблицу

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


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

Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: