Как упорядочить данные по алфавиту в 1С 8.3
Содержание
Чтобы отсортировать список по алфавиту прямо на экране, щёлкните по заголовку нужной колонки — строки выстроятся по возрастанию, повторный щелчок развернёт порядок в обратную сторону. В запросе за алфавит отвечает УПОРЯДОЧИТЬ ПО, а в коде — метод Сортировать у таблицы значений или СортироватьПоПредставлению у списка значений.
Способ зависит от того, где именно вам нужен порядок: в обычном списке документов, в отчёте, в печатной форме или внутри обработки. Ниже — каждый случай с точными действиями и примерами кода, который можно скопировать.
Сортировка по русскому алфавиту в 1С работает не всегда так, как ждёшь: ссылки на справочники упорядочиваются по внутреннему идентификатору, а числа-строки выстраиваются «10, 100, 2». Эти ловушки разберём отдельно.
С чего начать: выбираем нужный метод
Прежде чем лезть в код, определите, в каком месте программы нужен алфавитный порядок. От этого зависит инструмент.
УПОРЯДОЧИТЬ ПО. Раздел про запросы и про печатные формы.Сортировать / СортироватьПоПредставлению. Раздел «Программная сортировка».Дальше каждый пункт раскрыт подробно. Коротко разница между инструментами:
| Где нужен порядок | Инструмент | Сохраняется ли |
|---|---|---|
| Открытый список на экране | Щелчок по колонке / настройка списка | Только в текущем сеансе пользователя |
| Отчёт | Вкладка «Сортировка» в настройках | В сохранённом варианте отчёта |
| Печатная форма | УПОРЯДОЧИТЬ ПО в запросе формы | Пока не изменят запрос |
| Обработка, модуль | Методы коллекции (Сортировать и др.) | Только пока выполняется код |
Сортировка в списках пользовательского режима
Это самый частый запрос: открыт список номенклатуры или контрагентов, и нужно быстро расставить строки по названию.
По одной колонке — мышкой:
- Наведите курсор на заголовок колонки (например,
Наименование). - Щёлкните по нему левой кнопкой — список упорядочится по возрастанию, рядом с названием колонки появится стрелка ▲.
- Щёлкните ещё раз — порядок сменится на убывание (▼).
Маленький треугольник в шапке колонки показывает, по какому полю и в какую сторону отсортирован список прямо сейчас.
По нескольким полям сразу. Если нужно сначала по группе, потом по названию внутри группы, одного щелчка мало. Нажмите кнопку Еще в командной панели списка и откройте настройку списка — появится окно с вкладкой Сортировка. Перенесите нужные поля в правую часть и стрелками задайте их порядок. Название пункта меню в разных конфигурациях может отличаться, но вкладка сортировки есть всегда.
Сортировка в списке не меняет данные в базе — это только способ их показа. Другой пользователь увидит список в своём порядке.
Есть нюанс с динамическими списками: отсортировать можно по колонкам, которые есть в основной таблице. По вычисляемым или реквизитам через точку (Контрагент.ИНН) сортировка может быть недоступна — поле придётся явно добавить в список.
Табличная часть документа. Строки внутри документа (например, список номенклатуры в накладной) мышкой в шапке не сортируются — щелчок по колонке табличной части меняет не порядок, а текущую ячейку. Переставить строки по алфавиту можно либо вручную кнопками «вверх/вниз» командной панели таблицы, либо программно: выгрузить табличную часть в таблицу значений, отсортировать и загрузить обратно. Делать это в проведённом документе без перепроведения не стоит — порядок строк на движения не влияет, но лишнее изменение документа создаёт вопросы при аудите.
Порядок строк в отчётах и печатных формах
В отчётах алфавитный порядок задаётся не мышкой по колонке, а в настройках.
Универсальный отчёт и отчёты на СКД. Откройте отчёт, нажмите Настройки, перейдите на вкладку (или в раздел) Сортировка. Добавьте поле — например, Номенклатура — и выберите направление По возрастанию. Сформируйте отчёт заново. Если включена группировка, сортировка применяется внутри каждой группы.
Если в настройках стоит автоматическая сортировка по иерархии справочника, ваше алфавитное поле может не сработать. Сначала уберите иерархию или поставьте алфавит выше по приоритету.
Печатные формы. Здесь порядок строк определяет не табличный документ, а источник данных. Печатная форма наполняется из запроса (или из таблицы значений), поэтому сортировать нужно именно его — добавить УПОРЯДОЧИТЬ ПО в текст запроса, который собирает строки для вывода. Макет только выводит уже упорядоченные строки, сам он не сортирует.
Если печатная форма типовая и менять её нельзя, порядок придётся задавать через расширение конфигурации — это штатный способ переопределить поведение без снятия с поддержки.
Сортировка в запросах: УПОРЯДОЧИТЬ ПО
В языке запросов за алфавит отвечает конструкция УПОРЯДОЧИТЬ ПО. Она ставится в самом конце запроса.
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование
По умолчанию порядок — по возрастанию. Для обратного добавьте УБЫВ, для явного прямого — ВОЗР:
УПОРЯДОЧИТЬ ПО
Наименование УБЫВ
Сортировать можно сразу по нескольким полям — перечислите их через запятую. Сначала строки упорядочатся по первому полю, при совпадении — по второму:
УПОРЯДОЧИТЬ ПО
Группа,
Наименование
Главная ловушка запросов — сортировка по ссылке. Если написать УПОРЯДОЧИТЬ ПО Контрагент, строки встанут не по алфавиту, а по внутреннему идентификатору ссылки — то есть в порядке создания элементов. Чтобы получить алфавит, упорядочивайте по строковому полю:
УПОРЯДОЧИТЬ ПО
Контрагент.Наименование
Второй вариант — конструкция АВТОУПОРЯДОЧИВАНИЕ. Она сама заменяет ссылки на их представление при сортировке:
УПОРЯДОЧИТЬ ПО
Контрагент
АВТОУПОРЯДОЧИВАНИЕ
АВТОУПОРЯДОЧИВАНИЕ удобно, но делает запрос тяжелее: платформа подтягивает представления ссылок. На больших выборках лучше явно указывать строковое поле.
Первые N по алфавиту. Чтобы взять, скажем, первые десять строк в алфавитном порядке, сочетайте ПЕРВЫЕ с УПОРЯДОЧИТЬ ПО. Сначала выборка упорядочивается, потом из неё берётся верхушка:
ВЫБРАТЬ ПЕРВЫЕ 10
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование
Сортировка и итоги. Если в запросе есть ИТОГИ, порядок строк внутри каждой группировки всё равно задаётся через УПОРЯДОЧИТЬ ПО. А вот сами группы в результате идут в порядке их полей группировки — отдельной сортировки групп в тексте запроса нет, её задают уже при обходе результата или в настройках отчёта.
Учтите: УПОРЯДОЧИТЬ ПО относится к финальной выборке. Во вложенных запросах и при заполнении временных таблиц порядок не гарантируется — сортируйте на последнем шаге, когда получаете итоговый результат.
Для динамических списков форм порядок тоже можно задать текстом запроса списка либо через его настройку сортировки — логика та же.
Программная сортировка массивов и коллекций
Когда данные уже собраны в коллекцию, сортируют их методами самой коллекции. У разных типов методы разные.
Таблица значений — метод Сортировать. Самый гибкий вариант. В строке указываете колонки и направление:
ТЗ.Сортировать("Наименование Возр");
// по двум полям:
ТЗ.Сортировать("Группа Возр, Наименование Возр");
Список значений — два отдельных метода. Важно не перепутать:
СортироватьПоЗначению()— упорядочивает по хранимому значению (для ссылок это снова внутренний порядок, не алфавит).СортироватьПоПредставлению()— упорядочивает по тексту, который видит пользователь. Для алфавита по названиям нужен именно он.
СписокЗначений.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
Массив сортировать напрямую нельзя — у типа Массив нет метода сортировки. Обходной путь: перелить значения в таблицу или в список значений, отсортировать там и при необходимости выгрузить обратно.
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(МойМассив);
Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);
МойМассив = Список.ВыгрузитьЗначения();
Если собираете строки через обратный цикл и удаляете элементы, не пересчитывайте границу от изменяемой коллекции. Удаляйте с конца: Для Сч = 1 По Список.Количество() Цикл Элемент = Список[Список.Количество() - Сч], иначе пропустите часть строк.
Таблица из запроса. Часто данные приходят запросом, а сортировать удобнее уже в таблице. Выгрузите результат и упорядочьте его методом Сортировать — это быстрее, чем гонять запрос повторно:
ТЗ = Запрос.Выполнить().Выгрузить();
ТЗ.Сортировать("Наименование Возр");
Дерево значений. У дерева сортируют не само дерево, а его строки: Дерево.Строки.Сортировать("Наименование", Истина). Второй параметр Истина включает рекурсивную сортировку — вложенные уровни тоже упорядочатся.
Соответствие. Тип Соответствие отсортировать нельзя: порядок обхода ключей не регулируется. Если нужен алфавит по ключам — перелейте их в массив, отсортируйте его описанным выше способом и обходите соответствие уже по упорядоченному списку ключей.
Для числовых значений, собранных как строки, перед сортировкой приводите их к числу — иначе получите текстовый порядок (про это ниже).
Русский алфавит, регистр и спецсимволы
Сортировка «по алфавиту» на русском языке даёт несколько неожиданностей. Их полезно знать заранее.
Буква «ё». В национальной сортировке 1С «ё» обычно встаёт рядом с «е», а не в конце алфавита. Если в справочнике вперемешку «ёлка» и «елка», они окажутся соседями — это нормально.
Регистр букв. По умолчанию сортировка не чувствительна к регистру: Акт и акт считаются равными по старшинству буквы. Отдельного порядка «сначала все заглавные, потом строчные» нет.
Цифры внутри строки. Вот частая боль. Если наименования начинаются с чисел («10 кг», «2 кг», «100 кг»), алфавитная сортировка выстроит их посимвольно: 10, 100, 2. Для человека это выглядит сломанным.
Решения два:
| Ситуация | Что сделать |
|---|---|
| Число хранится в отдельном реквизите-числе | Сортировать по этому числовому полю, а не по строке |
| Число — часть строки (артикул, код) | Дополнить слева нулями до одной длины: 002, 010, 100 |
Пробелы и спецсимволы. Пробел, точка, дефис по старшинству идут раньше букв. Поэтому "А-строка" окажется выше, чем "Астрока". Если видите «неправильный» порядок коротких кодов — почти всегда дело в невидимом пробеле в начале значения.
Почему сортировка идёт «не по алфавиту»
Когда порядок строк кажется случайным, причина почти всегда одна из трёх. Проверьте по списку.
🔹 Сортируете по ссылке, а не по названию. Самый частый случай. В запросе стоит УПОРЯДОЧИТЬ ПО Номенклатура вместо Номенклатура.Наименование. Строки идут по порядку создания элементов. Лечится заменой на строковое поле или добавлением АВТОУПОРЯДОЧИВАНИЕ.
🔹 Поле на самом деле число или дата. «Алфавит» применяется только к строкам. Если колонка хранит число, порядок будет числовой; если дату — хронологический. Это не ошибка, а другой тип данных.
🔹 Включена сортировка по иерархии. В списках и отчётах справочник часто упорядочен по группам, а внутри групп — ваше поле. Если нужен сплошной алфавит без деления на папки, отключите иерархический просмотр (режим «список» вместо «дерево»).
Ещё две ситуации встречаются реже:
🔹 Строковые числа (разбирали выше) — выстраиваются посимвольно. 🔹 Невидимый пробел в начале значения поднимает строку в самый верх.
Частые вопросы
Как отсортировать справочник по алфавиту навсегда, а не только на экране?
УПОРЯДОЧИТЬ ПО либо в настройках конкретной формы списка. Сами элементы справочника при этом не перемещаются.Почему контрагенты сортируются не по названию, а как попало?
Наименование. В запросе укажите УПОРЯДОЧИТЬ ПО Контрагент.Наименование или добавьте АВТОУПОРЯДОЧИВАНИЕ.Можно ли отсортировать массив в коде напрямую?
Массив метода сортировки нет. Перелейте значения в список значений или таблицу значений, отсортируйте там методами СортироватьПоПредставлению / Сортировать и при необходимости выгрузите обратно.Как сделать, чтобы артикулы «2, 10, 100» шли по-человечески?
002, 010, 100).В чём разница между СортироватьПоЗначению и СортироватьПоПредставлению?
СортироватьПоЗначению упорядочивает по хранимому значению (для ссылок — по внутреннему порядку), а СортироватьПоПредставлению — по видимому тексту. Для алфавита по названиям нужен второй метод.