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

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

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

Выясним причину: почему 1С сортирует «неправильно»?

Для начала проанализируем техническую сторону вопроса. В платформе 1С тип данных поля Номер у документа — это Строка. Это сделано специально для того, чтобы номера могли содержать префиксы организаций, префиксы информационных баз и дефисы (например, "БП00-000001").

Разберем, как работает строковая (лексикографическая) сортировка. Система сравнивает строки посимвольно слева направо:

  1. Сравнивается первый символ: у "1", "10" и "11" это "1".
  2. Затем система видит, что у "10" второй символ "0", а у "2" первый символ — это "2".
  3. Так как символ "1" (начало числа 10) меньше символа "2", строка "10" всегда будет стоять в списке выше, чем "2".

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

Решение 1: Изменение настроек пользователем (без программирования)

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

Разберем этот процесс по шагам:

  1. Откроем список необходимых документов (например, "Счета-фактуры выданные").
  2. Нажмем кнопку Ещё в правой части командной панели и выберем пункт Настроить список.
  3. Перейдем на закладку Сортировка.
  4. Посмотрим на текущие поля сортировки. Скорее всего, там пусто или выбрано поле "Дата".
  5. Нам нужно добавить новое поле. Нажмем кнопку "Добавить" и в появившемся дереве реквизитов найдем Ссылка, раскроем её и выберем поле Номер (иногда оно может называться "Номер (Объект)").
  6. Важно: убедимся, что это поле стоит первым в списке сортировки или сразу после даты.

После применения этих настроек система начнет использовать при сортировке полный номер (например, "0000-0000001" и "0000-0000010"). За счет наличия лидирующих нулей количество символов в номерах станет одинаковым, и лексикографическая сортировка отработает идентично числовой.

Решение 2: Настройка поля порядка в Конфигураторе

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

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

Проанализируем структуру колонки "Номер". В поле ПутьКДанным там обычно указано Список.Номер (где номер — это как раз вычисленное представление). Чтобы при нажатии на заголовок этой колонки сортировка шла правильно, мы можем в свойство Имя поля порядка прописать путь к реальному номеру документа — Ссылка.Номер.

Важный нюанс: в современных версиях БП 3.0 данные в списки часто попадают из регистра сведений ДанныеПервичныхДокументов. Посмотрим на пример типичного запроса динамического списка:


ВЫБРАТЬ
    ДокументЖурнал.Ссылка КАК Ссылка,
    ДокументЖурнал.Дата КАК Дата,
    ДокументЖурнал.ПредставлениеНомера КАК Номер
ИЗ
    РегистрСведений.ДанныеПервичныхДокументов КАК ДокументЖурнал

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

Решение 3: Использование расширения для программной настройки

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


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

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

Резюме

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

← На главную