При работе в конфигурациях «1С:Предприятие», особенно в таких как «УПП 1.3» или других решениях на обычных формах, разработчики часто сталкиваются с проблемой некорректной сортировки номеров документов. Ситуация выглядит следующим образом: при использовании стандартного метода Сортировать("Номер УБЫВ") программа выстраивает цепочку 9, 8, 7... а после появления числа 10 порядок нарушается, так как система ставит «10» сразу после «1». Рассмотрим подробнее, почему так происходит, и разберем по шагам все способы решения этой задачи.
Прежде всего, проанализируем ситуацию с точки зрения типов данных. В системе 1С поле Номер у любого документа по умолчанию имеет тип Строка. Это фундаментальный момент. Строковая сортировка (лексикографическая) выполняется посимвольно слева направо. Проанализируем сравнение строк «2» и «10»:
Именно поэтому для корректной работы механизмов 1С крайне важно использовать ведущие нули (например, «00000000010» и «00000000002»). Если нули удалены вручную или маска номера изменена, стандартная сортировка работать перестает.
Если ваша задача — получить отсортированный список документов через запрос, не меняя при этом реальные номера в базе данных, можно использовать конструкцию ВЫБОР. Этот метод позволяет «на лету» подставить недостающие нули в начало строки для правильного упорядочивания. Посмотрим на пример реализации такого кода в тексте запроса:
ВЫБОР
КОГДА (Номер ПОДОБНО "%.[0-9]" ИЛИ ПОДСТРОКА(Номер, 8, 2) = ПОДСТРОКА(Номер, 8, 1))
ТОГДА "0" + Номер
ИНАЧЕ Номер
КОНЕЦ
В данном случае мы проверяем структуру номера. Если он соответствует определенному шаблону (например, содержит точку или имеет определенную длину), мы принудительно добавляем префикс "0". Это заставляет систему сравнивать «09» и «10», где «1» уже логично больше «0».
Если версия вашей платформы достаточно современная, мы рекомендуем использовать более изящный и универсальный способ формирования поля для сортировки. Рассмотрим подробнее формулу, которая позволяет динамически рассчитывать количество необходимых нулей:
СТРЗАМЕНИТЬ(Номер, ".", ПОДСТРОКА(".0000", 1, 5 - (ДЛИНАСТРОКИ(Номер) - СТРНАЙТИ(Номер, "."))))
Разберем, как это работает: функция вычисляет текущую длину строковой части номера после разделителя (точки) и дополняет ее нулями из заранее заготовленной строки ".0000". Это позволяет привести все номера к единому формату длины перед выполнением команды Сортировать.
Часто программисты пытаются использовать метод СортироватьПоЗначению(), но получают ошибку. Выясним причину: этот метод существует только у объекта СписокЗначений. Для объекта ТаблицаЗначений доступен только метод Сортировать().
Чтобы выполнить качественную числовую сортировку в таблице, выполним следующие действия:
ТаблицаЗначений временную колонку с типом Число, назовем ее, например, ПорядокЧислом.Число().Таблица.Сортировать("ПорядокЧислом УБЫВ").Этот способ является наиболее надежным, так как исключает ошибки строкового сравнения в принципе.
Если порядок документов в вашем списке должен соответствовать хронологии их создания, а не просто возрастанию цифр в номере, правильнее всего будет упорядочивать результат по полю МоментВремени.
Важный момент: объект МоментВремени включает в себя не только дату и время до секунды, но и уникальную ссылку на документ. Это гарантирует, что даже документы, созданные в одну и ту же секунду, будут иметь четкую, неизменную последовательность. В запросе это выглядит так:
УПОРЯДОЧИТЬ ПО
Документ.МоментВремени УБЫВ
Проанализируем ситуацию, когда вы отказываетесь от ведущих нулей. В 1С встроенный механизм УстановитьНовыйНомер() работает по принципу поиска максимального значения. Если в системе есть номер «9» и номер «10», то строковым максимумом будет «9». Это приведет к тому, что система будет пытаться снова создать номер «10», получит ошибку неуникальности и «зациклится».
Наш совет: старайтесь всегда сохранять стандартную длину номера с ведущими нулями для корректной работы ядра платформы. Если же заказчику требуется «красивый» номер без нулей (например, в печатной форме счета-фактуры), используйте функции преобразования только при выводе на печать. Внутри базы данные должны храниться в каноническом виде: Ап000000001 вместо Ап1.
Мы рассмотрели несколько подходов к решению проблемы сортировки. Подведем итог: если вам нужно быстро исправить порядок в существующей таблице значений, используйте дополнительную числовую колонку. Если же вы формируете отчет — используйте обработку номера в тексте запроса с дополнением лидирующими нулями. Помните, что корректная структура номера — залог стабильной работы механизмов автонумерации 1С.