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