|
ВычислитьВыражение для группировки | ☑ | ||
---|---|---|---|---|
0
magicSan
24.11.22
✎
09:33
|
Вид результата:
группировка1 80 запись1 100 запись2 15 запись3 5 Из первой записи на уровне группировки необходимо вычитать вторую, через условное если маскировать отрицательно скобки появляются с первая последняя сколько не крутил - не выходит. |
|||
1
Philix
24.11.22
✎
10:57
|
(0) Предлагаю смухлевать: сделать еще одну колонку "ПоказательДляИтогов", в которую засунуть числовые показатели со знаками, пригодными для простого суммирования. В отчет выводить детальные записи исходные, а суммировать и выводить в итог группировки "ПоказательДляИтогов"
|
|||
2
Fedor-1971
24.11.22
✎
11:31
|
(0) Отчёт на СКД делаешь?
|
|||
3
magicSan
24.11.22
✎
12:15
|
(1) когда сюда постил уже так решил проблему, но выглядит как костыль.
(2) да |
|||
4
Fedor-1971
24.11.22
✎
12:24
|
(3) тогда смотри в сторону вычисляемых полей (там функции работы с массивами)
|
|||
5
magicSan
24.11.22
✎
14:20
|
(4) Не поверишь, но так и написал в заголовке темы.
|
|||
6
Said_We
24.11.22
✎
14:26
|
(0) Нарисуй что на входе и что должно быть на выходе.
|
|||
7
lodger
24.11.22
✎
15:04
|
а если применить простые арифметические операторы?
сумма(твоё поле) - максимум(твоё поле) 120 - 100 = 20 максимум - сумма 100 - 120 = -20 2* максимум - сумма 200 - 120 = 80 |
|||
8
Fedor-1971
24.11.22
✎
15:09
|
(7) ему нужно от первой записи в группировке отнять последующие,
т.е. по факту: первая 50, максимум 70, а сумма всех 140 |
|||
9
Fedor-1971
24.11.22
✎
15:14
|
8+ тут нужно определить признак, что вот эта запись первая, а остальные отнимаем
т.е. примерно как в (1) добавляем колонку ПерваяЗапись и Расходы с минусом и в пользовательское поле пишем, простая запись ПП = ПолеИзЗапроса, а для группы Сумма(ПерваяЗапись) + Сумма(Расходы) Основная беда, в том, что пользователь может сам перестроить группировки и будет лажа В таком раскладе само просто делать отчёт на простом макете |
|||
10
magicSan
24.11.22
✎
15:25
|
(6) в теме указан источник данных и результат.
В моем видении оно должно выглядеть примерно так в ресурсах: ВычислитьВыражение("сумма(Часов)",,,"Первая","Первая")+ВычислитьВыражение("сумма(Часов)",,,"Первая(2)","Последняя") но как я не менял параметры выдается какая то дичь, внутри группировки так ничего и не удалось посчитать, я и её указывал и типРасчетов менял. |
|||
11
Said_We
24.11.22
✎
15:29
|
(10) Если честно, я не увидел ни задания ни результата.
|
|||
12
Said_We
24.11.22
✎
15:42
|
(0)
Из первой записи необходимо вычесть вторую и куда результат записать? Где результат 75? запись1 100 запись2 15 запись.... |
|||
13
Said_We
24.11.22
✎
15:43
|
85
|
|||
14
Said_We
24.11.22
✎
15:50
|
(10) Что бы не парится с СКД - нарисуй на чистом запросе нужный результат и просто его выводи.
|
|||
15
Fedor-1971
24.11.22
✎
15:57
|
(10) По факту: ты к сумме часов добавил сумму второй и последующих строк из группировки
Пробуй указать имя группировки: ВычислитьВыражение(Выражение, "ИмяГруппы", ТипРасчета, Начало, Конец, ... Но в таком виде отчёт будет эквивалентен простому макету |
|||
16
Said_We
24.11.22
✎
16:22
|
row_number() - можно использовать для того, что бы знать первая это строка или нет.
Такая конструкция в 1С не поддерживается: row_number() over(partition by ПолеГруппировки1, Полегруппировки2... order by ПолеПорядка1, ПолеПорядка2) as npp Но её можно получить искусственно соединив таблицу саму с собой. В результате получить таблицу с нумерацией по каждому значению группировки отдельно. |
|||
17
magicSan
25.11.22
✎
05:13
|
(12) да, не дописал, из первой вычитать всё что валяется в группировке, в идеале по условию из другого поля (типы через выбор)
(14) на чистом запросе не получатся такие финты (15) да, там вычитание должно быть, но оно отрабатывает как-то по другому. Группировку и типа расчета указывал - выводит дичь |
|||
18
magicSan
25.11.22
✎
05:13
|
(16) в вычислить выражение есть аргументы для указания номера строки, но работает непонятно как.
|
|||
19
Fedor-1971
25.11.22
✎
09:24
|
(17) в (14) имелось в виду переделать СКД на таблицу значений, а в модуле объекта заполнить её кодом как нужно для вывода
|
|||
20
magicSan
25.11.22
✎
09:41
|
(19) можно так, можно сделать сервис где выполнится этот расчет, можно к скулю обратится и там напрямую посчитать как надо.
Но есть СКД с описанным функционалом который вроде как должен это уметь. |
|||
21
Said_We
25.11.22
✎
11:13
|
(17) "на чистом запросе не получатся такие финты" - да ладно...
(19) "имелось в виду переделать СКД на таблицу значений," - нет имелось ввиду только язык запроса. |
|||
22
Said_We
25.11.22
✎
14:28
|
(0) Более подробно распиши задачу. Пока понял, так:
Пусть есть два поля. Поле группировки и сумма. Необходимо рассчитать по каждому группированному полю итог по формуле: первую запись (по непонятному критерию определить, что запись первая) считать с +, а остальные с минусом. Так как не понятно какую запись считать первой, то задание не до конца сформулировано и полей в источнике данных, скорее всего больше. |
|||
23
Мультук
гуру
25.11.22
✎
14:34
|
Вот что бывает, когда вместо внятной постановки задачи
- текущие данные - то что нужно получить нарисовав пример в XLS и кинув ссылку на таблицу, заказчик "растекается мыслью о древо". |
|||
24
magicSan
25.11.22
✎
15:13
|
(22) "Так как не понятно какую запись считать первой" - первой считаешь первую, что непонятного? там кросс таблица в запросе строится поэтому первая строка всегда та которая необходима в положительном значении.
(23) если тебе надо всё досконально разжевать, после чего в силу своего развития, ты всё ровно не предложишь решения, то это сугубо твои проблема из всех тут только пара затупила над условием. (21) выведи в чистом запросе результат, учитывая что в отчете в итоге вычитаемые значения отражаются как положительные |
|||
25
Said_We
25.11.22
✎
15:28
|
(24) "первой считаешь первую, что непонятного" - в общем случае первой может быть любая. Что тут не понятного? Запрос запустишь с разницей в пару секунд и результат можешь получить иной на тех же данных.
|
|||
26
magicSan
25.11.22
✎
15:30
|
(25) "там кросс таблица в запросе строится поэтому первая строка всегда та которая необходима в положительном значении."
|
|||
27
magicSan
25.11.22
✎
15:31
|
впрочем мы отвлеклись жду как ты на чистом запросе реализиуешь это
|
|||
28
Said_We
25.11.22
✎
15:50
|
(26) А как определяется что она первая?
(27) В прямом смысле КАК-ом можно. Если это устроит. |
|||
29
ass1c
25.11.22
✎
15:55
|
Для детальных записей вот так должно работать:
ВычислитьВыражение("Количество", "ЗаписьГруппировка", , "Первая(1)", "Первая(1)") - ВычислитьВыражение("Сумма(Количество)", "ЗаписьГруппировка", , "Первая(2)", "Последняя") А вот как в итоги на уровень "группировка" запихнуть надо подумать |
|||
30
Said_We
25.11.22
✎
15:58
|
Выбрать
"А" как А, 1 как нпп, 100 ка Б Поместить ВТ Объединить все "А", 2, 15 Объединить все "А", 3, 5 Объединить все "Б", 1, 200 Объединить все "Б", 2, 20 ; Выбрать т.А как А, т.Б как Б, т.С как С ИЗ (выбрать вт.А как А, вт.нпп как нпп, выбор когда вт.нпп = 1 тогда вт.Б иначе -вт.Б конец как С ИЗ ВТ как ВТ) как т итоги сумма(с) как Б по А Самое главное это замена итогового поля из соседней колонке через КАК другая колонка с именем Б "сумма(с) как Б" |
|||
31
Said_We
25.11.22
✎
15:59
|
На коленке писал - проверь запятые и синтаксис.
|
|||
32
Said_We
25.11.22
✎
16:09
|
В подзапросе колонку Б не прописал. Можно вообще без подзапроса, но тогда лишняя колонка ещё НПП, наличие, которой автор упорно отрицает.
выбрать вт.А как А, вт.Б как Б, вт.нпп как нпп, выбор когда вт.нпп = 1 тогда вт.Б иначе -вт.Б конец как С ИЗ ВТ как ВТ |
|||
33
Said_We
25.11.22
✎
16:15
|
(0) Получилось, то что нужно?
|
|||
34
Said_We
25.11.22
✎
16:29
|
(29) ass1c Если у тебя получилось можешь у себя в телеграмм канале нарисовать :-)
|
|||
35
ass1c
25.11.22
✎
16:45
|
(34), да - только что сделал, вроде работает - 5 сек ща скину
|
|||
36
Said_We
25.11.22
✎
16:45
|
(35) Ок.
|
|||
37
ass1c
25.11.22
✎
16:51
|
В телегу пример отчета скину вечером. Но работает вот так:
Есть запрос СКД ВЫБРАТЬ ПриобретениеТоваровУслугТовары.Ссылка КАК Ссылка, ПриобретениеТоваровУслугТовары.Номенклатура КАК Номенклатура, ПриобретениеТоваровУслугТовары.Количество КАК Количество ИЗ Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары ГДЕ ПриобретениеТоваровУслугТовары.Ссылка = &ДОК //Структура отчета СКД "Отчет" / "Ссылка" / "Номенклатура" //Ресурс "Количество" //Делаем вычисляемое поле "Поле1" с выражение ВычислитьВыражение("Количество", , , "Первая(1)", "Первая(1)", "Ссылка") - ВычислитьВыражение("Сумма(Количество)", , , "Первая(2)", "Последняя", "Ссылка") //На закладке ресурсы "Поле1" задаем выражение Максимум(ВычислитьВыражениеСГруппировкойМассив("Поле1")) //кидаем его в отчет и получаем Приобретение товаров и услуг XXX 6,000 -4 XX1 1,000 XX2 2,000 XX3 1,000 XX4 2,000 |
|||
38
Said_We
25.11.22
✎
16:55
|
(37) А то что без СКД в (30) и (32) проверял?
|
|||
39
ass1c
25.11.22
✎
16:59
|
(38) Не, я над этим сидел голову ломал - проверял теорию что в СКД все возможно) твои варики попозже заценю, голова после этих вычислитьвыражения и т.д. уже не варит)
|
|||
40
Said_We
25.11.22
✎
17:02
|
(39) Да там в консоли просто проверить, то или не то хотел автор. Я до сих пор на 100% не уверен, что понял его правильно :-) А он ещё упирается и даже в (24) на (23) не корректно пишет.
|
|||
41
ass1c
25.11.22
✎
17:13
|
(40) да он вообще куда то слился... Ну как поняли так и помогли)
|
|||
42
Said_We
25.11.22
✎
17:16
|
(37) Я так понял, что он по твоему примеру сразу хочет видеть -4, а не 6. В моем варианте без СКД так и будет.
(41) Он считает что всё всё поняли, а кто не поняли те дословно "... если тебе надо всё досконально разжевать, после чего в силу своего развития...это сугубо твои проблема из всех тут только пара затупила над условием". :-) Вроде не молодой уже человек. :-) |
|||
43
ass1c
25.11.22
✎
17:43
|
(42) Если он хочет видеть вместо 6, сразу разницу -4, то это легко решается игрой с ресурсами. Все решаемо) осталась только понять что хотел сделать автор... Да, иногда тут встречается проблема с изложением задачи, объяснением чего хочется и в результате 95 процентов сообщений это выяснение условий)
Поле Выражение Расчитывать ПО... Количество Количество Номенклатура Количество Максимум(ВычислитьВыражениеСГруппировкойМассив("Поле1")) Ссылка И будет Приобретение товаров и услуг XXX -4 XX1 1,000 XX2 2,000 XX3 1,000 XX4 2,000 |
|||
44
Said_We
25.11.22
✎
17:56
|
Если по примеру (30), то на данных:
А, 1, 100 А, 2, 15 А, 3, 5 Б, 1, 200 Б, 2, 20 Результат без СКД на чистом запросе будет такой: А, 80, NULL - итоговая строка А, 100, 100 А, 15, -15 А, 5, -5 Б, 180, NULL - итоговая строка Б, 200, 200 Б, 20, -20 Последнюю колонку при выводе результата можно не использовать и будет только две колонки. |
|||
45
magicSan
25.11.22
✎
18:06
|
(30) )))) откуда у тебя взялся ЯВНЫЙ признак первого поля? детский садик мля
|
|||
46
magicSan
25.11.22
✎
18:07
|
(37) оно же только по группировкам будет
|
|||
47
Said_We
25.11.22
✎
18:09
|
(45) Даш признак какая запись есть первая - то такое поле очень просто создать и добавить через row_number().
|
|||
48
magicSan
25.11.22
✎
18:10
|
(47) хорошо, давай выборку по реализации, первая строка - всегда первая
|
|||
49
Said_We
25.11.22
✎
18:12
|
(48) АвтономерЗаписи() в запросах уже несколько лет есть - у тебя какой релиз платформы?
|
|||
50
magicSan
25.11.22
✎
18:13
|
(49) у тебя выше описан алгоритм, прежде чем позорится проверь что он работает
|
|||
51
Said_We
25.11.22
✎
18:14
|
(50) Уже проверил - он рабочий.
|
|||
52
magicSan
25.11.22
✎
18:16
|
(51) у тебя там какаято херня прописана с явным признаком поля
|
|||
53
Said_We
25.11.22
✎
18:17
|
(52) Какого поля? Имя поля какое?
|
|||
54
Said_We
25.11.22
✎
18:25
|
(52) Если ты про "нпп", то алгоритм получения этого поля я опустил и сосредоточил внимание на переносе итогового значения из одной колонки в другу. Как я понял именно это ты спрашивал.
А нумерация row_number() over(partition by ПолеГруппировки order by ПолеСортировки) можно реализовать и без оконных функций и это я тоже выше описал. Так как вопросов по этому не возникло, то посчитал что всё и так понятно, так как алгоритм стандартный. |
|||
55
magicSan
25.11.22
✎
19:08
|
Тема ВычислитьВыражение, в (3) уже было решено через другие поля. смысл темы был не раскрыт, возможно кто то умеет в это
|
|||
56
magicSan
25.11.22
✎
19:09
|
(3) было решено то что ты прелдогаешь
|
|||
57
ass1c
25.11.22
✎
19:33
|
(46) - нет, в данном случае "запись1" это "номенклатура" что по сути детальные записи. Ты проверил это способ? В твоем случае это работает?
Скинул бы подробный пример откуда собираешь данные (ну или похожий пример из БСП) - и попробовали бы сделать. (55) - Жаль если эта тема просто пропадет, когда возможно получится красиво сделать через вычисляемые поля прям на основе данных запроса. Большинство тем так и пропадает, когда есть возможность выйти на грамотное решение стандартными средствами 1с... |
|||
58
magicSan
25.11.22
✎
19:42
|
(57) в пн скину
|
|||
59
ass1c
25.11.22
✎
19:48
|
Если в СКД в запрос передать ТЗ:
Колонка1 Колонка2 КолонкаСумма группировка1 запись1 100 группировка1 запись2 15 группировка1 запись3 5 группировка2 запись2 2 группировка2 запись3 1 группировка3 запись2 2 И на выходе в СКД получить: группировка 80 запись1 100 запись2 15 запись3 5 группировка 1 запись2 2 запись3 1 группировка 0 запись2 2 Такой результат нужно получить? (58) Ок. Скидывай, попробуем намутить... |
|||
60
Said_We
25.11.22
✎
19:54
|
(59) Может
группировка3 2 - откуда тут ноль, если вычитать нечего? запись2 2 |
|||
61
ass1c
25.11.22
✎
19:55
|
(60) - да, верно, вернее 2.
|
|||
62
Said_We
25.11.22
✎
20:22
|
(0) Как пример самого простого и понятного алгоритма нумерации по группировкам с единицы. На самом деле есть и другие.
Можно соединять таблицу не с собой, а с "(выбрать т.А, МИН(т.н) из ВТ_Пронумированный как т сгруппировать по т.А)" по полю "А", ну и соответственно из каждой строки вычитать полученное минимальное значение по прядку для каждой группировки из текщего поля "н" +1. Есть и третий и 4-й и N-й вариант. У меня сложилось впечатление, что этот алгоритм у вас вызвал сложности. В виде откуда явное поле взялось. Выбрать "А" КАК А, 100 КАК Б ПОМЕСТИТЬ ВТ Объединить все Выбрать "А", 15 Объединить все Выбрать "А", 5 Объединить все Выбрать "Б", 200 Объединить все Выбрать "Б", 20 ; Выбрать т.А как А, т.Б как Б, АвтономерЗаписи() как н ПОМЕСТИТЬ ВТ_Пронумированный ИЗ ВТ как т ; Выбрать т1.А как А, т1.Б как Б, //т1.н как н, Количество(т2.н) как нпп из ВТ_Пронумированный как т1 Левое соединение ВТ_Пронумированный как т2 ПО т1.А = т2.А И т1.н >= т2.н |
|||
63
Said_We
25.11.22
✎
20:24
|
Опять же писал на коленке...
Если где буквы перевернул или запятую пропустил, то.... :-) |
|||
64
Said_We
25.11.22
✎
20:26
|
Не дописал....
сгруппировать по т1.А, т1.Б, т1.н упорядочить по т1.А, т1.н |
|||
65
Said_We
25.11.22
✎
20:41
|
При формировании внутренней таблицы "ВТ_Пронумированный" правильнее указать сортировку по полю "А" и по..., а вот ещё по чему, я так и не добился. И раз добавляется упорядочивание, то понадобиться и выбрать ПЕРВЫЕ 99999999999.
Поэтому считаем, что таблица уже правильно отсортированная, но это скорее какой-то тепличный случай - в общем случае так не бывает. |
|||
66
magicSan
25.11.22
✎
21:12
|
(59) группировка 1
запись2 2 запись3 1 группировка 0 запись2 2 rjczrb ;t |
|||
67
magicSan
25.11.22
✎
21:13
|
не верный выход жанных
|
|||
68
magicSan
25.11.22
✎
21:13
|
косяки же
|
|||
69
magicSan
25.11.22
✎
21:14
|
прошу обратить внимание на тему, хотелось бы решить через методы скд, понимаю что изврат и никто это говно не пользует судя по всему, но вроде как оно могет
|
|||
70
PR
25.11.22
✎
21:16
|
(69) В СКЖ же в функциях есть предыдущая запись
|
|||
71
Said_We
25.11.22
✎
21:28
|
(69) В (17) твое сообщение "на чистом запросе не получатся такие финты". Как видишь - получаются достаточно просто.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |