Народ, возникла проблем которую никак не могу раскрутить.

Поставлена задача по написанию отчёта показывающего просроченную задолженность и штрафы по просрочке оплат.
В запросе получаю регистраторы по документу расчётов (платёжки, возвраты, корректировки долга). Для каждой вычисляю количество дней от даты просрочки
т.е.
Платёжка 1 - 20 дней от даты просрочки
Платёжка 2 - 25 дней от даты просрочки
Платёжка 3 - 27 дней от даты просрочки
Для начисления штрафа нужно для первой платёжки брать начальное количество дней, для всех последующих, вплоть до конца периода рассчитать дельту.
т.е.
Платёжка 1 - 20 дней
Платёжка 2 - 5 дней
Платёжка 3 - 2 дня
Штраф рассчитывается как произведение количества дней на сумму начального остатка по взаиморасчётам на дату документа движения (платёжки, возврата, корректировки) на процент, задаваемый пользователем.

К сути.
В запросе получаю количество дней от даты просрочки. Дабы не городить огород с соединениями по нахождению предыдущих записей расчёт дельт выношу в вычисляемые поля СКД. Получаю что-то типа:

```1c
    Выбор когда isNULL((ВЫЧИСЛИТЬВЫРАЖЕНИЕ("ПросроченоДнейВЭтомПериоде", "Регистратор","Группировка" , "Предыдущая", "Предыдущая")), 0) = 0 Тогда ПросроченоДнейВЭтомПериоде Когда (ВЫЧИСЛИТЬВЫРАЖЕНИЕ("ПросроченоДнейВЭтомПериоде", "Регистратор","Группировка" , "Предыдущая", "Предыдущая")) = ПросроченоДнейВЭтомПериоде Тогда 0 иначе isNULL(ПросроченоДнейВЭтомПериоде - (ВЫЧИСЛИТЬВЫРАЖЕНИЕ("ПросроченоДнейВЭтомПериоде", "Регистратор" , "Группировка", "Предыдущая", "Предыдущая")), 0) Конец
```

т.е. сначала исключаю первую запись (Null), далее убираю ситуацию с нулевыми дельтами, на конец оставляю собственно расчёт дельты. Всё. В контексте группировки "Регистратор" все необходимые дельты имеют место быть. На основании этого вычисленного поля могу найти сумму штрафа на закладке "Ресурсы". т.е. что-то типа
Ресурс "ШтрафОстаток" = "ДельтаДней/365 * &Процент/100 * ОстатокДолгаНП"

И вот далее начинается самое неприятное.
Нужно посчитать сумму по документу взаиморасчётов, контрагенту.

Если взять в лоб сумму по ресурсу "ШтрафОстаток" в контексте группировки документа взаиморасчетов, то получу абсолютную ересь с непонятными, отрицательными и прочими значениям.
Мощная функция "Сумма(ВЫЧИСЛИТЬВыражениесгруппировкоймассив("Сумма(ШтрафОстаток)", "Период"))" рассчитываемая по документу расчётов для ситуации с одиночной платёжкой работает нормально, в остальных случаях кладёт на меня определённый предмет и считает что-то абстрактное для себя.

Резюме.
Мне нужно взять результат вычислений по штрафу для самой нижней группировки (регистратор) и просуммировать этот самый результат для вышестоящих (Документ расчётов, Контрагент). Поиски похожих решений результата для данной конкретной ситуации не дали. Куда копнуть?
---
Господа. Затащил я эту радость.
Как известно у некоторых задач может быть несколько решений.
И конкретно для этой я решил довести до СКД уже готовую дельту т.е. вернуться к запросу.
Для этого пришлось сделать следующее:
1) В запросе итоговой таблицы пронумеровал регистраторы относительно документа взаиморасчётов.
Пример брал по соответствующему запросу. Что-то типа https://kb.mista.ru/article.php?id=703
Т.е. соединял одну и ту же таблицу по левому соединению с учётом равенства документов взаиморасчётов и проверки на большее даты
Если брать мой кусок, то в соединении будет приблизительно следующее

....... прочие группировки,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ИтогПередВычислениемДельты1.Регистратор) КАК Порядок
ПОМЕСТИТЬ ИтоговаяТаблицаСПорядками
ИЗ
 ИтогПередВычислениемДельты КАК ИтогПередВычислениемДельты
  ЛЕВОЕ СОЕДИНЕНИЕ ИтогПередВычислениемДельты КАК ИтогПередВычислениемДельты1
  ПО ИтогПередВычислениемДельты.ДокументРасчетовСКонтрагентом = ИтогПередВычислениемДельты1.ДокументРасчетовСКонтрагентом
   И ИтогПередВычислениемДельты.Период > ИтогПередВычислениемДельты1.Период

На выходе получил таблицу в которой регистраторы были пронумерованы от 0 до собственно количества регистраторов -1
Соглашусь что время расчёта возрастает, но для моей ситуации это было не критично. Анализироваться будут данные за месяц два.
2) Задублировал таблицу добавив в новой таблице к полю "Порядок" единицу.
3) Основную и дубль соединяю левым соединением по документу взаиморасчётов и порядку.
В итоге первая запись просроченной даты дубля "сползает" на вторую основной и можно спокойно находить дельту. Единственное, что остаётся - для NUll первой записи оставить количество дней просрочки, которое было изначально.
4) На выходе в СКД получаем нужную картину. И, для регистратора берём стандартный расчёт штрафа, для всех последующих вышестоящих группировок отлично отрабатывает "ВычислитьВыражениеСГруппировкойМассив" по полю "Регистратор".
Возможно в будущем подобное решение кому-нибудь да понадобится. И даже кто-то сможет "победить" изначальную ситуацию.
Всем спасибо за помощь. Было весьма интересно. )))
---
была подобная проблема, решилась подробной росписью формулы ресурса по группировке. т.к. у тебя есть условный выбор по детальным записям, попробуй формулу подробно расписать, например
Сумма(ВЫЧИСЛИТЬВыражениесгруппировкоймассив("Выбор когда Сумма(isNULL((ВЫЧИСЛИТЬВЫРАЖЕНИЕ("ПросроченоДнейВЭтомПериоде", "Регистратор","Группировка" , "Предыдущая", "Предыдущая")), 0)) = 0
Тогда Сумма(ПросроченоДнейВЭтомПериоде) Когда Сумма((ВЫЧИСЛИТЬВЫРАЖЕНИЕ("ПросроченоДнейВЭтомПериоде", "Регистратор","Группировка" , "Предыдущая", "Предыдущая")) = ПросроченоДнейВЭтомПериоде Тогда 0
иначе isNULL(Сумма(ПросроченоДнейВЭтомПериоде) - Сумма(ВЫЧИСЛИТЬВЫРАЖЕНИЕ("ПросроченоДнейВЭтомПериоде", "Регистратор" , "Группировка", "Предыдущая", "Предыдущая"))), 0) Конец", "Период"))
---
Дальше как правильно написали в (2), ВычислитьВыражение и прочие функции не работают по вычисляемым полям. Они работают только по реквизитам исходного набора (по детальными записям). Поэтому в расчете нужно повторят многоэтажные конструкции с самого начала.
---
Кака красота ))) Сейчас попробую. Благодарю.
---
Начал с простого для проверки при расчёте ресурса по документу расчётов
Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ПросроченоДнейВЭтомПериоде - (ВЫЧИСЛИТЬВЫРАЖЕНИЕ("ПросроченоДнейВЭтомПериоде", "Период" , "Группировка", "Предыдущая", "Предыдущая")", "Период"))
и схватил ошибку. "Поле на найдено "Группировка".
Причём если вставить конструкцию без ВычислитьВыражениеСГруппировкойМассив - ошибки не возникает. Получается при разборе параметров случаются непонятки.
Если убираю параметр "Группировка", получаю ошибка "Поле не найдено "Предыдущая""
Оголяю все параметры получая
Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ПросроченоДнейВЭтомПериоде - (ВЫЧИСЛИТЬВЫРАЖЕНИЕ("ПросроченоДнейВЭтомПериоде", , , , )", "Период"))
Ошибки нет, но и ВЫЧИСЛИТЬВЫРАЖЕНИЕ по сути не работает.
---
Начнем с простого.

"т.е. сначала исключаю первую запись (Null)," по измерению, по которому выводится первая строка (NULL) в роли поля ставим галку исключать NULL. уже выражение для вычисления будет проще
---
Тут скорее не совсем корректно выразился. Для первой записи не нужно искать дельту, а вывести количество дней просрочки набежавшее с даты её начала. Для этого как раз проверяю предыдущую запись на NULL. т.е. если это группировка первая, то условие как раз схватит NULL и можно спокойно вывести количество дней.
---
Используем научный метод)))
Сумма(ВычислитьВыражениеСГруппировкойМассив("", "Период")) - Ошибки нет
Сумма(ВычислитьВыражениеСГруппировкойМассив("ВычислитьВыражение("ПросроченоДнейВЭтомПериоде", "Период","Группировка" , "Предыдущая", "Предыдущая")", "Период")) - Ошибка есть
---
Сумма(ВычислитьВыражениеСГруппировкойМассив("ВычислитьВыражение("ПросроченоДнейВЭтомПериоде", "Период","Группировка" , "Предыдущая", "Предыдущая")", "Период")) - Ошибка есть
 Походу у тебя группировка указана не верно ВычислитьВыражение("ПросроченоДнейВЭтомПериоде", "Период") и Сумма(ВычислитьВыражениеСГруппировкойМассив("ВычислитьВыражение("ПросроченоДнейВЭтомПериоде", "Период","Группировка" , "Предыдущая", "Предыдущая")", "Период")) . Период - это должна быть нижняя группировка, а в ВычислитьВыражениеСГруппировкойМассив нужно брать другую, Например "общийитог"
---
Нет. Та же ошибка.
Сумма(ВычислитьВыражениеСГруппировкойМассив("ВычислитьВыражение("ПросроченоДнейВЭтомПериоде", "Период","Группировка" , "Предыдущая", "Предыдущая")", "ДокументРасчетовСКонтрагентом"))
Поле не найдено "Группировка". Он видимо когда строку выражения под ВычислитьВыражениеСГруппировкойМассив разбирает, сбивается по кавычкам.
---
Можно реализовать функцию в общем модуле, которая будет считать Сумму Штрафов - для этого можно передавать на вход функции таблицу значений, полученную с помощь - ВычислитьВыражениеСГруппировкойТаблицаЗначений.
Тогда в выражении ресурса нужно будет просто вызвать функцию общего модуля
---
На всякий случай сделаю ссылку на материал, который использовал при вычислении дельты.
https://infostart.ru/public/267055/

(11) Немного изврат. Попробую вечером. Только вот вопрос. ВычислитьВыражениеСГруппировкойТаблицаЗначений имеет тот же параметр "Выражение", в которое нужно прифигачить монструозную конструкцию с условиями и несколькими "ВычислитьВыражение". Предполагаю, что поймаю ту же ошибку, что и с "ВычислитьВыражениеСГруппировкойМассив" по параметрам "Группировка" и "Предыдущая".
Всё-таки хочется верить что в (2) направление верное, вполне возможно что-то упустил в синтаксисе. Может кавычку.

"...ещё под нашу музыку можно много чего делать." (Масяня)
---
при такой реализации "моструозная" конструкция не нужна - вы ее реализуете на уровне функции в общем модуле (и там она будет весьма красивой)
А в Выражение достаточно будет засунуть те поля, которые понадобятся вам для расчета ДельтыПросрочки, а затем и Суммы Штрафов
---
Господа. Затащил я эту радость.
Как известно у некоторых задач может быть несколько решений.
И конкретно для этой я решил довести до СКД уже готовую дельту т.е. вернуться к запросу.
Для этого пришлось сделать следующее:
1) В запросе итоговой таблицы пронумеровал регистраторы относительно документа взаиморасчётов.
Пример брал по соответствующему запросу. Что-то типа https://kb.mista.ru/article.php?id=703
Т.е. соединял одну и ту же таблицу по левому соединению с учётом равенства документов взаиморасчётов и проверки на большее даты
Если брать мой кусок, то в соединении будет приблизительно следующее

....... прочие группировки,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ИтогПередВычислениемДельты1.Регистратор) КАК Порядок
ПОМЕСТИТЬ ИтоговаяТаблицаСПорядками
ИЗ
 ИтогПередВычислениемДельты КАК ИтогПередВычислениемДельты
  ЛЕВОЕ СОЕДИНЕНИЕ ИтогПередВычислениемДельты КАК ИтогПередВычислениемДельты1
  ПО ИтогПередВычислениемДельты.ДокументРасчетовСКонтрагентом = ИтогПередВычислениемДельты1.ДокументРасчетовСКонтрагентом
   И ИтогПередВычислениемДельты.Период > ИтогПередВычислениемДельты1.Период

На выходе получил таблицу в которой регистраторы были пронумерованы от 0 до собственно количества регистраторов -1
Соглашусь что время расчёта возрастает, но для моей ситуации это было не критично. Анализироваться будут данные за месяц два.
2) Задублировал таблицу добавив в новой таблице к полю "Порядок" единицу.
3) Основную и дубль соединяю левым соединением по документу взаиморасчётов и порядку.
В итоге первая запись просроченной даты дубля "сползает" на вторую основной и можно спокойно находить дельту. Единственное, что остаётся - для NUll первой записи оставить количество дней просрочки, которое было изначально.
4) На выходе в СКД получаем нужную картину. И, для регистратора берём стандартный расчёт штрафа, для всех последующих вышестоящих группировок отлично отрабатывает "ВычислитьВыражениеСГруппировкойМассив" по полю "Регистратор".
Возможно в будущем подобное решение кому-нибудь да понадобится. И даже кто-то сможет "победить" изначальную ситуацию.
Всем спасибо за помощь. Было весьма интересно. )))
---
Попробовал сегодня разобрать ситуацию. По-порядку спотыкался примерно на том же самом

- Сумма(Штраф) считает как хочет
- ВычислитьВыражениеСГруппировкойМассив - считает хорошо только по детальным записям. или по периодам или по регистратору. то есть можно передать правильное значение на уровень выше. в моем случае это документ расчетов
- при попытке передать на уровень выше (контрагент, общий итог) ВычислитьВыражениеСГруппировкойМассив выдает ошибку, что в группировке совместно с периодом использовать другие поля нельзя

Сумма(Штраф) видимо считает просто по детальным записям а для дней штрафа (дельты) нам важен порядок с учетом группировок.

пришел к тому же - дни штрафа (она же дельта) нужно считать по другому. либо получить в два этапа сначала таблицу с контрагентом, документом расчетов, документом движения и начальным остатком. в этой таблице регистратор уже не будет периодом и ошибки быть не должно. может на самом деле сработает просто ВычислитьВыражениеСГруппировкойМассив по регистратору. либо для каждого уровня свои группировки прописать
---
Как раз чутка выше решил немного по своему. Если сможете через СКД - обязательно напишите. Полагаю, что есть решение.
---
Через СКД можно сделать только если "отвязать" остатки от Периода. То есть чтобы регистратор не воспринимался как период. Попробую сегодня убрать роли у регистратора. Либо вариант более сложный - через 2 схемы. Первая получается остатки, вторая собирает итоги.
---
Получилось сделать так - убрать роль период у регистратора. в запросе только начальный остаток. то есть нарушаем все рекомендации по расчету остатков :)

Штраф сделать просто как Сумма(Штраф)

остатки по регистраторам считаются правильно. остатки на верхних уровнях нам не нужны - точнее я думаю, что не нужны. если отчет нужен только для расчета штрафа, то такой вариант работает
---
Наврал что Сумма(Штраф) работает. На радостях. Все равно пришлось делать через ВычсилитьВыражениеСГруппировкойМАссив