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