|
СКД: полностью программное создание отчета | ☑ | ||
---|---|---|---|---|
0
Kaidend
22.11.10
✎
09:55
|
Всем привет.
Хочется разобраться с тем, как устроена СКД на уровне кода. Для этого решил сформировать простейший отчет, который выбирает все записи из табличной части документов Реализация товаров и услуг, группирует их по номенклатуре и суммирует по сумме. Но выводится совершенно пустой отчет (( Если кто хорошо знаком с СКД - можете подсказать, что я забыл сделать или сделал не так? Код ниже. |
|||
1
Kaidend
22.11.10
✎
09:55
|
//1. создаем схему компоновки данных
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; //1.1 определяем источник данных для схемы //для наших целей - текущая ИБ Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); Источник.Имя = "ЛокальнаяБаза"; Источник.СтрокаСоединения = ""; Источник.ТипИсточникаДанных = "Local"; //1.2 определяем набор данных НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "Продажи"; НаборДанных.ИсточникДанных = "ЛокальнаяБаза"; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; НаборДанных.Запрос = ( "ВЫБРАТЬ | РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, | РеализацияТоваровУслугТовары.Сумма КАК СтоимостьОборот |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары" ); //1.2.1 добавляем поля ПолеНоменклатуры = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеНоменклатуры.Заголовок = "Номенклатура"; ПолеНоменклатуры.ПутьКДанным = "Номенклатура"; ПолеНоменклатуры.Поле = "Номенклатура"; ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеСтоимости.Заголовок = "Стоимость"; ПолеСтоимости.ПутьКДанным = "СтоимостьОборот"; ПолеСтоимости.Поле = "Номенклатура"; //1.3 определяем ресурсы ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить(); ПолеРесурса.Выражение = "Сумма(СтоимостьОборот)"; ПолеРесурса.ПутьКДанным = "СтоимостьОборот"; //2. создаем настройки для схемы НастройкиКомпоновкиДанных = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; //2.1 определяем структуру //2.1.1 добавляем группировку "Номенклатура" ГруппировкаНоменклатуры = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); ПолеГруппировки = ГруппировкаНоменклатуры.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировки.Использование = Истина; ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Номенклатура"); //2.2 определим выбранные поля ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Заголовок = "Стоимость"; ВыбранноеПоле.Использование = Истина; ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("СтоимостьОборот"); //3. компонуем КомпНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); КомпНастроек.ЗагрузитьНастройки(НастройкиКомпоновкиДанных); НастройкиКомпоновкиДанных = КомпНастроек.ПолучитьНастройки(); //4. готовим макет КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных); //5. исполняем макет ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет); ПроцессорКомпоновки.Сбросить(); //6. выводим результат ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ТабДок = Новый ТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДок); ПроцессорВывода.НачатьВывод(); ЭлементРезультата = ПроцессорКомпоновки.Следующий(); Пока ЭлементРезультата <> Неопределено Цикл ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); ЭлементРезультата = ПроцессорКомпоновки.Следующий(); КонецЦикла; ПроцессорВывода.ЗакончитьВывод(); ТабДок.Показать(); |
|||
2
mikecool
22.11.10
✎
09:56
|
не настроил вывод отчета
|
|||
3
Kaidend
22.11.10
✎
09:58
|
(2) А можно чуть поподробнее?
|
|||
4
Kaidend
22.11.10
✎
10:26
|
Апнем, пожалуй.
|
|||
5
detec
22.11.10
✎
11:01
|
(0)
Совершенно пустой - это как? Полностью белый ТабДок или есть отбор, параметры, только таблица отчёта пустая. А вообще полностью программное формирование настроек СКД - это сизифов труд. Нарисуй руками макет, прикрепи его к своему документу и работай по-человечески. Использовать чистый программный СКД не имеет никакого практического смысла. |
|||
6
Kaidend
22.11.10
✎
11:05
|
(5) Полностью белый ТабДок.
Я вообще не собираюсь каждый раз формировать отчет на СКД программно, я это делаю в учебных целях. Чтобы лучше понимать, как устроена система компоновки данных, из каких блоков состоит, как они взаимодействуют, что реально скрывается за интерфейсом визуального конструктора. К тому же часто возникает потребность программно "подпилить" отчет, сформированный с помощью СКД, тут понимание общей структуры системы тоже нужно. |
|||
7
Defender aka LINN
22.11.10
✎
11:11
|
Автополей нет
|
|||
9
Ns33
22.11.10
✎
11:30
|
Стало тоже интересно, глянул на другой пример, применил подсказку(7).
Надо после пункта 2.2 добавить: ВыбранноеПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Использование = Истина; |
|||
10
Kaidend
22.11.10
✎
11:47
|
(7), (9) Да, действительно, не хватало автополей, как-то я про них не подумал. Спасибо большое.
|
|||
11
Kaidend
22.11.10
✎
11:51
|
Сейчас код стал таким:
//1. создаем схему компоновки данных СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; //1.1 определяем источник данных для схемы //для наших целей - текущая ИБ Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); Источник.Имя = "ЛокальнаяБаза"; Источник.СтрокаСоединения = ""; Источник.ТипИсточникаДанных = "Local"; //1.2 определяем набор данных НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "Продажи"; НаборДанных.ИсточникДанных = "ЛокальнаяБаза"; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; НаборДанных.Запрос = ( "ВЫБРАТЬ | РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, | РеализацияТоваровУслугТовары.Сумма КАК СтоимостьОборот |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары" ); //1.2.1 добавляем поля ПолеНоменклатуры = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеНоменклатуры.Заголовок = "Номенклатура"; ПолеНоменклатуры.ПутьКДанным = "Номенклатура"; ПолеНоменклатуры.Поле = "Номенклатура"; ПолеСтоимости = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеСтоимости.Заголовок = "Стоимость"; ПолеСтоимости.ПутьКДанным = "СтоимостьОборот"; ПолеСтоимости.Поле = "Номенклатура"; //1.3 определяем ресурсы ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить(); ПолеРесурса.Выражение = "Сумма(СтоимостьОборот)"; ПолеРесурса.ПутьКДанным = "СтоимостьОборот"; //2. создаем настройки для схемы НастройкиКомпоновкиДанных = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; //2.1 определяем структуру //2.1.1 добавляем группировку "Номенклатура" ГруппировкаНоменклатуры = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); ПолеГруппировки = ГруппировкаНоменклатуры.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировки.Использование = Истина; ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Номенклатура"); АвтоПоле = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); АвтоПоле.Использование = Истина; ПолеСтоимости = ГруппировкаНоменклатуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ПолеСтоимости.Заголовок = "Стоимость"; ПолеСтоимости.Использование = Истина; ПолеСтоимости.Поле = Новый ПолеКомпоновкиДанных("СтоимостьОборот"); //2.2 определим выбранные поля ВыбранноеПоле = НастройкиКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Заголовок = "Стоимость"; ВыбранноеПоле.Использование = Истина; ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("СтоимостьОборот"); //3. готовим макет КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных); //4. исполняем макет ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет); ПроцессорКомпоновки.Сбросить(); //5. выводим результат ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ТабДок = Новый ТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДок); ПроцессорВывода.Вывести(ПроцессорКомпоновки); ТабДок.Показать(); |
|||
12
Kaidend
22.11.10
✎
11:57
|
Выводит отчет с заполненной колонкой номенклатура, но не выводит вторую колонку с просуммированой стоимостью номенклатуры. Хотя это ресурсное поле я добавил в выбранные поля группировки дополнительно к автополю. Что интересно, если после программного формирования схемы и настроек, но до формирования макета открыть схему конструктором и, ничего не меняя, нажать ОК, то стоимость начинает рассчитываться. Никто не знает, в чем тут загвоздка?
Еще одни не понятный момент - в новом варианте я вообще не использую объект КомпоновщикНастроекКомпоновкиДанных. Зачем он тогда вообще нужен? Методов, позволяющих осуществить визуальное редактирование как у конструктора схемы, у него нет, пользы от программной работы с ним я тоже не вижу. Зачем же он тогда все-таки нужен? |
|||
13
Defender aka LINN
22.11.10
✎
12:01
|
(12) Настройки компоновщика <> Настройки схемы по умолчанию.
"Методов, позволяющих осуществить визуальное редактирование как у конструктора схемы, у него нет" - Создай форму настройки. |
|||
14
Kaidend
22.11.10
✎
12:15
|
(13) Хм, когда я создаю основную форму отчета, использующего СКД, "автоматическим образом", в ней есть кнопка "Настройки...". Как я понимаю, именно эта кнопка вызывает диалог редактирования настроек, которые хранятся в компоновщике настроек.
У большинства, так сказать, стандартных действий, которые можно назначить кнопкам командной панели, есть простой аналог во встроенном языке. У этой кнопки, получается, нет? Я не могу создать свою обычную кнопку на форме, по нажатию на которую будет выполняться программной код, которой будет вызывать стандартный диалог редактирования настроек? Кнопка "Настройки..." делает "платформенную магию"? |
|||
15
Ns33
22.11.10
✎
13:51
|
!!!! ПолеСтоимости.Поле = "Номенклатура"; !!!!!
|
|||
16
Kaidend
22.11.10
✎
14:15
|
(15) Ой, да, идиотская ошибка, спасибо, что заметили.
|
|||
17
Black_Doctor
28.11.10
✎
20:37
|
ребята, а как то же самое сделать, к примеру с ТЗ???
просто у меня стоит задача, надо из ТЗ динамически формировать макет и выводить в табдок))) если будет ответ напишите сюда: v8: СКД 8.2 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |