При разработке отчетов в Системе Компоновки Данных (СКД) мы часто сталкиваемся с необходимостью компактного вывода информации. Одна из стандартных возможностей — объединение нескольких полей в одной ячейке. Это делается через настройки группировки выбранных полей, когда мы указываем расположение «Вместе». По умолчанию платформа 1С использует в качестве разделителя запятую.
Однако, как справедливо заметили участники обсуждения, возникают ситуации, когда стандартная запятая делает отчет нечитаемым. Особенно это критично, если выводимые поля содержат дробные числа, которые в русской локализации также разделяются запятой. В итоге пользователь видит строку вида 12,5, 30,1, 55,4, и понять, где заканчивается одно число и начинается другое, становится невозможно.
В этой статье мы подробно разберем несколько способов решения этой задачи: от «архитектурно правильных» методов использования макетов до программных обходных путей.
Давайте проанализируем, как работает механизм компоновки. Когда мы добавляем несколько полей в одну группу выбранных полей и устанавливаем тип расположения «Вместе» или «Горизонтально», платформа автоматически склеивает строковые представления этих значений через запятую с пробелом.
К сожалению, в свойствах самой группировки или поля нет простой настройки «Символ разделителя», где мы могли бы просто указать точку с запятой или вертикальную черту. Если программное изменение заголовка группировки отчета СКД еще можно реализовать через компромиссные решения, то сам разделитель внутри ячейки жестко зашит. Поэтому нам придется использовать более продвинутые инструменты СКД.
Самый гибкий и профессиональный способ управления выводом данных в СКД — это использование вкладки Макеты. Этот метод, подробно описанный в материале Макеты в СКД — это просто. Настройка индивидуального оформления не требует написания сложного кода и позволяет полностью контролировать содержимое ячейки. Возможности здесь широки: от форматирования текста до решения задач, как вывести несколько картинок в одну ячейку на СКД.
Рассмотрим порядок действий для создания собственного разделителя:
Номенклатура и Артикул через точку с запятой, мы напишем в ячейке макета следующий текст:
[Номенклатура]; [Артикул]
В данном случае квадратные скобки указывают системе, что это параметры, которые нужно заполнить данными. Символ ; между ними — это наш жестко заданный разделитель. Мы можем использовать любые символы: тире, слэши, переводы строк.
Важно: Не забудьте в параметрах макета сопоставить параметры макета (то, что в квадратных скобках) с полями компоновки данных.
Если по каким-то причинам использование макетов кажется избыточным, мы можем подготовить данные на этапе компоновки, создав одно строковое поле, которое уже содержит нужный разделитель. Рассматривая различные способы группировки строк в одну строку в СКД, можно заметить, что конкатенация — один из самых доступных методов.
Перейдем на вкладку Вычисляемые поля и создадим новое поле. В выражении этого поля нам нужно явно сложить строковые представления наших данных.
Рассмотрим пример выражения:
Строка(Поле1) + "; " + Строка(Поле2)
Однако здесь есть нюанс. Если одно из полей будет содержать значение NULL (например, при левом соединении), то результат сложения со строкой может стать неопределенным или пустым (в зависимости от СУБД и контекста, но в языке выражений СКД лучше перестраховаться). Поэтому правильнее использовать функцию ЕстьNull и приведение типов.
Давайте напишем безопасное выражение:
ЕстьNull(Строка(Поле1), "") + "; " + ЕстьNull(Строка(Поле2), "")
Теперь мы можем выводить это единственное вычисляемое поле в отчет. Поскольку это одна строка, платформа не будет добавлять свои запятые.
Иногда задача стоит не в том, чтобы соединить разные колонки одной строки (например, Артикул и Наименование), а в том, чтобы свернуть несколько строк детальных записей в одну ячейку группировки. Фактически, это простой способ собрать значения колонки из нескольких строк в одну.
Для этого в языке выражений СКД существует мощная функция СоединитьСтроки(), которая позволяет указать разделитель вторым параметром.
Синтаксис выглядит так:
СоединитьСтроки(Массив(ПолеДляСвертки), "; ")
Разберем параметры:
Массив(ПолеДляСвертки) — эта функция собирает все значения детальных записей, входящих в группировку, в массив."; " — это строка-разделитель. Здесь мы можем указать точку с запятой, перенос строки (Символы.ПС) или любой другой знак.Это выражение обычно прописывается на вкладке Ресурсы для поля, которое нужно свернуть.
Вернемся к проблеме автора темы: "дробные части есть, тоже через запятую, читается плохо". Если задача состоит не в принципиальном отказе от запятой как разделителя полей, а в устранении визуальной путаницы с десятичной запятой, мы можем изменить формат вывода чисел.
В настройках полей СКД (или в наборе данных) для числовых ресурсов можно задать Оформление. Нас интересует параметр Формат. Разобраться в том, как приручить форматную строку для чисел и дат, помогут специализированные руководства по конструктору формата.
Построим форматную строку, которая заменяет десятичный разделитель на точку:
ЧДЦ=2; ЧРД=.
Расшифруем:
ЧДЦ=2 — Число Десятичных Цифр (показывать 2 знака после запятой).ЧРД=. — Число Разделитель Дробной (использовать точку вместо запятой).В результате числа будут выглядеть как 12.50, 30.10. При объединении их через стандартную запятую группировки мы получим: 12.50, 30.10. Это читается гораздо легче и не требует сложного программирования.
В обсуждении на форуме было предложено решение, которое автор назвал "костылем", но оно вполне рабочее, если реализован программный вывод отчета СКД. Это может быть актуально, когда логика формирования слишком сложна, например, когда используются две разных схемы в отчете СКД, и менять настройки компоновки рискованно.
Идея заключается в следующем:
1. Выводим отчет как есть, но для чисел временно меняем разделитель дробной части на какой-то уникальный (например, на точку или тильду), чтобы отличать их от разделителей полей.
2. Получаем готовый объект ТабличныйДокумент.
3. Проходим по области ячеек или используем метод замены текста во всем документе, меняя запятые (разделители полей) на точку с запятой.
4. Возвращаем разделители дробной части обратно, если это необходимо.
Рассмотрим примерный алгоритм замены запятой на точку с запятой во всем документе. Обратите внимание, что это "ковровая бомбардировка" — заменятся все запятые, включая те, что в тексте заголовков, если не ограничить область поиска.
// Примерный код постобработки после вывода отчета
// Результат - это ТабличныйДокумент
ОбластьВсегоДокумента = Результат.Область();
ПоискЗамена = Результат.СоздатьЗамену();
ПоискЗамена.НайтиТекст = ","; // Что ищем (стандартный разделитель)
ПоискЗамена.ЗаменитьТекст = ";"; // На что меняем
ПоискЗамена.Область = ОбластьВсегоДокумента;
// Важно: нужно быть осторожным, чтобы не заменить запятые в тексте названий
ПоискЗамена.ЗаменитьВсе();
Этот метод мы рекомендуем использовать только в крайних случаях, так как он может затронуть лишние данные и требует дополнительных ресурсов на модификацию табличного документа.
Давайте подведем итог. Стандартная запятая в группировке СКД не настраивается "галочкой", но у нас есть богатый арсенал решений: