Всем доброго времени суток!
Совсем недавно пришлось познакомиться с таким механизмом СКД, как «Пользовательские поля» и теперь спешу поделиться с теми, кто, как и я, пытается понять этот механизм.
Поступил запрос от заказчика на разработку нового отчёта. И вот была в этом отчёте одна интересная идея – нужно было, чтобы одно и тоже поле рассчитывалось для одной группировки как процент, а для другой группировки – как абсолютное значение.
Для примера предположим, что есть у нас справочник «Договоры контрагентов» и по данным этого справочника необходимо сформировать простейший отчёт – договор – сумма – количество и процентные соотношения, сгруппировать по стране регистрации контрагента. Если страна регистрации контрагента является участником ЕАЭС, то в итогах необходимо указать процентные итоги, иначе – абсолютное количество / сумму договоров.
Т.е., итоговый вид отчёта должен быть примерно таким:
Участники ЕАЭС |
Страна |
Сумма |
Количество |
% от суммы (от общей суммы) |
% от количества (от общего кол-ва) |
Да |
Итого |
1000 |
100 |
62,5 % |
62,5 % |
Россия |
100 |
10 |
10 % |
10 % |
|
Беларусь |
200 |
20 |
20 % |
20 % |
|
Казахстан |
300 |
30 |
30 % |
30 % |
|
Киргизия |
400 |
40 |
40 % |
40 % |
|
Нет |
Итого |
600 |
60 |
600 |
60 |
Китай |
100 |
10 |
100 |
10 |
|
Франция |
200 |
20 |
200 |
20 |
|
Германия |
300 |
30 |
300 |
30 |
Т.е., в колонке 5 и 6, в зависимости от группировки, итоги должны считаться по-разному. Итог по группировке «Участники ЕАЭС» - процент от общего количества (суммы) договоров, а для группировки не участников ЕАЭС – просто сумма текущей группировки. При этом, для стран-участников ЕАЭС после рассчитанного процента в поле обязательно должен быть указан значок «%».
Может быть, для кого-то это довольно посредственная задача, но мне, честно сказать, с таким любопытным расчетом ранее сталкиваться не приходилось. После некоторых размышлений и гуглений было решено использовать «Пользовательские поля».
Сложность задачи ещё заключалась в том, что, в отличие от вышеописанного тестового примера, в формируемом отчёте было 4 уровня иерархии и 3 различных правила расчёта итогов по ним: в каком-то случае проценты должны были считаться от общего итога, в каком-то от текущей группировки, в каком-то от вышестоящей группировки.
Реализовать ещё и различный тип итогов (проценты / абсолютное значение) при расчёте ресурсов показалось сложным именно для понимания расчета и дальнейшей работы (доработки / сопровождения) с отчётом.
А вот с пользовательскими полями всё показалось намного прозрачней и понятней.
В указанной статье покажу оба примера.
Итак, порядок действий:
1. Формируем запрос, в который выбираем договор, сумму, страну контрагента и признак участника ЕАЭС. В приложенный отчёт также было добавлена одна пустая строка с нулевой суммой и нулевым количеством – чуть позже объясню, зачем.
Также, в приложенном отчете в качестве сумм договоров всегда указано «100», т.к. на своём опыте приходилось сталкиваться с тем, что в разных конфигурациях данное поле называется по-разному (где-то «Сумма», где-то «Стоимость», а в некоторых его вообще нет). Если кто-то будет смотреть – то хотелось бы, чтобы отчёт, как говорится, «взлетел».
И ещё, на всякий случай, в отчёт добавлено условие «ПЕРВЫЕ 5000», на случай, если будет ну ооочень большой объём данных. Всё-таки никаких отборов и т.п.
2. Затем создаём два новых вычисляемых поля «ПроцентОтКоличества» И «ПроцентОтСуммы» - это будут те самые поля, в которых будем выполнять расчёт.
3. Рассчитываем ресурсы. Сумму и количество договоров просто суммируем.
Процент от количества рассчитаем через ресурс, процент от суммы – через пользовательское поле.
3.1. Расчёт через ресурс.
Выводим в ресурсы вычисляемое поле «ПроцентОтКоличества» и задаём ему нужную нам формулу расчёта (100 * Количество / Общее количество). Я также обычно выполняю проверку на то, что знаменатель не равен нулю, чтобы потом в отчете не было записей «Деление на 0».
Затем рассчитанное значение «заворачиваем» в функцию «Формат», указываем количество знаков после запятой и знак процента.
И всё это дело также «заворачиваем» в функцию выбора, в которой определяем, что если это участник ЕАЭС, то тогда вышерассчитанный процент, иначе – просто количество.
В конечном итоге у меня получилось так:
Теперь на вкладке «Настройки» просто выводим это поле и всё, задача решена.
3.2. Расчёт через пользовательское поле.
Для расчёта через пользовательское поле формула в ресурсах будет выглядеть немного проще – без форматирования и выбора – только проверка на не нулевой знаменатель и правило расчета. Остальная часть будет вынесена в пользовательские поля.
В конечном итоге вышло так при расчёте ресурса:
Далее, на вкладке «Настройки» -> вкладка «Пользовательские поля» добавляем новое пользовательское поле «выражение».
- В поле «Выражение детальных записей» указывается значение детальных записей (в нашем случае просто сумма).
- В поле «Выражение итоговых записей» указывается формула для расчета по группировкам. Это тот самый выбор + форматирование, которые для расчета по количеству выполняли в ресурсах, но т.к. значение по сумме уже рассчитано, то формула выглядит немного проще:
4. Выполняем настройки отчёта, группировки, положение и т.д. Затем запускаем отчёт и смотрим:
Всё как просили – для Участников ЕАЭС проценты, для остальных – абсолютные значения.
Однако обратите внимание на пустую строку, с пустыми значениями и знаком % в наших итогах. Это та самая строка, которая была добавлена специально для примера того, как рассчитанные нами значения будут отражаться в случае, если значение в строке будет нулевым.
Чтобы избавиться от этих пустых знаков процентов, достаточно в расчёт ресурса добавить простое условие, что если рассчитанное значение равно 0, то вывести 0 или пустое значение.
Для пользовательского поля это проблем не составит:
А вот для ресурса кода прибавится немного больше:
В любом случае видим, что в итоге знаков % больше нет:
Как итог скажу, что лично для меня пользовательское поле оказалось проще, так как расчетов было много, они были несколько сложнее, чем в указанных примерах, да и на мой взгляд выглядит это немного компактнее и читабельней.
Тестирование проводил в конфигурации Управление холдингом, редакция 3.1 (3.1.6.15).
Возможно, кто-то знает вариант лучше – всегда интересно услышать другие идеи.
Возможно, кому-то данная статья чем-то поможет в реализации поставленных задач.
В любом случае, спасибо за внимание.
Проверено на следующих конфигурациях и релизах:
- 1С:Управление холдингом 3.2 (русский и английский интерфейсы), релизы 3.2.9.2