Как сделать сводную таблицу?
30.07.2005
12:16
#1
"Есть таблица значений со следующими колонками:
Должность, Подразделение, Количество
с записями:
Должность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;Подразделение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С?"
31.07.2005
08:16
#2
"Ну если это объект "ТаблицаЗначений" то совсем просто - сделайте количество столбцов по количеству подразделений, а потом сверните по столбцу и все. Если это отчет, тогда добавьте объект "ТаблицаЗначений" . Например:
Таб=СоздатьОбъект("ТаблицаЗначений");
Таб.НоваяКолонка("Должност","Справочник.***",,,"Должность",,,);
Таб.НоваяКолонка("Подр1",Число",10,0,"Подр1",,,);
Таб.НоваяКолонка("Подр2",Число",10,0,"Подр2",,,);
Таб.НоваяКолонка("Подр3",Число",10,0,"Подр3",,,);
Таб.НоваяКолонка("Итого",Число",10,0,"Итого",,,);
//Обработка справочника должностей или сотрудников
Выбрать значения();
Пока ПолучитьЗначение()=1 Цикл
Таб.НоваяСтрока();
Таб.Должность=ТекущийЭлемент();
Если Подразделение=Подразд1 Тогда
Таб.Подр1=Число;
ИначеЕсли Подразделение=Подразд2 Тогда
Таб.Подр2=Число;
КонецЕсли;
КонецЦикла;
Таб.Свернуть("Должность","Подр1,Подр2");
Подробней читай в описании встроенного языка.
"
Таб=СоздатьОбъект("ТаблицаЗначений");
Таб.НоваяКолонка("Должност","Справочник.***",,,"Должность",,,);
Таб.НоваяКолонка("Подр1",Число",10,0,"Подр1",,,);
Таб.НоваяКолонка("Подр2",Число",10,0,"Подр2",,,);
Таб.НоваяКолонка("Подр3",Число",10,0,"Подр3",,,);
Таб.НоваяКолонка("Итого",Число",10,0,"Итого",,,);
//Обработка справочника должностей или сотрудников
Выбрать значения();
Пока ПолучитьЗначение()=1 Цикл
Таб.НоваяСтрока();
Таб.Должность=ТекущийЭлемент();
Если Подразделение=Подразд1 Тогда
Таб.Подр1=Число;
ИначеЕсли Подразделение=Подразд2 Тогда
Таб.Подр2=Число;
КонецЕсли;
КонецЦикла;
Таб.Свернуть("Должность","Подр1,Подр2");
Подробней читай в описании встроенного языка.
"
31.07.2005
08:26
#3
Количество подразделений - величина переменная, и их много. Поэтому забивать их вручную в программу не подходит.
31.07.2005
11:26
#5
Еще проще, сначала прогони и посчитай количество активных подразделений, потом в цикле создай нужное количество колонок и заполняй таблицу.
31.07.2005
18:55
#6
Вот как раз с заполнением-то и проблеммы...
Как позиционировать значения в таблице.
Можно пример кода?
Как позиционировать значения в таблице.
Можно пример кода?
01.08.2005
05:14
#7
"Тогда давайте определимся, у Вас есть исходная таблица значений:
Должность1;Подразделение1;Количество1;
Должность1;Подразделение2;Количество2;
Должность2;Подразделение1;Количество3;
Должность3;Подразделение2;Количество4;
В ней возможно любое количество должностей и подразделений.
Формируем два СпискаЗначений:
Должность=СоздатьОбъект("СписокЗначений");
Подразделение=СоздатьОбъект("СписокЗначений");
Таб.ВыбратьСтроки();//Перебираем исходную таблицу
Пока Таб.ПолучитьСтроку()=1 Цикл
Если Должность.НайтиЗначение(Таб.Должность)=0 Тогда
Должность.ДобавитьЗначение(Таб.Должность);
КонецЕсли;
Если Должность.НайтиЗначение(Таб.Подразделение)=0 Тогда
Подразделение.ДобавитьЗначение(Таб.Подразделение);
КонецЕсли;
На основании этих списков формируем итоговую таблицу:
ТабИтог=СоздатьОбъект("ТаблицаЗначений");
ТабИтог.ДобавитьСтолбец("Должность","Текст");
КолПодр=Подразделение.РазмерСписка();
Для i=1 по КолПодр Цикл
Подразделение.ПолучитьЗначение(i,Подр);
ТабИтог.ДобавитьСтолбец(Подр,"Число");
КонецЦикла;
ТабИтог.ДобавитьСтолбец("Итог","Число");
Дальше выгружаешь исходную таблицу, подразделения позиционируются по наименованию столбцов. "
Должность1;Подразделение1;Количество1;
Должность1;Подразделение2;Количество2;
Должность2;Подразделение1;Количество3;
Должность3;Подразделение2;Количество4;
В ней возможно любое количество должностей и подразделений.
Формируем два СпискаЗначений:
Должность=СоздатьОбъект("СписокЗначений");
Подразделение=СоздатьОбъект("СписокЗначений");
Таб.ВыбратьСтроки();//Перебираем исходную таблицу
Пока Таб.ПолучитьСтроку()=1 Цикл
Если Должность.НайтиЗначение(Таб.Должность)=0 Тогда
Должность.ДобавитьЗначение(Таб.Должность);
КонецЕсли;
Если Должность.НайтиЗначение(Таб.Подразделение)=0 Тогда
Подразделение.ДобавитьЗначение(Таб.Подразделение);
КонецЕсли;
На основании этих списков формируем итоговую таблицу:
ТабИтог=СоздатьОбъект("ТаблицаЗначений");
ТабИтог.ДобавитьСтолбец("Должность","Текст");
КолПодр=Подразделение.РазмерСписка();
Для i=1 по КолПодр Цикл
Подразделение.ПолучитьЗначение(i,Подр);
ТабИтог.ДобавитьСтолбец(Подр,"Число");
КонецЦикла;
ТабИтог.ДобавитьСтолбец("Итог","Число");
Дальше выгружаешь исходную таблицу, подразделения позиционируются по наименованию столбцов. "
01.08.2005
15:36
#8
"Спасибо, вот дополненная рабочая процедура:
Процедура Вывод(Таб)
//в Таб передаётся исходная таблица
СпДолжность=СоздатьОбъект("СписокЗначений");
СпПодразделение=СоздатьОбъект("СписокЗначений");
Таб.ВыбратьСтроки();//Перебираем исходную таблицу
Пока Таб.ПолучитьСтроку()=1 Цикл //Сюда надо будет добавить выгрузку из таблицы
Если СпДолжность.НайтиЗначение(Таб.Должность)=0 Тогда
СпДолжность.ДобавитьЗначение(Таб.Должность);
КонецЕсли;
Если СпПодразделение.НайтиЗначение(Таб.Подразделение)=0 Тогда
СпПодразделение.ДобавитьЗначение(Таб.Подразделение);
КонецЕсли;
СпПодразделение.Сортировать();
КонецЦикла;
ТабИтог=СоздатьОбъект("ТаблицаЗначений");
ТабИтог.НоваяКолонка("Должность","Текст");
КолПодр=СпПодразделение.РазмерСписка();
Для i=1 по КолПодр Цикл //Создаём новые колонки подразделений
ТабИтог.НоваяКолонка(,"Число",,,,3);
КонецЦикла;
ТабИтог.НоваяКолонка("Итог","Число");
КолДолж=СпДолжность.РазмерСписка();
Для i=1 по КолДолж Цикл //Заполнение наименования должностей
ТабИтог.НоваяСтрока();
ТабИтог.Должность=СпДолжность.ПолучитьЗначение(i);
КонецЦикла;
ТабИтог.НоваяСтрока();
ТабИтог.Должность="Итого по подраздел.:";
Таб.ВыбратьСтроки();//Перебираем исходную таблицу
Пока Таб.ПолучитьСтроку()=1 Цикл
Стр=СпДолжность.НайтиЗначение(Таб.Должность);
Кол=СпПодразделение.НайтиЗначение(Таб.Подразделение)+1;
ТабИтог.УстановитьЗначение(Стр,Кол,Таб.Сотруд);
КонецЦикла;
//Рассчитываем итоги
Для Стр=1 по КолДолж Цикл
ИтогПоДолжн=0;
Для Кол=1 по КолПодр Цикл
ИтогПоДолжн=ИтогПоДолжн+ТабИтог.ПолучитьЗначение(Стр, Кол+1);
Если Стр=КолДолж Тогда //Заполним итоги по подразделениям
ТабИтог.УстановитьЗначение(КолДолж+1,Кол+1,ТабИтог.Итог(Кол+1)); //Итоги по подразделениям
КонецЕсли;
КонецЦикла;
ТабИтог.УстановитьЗначение(Стр,"Итог",ИтогПоДолжн); //Итоги по должностям
КонецЦикла;
ТабИтог.УстановитьЗначение(КолДолж+1,"Итог",ТабИтог.Итог("Итог")); //Общий Итог
КонецПроцедуры
Кстати, у вас вот этот участок:
Для 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)