Имя: Пароль:
1C
 
СКД: полностью программное создание отчета
,
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
AdBlock убивает бесплатный контент. 1Сергей