Как в СКД вывести несколько значений в одну ячейку с переносом строки и сохранить расшифровку?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Вариант 1. Использование функции «СоединитьСтроки» на вкладке «Ресурсы»

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

Синтаксис функции выглядит следующим образом:

СоединитьСтроки(Значение, [РазделительЭлементов], [РазделительКолонок])

Пошагово настроим вычисление ресурса в схеме компоновки данных:

  1. Перейдем на вкладку Ресурсы в схеме компоновки данных.
  2. Добавим поле (например, Статус) в список ресурсов.
  3. В колонке Выражение укажем формулу агрегации с отбором уникальных значений: СоединитьСтроки(Массив(Различные Статус))
  4. Если в отчете требуется вывести не только уникальные статусы, но и информацию о самих документах (например, связку «Статус — Номер документа»), воспользуемся таблицей значений в качестве источника: СоединитьСтроки(ТаблицаЗначений(Статус, Документ), Символ(10), " — ")

Важный нюанс форматирования: по умолчанию в функции СоединитьСтроки вторым параметром (РазделительЭлементов) уже является системный символ перевода строки. Поэтому выражение СоединитьСтроки(Массив(Различные Статус)) автоматически выводит каждое новое значение с новой строки внутри ячейки без необходимости явно передавать Символ(10).

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

Вариант 2. Настройка структуры отчета без объединения строк (кросс-таблица с вложенной группировкой)

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

  1. Перейдем на вкладку Настройки и создадим элемент структуры Таблица.
  2. В секцию Колонки добавим группировку по полю Дата (или ПериодДень).
  3. В секцию Строки добавим группировку верхнего уровня (например, СкладОтправитель), а внутрь нее поместим подчиненную группировку по полю Документ или Детальные записи.
  4. В панели Выбранные поля для структуры таблицы укажем поле Статус (при этом Статус не обязательно делать ресурсом, если он выводится на уровне детальных записей).

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

Вариант 3. Использование пользовательских макетов СКД

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

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

Вариант 4. Программная обработка расшифровки в модуле формы отчета

Если ячейка формируется через склеивание строк (Вариант 1), но интерактивный переход к конкретному документу все же необходим, используем программную обработку расшифровки. Посмотрим, как это реализовать:

  1. В форме отчета создадим обработчик события таблицы отчета РезультатОбработкаРасшифровки.
  2. В коде обработчика извлечем массив исходных записей через объект ДанныеРасшифровки и выведем пользователю меню выбора документа:
    
    &НаКлиенте
    Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
        Перем ВыполненноеДействие;
        
        // Получаем список документов текущей ячейки из данных расшифровки
        // и предлагаем пользователю интерактивный выбор нужного объекта для открытия
    КонецПроцедуры
    

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

← На главную