Понедельник, 29 Апрель 2013 22:46

СКД - запрос к таблице значений

Автор 
Оцените материал
(3 голосов)

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

 

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

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

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

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

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

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

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

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

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

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

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

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

Прочитано 8441 раз
Evgen

Бла бла бла

Сайт: www.facebook.com/joltd

Галерея изображений

{gallery}http://www.flickr.com/photos/94875534@N08/sets/72157633418918307/{/gallery}
Другие материалы в этой категории: « Инструменты разработчика 1С