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

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

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

Анализ задачи: почему стандартная сортировка не подходит?

Исходная задача — вывести номенклатуру в печатной форме в строго определенном порядке, который задается последовательностью родительских групп. Стандартная сортировка по алфавиту или коду не решает эту проблему, так как бизнес-логика требует иного порядка. Например, группа «Молочная продукция» должна идти раньше группы «Автозапчасти», даже если по алфавиту она стоит позже.

Основная цель — найти универсальное и легко поддерживаемое решение, которое не превратится в «говнокод» из-за множества условий `Если ... Тогда ...` в цикле обхода табличной части.

Рассмотрим несколько эффективных методов реализации такой сортировки на уровне запроса, что является наиболее правильным и производительным подходом.

Решение 1: Динамическая сортировка в запросе с помощью ВЫБОР КОГДА

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

Посмотрим на примерную структуру такого запроса:


ВЫБРАТЬ
    Товары.Номенклатура,
    Товары.Количество,
    Товары.Цена,
    ВЫБОР
        КОГДА Товары.Номенклатура.Родитель = &МолочнаяПродукция ТОГДА 1
        КОГДА Товары.Номенклатура.Родитель = &Мороженое ТОГДА 2
        КОГДА Товары.Номенклатура.Родитель = &Бакалея ТОГДА 3
        ИНАЧЕ 999 // Все остальные группы будут в конце
    КОНЕЦ КАК ПорядокСортировки
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
    Товары.Ссылка = &СсылкаНаДокумент

УПОРЯДОЧИТЬ ПО
    ПорядокСортировки,
    Товары.Номенклатура.Наименование

Преимущества:

Недостатки:

Когда использовать: Этот метод отлично подходит для разовых задач или когда правил сортировки немного (2-5 групп), и они не будут меняться в обозримом будущем.

Решение 2: Использование временной таблицы для порядка сортировки

Этот подход является развитием предыдущей идеи. Вместо громоздкой конструкции `ВЫБОР КОГДА`, мы можем создать временную таблицу (ВТ) со списком групп и их порядковыми номерами. Затем эту таблицу можно соединить с основной выборкой товаров.

Разберем по шагам:

  1. Создаем временную таблицу. В нее помещаем ссылки на группы номенклатуры и присваиваем им порядковые номера. Это можно сделать через `ОБЪЕДИНИТЬ ВСЕ` или передать в запрос готовый массив структур.
  2. Соединяем с основной таблицей. Используем `ЛЕВОЕ СОЕДИНЕНИЕ` основной таблицы товаров с нашей временной таблицей по полю `Номенклатура.Родитель`.
  3. Сортируем результат. Упорядочиваем выборку по полю с порядковым номером из временной таблицы.

Пример запроса:


ВЫБРАТЬ
    &МолочнаяПродукция КАК Группа, 1 КАК Порядок
ПОМЕСТИТЬ ВТ_ПорядокГрупп

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    &Мороженое, 2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    &Бакалея, 3
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Товары.Номенклатура,
    Товары.Количество,
    Товары.Цена,
    ЕСТЬNULL(ВТ_ПорядокГрупп.Порядок, 999) КАК ПорядокСортировки
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПорядокГрупп
        ПО Товары.Номенклатура.Родитель = ВТ_ПорядокГрупп.Группа
ГДЕ
    Товары.Ссылка = &СсылкаНаДокумент

УПОРЯДОЧИТЬ ПО
    ПорядокСортировки,
    Товары.Номенклатура.Наименование

Преимущества:

Недостатки:

Решение 3: Хранение порядка в Регистре сведений (наиболее гибкий подход)

Этот способ предполагает вынесение настроек сортировки из кода в данные. Мы создаем отдельный объект в конфигурации — РегистрСведений, который будет хранить порядок групп.

Структура регистра ПорядокСортировкиНоменклатуры:

Пользователь (или администратор) сможет самостоятельно заполнять этот регистр через стандартный интерфейс, указывая для каждой группы ее порядковый номер. Запрос при этом становится очень простым и универсальным.


ВЫБРАТЬ
    Товары.Номенклатура,
    Товары.Количество,
    Товары.Цена,
    ЕСТЬNULL(ПорядокГрупп.Порядок, 999) КАК ПорядокСортировки
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПорядокСортировкиНоменклатуры КАК ПорядокГрупп
        ПО Товары.Номенклатура.Родитель = ПорядокГрупп.ГруппаНоменклатуры
ГДЕ
    Товары.Ссылка = &СсылкаНаДокумент

УПОРЯДОЧИТЬ ПО
    ПорядокСортировки,
    Товары.Номенклатура.Наименование

Преимущества:

Недостатки:

Решение 4: Добавление реквизита "Порядок" в справочник (самый надежный подход)

Если порядок сортировки является фундаментальным свойством групп номенклатуры и должен быть единым для всей системы, то лучшим решением будет добавление нового реквизита непосредственно в справочник Номенклатура (или, что логичнее, в справочник групп, если он отдельный).

Добавляем реквизит ПорядокСортировки (тип Число) в форму группы справочника номенклатуры. Ответственный сотрудник один раз проставляет нужные значения для всех родительских групп.

Запрос становится еще проще, так как вся информация уже есть в справочнике:


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

УПОРЯДОЧИТЬ ПО
    Товары.Номенклатура.Родитель.ПорядокСортировки,
    Товары.Номенклатура.Наименование

Преимущества:

Недостатки:

Сравнение подходов и итоговые рекомендации

Выбор конкретного метода зависит от требований к гибкости, масштабируемости и готовности вносить изменения в конфигурацию.

  1. Для быстрой и разовой задачи в одном отчете — используйте ВЫБОР КОГДА.
  2. Если логика сортировки должна быть глобальной, единой для всей системы и меняется редко — лучшим выбором будет добавление реквизита «Порядок» в справочник. Это наиболее "правильное" архитектурное решение.
  3. Если требуется максимальная гибкость, возможность настройки разных профилей сортировки для разных пользователей или организаций, и вы хотите дать пользователям возможность управлять порядком самостоятельно — создавайте РегистрСведений.

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

← На главную