gifts2017

СКД: вывод строк из табличной части в одной ячейке строки

Опубликовал ivanov660 ivanov660 (ivanov660) в раздел Программирование - Практика программирования

Ответим на вопрос: как в одной ячейке строки вывести товары, характеристики, набор значений из табличной части через запятую, двоеточие, на новой строке или с другими параметрами.
Приведем простую последовательность из пяти шагов для решения этой задачи.
Конфигурация для теста отчета УТ 11 (ERP 2.0). Рассмотрим на примере документа "Реализация товаров и услуг".  Выведем ссылку, организацию, контрагента и номенклатуру, в итоге отчет должен принять вид показанный на рисунке ниже.
 
Примерный вид отчета
Рис. 1 Примерный вид отчета

Шаг 1. Для этого создадим новый отчет и сформируем основную схему компоновки данных. И добавим два набора данных.
Набор данных1:

ВЫБРАТЬ
	РеализацияТоваровУслуг.Ссылка,
	РеализацияТоваровУслуг.Дата,
	РеализацияТоваровУслуг.Контрагент,
	РеализацияТоваровУслуг.Организация
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
	РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериод И &КонецПериода

Набор данных2:

ВЫБРАТЬ
	"Номенклатура" КАК КолонкаНоменклатуры,
	РеализацияТоваровУслугТовары.Ссылка,
	РеализацияТоваровУслугТовары.НомерСтроки,
	РеализацияТоваровУслугТовары.Номенклатура,
	РеализацияТоваровУслугТовары.Количество
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
	РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериод И &КонецПериода

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

Настройка варианта
Рис. 2 Пример варианта настройки

Шаг 5. Сохраняем и запускаем. Задача решена

Скачать файлы

Наименование Файл Версия Размер
Внешний отчет-пример использования функции СКД "Соединить Строки" 71
.erf 6,24Kb
20.11.15
71
.erf 28.01.15.1 6,24Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Крынецкий (echo77) 28.01.15 23:24
В языке выражений платформы 8.2 нет функций СоединитьСтроки() и Таблица(), но есть другие.

Я уже писал об этом в статье: http://infostart.ru/public/267055/
Согласен, что ваш пример более красивый для случая с табличной частью
2. ivanov660 ivanov660 (ivanov660) 29.01.15 07:35
Мы рассматривали конкретную задачу.
Привели конкретный пример для ее практического решения.
Описали быстрый старт - на основе этого примера легко начать работать с данным функционалом.
У Вас же в статье описан перечень функций и краткие советы по их использованию.

UPD. Функции СКД СоединитьСтроки и ТаблицаЗначений появились с версии 8.2.14. К тому же при необходимости можно использовать собственные функции, необходимо чтобы они были доступны в глобальном контексте или описаны в модуле менеджера отчета. В свое время для выполнения отчета создавали набор математических функций типа квадратного корня.
3. Константин Куликов (Светлый ум) 05.02.15 06:24
4. ффф ыыы (zqzq) 16.02.15 08:48
СоединитьСтроки не обязательно использовать, платформа сама строковое представление сделает. И при щелчке на таблицу откроет её как расшифровку... в толстом клиенте. В тонком клиенте ТаблицаЗначений недоступна на клиенте и платформа 8.2 вылетает с ошибкой при расшифровке :) С массивом нормально отрабатывает в обоих случаях. Так что с учетом бага пока действительно лучше к строке приводить.

P.S. Часто более полезной оказывается функция ВычислитьВыражениеСГруппировкойТаблицаЗначений (см. справку).
5. Сергей Гуков (SirYozha) 19.02.15 08:43
Спасибо! Интересное решение, возьмем на карандаш :).
+1

p.s. В шаге 4 исправьте орфографическую ошибочку в слове ОрАГнизация.
6. Александр Крынецкий (echo77) 22.02.15 17:10
(4) zqzq, У функции СоединитьСтроки() вся фишка в параметрах номер 2 и 3
7. Антон Коваленко (Kaval88) 13.03.15 11:36
2 набора данных не оптимально.
8. Александр Крынецкий (echo77) 13.03.15 21:38
(7) Kaval88, согласен, но иногда позволяют красивее и проще решить некоторые задачи соединения "мух" с "котлетами" (остатков, с оборотами и т.д.) без всяческих наворотов и сильной просадки производительности.
9. ivanov660 ivanov660 (ivanov660) 14.03.15 13:42
(7) Kaval88, приведен пример о возможностях СКД. В некоторых случаях 2 набора данных оптимальнее, Вы же знаете, что алгоритм СКД изменяет запрос в зависимости от настроек, и если в вывод отчета не попадает ни одного поля из набора 2, то данные отбираться не будут из базы.
10. Дмитрий Лупанов (maguga) 19.11.15 16:40
уважаемые, а на какую справку вы ссылаетесь? я вот в синтаксис помошнике нинашел ничего подобного. и если есть ссылка поделитесь пожалуйста.
11. Александр Крынецкий (echo77) 19.11.15 19:10
(10) maguga, Справка->Содержание справки
Прикрепленные файлы:
12. Елена Konyavka (konyavka) 18.01.16 16:20
Статья очень помогла. Спасибо.