Создание отчет на СКД(системе компоновке данных) программно для начинающих.
Для начала, несколько слов об СКД с точки зрения начинающего. Сразу же хочу сказать, что постарался "разжевать" материал как можно подробнее, так сам еще совсем недавно был начинающим и мне далось очень не просто изучение данного материала, надеюсь, что этот урок кому нибудь может быть оказаться полезным.
Не вдаваясь в тонкости, могу сказать, что это некий механизм, который позволит нам не беспокоиться об интерфейсе отчета (рисования различных форм и фильтров, как например это было в 1с 7), а сосредоточиться по большей мере на работе над самим основным - запросом.
Для создания и откладки отчета очень удобно использовать обработку консоль запросов от Павла Чистова, или консоль запросов СКД.
В данной статье я попытаюсь рассказать как можно более простым языком, как сделать отчет для СКД но программно. Для чего же нужнен этот "программный" вариант отчета на СКД? Например, возьмем пример Балашова Романа. Мы успешно сформировали отчет по продажам и вывели его на печать. Очень удобные отбор и сортировка, всем хорошо: и пользователям и разработчикам - СКД здорово облегчила всем работу. Ну а что если задача немного другая? Нужно чтобы по данным из продаж проставить определенные свойства, например, договорам контрагентов. СКД не "умеет" изменять объекты. Именно для этого и нужно уметь создавать отчет программно, чтобы с одной стороны использовать удобства интерфейса СКД, с другой стороны получить доступ к выборке результата отчета как подробно рассказано Вячеславом.
Итак, приступим. План такой:
1. Создаем отчет. Для этого в меню конфигуратора выбираем последовательно: "Файл - Новый" и получаем:
Далее последовательно нажимаем на кнопку "Открыть схему компоновки данных" и в открывшемся
окне кнопку "Готово".
В итоге мы получаем окно основной схемы компоновки данных на первой закладке "Набор данных". Если щелкнуть правой клавишей мыши на "Наборы данных", то появляется контекстное меню из трех пунктов. Первый мы уже видели в уроке Романа, но в данном случае нам нужен второй пункт "Объект". Третий же особенно полезен когда мы имеет дело со внешними данными в качестве набора данных(например документ Excel или сторонняя база данных).
Итак, выбрав "Объект" в качестве источника, дадим его какое нибудь осмысленное имя, именно оно будет использоваться в последующем в модуле отчета. Также нам будет необходимо добавить тут те поля, которые нам потребуются для отчета. К этому вопросу мы еще вернемся, а сейчас еще немного теории об СКД.
Достаточно один раз четко уложить в голове те составляющие, из которых состоит СКД и дальнейшая работа с ним пойдет куда легче(такжев основе концепции управляемых форм также лежит СКД).
Схема компоновки (некий перечень данных, с которыми мы будем работать), которая вместе с настройками подается на вход компоновщику макета КД(компоновки данных), которых из этих двух ингридиентов формирует Макет КД. В макете еще нет никаких реальных данных, лишь текст запроса и другие вспомогательные данные, такие как отборы и сортировки. По сути некий шаблон для заполнения. Вот когда шаблон готов в дело вступает Процессор компоновки данных . Именно после его работы мы получаем реальные данные из базы данных или другого внешнего источника. Теперь у нас данные. Осталось лишь вывести их. Последний этап - работа Процессора вывода КД. Он может вывести полученные от процессора компоновки данные либо в табличный документ либо в таблицу значений. В нашем случае таблица значений нас бы очень даже устроила.
Возникает резонный вопрос: какже создать и запустить механизмы, описанные выше, применимо к нашей задачи? Для отчетов на СКД в модуле есть предопределенная процедура "При компоновке результата". Именно в ней мы будем описывать и запрос и создавать основные объекты СКД.
Вот листинг нашей процедуры. В данном случае я рассматриваю пример с документом "ПоступлениеУслугТоваров" с целью каким то образом изменить объект для демонстрации целей задачи. (К примеру записать в комментарий количество из документа);
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) // Вставить содержимое обработчика. СтандартнаяОбработка=Ложь; КонецПроцедуры
Значение и описание параметров данной процедуры можно почитать в описании используя "Синтакс помощник".
Стандартная обработка = Ложь; говорит о том, что мы сами берем на себя контроль над событием, которое описывает данная предопределенная процедура.
Далее нам нужно создать запрос, чтобы использовать его макете как мы и планировали ранее.
Для этого очень удобно использовать мастер создания. Для этого мы нажимаем правую клавишу мыши в любом месте кода нашей процедуры и выбираем "конструктор запроса с обработкой результата", система сообщит, что запрос не найден и предложит его создать, мы соглашаемся, переходим на закладку "Таблицы и поля".
Далее используя конструктор в выбрал в документ поступление его табличную часть "товары" и ее поля номенклатура и количество, сгруппированное по полю номенклатура при этом считая сумму количества.
В итоге после работы конструктора мы получим вот что:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) // Вставить содержимое обработчика. СтандартнаяОбработка=Ложь; //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПоступлениеТоваровУслуг.Товары.( | Номенклатура, | СУММА(Количество) | ) |ИЗ | Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг | |СГРУППИРОВАТЬ ПО | ПоступлениеТоваровУслуг.Товары.(Номенклатура)"; Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры
Но нам нам обход результат не нужен, достаточно лишь Результат = Запрос.Выполнить().Выгрузить(); все остальное убираем до конца процедуры. Итак у нас теперь есть таблица значений с результатами работы нашего запроса.
Пришло время "заводить" СКД.
Но перед этим нам самое время вернуться к нашей схеме компоновки данных, где мы уже создали набор данных с типом "Объект" и остановились на создании полей. Отметим, что в отличии от примера, описанного Романом, в данном случае придется каждое поле добавлять "ручками", но проблем с этим нет ни каких. Итак после добавления нового поля (зеленая кнопка "+" или клавиша "insert") мы даем ему название в выбираем соответствующий тип данных.
В данном случае мы назвали поле "Номенклатура" и дали ему соответствующий тип "СправочникСсылка.Номенклатура". !!!!!!!!!ОЧЕНЬ ВАЖНО!!!!!!!!!!!!!!! чтобы имя данное полю тут (в схеме компоновки) совпадало с названием поля, который мы описали в запросе процедуры ПриКомпоновкеРезультата.
Аналогично добавляем поле "Количество". Поля, которые мы описываем тут могут быть использованы в настройках схемы КД для отобора и сортировки данных запроса, который мы написали в модуле.
Далее формируем цепочку, описанную выше: настройки + схема = макет(при помощи КомпоновщикаМакетов). Далее из макета + данных запроса обрабатываем при помощи ПроцессораКомпоновки(получаем данные из запроса с учетом отборов в макете). И наконец ПроцессорВывода(в ТабличныйДокумент/В коллекцию значений) выводит в данном случае в таблицу значений МояТЗ, чтобы в последующим можно было изменить нужный реквизит элементов запроса.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) // Вставить содержимое обработчика. СтандартнаяОбработка=Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура, | СУММА(Количество) КАК Количество //Обязательно даем имя реквизиту такое же как и схеме КД. |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслуг | |СГРУППИРОВАТЬ ПО | ПоступлениеТоваровУслуг.Номенклатура"; МояТЗ = Новый ТаблицаЗначений; Выборка = Запрос.Выполнить().Выгрузить(); ВнешнийНабор = Новый Структура("ТаблицаДанных", Выборка); //Процессору компоновку нужна структура Настройки = КомпоновщикНастроек.Настройки; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешнийНабор, ДанныеРасшифровки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(МояТЗ); ПроцессорВывода.Вывести(ПроцессорКомпоновки); Для Каждого врем из МояТЗ Цикл Объект = врем.Номенклатура.ПолучитьОбъект(); Объект.Комментарий = "123"; Сообщить("Для объекта: " + врем.Номенклатура + " установлен новый комментарий."); Объект.Записать(); КонецЦикла; КонецПроцедуры
Также не менее важное замечание: обязательно заполним закладку "Настройки" в основной схеме КД(рисунок выше). Без заполнения этой закладки мы получим следующее: запрос будет выполнен, данные будут получены и записаны в переменную "Результат" (из листинга выше). Однако так как настройки пусты, то никаких группировок не будет создано и табица "МояТЗ" будет пуста. Очень важно это не забывать.
Далее выбираем, например, поле "Номенклатура" или другие нужные нам поля и нажимаем кнопку "ОК".
В итоге отчет готов, в выборке по запросу мы можем делать все что нам угодно.
P.S. Это мой первый урок, не судите слишком строго. Удачи в освоении СКД.