Как упорядочить номенклатуру и её аналоги в отчете на СКД?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Способ 1. Изменение структуры запроса и использование группировок

Проанализируем самый надежный метод, который был предложен в обсуждении. Если ваши исходные данные представлены в виде одного списка, где вперемешку идут и основные товары, и аналоги, СКД будет сложно «догадаться», какая строка к какой относится. Чтобы решить эту задачу, нам необходимо подготовить данные в запросе таким образом, чтобы у каждой строки было два измерения: Номенклатура (основная) и Аналог.

Рассмотрим по шагам: вместо того чтобы выводить всё в одну колонку, мы создаем запрос, результатом которого будут две колонки. Для основных позиций колонка Аналог будет пустой (или содержать значение NULL), а для строк-аналогов в колонке Номенклатура будет указан владелец (основной товар), а в колонке Аналог — сам аналог.

В настройках СКД на закладке «Настройки» мы создаем следующую структуру:

  1. Добавляем группировку по полю Номенклатура.
  2. Внутри этой группировки добавляем детальные записи (или группировку по полю Аналог).

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

Способ 2. Использование вычисляемого поля для технической сортировки

Бывают ситуации, когда структура отчета не позволяет использовать вложенные группировки, и данные нужно вывести «плоским» списком. В этом случае мы можем прибегнуть к созданию специального индекса сортировки. Выясним, как это работает.

В тексте запроса или в вычисляемых полях СКД мы можем сформировать строку, по которой будет производиться упорядочивание. Например, для основной номенклатуры мы берем её уникальный код и добавляем в конец символ «0», а для аналога берем код основной номенклатуры и добавляем символ «1».

Рассмотрим пример выражения в запросе:


ВЫБРАТЬ
    НоменклатураСсылка КАК Товар,
    ВЫБОР
        КОГДА ЭтоАналог ТОГДА ОсновнаяНоменклатура.Код + "1" + НоменклатураСсылка.Наименование
        ИНАЧЕ НоменклатураСсылка.Код + "0"
    КОНЕЦ КАК ПолеСортировки
ИЗ
    Справочник.Номенклатура

Теперь в настройках СКД на закладке «Упорядочивание» достаточно указать поле ПолеСортировки. Так как коды основных позиций совпадают с префиксами их аналогов, а «0» идет раньше «1», аналоги всегда окажутся сразу под основным товаром в алфавитном порядке внутри своей группы.

Способ 3. Иерархические связи наборов данных

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

Перейдем на закладку «Связи наборов данных» и настроим связь:

  1. Источник связи: НаборДанных1 (Номенклатура).
  2. Приемник связи: НаборДанных1 (Аналоги).
  3. Условие связи: Ссылка = ОсновнаяНоменклатура.
  4. Параметры: укажите поле, по которому система будет находить подчиненные записи.

При использовании типа вывода «Иерархия» в настройках отчета, 1С сама визуально сместит аналоги вправо (сделает отступ), что значительно повышает читаемость отчета. Это наиболее профессиональный метод визуализации связей «ведущий-ведомый».

Способ 4. Сложные выражения упорядочивания

Если мы не хотим менять запрос, мы можем настроить порядок непосредственно в интерфейсе СКД. Разберем, как прописать логику в настройках упорядочивания. Допустим, у нас есть поля Номенклатура и ЭтоАналог (булево).

Мы можем добавить два уровня сортировки:

  1. Первое поле: выражение ВЫБОР КОГДА Аналог ЕСТЬ NULL ТОГДА Номенклатура ИНАЧЕ РодительскаяНоменклатура КОНЕЦ. Это поле объединит основную позицию и аналоги в один блок.
  2. Второе поле: выражение ВЫБОР КОГДА Аналог ЕСТЬ NULL ТОГДА 0 ИНАЧЕ 1 КОНЕЦ. Это поле гарантирует, что основная позиция (0) всегда будет выше своих аналогов (1).

Способ 5. Метод объединения (UNION) с весовыми коэффициентами

Посмотрим на пример реализации через запрос с объединением таблиц. Этот метод хорош тем, что он жестко задает структуру еще на этапе получения данных. Мы выбираем данные дважды: сначала основные, потом аналоги, и помечаем их «весом».


ВЫБРАТЬ
    Номенклатура КАК Ссылка,
    Номенклатура КАК ГруппаСортировки,
    0 КАК Вес
ИЗ
    Справочник.Номенклатура ГДЕ ...
    
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Аналог,
    ОсновнаяНоменклатура,
    1
ИЗ
    РегистрСведений.АналогиНоменклатуры ГДЕ ...

В настройках СКД устанавливаем сортировку сначала по полю ГруппаСортировки, а затем по полю Вес. Таким образом, система сначала соберет вместе основной товар и все его аналоги (у них общее поле ГруппаСортировки), а внутри этой группы поставит товар первым, так как его вес (0) меньше веса аналогов (1).

Способ 6. Системные поля для нумерации строк

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

Чтобы добавить нумерацию, просто перетащите нужное поле в «Выбранные поля» вашей группировки или детальных записей. Это поможет визуально отделить один блок «Номенклатура + Аналоги» от другого, особенно если отчет содержит сотни строк.

Важный момент: при использовании группировок (Способ 1) убедитесь, что в настройках выбранных полей для группировки по Номенклатуре не дублируются поля из детальных записей, иначе информация может выглядеть избыточно. Используйте Макеты, если стандартный вывод группировок СКД вас не устраивает по оформлению.

← На главную