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

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

При работе со справочником Номенклатура пользователи часто сталкиваются с ситуацией, когда группы или элементы, имеющие в начале названия порядковый номер, отображаются в некорректной последовательности. Вместо ожидаемого порядка 1, 2, 3... 10, 11 система выстраивает их лексикографически: 1, 10, 11, 2, 20. Это происходит потому, что поле Наименование является строковым, и программа сравнивает символы поочередно слева направо.

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

Причина возникновения проблемы

Для начала проанализируем ситуацию: в платформе 1С тип данных «Строка» сортируется посимвольно. Это означает, что единица в числе «10» сравнивается с двойкой. Поскольку единица стоит раньше в таблице символов, вся строка «10» оказывается выше строки «2». Чтобы обойти это ограничение и заставить систему воспринимать числа как числа, нам нужно применить один из нижеперечисленных методов.

Метод 1: Использование ведущих нулей (Самый быстрый способ)

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

Если мы знаем, что максимальное количество групп не превысит 99, нам достаточно двух знаков. Группы будут называться так:

  1. 01. Продукция
  2. 02. Полуфабрикаты
  3. ...
  4. 10. Материалы

Преимущества: не требует внесения изменений в конфигурацию, работает во всех типовых отчетах и формах выбора «из коробки».

Недостатки: визуально лишние нули могут не нравиться пользователям, а при достижении лимита (например, появлении 100-й группы) придется переименовывать все предыдущие записи в «001», «002».

Метод 2: Использование стандартного реквизита «Код»

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

Чтобы реализовать сортировку по коду, выполним следующие шаги:

  1. В конфигураторе проверим тип кода справочника Номенклатура. Если он текстовый, убедимся, что установлена фиксированная длина.
  2. В форме списка или форме подбора перейдем в «Настроить список».
  3. На закладке «Порядок» установим поле Код как основное для сортировки.

Рассмотрим ситуацию, когда код должен быть числовым. Некоторые разработчики советуют изменить тип кода на Число. Внимание: это опасный совет (как и упоминалось в сообщении 3), так как изменение типа кода в существующей базе с данными может привести к потере префиксов и проблемам при обмене данными. Лучше оставить код строковым, но следить за наличием ведущих нулей в нем (платформа добавляет их автоматически, если вы не отключали эту опцию).

Метод 3: Добавление дополнительного реквизита (Профессиональный подход)

Если мы хотим оставить наименования «красивыми» (без нулей типа «01»), нам необходимо добавить в систему поле, по которому будет происходить скрытая сортировка. Разберем по шагам, как это сделать:

1. В конфигураторе добавим новый реквизит для справочника Номенклатура (или только для его групп, если это позволяет структура). Назовем его ПорядокСортировки с типом Число.

2. Вынесем этот реквизит на форму элемента, чтобы пользователи могли задать приоритет (1, 2, 3 и т.д.).

3. В форме подбора или списка настроим динамический список. Для этого изменим свойство «Порядок» объекта ДинамическийСписок.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Очистим текущие настройки порядка
    Список.Порядок.Элементы.Очистить();
    
    // Добавим сортировку по нашему новому реквизиту
    ЭлементПорядка = Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("ПорядокСортировки");
    ЭлементПорядка.ВидУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
    ЭлементПорядка.Использование = Истина;

КонецПроцедуры

Метод 4: Настройка через Дополнительные реквизиты (БСП)

Если вы используете современную конфигурацию (УТ 11, ERP, КА 2, БП 3.0), можно обойтись без программирования в конфигураторе. Разберем этот алгоритм:

  1. Перейдем в раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения.
  2. Найдем справочник Номенклатура и добавим доп. реквизит «Порядок» с типом Число.
  3. В справочнике номенклатуры заполним этот реквизит у нужных групп.
  4. В форме списка через меню Еще — Изменить форму добавим это поле в колонки списка.
  5. Нажмем Еще — Настроить список и на закладке «Порядок» переместим наш доп. реквизит в правое окно.

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

Метод 5: Автоматизация исправления наименований

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

Нам потребуется функция, которая выделяет число в начале строки и дополняет его нулями. Рассмотрим пример кода:


Функция ПривестиНаименованиеКСтандарту(Знач ТекущееИмя)
    
    // Предположим, формат имени "1. Группа"
    ПозицияТочки = Найти(ТекущееИмя, ".");
    Если ПозицияТочки > 0 Тогда
        НомерСтрокой = Лев(ТекущееИмя, ПозицияТочки - 1);
        ОстатокНаименования = Сред(ТекущееИмя, ПозицияТочки);
        
        // Добавляем ведущий ноль, если номер состоит из одного символа
        Если СтрДлина(СокрЛП(НомерСтрокой)) = 1 Тогда
            Возврат "0" + СокрЛП(НомерСтрокой) + ОстатокНаименования;
        КонецЕсли;
    КонецЕсли;
    
    Возврат ТекущееИмя;
КонецФункции

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

Особенности иерархической сортировки

Выясним важный нюанс: в 1С существует два режима просмотра списка — иерархический и плоский. При иерархическом просмотре (дерево) система сначала сортирует папки (группы) верхнего уровня между собой, затем папки внутри них, и только потом элементы внутри папок. Если вы настроили сортировку по дополнительному реквизиту, убедитесь, что он заполнен у всех объектов, участвующих в иерархии, иначе элементы с пустым значением реквизита «провалятся» в самый верх или самый низ списка.

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

Резюме

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

← На главную