|
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); КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |