При разработке отчетов в системе компоновки данных (СКД) часто возникает задача построения кросс-таблицы, где по колонкам выводятся даты, по строкам — объекты учета (например, склады или подразделения), а на пересечении необходимо отобразить статусы или реквизиты сразу нескольких документов за выбранный день. Разберем, какими механизмами платформы 1С:Предприятие 8 можно решить эту задачу, как красиво отформатировать вывод и как не потерять интерактивную расшифровку данных.
Проанализируем базовый способ склеивания нескольких строковых значений в одну ячейку. В СКД для работы с коллекциями значений предусмотрена стандартная агрегатная функция СоединитьСтроки.
Синтаксис функции выглядит следующим образом:
СоединитьСтроки(Значение, [РазделительЭлементов], [РазделительКолонок])
Пошагово настроим вычисление ресурса в схеме компоновки данных:
Статус) в список ресурсов.
СоединитьСтроки(Массив(Различные Статус))
СоединитьСтроки(ТаблицаЗначений(Статус, Документ), Символ(10), " — ")
Важный нюанс форматирования: по умолчанию в функции СоединитьСтроки вторым параметром (РазделительЭлементов) уже является системный символ перевода строки. Поэтому выражение СоединитьСтроки(Массив(Различные Статус)) автоматически выводит каждое новое значение с новой строки внутри ячейки без необходимости явно передавать Символ(10).
Главным ограничением данного подхода является то, что ячейка с точки зрения платформы становится неделимым текстом. При двойном клике расшифровка будет открывать всю группировку целиком, а не отдельный документ из списка.
Если для пользователей критически важно сохранить штатную расшифровку каждого документа, объединять строки через ресурсы не следует. Рассмотрим, как перестроить структуру таблицы в СКД:
Дата (или ПериодДень).СкладОтправитель), а внутрь нее поместим подчиненную группировку по полю Документ или Детальные записи.Статус (при этом Статус не обязательно делать ресурсом, если он выводится на уровне детальных записей).В такой конфигурации СКД автоматически сформирует строки под каждый отдельный документ на соответствующую дату. При этом каждый статус будет располагаться в своей отдельной подстроке, сохраняя стандартный механизм расшифровки 1С по двойному клику мыши.
Разберем ситуацию, когда отчет должен иметь компактный вид, но требуется жесткий контроль за отображением данных и их расшифровкой:
Параметр или Шаблон.ДокументСсылка), и укажем основное действие — Открыть значение.Если ячейка формируется через склеивание строк (Вариант 1), но интерактивный переход к конкретному документу все же необходим, используем программную обработку расшифровки. Посмотрим, как это реализовать:
РезультатОбработкаРасшифровки.ДанныеРасшифровки и выведем пользователю меню выбора документа:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
Перем ВыполненноеДействие;
// Получаем список документов текущей ячейки из данных расшифровки
// и предлагаем пользователю интерактивный выбор нужного объекта для открытия
КонецПроцедуры
Таким образом, для быстрого визуального разделения статусов внутри ячейки достаточно применить функцию СоединитьСтроки(Массив(Различные Поле)) в ресурсах СКД. Если же ключевым требованием является сохранение поштучной расшифровки каждого документа, наиболее надежным решением будет использование вложенных группировок в структуре таблицы.