Расчет сложных итогов СКД

05.08.19

Разработка - СКД

Малоизвестный прием для расчета итогов в отчетах на СКД.

Скачать исходный код

Наименование Файл Версия Размер
Расчет сложных итогов СКД:
.erf 5,83Kb
62
.erf 5,83Kb 62 Скачать

Однажды появилась необходимость посчитать в отчете не стандартные итоги. Долго искал информацию в интернете, но ничего подобного не нашел. Путем экспериментов нашел возможность, описания которой ранее нигде не видел.  Думаю, кому-то может быть полезно.
Задача: необходимо в отчете получить итоги, которые рассчитываются следующим образом


Для расчета вертикальных и горизонтальных итогов все стандартно:

  • Итог по горизонтали рассчитывается формулой 
Среднее(ВычислитьВыражениеСГруппировкойМассив("Максимум(Значение)","Лево, Верх"))
  • Итого по вертикали рассчитывается формулой
Сумма(ВычислитьВыражениеСГруппировкойМассив("Максимум(Значение)","Лево, Верх"))

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

Сумма(ВычислитьВыражениеСГруппировкойМассив("Среднее(ВычислитьВыражениеСГруппировкойМассив(""Максимум(Значение)"",""Лево,Верх""))","Лево"))

Вложенные кавычки, как в стандартных текстовых константах выделяются двойными кавычками.

В результате получаются такие формулы расчета итогов.


В файлах отчет с примером.

Тестировалось на платформе 8.3.10.2667.

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    130817    709    390    

758

Как посмотреть итоговый запрос в отчете СКД

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    3524    implecs_team    6    

36

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    4856    37    obmailok    20    

75

Набор-объект для СКД по тексту или запросу

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2316    2    Yashazz    0    

32

СКД на JavaScript в 1С

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8861    20    John_d    25    

124

Использование менеджера временных таблиц в СКД

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    5464    PROSTO-1C    13    

65
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DoctorRoza 05.08.19 10:07 Сейчас в теме
А есть ли возможность подсчитать произвольный итог для полей группировок, не ресурсов? Например, у меня есть группировка со списком регистраторов и нужно над ними, в верхнем поле группировки, вывести количество документов. В запросе я могу сгруппировать, и задать Количество(РАЗЛИЧНЫЕ Регистратор), а в СКД как быть?
2. json 3318 05.08.19 10:20 Сейчас в теме
(1) Если не ошибаюсь, это возможно реализовать через пользовательские поля с типом "Выражение".
У меня была задача посчитать количество дней, в которые были поступления (Количество(РАЗЛИЧНЫЕ Период)).
Так вот через пользовательские поля это удалось посчитать.
3. DoctorRoza 05.08.19 10:51 Сейчас в теме
(2) Получается, что добавляем доп. поле, так, в итоге, и сделал, Но хочется балалайку, как с ресурсами.
4. ixijixi 1810 05.08.19 12:58 Сейчас в теме
(1) Можно так попробовать
Прикрепленные файлы:
user886825; +1 Ответить
22. Serejka 29.09.21 15:10 Сейчас в теме
(1) чтото подобное я решил с помощью Массив( различные Регистратор), причем Регистратор нужно закиуть в ресурсы без выражения.
5. ids79 8379 05.08.19 13:45 Сейчас в теме
Можно добавить вычисляемое поле:
ВычислитьВыражениеСГруппировкойМассив("Максимум(Значение)","Лево, Верх")
И в итогах сделать проще:
Среднне(ВычисляемоеПоле)
Сумма(ВычисляемоеПоле)
Сумма(ВычислитьВыражениеСГруппировкойМассив("Среднне(ВычисляемоеПоле)","Лево"))
То же самое, но красивее получается.
6. s22 19 05.08.19 19:34 Сейчас в теме
Долго искал операторы Лево и ВВерх. Думал, как сильно улучшить жизнь с ними в сложных случаях.
А оказалось это имена колонок.
Жизнь не справедлива.
Merkalov; user712426; Sardukar; Vyacheslide; Leshka_m; ediks; NoRazum; wowik; user717534; MikhailGirshberg; A_Max; +11 Ответить
7. logarifm 1121 06.08.19 09:28 Сейчас в теме
Это все конечно красиво кроме одного. Когда отчет перестроят и изменят группировки вот тогда значения будут весьма интересны. Для простенького примерчика покатит. А вот реально для сложного отчета предусмотреть вариации крайне тяжело.
Vyacheslide; It-developer; user634589_karolina_malboro; Summer_13; +4 Ответить
8. dandykry 10 15.11.19 09:04 Сейчас в теме
О божешки ты мои!!!! 2 дня 2 человека страдали (1 точно страдал) до прочтения этой статьи.
Кто ж знал, что можно выделять двумя кавычками вложенные выражения.
Я в шоке.
Спасибо
Sardukar; rpgshnik; +2 Ответить
9. xxxAndricxxx 64 11.02.20 10:19 Сейчас в теме
10. German_Tagil 43 14.07.20 14:05 Сейчас в теме
11. vasiliy_09_05 6 03.09.20 09:05 Сейчас в теме
Друзья, доброго времени суток.
Необходима Ваша помощь.
Думаю, что кто-либо сталкивался уже с таким:
По сути мне необходим именно такой алгоритм, который указан в статье, но с одним условием - структура отчета не фиксирована.
То есть использование
ВычислитьВыражениеСГруппировкойМассив("Максимум(Значение)","Лево, Верх")
мне не подходит, так как пользователь может поменять иерархию как угодно.
То есть пример - нужно соединить 2 РН - "Товары переданные" и "Товары полученные". На самом нижнем уровне начальный остаток - сумма начальных остатков переданных и полученных, далее приход и расход (стандартная сальдовка).
Но на вышестоящих уровнях должна быть сумма начальных и конечных остатков предыдущего уровня.

Пытался в ресурсе сделать выражение типа
ВЫБОР КОГДА УРОВЕНЬ()=2 Тогда НачальныйОстаток ИНАЧЕ Сумма(НачальныйОстаток) КОНЕЦ
(просто пример), но тогда СКД вышестоящих уровней суммирует все значения нижестоящей, а не значения группировок.

Если бы отчет был фиксированный, проблем бы не было.

Нашел описание подобной же проблемы: My Webpage, но там описывается общий принцип без конкретики.

Если кто то сможет натолкнуть на правильный вариант, был бы премного благодарен :)
12. masterkio 337 03.09.20 11:11 Сейчас в теме
(11) Добрый день. Если честно из описания не очень понятно что вы хотите получить. Если есть возможность сделать картинку с тем как и что должно считаться, может быть получиться помочь.
14. vasiliy_09_05 6 04.09.20 07:30 Сейчас в теме
(12) Доброго времени суток.
Спасибо за интерес к вопросу.
Вкратце что необходимо:
Смотрите, у меня 2 РН (Товары переданные и товары полученные).
В результате алгоритм должен быть следующим:
1) Получаем начальный остаток обоих РН на дату начала отчета
2) Получаем все записи обоих РН (у них реквизиты Организация и контрагент одинаковые, а договоры разные)
3) Сортируем список (2) по периоду
4) Последовательно проходим по всем отсортированным записям и, если запись из РН товары полученные, остаток увеличиваем на сумму записи, если товары переданные, уменьшаем.

В результате получается типовой отчет (нач остаток, приход, расход, кон остаток).

Все было бы просто если бы не несколько условий:
1) Иерархия отчета может строиться произвольно. То есть пользователь может убрать, например, договор, контрагента, а возможно и номенклатуру;
2) Ресурсы "Приход" и "Расход" по вышестоящим группировкам суммируются (здесь проблем нет, штатный механизм), а вот ресурсы "Начальный остаток" и "Конечный остаток" должны вести себя по-иному:
"Начальный остаток" - сумма группировки по первому значению (первая строка в группировке)
"Конечный остаток" - сумма группировки по последнему значению (последняя строка в группировке)

В общем вот такой нестандартный отчет :(

Чтобы было более понятно, приложил скрин:
Отчет

По вышестоящим группировкам начальный остаток должен быть 1457 (1367 первой строки номенклатуры Матал + 90 первой строки номенклатуры (евро))
конечный остаток - 1268 (1188 последней строки номенклатуры Матал + 80 последней строки номенклатуры (евро))

В общем что только я не пробовал, никак не получается каменный цветок.

Пробовал вычислять строки, добавлять их в ТЗ, а потом передавать в СКД, пробовал объединять 2 запроса и выводить строки с помощью
IsNull(ВЫЧИСЛИТЬВЫРАЖЕНИЕ("КонечныйОстаток", , , "Предыдущая", "Предыдущая"),НачальныйОстаток)


Ни один из вариантов не подошел :(

Может кто-нибудь сталкивался с подобным заданием и уже победил?
Был бы очень благодарен за советы :)
15. masterkio 337 04.09.20 10:54 Сейчас в теме
(14)Не проверял, но по идее как то так должно сработать.
В формуле расчета ресурса НачальныйОстаток должна быть примерно такая формула.

Сумма(ВычислитьВыражениеСГруппировкойМассив( "ВычислитьВыражение(""НачальныйОстаток"", """", ""Группировка"", ""Первая"", ""Первая"")", "Регистратор"))

т.е. группировка Регистратор есть всегда и именно в ней, как я понял, мы берем остаток из первой записи, а во всех вышележащих группировках просто складываем.
16. vasiliy_09_05 6 07.09.20 07:53 Сейчас в теме
(15) Хм, спасибо.
Сейчас попробую
18. echo77 1888 16.01.21 05:53 Сейчас в теме
13. cfifgoth 04.09.20 01:12 Сейчас в теме
Это просто супер. Я с этим долбался часов 6-7, пока не набрел на вашу статью. Спасибище. Статья неоценима просто.
17. SvLeo 22.10.20 12:25 Сейчас в теме
Спасибо, товарищ. применила идею к своим расчетам....
Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(ВычислитьВыражениеСГруппировкойМассив(""Выручка"",""ДоговорСсылка""))","ДоговорСсылка"))
19. Hatson 530 23.03.21 17:08 Сейчас в теме
А почему формулы написаны только на закладке "Ресурсы"? Не видно настроек отчета. Не понятно что будет при выводе детальных записей вместо одной из группировок.

PS
Приходишь в какую-нибудь контору, видишь такой отчет и неделю втыкаешь, что автор пытался изобразить и получилось ли у него, ведь ни описания ни тех. задания обычно написать никто не удосужился, а заказчик утверждает, что отчет показывает "не совсем то", но сам не знает что. Но, правда, статистика всегда одинакова: отчет иногда работает в исключительно частном случае, в остальных случаях помогает только Ctrl+A -> Shift+Del
20. proger1c81 1 07.07.21 18:56 Сейчас в теме
Очень нужна помощь, может кто знает:

Возьмем ваш пример с группировками Лево1, Лево2, Лево3.
Как сделать так, чтобы итоги по горизонтали (итоги справа) не считались для конкретной группировки (например, лево2) ?
21. masterkio 337 07.09.21 11:43 Сейчас в теме
(20)
Думаю, можно просто добавить в формулу условие Выбор когда Поле = "Лево2" Тогда 0 Иначе формула Конец
23. gamletspb 102 16.11.21 16:56 Сейчас в теме
делаю вычисляемое поле,
ВычислитьВыражение(Максимум(НомерСтроки), "Контрагент.Ответственный")

ресурс
Сумма(ЧислоСтрок)


при формировании отчета получаю
Использование вложенных агрегатных функций не допускается


что я делаю не так?
Прикрепленные файлы:
24. gamletspb 102 18.11.21 13:11 Сейчас в теме
(23) разобрался - забыл про кавычки
25. Dermidont 11 27.05.22 10:19 Сейчас в теме
Автору респект за статью. Сильно помогло.
26. 4ytta 25 24.06.22 17:31 Сейчас в теме
Ребят, подскажите пожалуйста, а можно вложений сделать больше 2, а то везде пишут примеры именно с двумя вложениями, а как сделать например три вложения, я кавычки не могу победить...Вот пример: Среднее(ВычислитьВыражениеСГруппировкойМассив("Среднее(ВычислитьВыражениеСГруппировкойМассив("
Среднее(ВычислитьВыражениеСГруппировкойМассив(""Сумма(Значение)"",""Смена""))"
,"Период"))","ТО"))
27. angabanga5 18.09.22 00:33 Сейчас в теме
запутался к бабушке. у меня итоги не верно считаются с этими выражениями. сумма идет не верная. в пределах указанной в выражении группировки все верно,а общие итоги едут, он какбуд-то сложить их не может правильно, что за бред

Сумма(ВычислитьВыражение("Максимум(КоличествоОстаток41)","Номенклатура")).
Тут я по измерению номенклатура беру максимум и хочу, чтобы в отчете была сумма этих максимумов (естессно ез повторяющихся по номенклатуре, а вместо этого все едет
28. yudroma 09.01.23 16:28 Сейчас в теме
Лучший! Просто лучший!
29. buy_sale 220 16.06.23 08:09 Сейчас в теме
Если хоть в одной группировке отрицательное значение, то ваш принцип с максимумами не работает.
Узкоспециализированное решение, но за инфу о тонкостях платформы благодарю.
Sardukar; +1 Ответить
Оставьте свое сообщение