Имя: Пароль:
1C
1С v8
СКД: Отображение данных в виде таблицы программным путём
0 Stolz
 
22.04.13
11:27
Доброго времени суток всем!

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

Организация    01.04.2013    02.04.2013    03.04.2013
АО МММ    2300    3400    3500
Русский дом Селенга    4300    2100    8700
Хопёр-Инвест    7800    2600    9800

Однако отчего-то заголовки периодов не выводятся, а вместо них отображается текст «Сумма»:

Организация    Сумма    Сумма    Сумма
АО МММ    2300    3400    3500
Русский дом Селенга    4300    2100    8700
Хопёр-Инвест    7800    2600    9800

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Период,
|    Организация,
|    СуммаОборот КАК Сумма
|ИЗ
|    РегистрНакопления.ДенежныеСредства.Обороты(, , РЕГИСТРАТОР)";
ТабСведения = Запрос.Выполнить().Выгрузить();

ТекСхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
ИсточникДанных = ТекСхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных";
ИсточникДанных.ТипИсточникаДанных = "Local";
НаборДанныхОбъект = ТекСхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НаборДанныхОбъект.Имя = "НаборДанныхОбъект";
НаборДанныхОбъект.ИмяОбъекта = "ДвиженияПоОрганизациям";
НаборДанныхОбъект.ИсточникДанных = "ИсточникДанных";

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

ПолеНабораДанных = НаборДанныхОбъект.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабораДанных.Поле = "Организация";
ПолеНабораДанных.ПутьКДанным = "Организация";
ПолеНабораДанных.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Организации");

ПолеНабораДанных = НаборДанныхОбъект.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабораДанных.Поле = "Сумма";
ПолеНабораДанных.ПутьКДанным = "Сумма";
ПолеНабораДанных.ТипЗначения = Новый ОписаниеТипов("Число");

ТекРесурс = ТекСхемаКомпоновкиДанных.ПоляИтога.Добавить();
ТекРесурс.Выражение = "Сумма(Сумма)";
ТекРесурс.ПутьКДанным = "Сумма";

ТекКомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
ТекКомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ТекСхемаКомпоновкиДанных));
ТекНастройки = ТекКомпоновщикНастроек.Настройки;

ТекТаблица = ТекНастройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
ТекТаблица.Использование = Истина;

ТекСтрокаГруппировки = ТекТаблица.Строки.Добавить();
ТекСтрокаГруппировки.Имя = "Строка";
ТекСтрокаГруппировки.Использование = Истина;

ПолеГруппировки = ТекСтрокаГруппировки.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Использование = Истина;
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Организация");

ТекКолонкаГруппировки = ТекТаблица.Колонки.Добавить();
ТекКолонкаГруппировки.Имя = "Колонка";
ТекКолонкаГруппировки.Использование = Истина;

ПолеГруппировки = ТекКолонкаГруппировки.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Использование = Истина;
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Период");

ВыбранныеПоля = ТекСтрокаГруппировки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранныеПоля.Использование = Истина;

ВыбранноеПоле = ТекНастройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Период");
ВыбранноеПоле.Использование = Истина;

ВыбранноеПоле = ТекНастройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Организация");
ВыбранноеПоле.Использование = Истина;

ВыбранноеПоле = ТекНастройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Сумма");
ВыбранноеПоле.Использование = Истина;

ЭлементСортировки = ТекСтрокаГруппировки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементСортировки.Поле = Новый ПолеКомпоновкиДанных("Период");
ЭлементСортировки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
ЭлементСортировки.Использование = Истина;

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

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

Вот, многоуважаемые гуру СКД, укажите, пожалуйста, в чём я неправ.
1 mistеr
 
22.04.13
11:38
Вызови стандартную форму настроек, и сразу увидишь, в чём неправ.
2 Stolz
 
22.04.13
11:42
(1)
Уже вызывал, до того как вопрос задавать. Не увидел, увы, - потому и спрашиваю.
3 Stolz
 
22.04.13
12:00
Что ж, отвечу сам себе.

После строк:

ВыбранныеПоля = ТекСтрокаГруппировки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранныеПоля.Использование = Истина;

Надо добавить:

ВыбранныеПоля = ТекКолонкаГруппировки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранныеПоля.Использование = Истина;

Всего-то. :-)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.