Имя: Пароль:
1C
1C 7.7
v7: Группировка строк ... Свернуть()?
,
0 BLP
 
07.07.16
00:20
Есть какая-то ТЗ с двумя колонками, поля  оба текстовые , например,
А а
А п
Б р
А ж
Б ю

Надо вывести в печатную таблицу в сгруппированном виде
А апж или ещё лучше а, п, ж
Б рю или р, ю

Т.Е. Получается свернуть() по первой колонке, а по второй сложить тексты.
Если бы там были чиста, то все понятно, сложилась бы общая сумма. А как быть в моей ситуации ?
1 ИсчадиеADO
 
07.07.16
00:27
2 списка значений каких нить. че сложного?
2 Изучаю1С8
 
07.07.16
00:27
Перебором
3 Злопчинский
 
07.07.16
01:39
Идем по исходной тз
Делаем новую тз
Каждое новое уник значение первой колонки порождает новую строку
Каждое новое уник значение второй колонки порождает новую колонку с 1 в ячейке
4 Злопчинский
 
07.07.16
01:40
это тупотнавскидку
Можно наверняка и красивее придумать
5 Это_mike
 
07.07.16
06:42
(4)  красиво - это 1с++ и группировать(). Но все равно перебор понадобится.
Или запросом 1sqlite (новой версии.
6 Ёпрст
 
07.07.16
09:25
(0) запрос на 1sqlite + group_concate

select Колонка1, Колонка2,group_concat(Колонка1) from tab group by Колонка1, Колонка2
7 skafandr
 
07.07.16
09:56
(3)
немного не так
1. Каждое новое уник значение первой колонки порождает новую строку
2. при повторе в первой колонке,добавлять к строке во второй колонке ","+значение второй колонки исходной таблицы.Если нужно не повторять букавки во второй колонке,сначала делать проверку на наличие в строке второй колнки попавшейся буквы
8 BLP
 
07.07.16
10:07
Спасибо за советы
Пытаюсь делать как в (3) т.к. Мне более-менее понятно
С остальными возможностями пока не "дружу" ;)
9 Это_mike
 
07.07.16
10:15
(7) проверка - долго. проще лобавлять во вложенный сз или вложенную тз
10 BLP
 
07.07.16
10:20
Пои итогам отпишусь, получилось-не получилось и что не получилось если не получилось )
11 skafandr
 
07.07.16
10:23
(8)
Не очень понимаю как для "вывести в печатную таблицу в сгруппированном виде" помогут новые колонки с 1.
По моему алгоритму во второй колонке новой таблицы сразу формируется строка для печати "а,п,ж".
12 Ёпрст
 
07.07.16
10:29
(8) че там делать то ?
Процедура Сформировать()
    Попытка
        база = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        база = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    база.Открыть(":memory:");
    запрос = база.НовыйЗапрос();    
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Колонка1","Строка");
    ТЗ.НоваяКолонка("Колонка2","Строка");
    Для к = 1 По 10 Цикл
        ТЗ.НоваяСтрока();
        ТЗ.Колонка1 = "Колонка"+к%2;
        ТЗ.Колонка2 = "Вася"+к;
    КонецЦикла;
    база.УложитьТЗ(ТЗ,"Табличка",0);
    ТекстЗапроса = "
    |select Колонка1,group_concat(Колонка2) from Табличка group by Колонка1";
    ТЗ  =    запрос.ВыполнитьЗапрос(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();
    Возврат;    
    ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();
КонецПроцедуры
13 Это_mike
 
07.07.16
10:30
(10) если не получится - не в форум писать надо, а заявление в отдел кадров...
14 BLP
 
07.07.16
10:45
(13) спасибо и за этот совет, но совсем не в тему из-за незнания ситуации.
И фирмы нет, и отдела кадров нет,  и бухгалтерии нет,  и конфа самописная для собственных целей и никак не связаная с бух учётом... так что... е надо умничать ;)

Остальным спасибо
(8) вот так и должно быть в идеале, что-то крутится вокруг да около, но "просто" не получается.

(12) спасибо!!!! Верю опыту, что так и должно быть.
Но Сейчас своё уже доделаю, посмотрю, хотя у меня "сложным путём все", потом попробую как в (12) - уверен, что лучше.

Тупо скопировать и юзать - это роще всего, а хочется разобраться на будущее, понять, чтобы такие для 1сГуру "простые" вопросы не задавать.
15 BLP
 
07.07.16
10:48
(11) я написал свой (8) когда еще не видел ваш (11)
Тоже учитываю спс
16 BLP
 
07.07.16
10:53
(7) 2. при повторе в первой колонке,добавлять к строке во второй колонке ","+значение второй колонки исходной таблицы.Если нужно не повторять букавки во второй колонке,сначала делать проверку на наличие в строке второй колнки попавшейся буквы

"Буковки" или их набор не повторяются ни у кого,  так что задача упрощается ;)
17 Это_mike
 
07.07.16
11:05
(14) задачка-то школьная.
18 BLP
 
07.07.16
11:11
(17) Верю, но за все время мне впервые пришлось столкнуться с такой задачкой и свернуть().

Сейчас прост для большей наглядности покажу что у меня получается и что НАДО получить

ЕСТЬ Список с людями и их номерами в выставчном каталоге :)

Aggersbol 249    
Aggersbol 250    
Aggersbol 251    
Akerman    19    
Alsmark   312    
Altier    320    
Ambo      147    
Ambo      173    

------------------------
НАДО чтобы было

Aggersbol 249, 250, 251
Akerman   19    
Alsmark   312    
Altier    320    
Ambo      147,173
19 BLP
 
07.07.16
11:17
В результате всего вот такой код у меня получился. Но выдает после формирования такое сообщение
TZ1.УстановитьЗначепние(CatNr,Str,"Nr1");
{C:\USERS\BLP\EXTFORMS\111.ERT(37)}: Number is out of the value range!
<code>
        TZ=CreateObject("ТаблицаЗначений");
        TZ1=CreateObject("ТаблицаЗначений");
        TZ2=CreateObject("ТаблицаЗначений");
        TZ.NewColumn("FIO");
        TZ.NewColumn("Nr");
        TZ1.NewColumn("FIO1");
        TZ1.NewColumn("Nr1");
        TZ2.NewColumn("FIO2");
        TZ2.NewColumn("Nr2");
        
        Док.SelectLines();
        While Док.GetLine()>0 Do
            TZ.NewLine();
            TZ.FIO=Док.Владелец;
            TZ.Nr=Док.NrCat;  
            
            TZ1.NewLine();
            TZ1.FIO1=Док.Владелец;
            TZ1.Nr1=Док.NrCat;
        EndDo;
        
        TZ1.GroupBy("FIO1","Nr1");
        
        TZ.SelectLines();
        While TZ.GetLine()>0 Do
            Str="";
            TZ1.НайтиЗначение(TZ.FIO,Str,"FIO1");
            CatNr=TZ1.ПолучитьЗначение(Str,"Nr1")+TZ.Nr;
            TZ1.УстановитьЗначение(CatNr,Str,"Nr1");
        EndDo;  
        
        TZ1.SelectLines();
        While TZ1.GetLine()>0 Do
            Tab.PutSection("List_DE");    
        EndDo;  

</code>
20 Это_mike
 
07.07.16
11:22
(19) a chto, russkii yazik - ne rodnoy?
21 BLP
 
07.07.16
11:28
(20) Нет,  надо на англ ). Честно.
Если и пишу код по-Русски (для быстроты) при написании, потом переделываю на англ
22 Ёпрст
 
07.07.16
11:29
(19)

// TZ1.УстановитьЗначение(CatNr,Str,"Nr1");
TZ1.SetValue(Str,"Nr1",CatNr);
23 BLP
 
07.07.16
11:30
(20) т.к. Не всегда русскоязычная Клава под рукой )
24 Это_mike
 
07.07.16
11:40
(21) возникает ТрадиционныйКитайскийВопрос™
хотя ответа на него я уже почему-то боюсь...
25 skafandr
 
07.07.16
11:45
Блин как замудрили то, с точностью до языка операторов

<code>
      Док.SelectLines();
        While Док.GetLine()>0 Do
            Str="";
       Если TZ.НайтиЗначение(Док.Владелец,Str,"FIO")>0 Тогда
            CatNr=TZ.ПолучитьЗначение(Str,"Nr");
            TZ.SetValue(Str,"Nr",CatNr+","+Док.NrCat);
       Иначе
            TZ.NewLine();
            TZ.FIO=Док.Владелец;
            TZ.Nr=Док.NrCat;  
       КонецЕсли;            
        EndDo;
      
        TZ.SelectLines();
        While TZ.GetLine()>0 Do
            Tab.PutSection("List_DE");    
        EndDo;      
  </code>
26 skafandr
 
07.07.16
11:45
сорри за кривость, ни разу код не вставлял
27 BLP
 
07.07.16
11:47
(19) Спасиб, ГЛАВНОЕ - получилось. Уже легче.
Только почему-то первый номер задваивается...
Вот что я получил на выходе.
<code>
Ahrend Kathrin      12, 12, 11, 10,                    
Almandinger Daniela 72, 72, 87,                    
Aymar Ulrich        185, 185, 186,                    
Bakker de Bruin     209, 209, 197,                    
Bekiesch Arin       127, 127, 128,                    
Bierlein Sandra     53, 53, 107,                    
Binder Lydia        78, 70, 71, 78,                    
Brauer Petra        56, 56, 59, 89,                    
Bцhm Christian      220, 220, 221,                    
Bьttner Romana      148, 148, 147,                    
Bьttner Thilo       223, 223,                    
Christen Heidi      20, 20, 4,                    
Dechant Brigitte    24, 24, 22,                    
</code>
28 BLP
 
07.07.16
12:01
Упс, некоторые посты удалены... Сыылки на их номера сбились...

(25) А вот в Вашем варианте получается так

Ahrend Kathrin 12,    
Ahrend Kathrin 11,    
Ahrend Kathrin 10,    
Almandinger Daniela Stefanie 72,    
Almandinger Daniela Stefanie 87,    
Aymar Ulrich 185,    
Aymar Ulrich 186,    

Т.е. не свернулось )))
29 BLP
 
07.07.16
12:20
(25) Упс, сорри за (28).
Тоже работает... и без 2-й ТЗ.
Но также выводит задвоенные первые номера как в отчете (27)
:(
30 BLP
 
07.07.16
12:24
Итак... почти (если не считать задвоенные первые номера) рабочий код (только с одной ТЗ).
Ребят, ну, помогите ышо, пжалста, как убрать дубли )))
<code>
Док = Form.Параметр;

Док.SortLines("Владелец");
Tab=CreateObject("Table");
Tab.SourceTable("Participants");

TZ=CreateObject("ТаблицаЗначений");
TZ.NewColumn("FIO");
TZ.NewColumn("Nr");

Док.SelectLines();
While Док.GetLine()>0 Do
    TZ.NewLine();
    TZ.FIO=Док.Владелец;
    TZ.Nr=""+Док.NrCat;  
EndDo;

Док.SelectLines();
While Док.GetLine()>0 Do
    Str="";    
    
    Если TZ.НайтиЗначение(Док.Владелец,Str,"FIO")>0 Тогда
        CatNr=TZ.ПолучитьЗначение(Str,"Nr");
        TZ.SetValue(Str,"Nr",CatNr+","+Док.NrCat);
    Иначе
        TZ.NewLine();
        TZ.FIO=Док.Владелец;
        TZ.Nr=Док.NrCat;  
    КонецЕсли;            
EndDo;
TZ.GroupBy("FIO","Nr");
TZ.SelectLines();
While TZ.GetLine()>0 Do
    Tab.PutSection("List_DE2");    
EndDo;      

Tab.Options(0,0,0,0,,"PrintExhibitors");
Tab.PageSetup(1,100,,10,,10,10,,,1,,глПолучитьПринтерПоУмолчанию());
Tab.Show("Print of List of Exhibitors","");

</code>
31 Ёпрст
 
07.07.16
12:26
(30) полный ПЭ..
Док.SelectLines();
While Док.GetLine()>0 Do
    TZ.NewLine();
    TZ.FIO=Док.Владелец;
    TZ.Nr=""+Док.NrCat;  
EndDo;

это выкини из кода нахрен
32 skafandr
 
07.07.16
12:28
Значит всё-таки в каких-то доках дублятся комнаты
вместо
  Если TZ.НайтиЗначение(Док.Владелец,Str,"FIO")>0 Тогда
        CatNr=TZ.ПолучитьЗначение(Str,"Nr");
        TZ.SetValue(Str,"Nr",CatNr+","+Док.NrCat);
Иначе


  Если TZ.НайтиЗначение(Док.Владелец,Str,"FIO")>0 Тогда
        CatNr=TZ.ПолучитьЗначение(Str,"Nr");
        Если Найти(CatNr,Док.NrCat)=0 Тогда
           TZ.SetValue(Str,"Nr",CatNr+","+Док.NrCat);
        КонецЕсли;
    Иначе
33 skafandr
 
07.07.16
12:30
а зачем первый раз то ТЗ заполняете?
я привел ПОЛНЫЙ текст - больше ничего не нужно
34 skafandr
 
07.07.16
12:32
(31) +500
35 BLP
 
07.07.16
12:48
(31) и (34) Согласен... )))) Просто уже в глазах все рябит... НО!
Теперь все СУПЕР как надО!!!
Спасиб, ГОСПОДА!!!!!!!!!!!!!
36 BLP
 
10.07.16
13:30
Еще раз спасибо всем. Прoстo всегда бoялся ТЗ, пoэтoму никoгда их не делал и не испoльзoвал, как тo oбхoдился другими спoсoбами.
Пoсле этoй темы, накoнец-тo, в этих ТЗ и СЗ разoбрался и... пoнеслo! Наклепал нoвых oбрабoтoк, o кoтoрых раньше тoка мечтал. )))