Найти: на

Внимание! Сайт переехал на http://бизнесплюспермь.рф

"Объектная" Схема компоновки данных в 1С 8.х

Введение

Итак: «Объектная» СКД – что это и зачем вам надо ее использовать?

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

Не каждый разработчик «любит» использовать в своей работе СКД. На это есть несколько понятных причин. Например,

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

Получается, СКД, достаточно мощный механизм, используется разработчиками преимущественно для написания отчетов с довольно простыми «запросными» выборками данных из базы и не сложными выходными формами.

Но не стоит забывать об «Объектной» компоновке! О СКД, в которой в качестве набора данных выступает объект – произвольная таблица значений. Тем самым, мы можем использовать всю гибкость настроек СКД на уровне пользователей (свободу построения выходных форм, произвольные отборы, настройки,…) и очень сложные нетиповые выборки в качестве источника данных!

Опишем основные нюансы (и порядок) работы с «объектной» компоновкой, на которые стоит обратить внимание при разработке сложных отчетов.

ВНИМАНИЕ: все приведенные листинги написаны на 8.1.

Раз в СКД в качестве источника данных выступает объект – произвольная таблица значений, следовательно, в отчете надо эту таблицу значений создать и заполнить. Таблица значений произвольная: данные в нее могут попадать из любых источников и произвольным образом (из запросов, таблиц базы данных), могут быть расчетные поля и т.д.

Для простоты дальнейшего изложения предположим, в отчете была создана таблица значений «ТаблицаЗначенийОтчета» с колонками «колонка1, колонка2, колонка3, …».

Настройки СКД

Кратко опишем настройки СКД. Думаю, подробно заострять внимание на них не стоит.

В отчет добавляем новый макет типа «Схема компоновки данных».

Рис. 1. Добавление нового макета типа СКД

В самой СКД в качестве набора данных добавляем набор данных «объект»

Рис.2. Добавление набора данных «объект» в СКД

Затем, ОБЯЗАТЕЛЬНО, необходимо указать имя объекта, содержащего данные. Имя объекта МОЖЕТ НЕ СОВПАДАТЬ с именем таблицы значений с данными, которую мы уже создали в отчете (см. п. 1).

Допустим, у нас, имя объекта, содержащего данные, будет «ОбъектСДанными».

Рис. 3. Задание имени объекта, содержащего данные.

Заполнение полей СКД. Обращаем ваше внимание, поля СКД можно задать (описать) в СКД сейчас, когда мы создаем СКД, а можно позже, программно. Для простоты, добавим все наши поля непосредственно в СКД.

ВАЖНО! Имена полей в объектной СКД должны совпадать с именами колонок таблицы значений источника: у нас поля будут иметь имена «колонка1, колонка2, колонка3, …», также, как в таблице значений «ТаблицаЗначенийОтчета».

Рис. 4. Добавление полей в СКД

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

Теперь осталось только указать ресурсы компоновки, настроить выходную форму, указать отборы (здесь мы подробно расписывать не будем, - предполагаем, что читатель знает как это делается).

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

Добавим в отчет процедуру, которая передаст нашу таблицу значений в компоновку и выведет отчет. Назовем эту процедуру «Печать»

Процедура Печать() экспорт

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

	//Вывод результата
	ДокументРезультат = ЭлементыФормы.Результат;
	ДокументРезультат.Очистить(); 
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	ДокументРезультат.Показать();
	
КонецПроцедуры

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

В нашем примере (см. картинки выше) макет со схемой компоновки данных назывался «Макет». Обращаем ваше внимание, что используемый макет СКД не обязательно должен быть основным.

Естественно, что в СКД может быть использовано несколько наборов данных и, следовательно, несколько наборов данных могут использовать объект в качестве источника. В переменной (в листинге) «ВнешниеНаборыДанных» (тип Структура) прописывается связь между именами объектов, содержащих данные, в СКД и самими объектами (существующими таблицами значений в отчете). У нас (в нашем примере), такая связь всего одна:

ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ОбъектСДанными ", ТаблицаЗначенийОтчета);

Обращаем ваше внимание, таблица значений «ТаблицаЗначенийОтчета» не передается в процедуру параметром, а является переменной или реквизитом формы отчета в целом.

Некоторые пояснения к макету компоновки. Здесь появляется еще одна переменная: «ДанныеРасшифровкиОтчета». Эта переменная также должна быть переменной формы. В нее СКД поместит информацию о расшифровке.

Вывод результата. В нашем примере в качестве таблицы для вывода результата используется поле табличного документа формы «Результат».

Вызов отчета

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

Это (переопределение типовой процедуры Сформировать) необходимо сделать, т.к. при вызове типовой процедуры формирования отчета на СКД, система вызовет связанную СКД, которая в свою очередь попытается получить информацию в набор из базы данных, и выпадет в ошибку, ведь данные должны быть получены не из базы данных, а из объекта (таблицы значений). Именно так мы указали.

Итак, добавляем процедуру «Сформировать()» в форму обработки, в которой вызываем процедуру формирования исходной таблицы с данными и процедуру Печать(). В форму обработки добавляем кнопку, которая вызывает процедуру Сформировать().

Настройка расшифровки

Раз мы не могли воспользоваться типовой процедурой формирования отчета на СКД, результат работы отчета (табличный документ) не будет иметь типовой расшифровки с возможностями компоновки. При этом, расшифровка (даже в виде простого открытия текущего значения в ячейке) работать не будет! СКД при формировании выходной формы отчета не заполняет поле «Параметр» ячейки. Поэтому, работу расшифровки отчета необходимо прописывать вручную. При формировании отчета СКД формирует таблицу специального формата, в которой хранит связь между полями результирующей формы и данными отчета. Именно благодаря этой таблице мы можем сформировать расшифровку ячейки отчета.

В листинге процедуры Печать() используется переменная формы отчета «ДанныеРасшифровкиОтчета». Именно в эту переменную компоновка выгрузит таблицу со всей необходимой информацией для расшифровки (именно так сказано в процедуре Печать()).

Не будем заострять внимание, как сделать так, чтобы элемент формы типа Табличный документ имел возможность расшифровки, только приведем листинг процедуры «ОбработкаРасшифровки» и некоторые пояснения к нему.

Итак, процедура «ОбработкаРасшифровки» будет иметь следующий вид:

Процедура ОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

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

В приведенном листинге для начала отключаем стандартную обработку расшифровки (она все равно не даст ничего вразумительно) и далее уже настраиваем расшифровку вручную. Для начала связываемся с нашей СКД (с макетом, в котором хранится используемая нами схема) и конструктором создаем объект типа ОбработкаРасшифровкиКомпоновкиДанных, в котором через параметры прописываем связь данных расшифровки (переменная «ДанныеРасшифровкиОтчета» из процедура Печать() и нашей СКД).

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

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

Настройки отчета

Следует заметить еще одну особенность объектной СКД. Как помните, в командной панели отчета мы убрали флаг «Автозаполнение» и процедуру формирования отчета (у нас это процедура Сформировать()) писали самостоятельно. Так вот, вызов формы с настройками СКД отчета так же необходимо писать вручную. При этом, сама форма настроек отчета также должна быть сформирована/нарисована самостоятельно. Это не сложно сделать, т.к. все элементы формы настроек будут связаны с реквизитами Компоновщика настроек. На формировании и вызове формы с настройками компоновки не будем заострять внимание.

Вместо заключения

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

Здесь можно скачать пример отчета, который использует «объектную» компоновку.

Hosted by uCoz