Шпаргалка по программному использованию СКД.
пишу в первую очередь для себя, потому и выглядит как черновик
Программное создание макета СКД
Почти всегда достаточно построить макет СКД вручную, но в некоторых случаях требуется это сделать программно. В качестве примера могу привести реальную задачу, когда требовалось организовать отбор на форме сразу для нескольких справочников. Результат выглядел как-то так:
Для справочников формирование макета схемы выглядела так:
НаименованиеСправочника = СтрЗаменить(Тип.Значение,"СправочникОбъект.","");
//1. создаем схему компоновки данных
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
//1.1 определяем источник данных для схемы
//для наших целей - текущая ИБ
Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
Источник.Имя = "ЛокальнаяБаза";
Источник.СтрокаСоединения = "";
Источник.ТипИсточникаДанных = "Local";
//1.2 определяем набор данных
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "Справочник";
НаборДанных.ИсточникДанных = "ЛокальнаяБаза";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
НаборДанных.Запрос = (
"ВЫБРАТЬ
| //НаименованиеСправочника.Ссылка КАК Ссылка,
| //НаименованиеСправочника.Наименование КАК Наименование
|ИЗ
| Справочник.//НаименованиеСправочника КАК //НаименованиеСправочника"
);
НаборДанных.Запрос = СтрЗаменить(НаборДанных.Запрос,"//НаименованиеСправочника",НаименованиеСправочника);
//1.2.1 добавляем поля
ПолеНоменклатуры = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНоменклатуры.Заголовок = "Ссылка";
ПолеНоменклатуры.ПутьКДанным = "Ссылка";
ПолеНоменклатуры.Поле = "Ссылка";
//ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
//ПолеСтоимости.Заголовок = "Наименование";
//ПолеСтоимости.ПутьКДанным = "Наименование";
//ПолеСтоимости.Поле = "Наименование";
//ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
//ПолеСтоимости.Заголовок = "Владелец";
//ПолеСтоимости.ПутьКДанным = "Владелец";
//ПолеСтоимости.Поле = "Владелец";
//ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
//ПолеСтоимости.Заголовок = "Группа";
//ПолеСтоимости.ПутьКДанным = "Группа";
//ПолеСтоимости.Поле = "Группа";
////1.3 определяем ресурсы
// ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
// ПолеРесурса.Выражение = "Сумма(СтоимостьОборот)";
// ПолеРесурса.ПутьКДанным = "СтоимостьОборот";
//2. создаем настройки для схемы
НастройкиКомпоновкиДанных = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
//2.1 определяем структуру
//2.1.1 добавляем группировку "Номенклатура"
ГруппировкаНоменклатуры = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
//ПолеГруппировки = ГруппировкаНоменклатуры.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
//ПолеГруппировки.Использование = Истина;
//ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
//2.2 определим выбранные поля
ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Заголовок = "Ссылка";
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
СохраненныеНастройкиКНКД = ВосстановитьЗначение(ЭлементыФормы.Панель2.ТекущаяСтраница.Имя);
Если Не ЗначениеЗаполнено(СохраненныеНастройкиКНКД) Тогда
КНСКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КНСКД.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Иначе
КНСКД.ЗагрузитьНастройки(ЗначениеИзСтрокиВнутр(СохраненныеНастройкиКНКД));
КонецЕсли;
ЭлементыФормы.ТПКНСКД.ОбновитьСтроки();
Для независимого регистра сведений поинтереснее:
//1. создаем схему компоновки данных
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
//1.1 определяем источник данных для схемы
//для наших целей - текущая ИБ
Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
Источник.Имя = "ЛокальнаяБаза";
Источник.СтрокаСоединения = "";
Источник.ТипИсточникаДанных = "Local";
//1.2 определяем набор данных
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НЗ";
НаборДанных.ИсточникДанных = "ЛокальнаяБаза";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
НаборДанных.Запрос = (
"ВЫБРАТЬ
| СтруктурныеЕдиницы.Ссылка КАК СЕ,
| СтруктурныеЕдиницы.КатегорияЦенРозницы
|ПОМЕСТИТЬ _0_
|ИЗ
| Справочник.СтруктурныеЕдиницы КАК СтруктурныеЕдиницы
|ГДЕ
| СтруктурныеЕдиницы.Ссылка В(&МассивСЕ)
|;
|
|//////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| _3_МаксПериод.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
| _3_МаксПериод.Номенклатура КАК Номенклатура,
| _3_МаксПериод.ЕдиницаИзмерения,
| _3_МаксПериод.Характеристика,
| _3_МаксПериод.КатегорияЦен,
| _3_МаксПериод.Период,
| _2_.Цена
|{ВЫБРАТЬ
| Номенклатура.*,
| ЕдиницаИзмерения.*,
| Характеристика.*,
| КатегорияЦен.*,
| СтруктурнаяЕдиница.*,
| Период,
| Цена}
|ИЗ
| _3_МаксПериод КАК _3_МаксПериод
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ _2_ КАК _2_
| ПО _3_МаксПериод.Номенклатура = _2_.Номенклатура
| И _3_МаксПериод.ЕдиницаИзмерения = _2_.ЕдиницаИзмерения
| И _3_МаксПериод.Характеристика = _2_.Характеристика
| И _3_МаксПериод.КатегорияЦен = _2_.КатегорияЦен
| И _3_МаксПериод.СтруктурнаяЕдиница = _2_.СтруктурнаяЕдиница
| И _3_МаксПериод.Период = _2_.Период
|{ГДЕ
| _3_МаксПериод.Номенклатура.*,
| _3_МаксПериод.Характеристика.*,
| _3_МаксПериод.КатегорияЦен.*,
| _3_МаксПериод.СтруктурнаяЕдиница.*}
|
|УПОРЯДОЧИТЬ ПО
| СтруктурнаяЕдиница,
| Номенклатура"
);
//1.2.1 добавляем поля
ПолеНоменклатуры = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНоменклатуры.Заголовок = "Номенклатура";
ПолеНоменклатуры.ПутьКДанным = "Номенклатура";
ПолеНоменклатуры.Поле = "Номенклатура";
ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеСтоимости.Заголовок = "СтруктурнаяЕдиница";
ПолеСтоимости.ПутьКДанным = "СтруктурнаяЕдиница";
ПолеСтоимости.Поле = "СтруктурнаяЕдиница";
ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеСтоимости.Заголовок = "Характеристика";
ПолеСтоимости.ПутьКДанным = "Характеристика";
ПолеСтоимости.Поле = "Характеристика";
ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеСтоимости.Заголовок = "КатегорияЦен";
ПолеСтоимости.ПутьКДанным = "КатегорияЦен";
ПолеСтоимости.Поле = "КатегорияЦен";
ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеСтоимости.Заголовок = "ЕдиницаИзмерения";
ПолеСтоимости.ПутьКДанным = "ЕдиницаИзмерения";
ПолеСтоимости.Поле = "ЕдиницаИзмерения";
ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеСтоимости.Заголовок = "Цена";
ПолеСтоимости.ПутьКДанным = "Цена";
ПолеСтоимости.Поле = "Цена";
//ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
//ПолеСтоимости.Заголовок = "Владелец";
//ПолеСтоимости.ПутьКДанным = "Владелец";
//ПолеСтоимости.Поле = "Владелец";
//ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
//ПолеСтоимости.Заголовок = "Группа";
//ПолеСтоимости.ПутьКДанным = "Группа";
//ПолеСтоимости.Поле = "Группа";
////1.3 определяем ресурсы
// ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
// ПолеРесурса.Выражение = "Сумма(СтоимостьОборот)";
// ПолеРесурса.ПутьКДанным = "СтоимостьОборот";
//2. создаем настройки для схемы
НастройкиКомпоновкиДанных = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
//2.1 определяем структуру
//2.1.1 добавляем группировку "Номенклатура"
ГруппировкаНоменклатуры = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
//ПолеГруппировки = ГруппировкаНоменклатуры.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
//ПолеГруппировки.Использование = Истина;
//ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
//2.2 определим выбранные поля
ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Заголовок = "СтруктурнаяЕдиница";
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("СтруктурнаяЕдиница");
ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Заголовок = "Номенклатура";
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Заголовок = "Характеристика";
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Характеристика");
ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Заголовок = "ЕдиницаИзмерения";
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("ЕдиницаИзмерения");
ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Заголовок = "КатегорияЦен";
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КатегорияЦен");
ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Заголовок = "Цена";
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Цена");
СохраненныеНастройкиКНКД = ВосстановитьЗначение(ЭлементыФормы.Панель2.ТекущаяСтраница.Имя);
//Если Не ЗначениеЗаполнено(СохраненныеНастройкиКНКД) Тогда
КНСКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КНСКД.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
//Иначе
// КНСКД.ЗагрузитьНастройки(ЗначениеИзСтрокиВнутр(СохраненныеНастройкиКНКД));
//КонецЕсли;
ЭлементыФормы.ТПКНСКД.ОбновитьСтроки();
////3. компонуем
// КомпНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
// КомпНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
// КомпНастроек.ЗагрузитьНастройки(НастройкиКомпоновкиДанных);
// НастройкиКомпоновкиДанных = КомпНастроек.ПолучитьНастройки();
КНКД - конструктор настроек компоновки данных, выведенный на форму.
Вышеприведенный код предназначен для заполнения настроек КНКД при переключении закладок соответствующих справочников, или регистра сведений.
Отбор объектов посредством СКД
Посредством СКД очень просто организовать отбор для элементов с целью их использования, например в коллекции значений(таблице значений или дереве).
Например, мне необходимо выбрать документы для печати, удовлетворяющие определенным критериям.
Первым шагом создаю макет СКД во внешней обработке, формирую в нём набор данных запросом и задаю настройки вывода.
Далее, на форме создаю реквизит с типом "КомпоновщикНастроекКомпановкиДанных", добавляю табличное поле, в котором в качестве данных выбираю