Как изменить разделитель полей в группировке СКД вместо стандартной запятой?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов в Системе Компоновки Данных (СКД) мы часто сталкиваемся с необходимостью компактного вывода информации. Одна из стандартных возможностей — объединение нескольких полей в одной ячейке. Это делается через настройки группировки выбранных полей, когда мы указываем расположение «Вместе». По умолчанию платформа 1С использует в качестве разделителя запятую.

Однако, как справедливо заметили участники обсуждения, возникают ситуации, когда стандартная запятая делает отчет нечитаемым. Особенно это критично, если выводимые поля содержат дробные числа, которые в русской локализации также разделяются запятой. В итоге пользователь видит строку вида 12,5, 30,1, 55,4, и понять, где заканчивается одно число и начинается другое, становится невозможно.

В этой статье мы подробно разберем несколько способов решения этой задачи: от «архитектурно правильных» методов использования макетов до программных обходных путей.

Проблема стандартной группировки

Давайте проанализируем, как работает механизм компоновки. Когда мы добавляем несколько полей в одну группу выбранных полей и устанавливаем тип расположения «Вместе» или «Горизонтально», платформа автоматически склеивает строковые представления этих значений через запятую с пробелом.

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

Способ 1: Использование Макетов оформления (Рекомендуемый)

Самый гибкий и профессиональный способ управления выводом данных в СКД — это использование вкладки Макеты. Этот метод, подробно описанный в материале Макеты в СКД — это просто. Настройка индивидуального оформления не требует написания сложного кода и позволяет полностью контролировать содержимое ячейки. Возможности здесь широки: от форматирования текста до решения задач, как вывести несколько картинок в одну ячейку на СКД.

Рассмотрим порядок действий для создания собственного разделителя:

  1. Откроем схему компоновки данных и перейдем на вкладку Макеты.
  2. Добавим новый Макет поля.
  3. В качестве поля выберем то поле, которое мы хотим вывести, или, если у нас группировка полей, можно создать макет для всей группировки (если она имеет имя) или просто нарисовать область макета.
  4. В области макета (ячейке табличного документа) мы можем вручную написать шаблон вывода. Например, если нам нужно вывести Номенклатура и Артикул через точку с запятой, мы напишем в ячейке макета следующий текст:

[Номенклатура]; [Артикул]

В данном случае квадратные скобки указывают системе, что это параметры, которые нужно заполнить данными. Символ ; между ними — это наш жестко заданный разделитель. Мы можем использовать любые символы: тире, слэши, переводы строк.

Важно: Не забудьте в параметрах макета сопоставить параметры макета (то, что в квадратных скобках) с полями компоновки данных.

Способ 2: Вычисляемое поле с конкатенацией

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

Перейдем на вкладку Вычисляемые поля и создадим новое поле. В выражении этого поля нам нужно явно сложить строковые представления наших данных.

Рассмотрим пример выражения:

Строка(Поле1) + "; " + Строка(Поле2)

Однако здесь есть нюанс. Если одно из полей будет содержать значение NULL (например, при левом соединении), то результат сложения со строкой может стать неопределенным или пустым (в зависимости от СУБД и контекста, но в языке выражений СКД лучше перестраховаться). Поэтому правильнее использовать функцию ЕстьNull и приведение типов.

Давайте напишем безопасное выражение:

ЕстьNull(Строка(Поле1), "") + "; " + ЕстьNull(Строка(Поле2), "")

Теперь мы можем выводить это единственное вычисляемое поле в отчет. Поскольку это одна строка, платформа не будет добавлять свои запятые.

Способ 3: Агрегатная функция СоединитьСтроки

Иногда задача стоит не в том, чтобы соединить разные колонки одной строки (например, Артикул и Наименование), а в том, чтобы свернуть несколько строк детальных записей в одну ячейку группировки. Фактически, это простой способ собрать значения колонки из нескольких строк в одну.

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

Синтаксис выглядит так:

СоединитьСтроки(Массив(ПолеДляСвертки), "; ")

Разберем параметры:

  1. Массив(ПолеДляСвертки) — эта функция собирает все значения детальных записей, входящих в группировку, в массив.
  2. "; " — это строка-разделитель. Здесь мы можем указать точку с запятой, перенос строки (Символы.ПС) или любой другой знак.

Это выражение обычно прописывается на вкладке Ресурсы для поля, которое нужно свернуть.

Способ 4: Изменение формата чисел (Если проблема в дробной части)

Вернемся к проблеме автора темы: "дробные части есть, тоже через запятую, читается плохо". Если задача состоит не в принципиальном отказе от запятой как разделителя полей, а в устранении визуальной путаницы с десятичной запятой, мы можем изменить формат вывода чисел.

В настройках полей СКД (или в наборе данных) для числовых ресурсов можно задать Оформление. Нас интересует параметр Формат. Разобраться в том, как приручить форматную строку для чисел и дат, помогут специализированные руководства по конструктору формата.

Построим форматную строку, которая заменяет десятичный разделитель на точку:

ЧДЦ=2; ЧРД=.

Расшифруем:

В результате числа будут выглядеть как 12.50, 30.10. При объединении их через стандартную запятую группировки мы получим: 12.50, 30.10. Это читается гораздо легче и не требует сложного программирования.

Способ 5: Постобработка табличного документа (Программный метод)

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

Идея заключается в следующем: 1. Выводим отчет как есть, но для чисел временно меняем разделитель дробной части на какой-то уникальный (например, на точку или тильду), чтобы отличать их от разделителей полей. 2. Получаем готовый объект ТабличныйДокумент. 3. Проходим по области ячеек или используем метод замены текста во всем документе, меняя запятые (разделители полей) на точку с запятой. 4. Возвращаем разделители дробной части обратно, если это необходимо.

Рассмотрим примерный алгоритм замены запятой на точку с запятой во всем документе. Обратите внимание, что это "ковровая бомбардировка" — заменятся все запятые, включая те, что в тексте заголовков, если не ограничить область поиска.


// Примерный код постобработки после вывода отчета
// Результат - это ТабличныйДокумент

ОбластьВсегоДокумента = Результат.Область();
ПоискЗамена = Результат.СоздатьЗамену();
ПоискЗамена.НайтиТекст = ","; // Что ищем (стандартный разделитель)
ПоискЗамена.ЗаменитьТекст = ";"; // На что меняем
ПоискЗамена.Область = ОбластьВсегоДокумента;
// Важно: нужно быть осторожным, чтобы не заменить запятые в тексте названий
ПоискЗамена.ЗаменитьВсе();

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

Резюме

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

  1. Если нужно просто разделить числа визуально — настройте Формат чисел (замените десятичную запятую на точку).
  2. Если нужен полный контроль над строкой — используйте Макет поля. Это самый надежный способ.
  3. Если нужно быстрое решение без макетов — используйте Вычисляемое поле с формулой конкатенации.
  4. Если отчет формируется кодом и схему трогать нельзя — можно аккуратно обработать результирующий табличный документ.
← На главную