Имя: Пароль:
1C
 
ВычислитьВыражение для группировки
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) твое сообщение "на чистом запросе не получатся такие финты". Как видишь - получаются достаточно просто.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс