Нередко при работе с отчетами в системе 1С:Предприятие 8.3 мы сталкиваемся с необходимостью представить данные из нескольких связанных строк в виде одной объединенной строки. Типичный сценарий, который мы рассмотрим сегодня, — это когда у нас есть основной объект, например, займ, и с ним связаны несколько второстепенных объектов, таких как поручители. Задача состоит в том, чтобы вывести всю информацию о поручителях в одной строке отчета через разделитель, не создавая при этом отдельные строки для каждого поручителя и не используя явные заголовки группировок. Это позволит нам получить более компактный и читаемый отчет.
Давайте подробнее разберем, как мы можем решить эту задачу, используя различные возможности системы компоновки данных (СКД) и языка 1С. Мы выясним, какие подходы являются наиболее эффективными и почему некоторые методы оказываются менее практичными или вовсе не применимы. Для тех, кто хочет расширить возможности настройки отчетов на стороне клиента, может оказаться полезной Пользовательская СКД, предоставляющая дополнительные инструменты визуализации.
СтрСоединить() с функцией Массив() в вычисляемых полях СКДОдним из наиболее элегантных и широко применяемых способов объединения строковых данных в 1С без явных группировок является использование вычисляемого поля в Системе Компоновки Данных (СКД) в сочетании с функциями СтрСоединить() и Массив(). Этот подход позволяет нам собрать все необходимые значения из детальных записей в массив, а затем объединить их в одну строку с заданным разделителем.
Понимание концепции Массив() в СКД.
Функция Массив(Поле) в СКД предназначена для сбора значений указанного поля из всех детальных записей, которые относятся к текущему уровню группировки, в массив. Хотя это подразумевает наличие концепции "группировки" внутри СКД для корректного сбора данных, на выходе мы можем настроить отчет так, чтобы отображалась только одна строка с уже объединенными данными, без дублирования детальных записей и без видимых заголовков группировок.
Для того чтобы Массив() работал корректно, мы должны определить вычисляемое поле, которое его использует, как ресурс в настройках СКД. Более того, для этого ресурса необходимо указать, по какому полю он будет рассчитываться. Например, если мы хотим объединить поручителей для каждого займа, мы указываем поле "Займ" в качестве измерения, по которому собираются данные.
Шаги по реализации в СКД:
Создание вычисляемого поля.
В настройках СКД (на вкладке "Наборы данных" или "Вычисляемые поля") создаем новое вычисляемое поле — для этого подойдёт инструмент для отладки запросов и СКД. Назовем его, например, ПоручителиСтрокой.
Определение выражения для вычисляемого поля.
В качестве выражения для этого поля мы используем комбинацию функций СтрСоединить() и Массив(). Предположим, что в нашем наборе данных есть поле ПоручительНаименование, которое мы хотим объединить.
СоединитьСтроки(Массив(ПоручительНаименование), "; ")
Здесь:
Массив(ПоручительНаименование): Эта часть собирает все наименования поручителей, относящиеся к одному займу, в динамический массив."; ": Это разделитель, который будет использован между каждым элементом массива при объединении.Настройка вычисляемого поля как ресурса.
Переходим на вкладке "Ресурсы" и выбираем поле ПоручителиСтрокой. В поле "Выражение" дублируем: СоединитьСтроки(Массив(ПоручительНаименование), "; "). Это необходимо для корректной агрегации данных.
Настройка группировок в отчете.
На вкладке "Настройки" добавляем группировку по полю Займ. Чтобы избежать лишнего визуального шума, можно применить программное изменение заголовка группировки отчета СКД, если стандартных средств скрытия заголовков недостаточно.
Ключевой момент: Чтобы избежать отображения детальных строк, мы выводим поле ПоручителиСтрокой на уровне группировки по Займу, а сами детальные записи не добавляем в выбранные поля.
Например, структура может быть такой:
Группировка: Займ
Выбранные поля: Займ, СуммаЗайма, ПоручителиСтрокой
В ситуациях, когда логика объединения данных становится сложной, или когда данные нужно получать из внешних источников, можно использовать универсальную функцию ПолучитьРезультатСКД() или создать собственную экспортную функцию в общем модуле.
Причины использования данного метода:
Шаги по реализации:
Создание функции в Общем модуле.
Создаем функцию в модуле с установленными свойствами "Сервер" и "Внешнее соединение". Пример функции:
Функция ПолучитьПоручителейЗаймаСтрокой(СсылкаНаЗайм) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Поручители.Наименование ИЗ Справочник.Поручители КАК Поручители ГДЕ Поручители.Займ = &Займ";
Запрос.УстановитьПараметр("Займ", СсылкаНаЗайм);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
МассивПоручителей = РезультатЗапроса.ВыгрузитьКолонку("Наименование");
Возврат СтрСоединить(МассивПоручителей, "; ");
КонецФункции
Вызов функции из СКД.
В вычисляемом поле указываем путь к функции: УправлениеЗаймамиСлужебный.ПолучитьПоручителейЗаймаСтрокой(ЗаймСсылка). Это поле также настраивается как ресурс.
Важно отметить, что в языке запросов 1С отсутствует прямая агрегатная функция для конкатенации строк из нескольких записей. Тем не менее, существуют сложные методы эмуляции такого поведения через временные таблицы и нумерацию строк.
ВЫБОР КОГДА Номер = 1 ТОГДА ... данные разворачиваются в колонки Поручитель1, Поручитель2.+.Критические замечания: Метод крайне громоздкий, плохо масштабируется и ограничен фиксированным количеством колонок. Он практически не используется, так как первые два метода гораздо эффективнее.
Подводя итог, мы проанализировали три основных подхода:
СтрСоединить() + Массив() в СКД:
Это наиболее рекомендуемый подход. Он универсален и прост. Для тех, кто часто создает сложные отчеты программно, рекомендуем использовать СКДБилдер: упрощаем программное создание СКД, который значительно сокращает объем кода при работе с настройками вычисляемых полей и ресурсов.
Функция в Общем модуле:
Лучший выбор для сложной логики. В исключительных случаях, когда один отчет должен объединять принципиально разные логики обработки данных, могут потребоваться две разных схемы в одном отчете СКД.
Обходные пути на уровне запроса 1С:
Метод не рекомендуется из-за его сложности и низкой гибкости.
При выборе метода всегда начинайте с использования встроенных функций СКД. Мы надеемся, что это руководство поможет вам сделать ваши отчеты более информативными и удобными для анализа.