Имя: Пароль:
1C
1С v8
Колонки таблицы значений
0 ВежливаяТварь
 
20.02.12
18:10
Добрый день. Столкнулся с весьма специфической проблемой. Я вытягиваю из запроса информацию о продажах за определённый период. Выглядит так:

наименование   | склад      |сумма
раз            | основной   |сумма раз
раз            | херсон     |сумма два
раз            | Одесса     |сумма три

теперь мне нужно преобразовать эту таблицу в таблицу типа

Наименование |основной | херсон   |одесса
раз          |сумма раз|сумма два |сумма три

Как по содержанию колонки склад в первой ТЗ определить в какую колонку нужно заносить сумму во второй ТЗ?
1 Нуф-Нуф
 
20.02.12
18:12
через СКД?
2 Mort
 
20.02.12
18:13
(1) Скд горизонтальные группировки не выводит в ТЗ.
3 Шапокляк
 
20.02.12
18:14
(0)Выбираете различные склады и заносите в список.
Вычисляете количество элементов в получившемся списке.
формируете таблицу значений с колонками Склад1, склад2....Складn - по числу складов.
шебуршите свою первую таблицу. По складу из строки определяете ее положение в списке. Вносите в соответствующую колонку второй таблицы.
4 ВежливаяТварь
 
20.02.12
18:15
(3)"Вносите в соответствующую колонку второй таблицы." вот как раз в этом и проблема
5 Шапокляк
 
20.02.12
18:27
(4) В чем проблема-то?
Алгоритм:
1. Копируем первую таблицу и сворачиваем ее по складам (если возможны в ней повторы по складам).
2. Создаем список складов.Перебираем строки  таблицы из п.1. и вносим в список склады. Условно говоря, на выходе список с элементами основной, Херсон, Одесса, Урюпинск и т.д.
3. Создаем таблицу значений, Назовем ее ТЗ. Далее: ТЗ.Колонки.Добавить("Номенклатура"); Сч=СписокСкладов.Количество();
Для инд=1 ПО Сч Цикл
Эл=СписокСкладов.Получить(инд-1);
ИмяКолонки="Склад"+Строка(инд);
ТЗ.Колонки.Добавить(ИмяКолонки);
КонецЦикла;
4. Для Каждого Стр Из ПерваяТаблица Цикл
СтрТЗ=ТЗ.Добавить();
СтрТЗ.Номенклатура=Стр.Номенклатура;
Для инд=1 По Сч Цикл
Эл=СписокСкладов.Получить(инд-1);
Если Эл.Значение=Стр.Склад Тогда
СтрТЗ[инд]=Стр.Сумма;
Иначе
СтрТЗ[инд]=0;
КонецЕсли;
КонецЦикла;
например, так
6 Mort
 
20.02.12
18:31
Имхо цывильнее привязать колонки к складам по соответствию.
7 fisher
 
20.02.12
18:37
(4)
ТЗ1.Сортировать("Наименование,Склад", Новый СравнениеЗначений);
текНаименование = Неопределено;
Для Каждого СтрокаТЗ1 Из ТЗ1 Цикл
    Если текНаименование <> СтрокаТЗ1.Наименование Тогда
         СтрокаТЗ2 = ТЗ2.Добавить();
         СтрокаТЗ2.Наименование = СтрокаТЗ1.Наименование;
         текНаименование = СтрокаТЗ1.Наименование;
    КонецЕсли;
    СтрокаТЗ2[СоответствиеИндексовКолонок[СтрокаТЗ1.Склад]] = СтрокаТЗ1.Сумма;
КонецЦикла;
8 kosts
 
20.02.12
19:02
(0) Запрос сам все посчитает:

Таблица.наименование как наименование,    
Сумма(Выбор Когда Таблица.Склад = СсылкаОдесса Тогда сумма раз Иначе 0 Конец) как СуммаОдесса,
Сумма(Выбор Когда Таблица.Склад = СсылкаОсновной Тогда сумма два Иначе 0 Конец) как СуммаОсновной,
Сумма(Выбор Когда Таблица.Склад = СсылкаХерсон Тогда сумма три Иначе 0 Конец) как СуммаХерсон
Из Таблица как Таблица
Группировать
наименование  
9 ВежливаяТварь
 
20.02.12
19:23
Приблизительно понял. Огромное спасибо.