Имя: Пароль:
1C
1С v8
Возможно ли ТаблицуЗначений по одной колонке свернуть, а по остальным сложить?
0 evorle145
 
30.05.12
11:21
Возможно ли ТаблицуЗначений Например:
Яблоко   МестоХранение1
Арбуз    МестоХранение2
Арбуз    МестоХранение3

Превратить в таблицу:
Яблоко   МестоХранение1
Арбуз    МестоХранение2 + МестоХранение3,

Я делаю так:

Для каждого стр из ТаблицаЗначений Цикл
//Собираю новую таблицу, в которой превращаю в строку вторую колонку //и складываю в случае равенства значения первой колонки.
КонецЦикла;

Может есть другой способ? Подскажите, пожалуйста
1 asady
 
30.05.12
11:22
(0)как правило это делают уже при выводе по группировке фрукт -
2 shuhard
 
30.05.12
11:22
(0) вообще то у свернуть два аргумента - что свернуть и что сложить
3 EasyRider
 
30.05.12
11:24
(2)строка не будет учитываться
4 EasyRider
 
30.05.12
11:24
выведет 0
5 evorle145
 
30.05.12
11:26
(2), дело в том, что во второй колонке не число
6 evorle145
 
31.05.12
12:44
может как-то в запросе это можно сделать? задача же часто встречается такая.
7 shuhard
 
31.05.12
12:48
(5) и решается циклом - неожиданно ?
8 Serginio1
 
31.05.12
16:33
Функция ПолучитьМассивСтрок(Тз,нач,кон)
   Массив= новый Массив(Кон-Нач+1);
   инд=0;
   Для сч=Нач по Кон Цикл
       Массив[инд]=Тз[сч];
       инд=инд+1;
   КонецЦикла;
   возврат Массив
КонецФункции

Функция глСгруппироватьТзПоПолю(Тз,Поле,ПоляСортировкиТзПоГруппе="") Экспорт
    перем Тип,Длина,Точность,ЕстьСпр,ЕстьДок;
    ЕстьСпр=0; ЕстьДок=0;
    //Тз.ПолучитьПараметрыКолонки(поле,тип,Длина,Точность);
    Колонка=Тз.Колонки.Найти(Поле);
    // Для того что бы правильно сртировались элементы с одинаковыми представление
    // Сначала отсортируем по внутреннему значению
    //а после группирования по представлению по возрастанию
    Сравнение=Новый СравнениеЗначений;
  //  Тз.Сортировать(ПолучитьСтрокуСортПоля(Поле,Тз,ЕстьСпр,ЕстьДок));
  ПоляСортировки=Поле;
  Если не пустаяСтрока(ПоляСортировкиТзПоГруппе) Тогда
      ПоляСортировки=ПоляСортировки+","+ПоляСортировкиТзПоГруппе
  КонецЕсли;
  Тз.Сортировать(ПоляСортировки,Сравнение);
    ТзФ=новый ТаблицаЗначений;
    ТзФ.Колонки.Добавить(Колонка.Имя,Колонка.типЗначения);
    ТзФ.Колонки.Добавить("ТзПоГруппе",Новый ОписаниеТипов("ТаблицаЗначений"));
    ТекСтр=0;
    Заявка=0;  
    НачСтр=-1;
    СтрТзф="";
    Если Тз.Количество()>0 Тогда
         
        Для сч=0 По Тз.Количество()-1 Цикл
            строка=тз[сч];
              ТекЗаявка=Строка[Поле];
             
              Если (Сч=0) или ( Заявка<>ТекЗаявка) Тогда
                   Если НачСтр>-1 Тогда
                        //ТекТз=СоздатьОбъект("ТаблицаЗначений");
                        //Тз.Выгрузить(ТекТз,НачСтр,сч-1);
                        ТекТз=Тз.Скопировать(ПолучитьМассивСтрок(Тз,НачСтр,сч-1));
                        СтрТзф.ТзПоГруппе=ТекТз;      
                   КонецЕсли;
                   
                  СтрТзф= ТзФ.Добавить();
                   Заявка=ТекЗаявка;
                  СтрТзф[Поле]=ТекЗаявка;
                   НачСтр=сч;
              КонецЕсли;    
              // глКлонироватьЗапись(Тз,сч,ТекТз)
         КонецЦикла;
         
         Если НачСтр>-1 Тогда
              ТекТз=Тз.Скопировать(ПолучитьМассивСтрок(Тз,НачСтр,Тз.Количество()-1));
              СтрТзф.ТзПоГруппе=ТекТз;
         КонецЕсли;
    КонецЕсли;
    //     ТзФ.ВыбратьСтроку();
    //Если (ЕстьСпр=1) или (ЕстьДок=1) Тогда
    //     Если ЕстьДок=1 Тогда
    //          ТзФ.Сортировать(Поле,1);
    //     Иначе
    //          ТзФ.Сортировать(Поле);
    //     КонецЕсли;
    //КонецЕсли;
    Возврат ТзФ;
КонецФункции

Функция СравнитьПоля(Структ,Строка)
   Для каждого стр из Структ Цикл
       Если Стр.Значение<>Строка[Стр.Ключ] Тогда
           возврат ложь
       КонецЕсли;
   КонецЦикла;    
       возврат истина
   КонецФункции
   
   Процедура ДобавитьПоля(Тз,ТзОриг,Поля) Экспорт
       если ПустаяСтрока(Поля) Тогда
           возврат
       КонецЕсли;
       
       МассивПолей=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Поля,",");
       Для каждого Поле из МассивПолей Цикл
    Колонка=ТзОриг.Колонки.Найти(Поле);
    Тз.Колонки.Добавить(Колонка.Имя,Колонка.типЗначения);
    КонецЦикла;

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

Процедура ПроссумироватьПоля(Тз,ТзСтрок,МассивСуммируемыхПолей)
    Для Каждого Стр из МассивСуммируемыхПолей Цикл
       Тз[стр] = ТзСтрок.Итог(Стр);
    КонецЦикла;
   
КонецПроцедуры

Функция глСгруппироватьТзПоПолям(Тз,Поля,СуммируемыеПоля,ПоляСортировкиТзПоГруппе="") Экспорт
    перем Тип,Длина,Точность,ЕстьСпр,ЕстьДок;
    ЕстьСпр=0; ЕстьДок=0;
    //Тз.ПолучитьПараметрыКолонки(поле,тип,Длина,Точность);
    если ПустаяСтрока(СуммируемыеПоля) Тогда
        МассивСуммируемыхПолей=Новый массив;
        Иначе
    МассивСуммируемыхПолей=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СуммируемыеПоля,",");
    КонецЕсли;
    Структ=Новый Структура(Поля);
   
    // Для того что бы правильно сртировались элементы с одинаковыми представление
    // Сначала отсортируем по внутреннему значению
    //а после группирования по представлению по возрастанию
    Сравнение=Новый СравнениеЗначений;
  //  Тз.Сортировать(ПолучитьСтрокуСортПоля(Поле,Тз,ЕстьСпр,ЕстьДок));
 
  ПоляСортировки=Поля;
  Если не пустаяСтрока(ПоляСортировкиТзПоГруппе) Тогда
      ПоляСортировки=ПоляСортировки+","+ПоляСортировкиТзПоГруппе
  КонецЕсли;
  Тз.Сортировать(ПоляСортировки,Сравнение);
 
    ТзФ=новый ТаблицаЗначений;
     ДобавитьПоля(ТзФ,Тз,Поля);
     ДобавитьПоля(ТзФ,Тз,СуммируемыеПоля);
     
     ТзФ.Колонки.Добавить("ТзПоГруппе",Новый ОписаниеТипов("ТаблицаЗначений"));
     
    ТекСтр=0;
    Заявка=0;  
    НачСтр=-1;
    СтрТзф="";
    Если Тз.Количество()>0 Тогда
         
        Для сч=0 По Тз.Количество()-1 Цикл
            строка=тз[сч];
                           
              Если (Сч=0) или не СравнитьПоля(Структ,Строка) Тогда
                   Если НачСтр>-1 Тогда
                        ТекТз=Тз.Скопировать(ПолучитьМассивСтрок(Тз,НачСтр,сч-1));
                        СтрТзф.ТзПоГруппе=ТекТз;
                        ПроссумироватьПоля(СтрТзф,ТекТз,МассивСуммируемыхПолей);
                   КонецЕсли;
                   
                  СтрТзф= ТзФ.Добавить();
                  Для каждого стр из Структ Цикл
                    Поле=Стр.Ключ;
                    Значение=Строка[поле];
                    Структ[Поле]=Значение;
                    СтрТзф[Поле]=Значение;
                 
                  КонецЦикла;
                   
                   НачСтр=сч;
              КонецЕсли;    
              // глКлонироватьЗапись(Тз,сч,ТекТз)
         КонецЦикла;
         
         Если НачСтр>-1 Тогда
              ТекТз=Тз.Скопировать(ПолучитьМассивСтрок(Тз,НачСтр,Тз.Количество()-1));
              СтрТзф.ТзПоГруппе=ТекТз;
              ПроссумироватьПоля(СтрТзф,ТекТз,МассивСуммируемыхПолей);
         КонецЕсли;
    КонецЕсли;
    //     ТзФ.ВыбратьСтроку();
    //Если (ЕстьСпр=1) или (ЕстьДок=1) Тогда
    //     Если ЕстьДок=1 Тогда
    //          ТзФ.Сортировать(Поле,1);
    //     Иначе
    //          ТзФ.Сортировать(Поле);
    //     КонецЕсли;
    //КонецЕсли;
    Возврат ТзФ;
КонецФункции
9 Ненавижу 1С
 
гуру
31.05.12
16:39
ссылки складывать нельзя
10 evorle145
 
31.05.12
17:00
(8), Спасибо, буду разбираться
Основная теорема систематики: Новые системы плодят новые проблемы.