Как сделать сводную таблицу?

Новая тема
"Есть таблица значений со следующими колонками:

Должность, Подразделение, Количество

с записями:

Должность1;Подразделение1;Количество1;

Должность1;Подразделение2;Количество2;

Должность2;Подразделение1;Количество3;

Должность3;Подразделение2;Количество4;

и т.д.

Нужно сделать сводную таблицу:

-------------------------------------------------------------

|__________|Подразделен1|Подразделен2|Итого |

-------------------------------------------------------------

|Должность1| Количество1  | Количество2  |Итого1|

|Должность2| Количество3  |____________|Итого2|

|Должность3|____________| Количество4  |Итого3|

-------------------------------------------------------------

|__ИТОГО___|__ИТОГО1___|___ИТОГО2__|ВСЕГО|

Как это сделать средствами языка 1С?"
"Ну если это объект "ТаблицаЗначений" то совсем просто - сделайте количество столбцов по количеству подразделений, а потом сверните по столбцу и все. Если это отчет, тогда добавьте объект "ТаблицаЗначений" . Например:

       Таб=СоздатьОбъект("ТаблицаЗначений");

Таб.НоваяКолонка("Должност","Справочник.***",,,"Должность",,,);

Таб.НоваяКолонка("Подр1",Число",10,0,"Подр1",,,);

Таб.НоваяКолонка("Подр2",Число",10,0,"Подр2",,,);

Таб.НоваяКолонка("Подр3",Число",10,0,"Подр3",,,);

Таб.НоваяКолонка("Итого",Число",10,0,"Итого",,,);

//Обработка справочника должностей или сотрудников

       Выбрать значения();

       Пока ПолучитьЗначение()=1 Цикл

           Таб.НоваяСтрока();

           Таб.Должность=ТекущийЭлемент();

           Если Подразделение=Подразд1 Тогда

               Таб.Подр1=Число;

           ИначеЕсли Подразделение=Подразд2 Тогда

               Таб.Подр2=Число;

           КонецЕсли;  

        КонецЦикла;

        Таб.Свернуть("Должность","Подр1,Подр2");

Подробней читай в описании встроенного языка.          

   

"
Количество подразделений - величина переменная, и их много. Поэтому забивать их вручную в программу не подходит.
а в цикле добавлять колонки уже имея исходную ТЗ?
Еще проще, сначала прогони и посчитай количество активных подразделений, потом в цикле создай нужное количество колонок и заполняй таблицу.
Вот как раз с заполнением-то и проблеммы...

Как позиционировать значения в таблице.

Можно пример кода?
"Тогда давайте определимся, у Вас есть исходная таблица значений:

Должность1;Подразделение1;Количество1;

Должность1;Подразделение2;Количество2;

Должность2;Подразделение1;Количество3;

Должность3;Подразделение2;Количество4;

В ней возможно любое количество должностей и подразделений.

Формируем два СпискаЗначений:



Должность=СоздатьОбъект("СписокЗначений");

Подразделение=СоздатьОбъект("СписокЗначений");

Таб.ВыбратьСтроки();//Перебираем исходную таблицу

Пока Таб.ПолучитьСтроку()=1 Цикл

Если Должность.НайтиЗначение(Таб.Должность)=0 Тогда

  Должность.ДобавитьЗначение(Таб.Должность);

КонецЕсли;

Если Должность.НайтиЗначение(Таб.Подразделение)=0 Тогда

  Подразделение.ДобавитьЗначение(Таб.Подразделение);

КонецЕсли;



На основании этих списков формируем итоговую таблицу:



ТабИтог=СоздатьОбъект("ТаблицаЗначений");

ТабИтог.ДобавитьСтолбец("Должность","Текст");

КолПодр=Подразделение.РазмерСписка();

Для i=1 по КолПодр Цикл

Подразделение.ПолучитьЗначение(i,Подр);

ТабИтог.ДобавитьСтолбец(Подр,"Число");

КонецЦикла;

ТабИтог.ДобавитьСтолбец("Итог","Число");



Дальше выгружаешь исходную таблицу, подразделения позиционируются по наименованию столбцов.                      "
"Спасибо, вот дополненная рабочая процедура:

Процедура Вывод(Таб)

//в Таб передаётся исходная таблица

СпДолжность=СоздатьОбъект("СписокЗначений");

СпПодразделение=СоздатьОбъект("СписокЗначений");

Таб.ВыбратьСтроки();//Перебираем исходную таблицу

Пока Таб.ПолучитьСтроку()=1 Цикл  //Сюда надо будет добавить выгрузку из таблицы

Если СпДолжность.НайтиЗначение(Таб.Должность)=0 Тогда

СпДолжность.ДобавитьЗначение(Таб.Должность);

КонецЕсли;

Если СпПодразделение.НайтиЗначение(Таб.Подразделение)=0 Тогда

СпПодразделение.ДобавитьЗначение(Таб.Подразделение);

КонецЕсли;

СпПодразделение.Сортировать();

КонецЦикла;

ТабИтог=СоздатьОбъект("ТаблицаЗначений");

ТабИтог.НоваяКолонка("Должность","Текст");

КолПодр=СпПодразделение.РазмерСписка();

Для i=1 по КолПодр Цикл //Создаём новые колонки подразделений

ТабИтог.НоваяКолонка(,"Число",,,,3);

КонецЦикла;

ТабИтог.НоваяКолонка("Итог","Число");

КолДолж=СпДолжность.РазмерСписка();

Для i=1 по КолДолж Цикл //Заполнение наименования должностей

ТабИтог.НоваяСтрока();

ТабИтог.Должность=СпДолжность.ПолучитьЗначение(i);

КонецЦикла;

ТабИтог.НоваяСтрока();

   ТабИтог.Должность="Итого по подраздел.:";

Таб.ВыбратьСтроки();//Перебираем исходную таблицу

Пока Таб.ПолучитьСтроку()=1 Цикл

Стр=СпДолжность.НайтиЗначение(Таб.Должность);

Кол=СпПодразделение.НайтиЗначение(Таб.Подразделение)+1;

ТабИтог.УстановитьЗначение(Стр,Кол,Таб.Сотруд);

КонецЦикла;

//Рассчитываем итоги

Для Стр=1 по КолДолж Цикл  

    ИтогПоДолжн=0;

Для Кол=1 по КолПодр Цикл

        ИтогПоДолжн=ИтогПоДолжн+ТабИтог.ПолучитьЗначение(Стр, Кол+1);

Если Стр=КолДолж Тогда //Заполним итоги по подразделениям

ТабИтог.УстановитьЗначение(КолДолж+1,Кол+1,ТабИтог.Итог(Кол+1)); //Итоги по подразделениям

КонецЕсли;

КонецЦикла;

ТабИтог.УстановитьЗначение(Стр,"Итог",ИтогПоДолжн); //Итоги по должностям

КонецЦикла;

ТабИтог.УстановитьЗначение(КолДолж+1,"Итог",ТабИтог.Итог("Итог")); //Общий Итог

КонецПроцедуры



Кстати, у вас вот этот участок:

Для i=1 по КолПодр Цикл

Подразделение.ПолучитьЗначение(i,Подр);

ТабИтог.ДобавитьСтолбец(Подр,"Число");

КонецЦикла;

не присваивает названиям колонок наименования подразделений

Их вообще никак невозможно присвоить, т.к. некоторые подразделения состоят из нескольких слов..."
Читают тему
(гостей: 1)

Быстрый переход