Как исправить сортировку номеров документов в 1С при отсутствии ведущих нулей?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При работе в конфигурациях «1С:Предприятие», особенно в таких как «УПП 1.3» или других решениях на обычных формах, разработчики часто сталкиваются с проблемой некорректной сортировки номеров документов. Ситуация выглядит следующим образом: при использовании стандартного метода Сортировать("Номер УБЫВ") программа выстраивает цепочку 9, 8, 7... а после появления числа 10 порядок нарушается, так как система ставит «10» сразу после «1». Рассмотрим подробнее, почему так происходит, и разберем по шагам все способы решения этой задачи.

Почему 1С сортирует «10» меньше «2»?

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

  1. Система сравнивает первый символ первой строки («2») и первый символ второй строки («1»).
  2. Так как «2» больше «1», вся строка «2» считается большей, чем строка «10», независимо от последующих цифр.

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

Решение 1. Модификация запроса для добавления лидирующих нулей

Если ваша задача — получить отсортированный список документов через запрос, не меняя при этом реальные номера в базе данных, можно использовать конструкцию ВЫБОР. Этот метод позволяет «на лету» подставить недостающие нули в начало строки для правильного упорядочивания. Посмотрим на пример реализации такого кода в тексте запроса:


ВЫБОР 
    КОГДА (Номер ПОДОБНО "%.[0-9]" ИЛИ ПОДСТРОКА(Номер, 8, 2) = ПОДСТРОКА(Номер, 8, 1)) 
    ТОГДА "0" + Номер 
    ИНАЧЕ Номер 
КОНЕЦ

В данном случае мы проверяем структуру номера. Если он соответствует определенному шаблону (например, содержит точку или имеет определенную длину), мы принудительно добавляем префикс "0". Это заставляет систему сравнивать «09» и «10», где «1» уже логично больше «0».

Решение 2. Универсальная формула для дополнения нулями (через СТРЗАМЕНИТЬ)

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


СТРЗАМЕНИТЬ(Номер, ".", ПОДСТРОКА(".0000", 1, 5 - (ДЛИНАСТРОКИ(Номер) - СТРНАЙТИ(Номер, "."))))

Разберем, как это работает: функция вычисляет текущую длину строковой части номера после разделителя (точки) и дополняет ее нулями из заранее заготовленной строки ".0000". Это позволяет привести все номера к единому формату длины перед выполнением команды Сортировать.

Решение 3. Использование дополнительной колонки в Таблице Значений

Часто программисты пытаются использовать метод СортироватьПоЗначению(), но получают ошибку. Выясним причину: этот метод существует только у объекта СписокЗначений. Для объекта ТаблицаЗначений доступен только метод Сортировать().

Чтобы выполнить качественную числовую сортировку в таблице, выполним следующие действия:

  1. Добавим в ТаблицаЗначений временную колонку с типом Число, назовем ее, например, ПорядокЧислом.
  2. В цикле пройдемся по строкам таблицы и запишем в эту колонку только числовую часть номера, преобразовав ее в число через Число().
  3. Выполним команду Таблица.Сортировать("ПорядокЧислом УБЫВ").

Этот способ является наиболее надежным, так как исключает ошибки строкового сравнения в принципе.

Решение 4. Сортировка по Моменту Времени

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

Важный момент: объект МоментВремени включает в себя не только дату и время до секунды, но и уникальную ссылку на документ. Это гарантирует, что даже документы, созданные в одну и ту же секунду, будут иметь четкую, неизменную последовательность. В запросе это выглядит так:


УПОРЯДОЧИТЬ ПО
    Документ.МоментВремени УБЫВ

Проблема «дырок» и автонумерации

Проанализируем ситуацию, когда вы отказываетесь от ведущих нулей. В 1С встроенный механизм УстановитьНовыйНомер() работает по принципу поиска максимального значения. Если в системе есть номер «9» и номер «10», то строковым максимумом будет «9». Это приведет к тому, что система будет пытаться снова создать номер «10», получит ошибку неуникальности и «зациклится».

Наш совет: старайтесь всегда сохранять стандартную длину номера с ведущими нулями для корректной работы ядра платформы. Если же заказчику требуется «красивый» номер без нулей (например, в печатной форме счета-фактуры), используйте функции преобразования только при выводе на печать. Внутри базы данные должны храниться в каноническом виде: Ап000000001 вместо Ап1.

Итоги

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

← На главную