К статье
Практический материал

Отчеты и Аналитика · 11 мин

Как объединить строки в СКД 1С

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

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

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

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

Определите, какой тип объединения вам нужен

Перед изменением схемы компоновки чётко сформулируйте результат. Если требуется «схлопнуть» строки и получить суммы, количества или средние — это задача группировки с агрегацией. Если требуется получить в ячейке перечень значений текстом — это задача конкатенации, и она решается на уровне данных, а не настроек отчёта.

Маршрут решения

Как выбрать действие

Нужны итоги: сумма, количество, максимум, минимум по группеИспользуйте группировку и ресурсы с агрегатными функциями в настройках СКД
Нужен список значений текстом в одной ячейке (например, товары через запятую)Готовьте строку в запросе или добавьте вычисляемое поле с функцией общего модуля
Нужно убрать детальные строки и оставить только итоги по группеУдалите детальные записи из структуры настроек и оставьте только группировку

Частая ситуация: пользователь просит «объединить одинаковые строки», а на деле в отчёте просто присутствуют детальные записи, которые мешают восприятию. В этом случае достаточно убрать уровень детальных записей из структуры настроек — никакой доработки запроса не потребуется.

Объединение строк через группировку и ресурсы

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

Чтобы в объединённой строке отображались числовые показатели, определите ресурсы на закладке «Ресурсы» схемы. Для каждого ресурса задайте выражение с агрегатной функцией: Сумма(СуммаОборот), Количество(Ссылка), Максимум(Дата). Без объявленных ресурсов поля в группировке могут выводиться пустыми или с произвольным значением из группы.

Склейка текстовых значений из нескольких строк

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

Подготовка строки в запросе набора данных

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

Вычисляемое поле с функцией общего модуля

Универсальный способ — вычисляемое поле, выражение которого вызывает функцию из общего модуля. На закладке «Вычисляемые поля» добавьте поле, укажите путь к данным и выражение вида ОбщийМодульОтчеты.СформироватьСписокТоваров(Ссылка). Функция в общем модуле выполняет запрос по связанным данным и возвращает строку, собранную через цикл или СоединитьСтроки.

bsl
Функция СформироватьСписокТоваров(ДокументСсылка) Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ Товары.Номенклатура.Наименование КАК Наименование ИЗ Документ.Заказ.Товары КАК Товары ГДЕ Товары.Ссылка = &Ссылка";
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	МассивСтрок = Новый Массив;
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		МассивСтрок.Добавить(Выборка.Наименование);
	КонецЦикла;
	Возврат СтрСоединить(МассивСтрок, ", ");
КонецФункции

Общий модуль, из которого вызывается функция, должен быть серверным и иметь установленный флаг «Вызов сервера», иначе СКД не сможет обратиться к нему при формировании отчёта. Также учтите: функция вызывается для каждой выводимой строки, поэтому запрос внутри неё должен быть максимально лёгким, иначе отчёт на больших данных заметно замедлится.

Объединение значений в запросе через ВЫРАЗИТЬ и упорядочивание

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

Сравнение вариантов склейки строк

Группировка + ресурсы

Подходит для чисел и простых итогов. Не склеивает произвольный текст, зато настраивается без кода

Вычисляемое поле с функцией модуля

Гибкий способ для текста. Требует доработки общего модуля и контроля производительности

Внешний набор данных

Максимальная гибкость, но отчёт формируется только программно, настройки пользователя ограничены

Объединение строк из нескольких наборов данных

Отдельная задача — объединить строки, поступающие из разных наборов данных, например из двух запросов. Здесь применяется объединение наборов: в схеме компоновки создайте набор данных типа «Объединение» и добавьте в него нужные запросы. Поля с одинаковыми именами и совместимыми типами попадут в общий результат как единая последовательность строк.

Следите за составом полей: в объединении все наборы должны возвращать одинаковый список полей с совместимыми типами. Если во втором запросе отсутствует поле, добавьте в его текст NULL КАК ИмяПоля или значение-заглушку с приведением типа через ВЫРАЗИТЬ. Несовпадение состава полей — типичная причина ошибки при формировании отчёта.

Если строки нужно не складывать в одну кучу, а связывать (например, шапку документа со строками табличной части), используйте связи наборов данных на закладке «Связи наборов данных». Там задаётся поле связи, и СКД автоматически объединит данные по нему при выводе.

Проверка результата и типичные ошибки

После настройки сформируйте отчёт и сверьте итоги с эталоном: например, сумму по группе с оборотно-сальдовой ведомостью или сумму по детальным строкам исходного варианта отчёта. Совпадение контрольных сумм — главный признак корректного объединения.

Контрольные точки

Как проверить результат

Итог по ресурсу в группировке
Норма

Равен сумме детальных строк до объединения

Тревожный признак

Итог пуст, равен нулю или отличается от контрольной суммы

Склеенная текстовая ячейка
Норма

Содержит все ожидаемые значения через разделитель

Тревожный признак

Ячейка пустая или содержит только одно значение

Структура отчёта
Норма

Выводятся только нужные уровни группировок

Тревожный признак

Присутствуют дублирующие детальные строки

Типичные ошибки
01
Ресурс объявлен, но не добавлен в выбранные поля — колонка не появляется в отчёте
02
В объединении наборов разный состав полей — ошибка формирования или пустые колонки
03
Функция общего модуля не экспортная или модуль без флага «Сервер» — ошибка вычисления выражения
04
В выражении ресурса забыта агрегатная функция — в итог попадает произвольное значение из группы
05
Тяжёлый запрос внутри функции склейки — отчёт формируется неприемлемо долго

Частые вопросы

Можно ли склеить строки в СКД без программирования?

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

Почему в группировке выводится только одно значение вместо итога?

Скорее всего, поле не объявлено ресурсом с агрегатной функцией. Без агрегации СКД берёт для группы произвольное значение из входящих в неё записей. Добавьте поле на закладку «Ресурсы» с выражением вида Сумма(Поле).

Как объединить строки, убрав дубли полностью?

Добавьте группировку по всем полям, определяющим уникальность строки, и уберите детальные записи. Если дубли приходят из запроса, дополнительно используйте в тексте запроса группировку или ключевое слово РАЗЛИЧНЫЕ.

Почему вычисляемое поле с функцией выдаёт ошибку?

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

Как объединить данные двух разных запросов в одном отчёте?

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

Влияет ли объединение строк на скорость отчёта?

Группировка и ресурсы практически не влияют — агрегация выполняется в запросе. Замедление даёт склейка текста через функцию общего модуля, если она выполняет запрос для каждой строки. Оптимизируйте такие функции или выносите подготовку данных на уровень основного запроса.

Итог

Что важно запомнить

Объединение строк в СКД 1С решается группировкой с ресурсами для числовых итогов и вычисляемыми полями с функцией общего модуля — для склейки текста. Убирайте детальные записи для компактного отчёта, контролируйте состав полей в объединении наборов и проверяйте итоги по контрольным суммам. Доработки выполняйте через вариант настроек или внешний отчёт, не трогая типовую схему.