Опубликован: 14.07.2011 | Уровень: специалист | Доступ: платный
Лекция 6:

Система компоновки данных

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

6.3. Программное построение отчета с помощью СКД

Прежде чем приступить к программному построению отчета с использованием СКД, обсудим основные этапы, которые нужно выполнить для создания такого отчета.

  1. Создание и настройка схемы компоновки данных. На данном этапе мы будем использовать уже знакомый вам Конструктор схемы компоновки данных. Здесь мы зададим набор источников данных, набор полей, произведем настройку состава и внешнего вида отчета.
  2. Получение данных, необходимых для построения отчета. Здесь мы получим необходимые данные и оформим их соответствующим образом для последующего построения отчета.
  3. Подготовка к исполнению схемы компоновки данных. На этом этапе мы будем пользоваться объектом типа КомпоновщикМакетаКомпоновкиДанных. Он, на основе настроек компоновки данных и схемы компоновки данных, готовит схему к исполнению, на выходе данного этапа получается макет компоновки данных, готовый к заполнению данными.
  4. Исполнение схемы компоновки данных. Здесь мы воспользуемся объектом типа ПроцессорКомпоновкиДанных. Он оперирует данными, необходимыми для построения отчета, и созданным ранее макетом компоновки данных.
  5. Вывод результата компоновки данных. На этом этапе создается табличный документ, который, после заполнения его данными, будет представлять собой готовый отчет. Так же здесь используется объект типа ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Он использует данные процессора компоновки данных для вывода их в ранее созданный табличный документ.
  6. Настройка табличного документа. На данном этапе мы настраиваем параметры, характерные для табличного документа и показываем его пользователю.

Все этапы программной работы со схемой компоновки данных допускают вмешательство разработчика, что позволяет строить программным способом отчеты любой сложности.

Решим следующую задачу. Построим печатную форму документа НачислениеЗарплаты, которая будет содержать следующие реквизиты документа:

  • Номер документа;
  • Дата документа;
  • ПериодРегистрации;

Так же отчет будет содержать табличную часть, данные которой нужно взять из табличной части НачисленияИУдержания открытого документа. А именно, это следующие данные:

  • НомерСтроки;
  • Сотрудник;
  • ВидРасчета;
  • График;
  • ИсходныеДанные;
  • ДатаНачала;
  • ДатаОкончания;

Все эти данные присутствуют в документе.

Начнем с создания макета документа типа Схема компоновки данных. Для этого вызовем контекстное меню элемента Макеты, подчиненного документу НачислениеЗарплаты, в появившемся окне Конструктор макета установим тип - Схема компоновки данных, введем имя макета - МакетСКД, рис. 6.24.

Создание нового макета для разработки печатной формы документа

Рис. 6.24. Создание нового макета для разработки печатной формы документа

В уже знакомом вам по предыдущему примеру окну конструктора СКД добавим новый источник данных - Объект. При использовании источников данных-объектов данные для построения отчета можно получать данные из различных объектов, например:

  • Результаты запросов;
  • Табличные части;
  • Таблицы значений;
  • Области ячеек табличного документа;
  • Прикладные объекты;
  • Наборы записей регистров;

Мы, в нашем примере, поступим следующим образом. Данные для заполнения сведений о документе ( Номер, Дата, ПериодРегистрации ) получим с помощью запроса, данные табличной части документа используем без предварительной подготовки.

Итак, после добавления нового источника данных-объекта, переименуем его в НачислениеЗарплаты (это можно сделать, выполнив двойной щелчок по имени набора данных и введя новое имя вместо подсвеченного имени по умолчанию), введем в поле Имя объекта, содержащего данные имя документа - Начисление зарплаты. Заполним состав полей - дадим им имена, соответствующие именам реквизитов документа: Номер, Дата, ПериодРегистрации, рис. 6.25.

Добавление набора данных для размещения в отчете реквизитов документа

увеличить изображение
Рис. 6.25. Добавление набора данных для размещения в отчете реквизитов документа

Таким же образом добавим набор данных-объект НачисленияИУдержария. В поле Имя объекта, содержащего данные, запишем НачисленияИУдержания, создадим поля НомерСтроки, Сотрудник, ВидРасчета, График, ИсходныеДанные, ДатаНачала, ДатаОкончания (эти имена соответствуют именам полей табличной части), рис. 6.26.

Добавление набора данных для размещения в отчете табличной части документа

увеличить изображение
Рис. 6.26. Добавление набора данных для размещения в отчете табличной части документа

Перейдем на вкладку конструктора Настройки. Добавим в структуру отчета новую группировку, перейдем к ее настройке и добавим на вкладке Поля группировки поля Номер, Дата и ПериодРегистрации. Перейдем на вкладку Другие настройки, установим параметр Тип макета в значение Вертикально (для того, чтобы эти данные были выведены в виде вертикального списка), рис. 6.27.

Настройка структуры отчета для размещения реквизитов документа

увеличить изображение
Рис. 6.27. Настройка структуры отчета для размещения реквизитов документа

Добавим новую группировку, не указывая группировочное поле, перейдем в режим ее настройки, откроем вкладку Выбранные поля, и выберем остальные поля отчета ( НомерСтроки, Сотрудник, ВидРасчета, График, ИсходныеДанные, ДатаНачала, ДатаОкончания ), рис. 6.28.

Настройка структуры отчета для размещения табличной части

увеличить изображение
Рис. 6.28. Настройка структуры отчета для размещения табличной части

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

Наш документ НачислениеЗарплаты не имел формы, поэтому создадим для него форму документа (вкладка Формы окна редактирования свойств объекта), добавим на командную панель формы кнопку Печать и зададим обработчик события нажатия кнопки, рис. 6.29. Именно здесь будет располагаться код формирования печатной формы на основе СКД.

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

увеличить изображение
Рис. 6.29. Создание формы документа и кнопки для вызова кода, создающего печатную форму

Ниже приведен код модуля ОсновныеДействияФормыПечать() с комментариями.

Процедура ОсновныеДействияФормыПечать(Кнопка)
	Сообщить("Для правильного формирования отчета документ после изменения должен быть записан!");
	//Вывод данных из документа с помощью СКД
	//Этим запросом мы получим реквизиты документа из базы
	Запрос = Новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	             |	НачислениеЗарплаты.Номер,
	             |	НачислениеЗарплаты.Дата,
	             |	НачислениеЗарплаты.ПериодРегистрации
	             |ИЗ
	             |	Документ.НачислениеЗарплаты КАК НачислениеЗарплаты
	             |ГДЕ
	             |	НачислениеЗарплаты.Ссылка = &Ссылка";
	//Установим параметр запроса - ссылку на открытый документ
	Запрос.УстановитьПараметр("Ссылка", ДокументОбъект.Ссылка);
	//Выгрузим результат выполнения запроса в таблицу значений 
	НачислениеЗарплатыСКД=Запрос.Выполнить().Выгрузить();
	//В этой структуре значений будем хранить данные для передачи в СКД
	ВнешниеДанные = Новый Структура;
	//Поместим в структуру данные табличной части НачисленияИУдержания
	ВнешниеДанные.Вставить("НачисленияИУдержания", ДокументОбъект.НачисленияИУдержания);
	//Поместим в структуру таблицу значений с реквизитами документа
	ВнешниеДанные.Вставить("НачислениеЗарплаты", НачислениеЗарплатыСКД);
	//Получим макет СКД, заданный ранее
	СКД=ПолучитьМакет("МакетСКД");
	//Получим настройки по умолчанию для нашей СКД
	НастройкиСКД=СКД.НастройкиПоУмолчанию;
	//Создадим новый компоновщик макета компоновки данных
	КомпоновщикМакетаКД=Новый КомпоновщикМакетаКомпоновкиДанных;
	//Создадим новый макет компоновки данных с помощью компоновщика макета
	//с использованием полученной ранее СКД (тип СхемаКомпоновкиДанных) и настроек
	//(тип НастройкиКомпоновкиДанных)
	МакетКД=КомпоновщикМакетаКД.Выполнить(СКД, НастройкиСКД);
	//Создадим новый процессор компоновки данных
	ПроцессорКД=Новый ПроцессорКомпоновкиДанных;
	//Инициализируем процессор компоновки данных ранее созданным
	//макетом компоновки данных и данными, необходимыми для 
	//построения отчета
	ПроцессорКД.Инициализировать(МакетКД, ВнешниеДанные);
	//Создадим новый табличный документ
	ГотовыйОтчет=Новый ТабличныйДокумент;
	//Создадим новый процессор вывода результата компоновки данных
	ПроцессорВыводаКД=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	//Установим документ ГотовыйОтчет в качестве документа, в который
	//нужно выводить готовый отчет
	ПроцессорВыводаКД.УстановитьДокумент(ГотовыйОтчет);
	//Выведем в табличный документ данные, полученные из процессора компоновки данных
	ПроцессорВыводаКД.Вывести(ПроцессорКД);
	//Выключим отображение сетки в готовом отчете
	ГотовыйОтчет.ОтображатьСетку=Ложь;
	//Выключим отображение имен строк и столбцов в готовом отчете
	ГотовыйОтчет.ОтображатьЗаголовки=Ложь;
	//Покажем отчет пользователю
	ГотовыйОтчет.Показать();
КонецПроцедуры
Листинг .

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

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

6.4. Выводы

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

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >
Евгений Орлов
Евгений Орлов
Кундуз Сабаева
Кундуз Сабаева

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.НачислениеЗарплаты.МодульОбъекта(45)}: Деление на 0
        Движение.Результат= Движение.ИсходныеДанные*Факт[0].РабочийДень/План[0].РабочийДень;

Андрей Нейман
Андрей Нейман
Россия
Илья Климов
Илья Климов
Россия, Пермь, ПНИПУ, 2013