Имя: Пароль:
1C
1C 7.7
v7: Группировки и Свернуть() по таблице значений
0 EverGreenMouse
 
01.10.15
13:35
внимательно, это 7.7 :)

Итак сабж: выгружаю ТЧ документа в таблицу значений.
ТЧ документа имеет вид
Расх.накл. | Клиент | адрес доставки.

Обрабатываю таблицу значений:
выбратьСтроки();
    пока получитьСтроку() = 1 Цикл
        тбл.НоваяСтрока();
        тбл.Клиент = Клиент;
        тбл.АдресДоставки = АдресДоставки;
        тбл.НомерДок = Накладная.НомерДок;
    КонецЦикла;    


Суть в следующем. В макете при печать должно в одной ячейке выходить Клиент, АдресДоставки и номера всех расходных накладных по клиенту,  а так же может быть один клиент, но разные адреса доставки. То есть, в случае совпадения Клиента и Адреса, выводить список накладных по этим параметрам.
1 jurassic
 
01.10.15
13:36
понял
2 EverGreenMouse
 
01.10.15
13:37
(1) как-то я криво написал.

Попытаюсь еще разок.
В ТЧ документа есть три колонки. В случае, если Клиент и АдресДоставки одинаковые в нескольких строках, то расходные накладные для этих строк при печати должны выводиться через запятую.
3 jurassic
 
01.10.15
13:38
понял ещё раз
4 torgm
 
01.10.15
13:40
(0) отсортируй по контрагенту адресу доставки, и формируй там все в один проход делается
5 Mikeware
 
01.10.15
13:41
(2) Сделай!©
в чем проблема-то?
6 EverGreenMouse
 
01.10.15
13:45
Ну хорошо. Как правильно тогда параметр макета описать?
Сейчас там
СокрЛП(тбл.Клиент) + ", " + СокрЛП(тбл.АдресДоставки)+" , Расх.накл №"+СокрЛП(тбл.НомерДок)
Разумеется, он выводит только одну накладную. А как вывести все, через запятую?
7 mehfk
 
01.10.15
13:46
2000р.
8 ДенисЧ
 
01.10.15
13:48
Пригласить программиста
9 EverGreenMouse
 
01.10.15
13:49
(7) ну нет) (8) Как бы я, но с 7 я не работал никогда. В 8ке я бы запросом решил проблему за 5 минут, а тут хз
10 Mikeware
 
01.10.15
13:49
циклом, циклом....
Ну, или 1с++, ИТЗ, Группировать...
11 Смотрящий
 
01.10.15
13:51
(0) Вложенную таблицу сделай
12 torgm
 
01.10.15
13:52
(6) Сторожилы бают, что строки частями можно складывать... Врут наверное...
13 EverGreenMouse
 
01.10.15
13:55
(12) Можно, но допетрить не могу, как это сделать. Объявить переменную, в нее складывать строки и ее выводить в параметр макета? Это вроде логично, но как оформить заполнение этой переменной?
14 ДенисЧ
 
01.10.15
13:56
(9) В 8ке запросом ты бы объединил несколько строк? Сказки в другом месте рассказывай...
15 jurassic
 
01.10.15
13:57
(13) если текущий равен предыдущему, складывать, иначе заводить с нуля. конец если
16 EverGreenMouse
 
01.10.15
13:57
(14) нет, не объединил бы, а сгруппировал как надо и результат запроса по группировкам складывал бы в строку и хорошо
17 ДенисЧ
 
01.10.15
13:58
(16) Так и тут группируй, кто мешает?
18 jurassic
 
01.10.15
13:59
(16) нуну
19 Ёпрст
 
01.10.15
13:59
(0) sqllite + group_concat, это ежели в запросе.
А так, ИТЗ + группировать, если по-простому
20 EverGreenMouse
 
01.10.15
14:21
Ок. Перейдем еще проще. Есть таблица значений
Расх.накл | Клиент | Адрес
расх1       клиент1  адрес1
расх2       клиент1  адрес1
расх3       клиент2  адрес2

Как путем семерки объединить все накладные, идущие по одному клиенту и на один адрес? понятно, что в цикле в цикле. но как их правильно организовать?
21 hhhh
 
01.10.15
14:28
всенакладные = перваянакладная;

Пока Траляля Цикл

   ВсеНакладные + ", " + следующаянакладная;

КонецЦикла;

СокрЛП(тбл.Клиент) + ", " + СокрЛП(тбл.АдресДоставки)+" , " ВсеНакладные
22 jurassic
 
01.10.15
14:28
(20) так и скажи: я ни черта не понял
23 mehfk
 
01.10.15
14:31
(20) 5000р.
24 torgm
 
01.10.15
14:32
(21) условие поставь на контрагента адрес
25 Ёпрст
 
01.10.15
14:32
(20)
ИТЗ.Группировать("Вася:*Клиент,*Адрес");
26 Ёпрст
 
01.10.15
14:33
если не использовать ИТЗ, то примитив
ТЗ.Сортировать("Контрагент,Адрес") и обход тз. всё
27 Serginio1
 
01.10.15
14:35
28 Дмитрий
 
01.10.15
14:37
При записи в таблицу проверяй на наличие строки с клиентом и адресом, если такая строка есть, добавляй накладную к реквизиту накладная
29 Ёпрст
 
01.10.15
14:38
(27) у него же не снеговик, в клюшках всё проще
30 Serginio1
 
01.10.15
14:50
(29) Там и для клюшек
31 Ёпрст
 
01.10.15
14:57
(30) в каком месте ? Предлагаешь автору транслировать твой код в клюшки самостоятельно ? :)
32 EverGreenMouse
 
01.10.15
15:01
Все, победил. Спасибо всем)
???.???????????("??????, ?????????????, ????????", "");
????????? = "";
????????  = -1;
????       = "";  
???.?????????????();
???? ???.??????????????()=1 ????
    ???? = ??????(???? + ???.???????? + " | ");
     ???? ????????=-1 ?????
         ???????? = ???.?????????????;
         ????????? = ???.??????
     ????????? (????????<>???.?????????????) ? (?????????<>???.??????)  ?????
                ???.?????????????("???");
             ???????? = ???.?????????????;
             ????????? = ???.??????;
             ???? = "";
     ?????????;
??????????;
33 EverGreenMouse
 
01.10.15
15:01
ОУ
34 Serginio1
 
01.10.15
15:02
(31) Там внутри находятся обработки. Я кстати очень часто их применяю для группировки данных
35 Масянька
 
01.10.15
15:03
(33) Пе-ре-ве-ди (С)
36 EverGreenMouse
 
01.10.15
15:07
тбл.Сортировать("Клиент, АдресДоставки, НомерДок", "");
ТекКлеинт = "";
ТекАдрес = -1;
Расх = "";
тбл.ВыбратьСтроки();
Пока тбл.ПолучитьСтроку()=1 цикл
   Расх = Строка(Расх + Тбл.НомерДок + " | ");
    Если ТекАдрес=-1 Тогда
       ТекАдрес = тбл.АдресДоставки;
       ТекКлиент = Тбл.Клиент;
    ИначеЕсли (ТекАдрес<>тбл.АдресДоставки) И (ТекКлиент<>тбл.Клиент Тогда
       таб.ВывестиСекцию("стр");
       ТекАдрес = тбл.АдресДоставки;
       ТекКлиент = тбл.Клиент;
       Расх = "";
    КонецЕсли;
КлонецЦикла;
37 jurassic
 
01.10.15
15:08
Клеинт - это специалист по женскому вопросу?
38 EverGreenMouse
 
01.10.15
15:09
(37) Да. Он самый
39 Serginio1
 
01.10.15
15:09
40 Serginio1
 
01.10.15
15:15
(36) У тебя будут проблемы если будут дубли
Функция ПолучитьСтрокуСортПоля(Колонка,Тз,ЕстьСпр,ЕстьДок)
    перем Тип,Длина,Точность;
    поле=Тз.ПолучитьПараметрыКолонки(Колонка,тип,Длина,Точность);
    
    Тип=Врег(Тип);
    
    Если Найти(Тип,"СПРАВОЧНИК")=1 Тогда
        ЕстьСпр=1;
        Резулт=Колонка+"*"
    ИначеЕсли     Найти(Тип,"ДОКУМЕНТ")=1 Тогда
        ЕстьДок=1;
        Резулт=Колонка+"*"
    Иначе
        Резулт=Колонка;
    КонецЕсли;
    
    Возврат Резулт    
КонецФункции // ПолучитьСтрокуСортПоля
41 Serginio1
 
01.10.15
15:16
То есть нужно сортировать
тбл.Сортировать("Клиент*, АдресДоставки, НомерДок", "");
Тогда сортировка будет по ID
42 Serginio1
 
02.10.15
14:37
(27) Кстати в Linq есть аналог Group by с выводом детальных записей с агрегатными функциями
Code First и Linq to EF на примере 1С версии 7.7

Я очень часто использую 27 как в 7 ке так и в 8 ке. Оочень удобно.
Такой вариант можно было бы сделать и для ИТЗ

Кстати    Ёпрст а почему не хочешь изучать .Net.
Очень удобно через него расширять возможности 7 ки. Да и в 8 ке полно задач решаемых с помощью стандатрных сборок
43 Ёпрст
 
02.10.15
14:57
(42)с клюшками почти не работаем уже, да и лень
44 Serginio1
 
02.10.15
15:28
(43) Не верю, что ты ленивый. Что же реально мешает? Всегда хочется познать новое и применить знания. Да и время судя по количеству постов на форуме есть.
8 ку же изучил.
45 SiAl-chel
 
05.10.15
09:38
(0) Используй черный запрос про документам. Группировки: Клиент, Адрес доставки, Реализация (Упорядочивание по номеру). Циклы используешь с учетом группировок. В исходную таблицу выводи строки во второй группировке (Адрес доставки), но после цикла по третьей группировке (Реализация), потому что во второй группировке будешь формировать строку с номерами накладных.
НомераНакладных = "";
Пока Запрос.Группировка(3) = 1 Цикл
    НомераНакладных = НомераНакладных + ?(ПустаяСтрока(НомераНакладных) = 1, "", ", ") + Запрос.ЗначениеУпорядочивания(3, 1);
КонецЦикла;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший