|   |   | 
| 
 | 1С 7.7. Группировка ТаблицыЗначений | ☑ | ||
|---|---|---|---|---|
| 0
    
        es3000 06.07.15✎ 22:57 | 
        Нужно сгруппировать таблицу значений. Типа как ИндексированнаяТаблица в 1С++.
 Вот здесь (http://www.1cpp.ru/forum/YaBB.pl?num=1436179378) посоветовали воспользоваться классом "ТаблицаГруппировок", который это делает. Вот ссылка откуда брал класс: http://itland.ru/forum//index.php?showtopic=15709&st=0&p=83328entry83328 Только я не понял как им пользоваться - нету описания. лТГ.ВНачалоВыборки(); Пока лТГ.Группировка("Склад") = 1 Цикл Пока лТГ.Группировка("Номенклатура") = 1 Цикл хххх КонецЦикла; КонецЦикла; Кто-нибудь может помочь? Что надо в цикле писать? | |||
| 1
    
        Злопчинский 07.07.15✎ 00:42 | 
        ТЗсклад = СоздатьОбъект("таблицаЗначений");
 ТЗ.Выгрузить(ТЗсклад,,,"Склад"); ТЗСклад.Свернуть("Склад",); ТЗсклад.ВыбратьСтроки(); Пока ТЗСклад.ПолучитьСтроку()=1 Цикл ТекущийСклад = ТЗСклад.Склад; ТЗраб = глОтобратьПоКОлонке(ТЗ,"Склад",ТекущийСклад); ТЗраб.ВыбратьСтроки(); Пока ТЗраб.ПолучитьСтроку()=1 Цикл ТекНОменклатура = ТЗраб.Номенклатура; .... Можно сделать рекурсивный алгоритм. На вход можно подать строку с идентификаторами группировок, и в рекурсии отфильтровывать штатными средствами. Я так делал - работает, кушать не просит... | |||
| 2
    
        es3000 07.07.15✎ 09:15 | 
        (1) "глОтобратьПоКолонке" - это твоя функция?
 то есть получается что итоги по группировкам нигде не хранятся, а рассчитываются "на лету"? | |||
| 3
    
        ДенисЧ 07.07.15✎ 09:17 | 
        А почему бы не взять саму индексированную таблицу?     | |||
| 4
    
        es3000 07.07.15✎ 09:19 | 
        (3) для ИТ нужно подключать 1С++,
 клиент не хочет использовать внешние компоненты, вот один вредный такой попался | |||
| 5
    
        dk 07.07.15✎ 09:31 | 
        непонятненько новый класс можно взять а индексированную таблицу нельзя?     | |||
| 6
    
        Масянька 07.07.15✎ 09:31 | 
        (4) А ты не говори про ВК... Просто - сделай.     | |||
| 7
    
        dk 07.07.15✎ 09:33 | 
        если количество группировок заранее известно, то тупо делаешь несколько ТЗ и группируешь до нужного уровня, муторно некрасиво но работает     | |||
| 8
    
        vcv 07.07.15✎ 09:35 | 
        У меня в конфе валяется такая функция, давно-давно взятая непонятно откуда. Вроде еще работает, не всё заменено на ИндексированнуюТаблицу
 Функция СоздатьГруппировкиВТаблице(табОтчета,Группировки,КолонкиДляСуммирования,ПоследняяГруппировка=0) экспорт Перем Тип,Длина,Точность; Перем зн1[20],ИдКолонки[20]; // подразумеваем, что макс. число группировок 20. должно хватить Состояние("Расчет итогов по группировкам..."); //счетнач=_GetPerformanceCounter(); Если табОтчета.КоличествоСтрок()=0 тогда // чтобы не глюкнуло для пустой таб=ПолучитьПустоеЗначение(); табОтчета.Выгрузить(таб); возврат таб; КонецЕсли; сзГруппировки=СоздатьОбъект("СписокЗначений"); сзГруппировки.ИзСтрокиСРазделителями(""""+СтрЗаменить(Группировки,",",""",""")+""""); сзКолонкиДляСуммирования=СоздатьОбъект("СписокЗначений"); сзКолонкиДляСуммирования.ИзСтрокиСРазделителями(""""+СтрЗаменить(КолонкиДляСуммирования,",",""",""")+""""); //сзТаблицы=СоздатьОбъект("СписокЗначений"); сзГруппировки1=СоздатьОбъект("СписокЗначений"); ПройденныеКолонки=""; Для с=1 по сзГруппировки.РазмерСписка() цикл ТекКолонка=сзГруппировки.ПолучитьЗначение(с); ПройденныеКолонки=ПройденныеКолонки+?(ПустоеЗначение(ПройденныеКолонки)=1,"",",")+ТекКолонка; сзГруппировки1.ВставитьЗначение(1,ПройденныеКолонки); КонецЦикла; ПредТаб=ПолучитьПустоеЗначение(); табОтчета.Выгрузить(ПредТаб); Для с=1 по сзГруппировки1.РазмерСписка() цикл ТекКолонки=сзГруппировки1.ПолучитьЗначение(с); сзТекКолонки=СоздатьОбъект("СписокЗначений"); сзТекКолонки.ИзСтрокиСРазделителями(""""+СтрЗаменить(ТекКолонки,",",""",""")+""""); КолТекКолонок=сзТекКолонки.РазмерСписка(); ПредТаб.Сортировать(ТекКолонки); // эта сортировка ускоряет сдвиг строк "чужих" в блоке // (весьма интересный эффект). в противном случае достаточно было ПредТаб сортировать один раз (при создании) таб=ПолучитьПустоеЗначение(); ПредТаб.Выгрузить(таб); таб.Свернуть(ТекКолонки,КолонкиДляСуммирования); //таб.Сортировать(ТекКолонки); // предполагаем, что сворачивание не нарушает сортировки Если (ПоследняяГруппировка=0) и (с=1) тогда ПредТаб=таб; продолжить; // не создаем вложенную таблицу в последней таб КонецЕсли; таб.НоваяКолонка("ВложеннаяТаблица","ТаблицаЗначений"); шабл_ВТ=ПолучитьПустоеЗначение(); ПредТаб.Выгрузить(шабл_ВТ,1,1); шабл_ВТ.УдалитьСтроки(); НачСтр=1; таб.ВыбратьСтроки(); Пока таб.ПолучитьСтроку()=1 цикл текВТ=ПолучитьПустоеЗначение(); шабл_ВТ.Выгрузить(текВТ); таб.ВложеннаяТаблица=текВТ; Для к=1 по КолТекКолонок цикл ТекИдКолонки=сзТекКолонки.ПолучитьЗначение(к); зн1[к]=таб.ПолучитьЗначение(таб.НомерСтроки,ТекИдКолонки); ИдКолонки[к]=ТекИдКолонки; КонецЦикла; ПереместитьБлок=0; СтрСтрокиСОтличиямиВнутриБлока=""; // бывает так, что представление у разных объектов одинаково // и при этом в таблице они могут перемешиваться друг с другом в порядке следования // т.е. метод сортировать() так работает // мы запомним такие строки, а замем переместим их все за пределы блока БылоБезОтличий=0; ПрерватьПеребор=0; Для i=НачСтр по ПредТаб.КоличествоСтрок() цикл //Если i>ПредТаб.КоличествоСтрок() тогда прервать КонецЕсли; НайденоОтличие=0; Для кк=1 по КолТекКолонок цикл // колонки быстрее просматривать в обратном порядке к=КолТекКолонок-кк+1; //ТекИдКолонки=ИдКолонки[к]; //ИдКолонки=сзТекКолонки.ПолучитьЗначение(к); зн2=ПредТаб.ПолучитьЗначение(i,ИдКолонки[к]); Если зн1[к]=зн2 тогда продолжить КонецЕсли; Если ПустоеЗначение(зн1[к])+ПустоеЗначение(зн2)=2 тогда продолжить КонецЕсли; Если ""+зн1[к]<>""+зн2 тогда // если представления отличаются, то значит здесь своих уже не будет // если уже были (поскольку сортируется ПредТаб по представлению) ПрерватьПеребор=1; Иначе СтрСтрокиСОтличиямиВнутриБлока=""+i+?(СтрСтрокиСОтличиямиВнутриБлока="","",","+СтрСтрокиСОтличиямиВнутриБлока); КонецЕсли; НайденоОтличие=1; прервать; КонецЦикла; Если НайденоОтличие=1 тогда Если БылоБезОтличий*ПрерватьПеребор=1 тогда ПереместитьБлок=1; Иначе продолжить КонецЕсли; ИначеЕсли i=ПредТаб.КоличествоСтрок() тогда ПереместитьБлок=1; КонецЕсли; Если ПереместитьБлок=1 тогда КолЧужихВБлоке=0; // перемещаем строки, в которых были отличия, после текущего блока Если СтрСтрокиСОтличиямиВнутриБлока<>"" тогда //Сообщить ("есть чужие в блоке!"+", "+зн1[1]); //ПредТаб.ВыбратьСтроку(); сз_строки_с_отличиями_внутри_блока =СоздатьОбъект("СписокЗначений"); сз_строки_с_отличиями_внутри_блока.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрСтрокиСОтличиямиВнутриБлока,",",""",""")+""""); КолЧужихВБлоке=сз_строки_с_отличиями_внутри_блока.РазмерСписка(); Для ii=1 по КолЧужихВБлоке цикл ТекЧужаяСтрока=0+сз_строки_с_отличиями_внутри_блока.ПолучитьЗначение(ii); ПредТаб.СдвинутьСтроку(i-ТекЧужаяСтрока-ii,ТекЧужаяСтрока); КонецЦикла; КонецЕсли; НачСтрокаВыгрузки=НачСтр; НачСтр=i-КолЧужихВБлоке; КонСтрокаВыгрузки=НачСтр-НайденоОтличие; ПредТаб.Выгрузить(текВТ,НачСтрокаВыгрузки,КонСтрокаВыгрузки); прервать; КонецЕсли; БылоБезОтличий=1; КонецЦикла; КонецЦикла; ПредТаб=таб; КонецЦикла; //счеткон=_GetPerformanceCounter(); //сообщить ("время запроса: "+(счеткон-счетнач)); Состояние(""); возврат таб; КонецФункции | |||
| 9
    
        es3000 07.07.15✎ 09:37 | 
        (5) я собирался взять новый класс и переделать его на обычные процедуры     | |||
| 10
    
        es3000 07.07.15✎ 09:37 | 
        (8) спасибо, буду разбираться     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |