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