При работе в современных конфигурациях 1С, таких как Бухгалтерия предприятия 3.0, пользователи часто сталкиваются с неприятной ситуацией: при попытке отсортировать список документов по колонке Номер, система выстраивает их в странном порядке. Вместо ожидаемой последовательности 1, 2, 3, 10, 11 мы получаем 1, 10, 11, 2. Давайте подробно разберем, почему это происходит и как исправить ситуацию несколькими способами.
Для начала проанализируем техническую сторону вопроса. В платформе 1С тип данных поля Номер у документа — это Строка. Это сделано специально для того, чтобы номера могли содержать префиксы организаций, префиксы информационных баз и дефисы (например, "БП00-000001").
Разберем, как работает строковая (лексикографическая) сортировка. Система сравнивает строки посимвольно слева направо:
В типовых решениях на управляемых формах ситуация осложняется тем, что в списках часто отображается не само поле Номер, а поле ПредставлениеНомера. Это специально подготовленная строка, из которой удалены лидирующие нули и префиксы для удобства восприятия пользователем. Именно это «красивое» представление и сбивает сортировку с толку.
Рассмотрим самый быстрый способ, который может применить любой бухгалтер или пользователь самостоятельно. Нам нужно заставить динамический список сортировать данные не по текстовому представлению, которое мы видим глазами, а по реальному внутреннему номеру документа (со всеми нулями).
Разберем этот процесс по шагам:
Ссылка, раскроем её и выберем поле Номер (иногда оно может называться "Номер (Объект)").После применения этих настроек система начнет использовать при сортировке полный номер (например, "0000-0000001" и "0000-0000010"). За счет наличия лидирующих нулей количество символов в номерах станет одинаковым, и лексикографическая сортировка отработает идентично числовой.
Если мы хотим решить проблему радикально для всех пользователей сразу, нам потребуется внести изменения в свойства формы. Рассмотрим, как это сделать правильно, чтобы не нарушить типовую логику.
В свойствах элемента формы Таблица (которая отображает список) существует специальное свойство ИмяПоляПорядка. Выясним, как его использовать:
Проанализируем структуру колонки "Номер". В поле ПутьКДанным там обычно указано Список.Номер (где номер — это как раз вычисленное представление). Чтобы при нажатии на заголовок этой колонки сортировка шла правильно, мы можем в свойство Имя поля порядка прописать путь к реальному номеру документа — Ссылка.Номер.
Важный нюанс: в современных версиях БП 3.0 данные в списки часто попадают из регистра сведений ДанныеПервичныхДокументов. Посмотрим на пример типичного запроса динамического списка:
ВЫБРАТЬ
ДокументЖурнал.Ссылка КАК Ссылка,
ДокументЖурнал.Дата КАК Дата,
ДокументЖурнал.ПредставлениеНомера КАК Номер
ИЗ
РегистрСведений.ДанныеПервичныхДокументов КАК ДокументЖурнал
В этом случае поле Номер в списке — это всего лишь текстовая колонка регистра. Чтобы сортировка работала, в запросе динамического списка обязательно должно присутствовать поле Ссылка или скрытое поле с полным номером.
Если конфигурация находится на поддержке и мы не хотим ее снимать, воспользуемся механизмом расширений. Мы можем программно установить правильный порядок при создании формы. Рассмотрим пример кода, который нужно разместить в модуле формы списка:
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Находим элемент порядка в динамическом списке
ПорядокСписок = Список.Порядок.Элементы;
ПорядокСписок.Очистить();
// Добавляем сортировку по реальному номеру объекта
НовыйПорядок = ПорядокСписок.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
НовыйПорядок.Поле = Новый ПолеКомпоновкиДанных("Ссылка.Номер");
НовыйПорядок.ВидУпорядочивания = НаправлениеСортировки.Возв;
НовыйПорядок.Использование = Истина;
КонецПроцедуры
Этот код гарантирует, что при каждом открытии формы пользователем список будет автоматически отсортирован по возрастанию номера с учетом лидирующих нулей, игнорируя «упрощенное» текстовое представление.
Подводя итог, отметим, что проблема «1, 10, 2» — это не ошибка программы, а особенность работы со строковыми данными. Для её решения мы всегда должны стремиться выполнять сортировку по полному номеру (содержащему все нули) или по полю Ссылка, оставляя для отображения пользователю «красивое» ПредставлениеНомера. Наиболее корректным способом для системного администратора будет настройка сортировки через Поля порядка в свойствах формы или использование Расширений для фиксации настроек динамического списка.