При разработке отчетов в системе компоновки данных (СКД) нередко возникает необходимость вывести два показателя в одной ячейке таблицы через специальный разделитель, например, в виде дроби или через слэш (3/5). Если в настройках отчета использовать группировку выбранных полей с расположением Вместе, платформа по умолчанию разделяет значения запятой с пробелом, и изменить этот системный разделитель стандартными флажками невозможно.
Попытка создать вычисляемое поле со строковым выражением и вывести его в таблицу часто приводит к неприятному эффекту: вместо компактной строки на пересечении группировок строки отчета начинают двоиться, образуя «лесенку» с пустыми ячейками в соседних колонках. Разберем по шагам, почему так происходит и какими способами можно корректно решить эту задачу.
Проанализируем механику работы СКД. Поля, которые не добавлены на вкладку Ресурсы, компоновщик данных автоматически расценивает как группировочные измерения. Если поместить такое поле в область вывода таблицы, СКД начнет детализировать строки отчета до уникальных значений этого поля в каждой строке исходной выборки. В результате одна и та же строка группировки дублируется столько раз, сколько различных комбинаций значений получено для колонок таблицы, а на пересечениях появляются пустые места.
Чтобы строковое значение выводилось строго внутри ячейки на пересечении строки и колонки, СКД должна воспринимать его как показатель, то есть поле обязательно должно быть зарегистрировано как ресурс.
Рассмотрим вариант решения, предложенный в обсуждении: вызов экспортной функции общего модуля в выражении ресурса.
Функция КонкатенацияПолей(Поле1, Поле2) Экспорт
Возврат "" + Поле1 + "/" + Поле2;
КонецФункции
ИмяОбщегоМодуля.КонкатенацияПолей(К1, К2). Обратите внимание: просто очищать формулу нельзя, обязательно должно быть указано корректное выражение вычисления ресурса.Разберем более универсальный способ, который не требует создания функций в общих модулях и отлично подходит для внешних отчетов. Язык выражений СКД поддерживает операцию конкатенации строк и агрегатные функции непосредственно на вкладке Ресурсы.
К1, либо предварительно созданное вычисляемое поле).
Строка(Сумма(К1)) + " / " + Строка(Сумма(К2))
или с точным форматированием чисел:
Формат(Сумма(К1), "ЧДЦ=0") + " / " + Формат(Сумма(К2), "ЧДЦ=0")
Сумма или Максимум защитит отчет от синтаксических ошибок в тех случаях, когда на пересечение группировок строки и колонки попадает более одной детальной записи из запроса.Посмотрим на еще один штатный механизм, который позволяет сохранить исходные числовые поля ресурсами, не преобразуя их в строки на уровне вычислений.
К1 и К2 стандартными числовыми ресурсами с выражением Сумма(К1) и Сумма(К2).[К1] / [К2].Главное достоинство этого подхода заключается в том, что данные в схеме компоновки остаются полноценными числами. Это позволяет избежать проблем с лексикографической сортировкой (когда строка "10/2" при сортировке по алфавиту оказывается раньше, чем "2/1") и дает возможность параллельно рассчитывать корректные математические итоги.
Если для решения задачи выбран путь формирования строкового ресурса, стандартный расчет общих итогов по таблице перестает работать автоматически, поскольку сложить строки платформа не может.
Чтобы итоги по колонкам и строкам отображались корректно, на вкладке Ресурсы необходимо разделить формулы: в колонке Рассчитывать по... настроить отдельные строки выражения для детальных записей и промежуточных группировок, а также для поля ОбщиеИтоги, явно описав правила суммирования составляющих частей дроби.