ТаблицаЗначений.Сортировать

Методы · Sort

Сортирует таблицу значений в соответствии с указанными правилами сортировки.

Синтаксис

Сортировать(<Колонки>, <ОбъектСравнения>)

Примеры платформы

ТаблицаЦен.Сортировать("Цена Убыв, Товар Возр");
Альфа = Новый СравнениеЗначений;
ТаблицаЦен.Сортировать("Цена Убыв", Альфа);
Полное описание, параметры и ограничения

ТаблицаЗначений.Сортировать (ValueTable.Sort)

ТаблицаЗначений (ValueTable)

Сортировать (Sort)

Доступен, начиная с версии 8.0.

Синтаксис:
Сортировать(<Колонки>, <ОбъектСравнения>)
Параметры:

<Колонки> (обязательный)
Тип: Строка.
Список имен колонок, разделенных запятыми, по которым производится сортировка таблицы. После каждого имени колонки через пробел может быть указано направление сортировки. Направление определяется: "Убыв" ("Desc") - упорядочивать по убыванию; "Возр" ("Asc") - упорядочивать по возрастанию. По умолчанию сортировка производится по возрастанию. Порядок указания имен колонок таблицы определяет порядок сортировки. Это означает, что сначала таблица сортируется по колонке, указанной первой. Затем группы строк с одинаковым значением в этой колонке сортируются по колонке, которая указана второй, и так далее.

<ОбъектСравнения> (необязательный)
Тип: СравнениеЗначений.
Объект для сравнения значений. Независимо от того, задан объект сравнения или нет, элементы, чьи типы не совпадают, сравниваются по коду типа, а элементы простых типов сравниваются по значению. Дополнительно к этому:
если объект сравнения не задан, то элементы остальных типов сравниваются по строковому представлению;

если объект сравнения задан, то:

объекты сравниваются по идентификатору;

моменты времени сравниваются по дате и идентификатору объекта;

элементы остальных типов сравниваются по строковому представлению.

Описание:

Сортирует таблицу значений в соответствии с указанными правилами сортировки.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Пример:

ТаблицаЦен.Сортировать("Цена Убыв, Товар Возр");

// Пример с использованием объекта сравнения

Альфа = Новый СравнениеЗначений;
ТаблицаЦен.Сортировать("Цена Убыв", Альфа);

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Правильно отсортировать свои субсчета по маске и проверить их родителя

На ссылках двух собственных субсчетов видно отличие строки кода, результата ПолучитьПорядокКода и ручного Порядок. Дополнительно проверяется собственная иерархия без проводок.

Где и как запускать

Полный серверный модуль своей НОВОЙ пустой учебной конфигурации по подготовке; платформа 8.5.1.1343. При записи всегда откат, рабочие данные не используются. Здесь не запускался.

Подготовка

  1. Создайте НОВУЮ пустую файловую базу, корневое имя УчебныйУчет85. В рабочей БП/КА2/УТ/УНФ эти задачи не запускайте. Это технический пример API, не готовый бухгалтерский учёт.

  2. Планы видов характеристик → Добавить: УчебныеАналитики85. Тип значения только Строка 30. Элементы, дополнительные реквизиты, табличные части и предопределённые значения не создавайте.

  3. Планы счетов → Добавить: УчебныеСчета85. ДлинаКода 10, МаскаКода @@@.@@@.@@, ДлинаНаименования 100, ДлинаПорядка 20. АвтоПорядокПоКоду выключен, КонтрольУникальности включён. ВидыСубконто=УчебныеАналитики85, МаксКоличествоСубконто=2.

  4. У плана нет пользовательских реквизитов/табличных частей, признаков учёта и предопределённых счетов. История выключена, регистров бухгалтерии, проводок и реальных остатков нет. Это технический опыт типов, не методология учёта.

  5. Опыт с маской @@@.@@@.@@ использует строковые коды. Не переносите его сравнения на иной числовой/немаскированный план. АвтоПорядокПоКоду выключен: Порядок хранится отдельно от кода.

  6. Модули собственных объектов/менеджеров пустые, подписок, расширений и внешних действий нет. Не используйте рабочую базу или её копию с действующими обработчиками.

  7. Код здесь в 1С не запускался. HTML показывает урок: проверены исходники и установленная справка именно 8.5.1.1343, но запись/открытие формы в ваших базах не выполнялись.

  8. Ссылка идентифицирует запись, объект служит для её изменения. Свойства ссылки readonly, ВерсияДанных — непрозрачная строка, не номер версии конфигурации.

  9. Непустая плановая ссылка не подтверждает существование записи; перед чтением данных отсутствующая запись исключается отдельно.

  10. В собственной базе создайте серверный общий модуль УчебныеСсылкиПланов, вставьте ВЕСЬ модуль одного урока. ВыполнитьПример() Экспорт вызывайте из собственной процедуры формы с &НаСервереБезКонтекста. Обновите конфигурацию БД.

  11. Опыт записи допускается только вне чужой транзакции. Внутри своей транзакции создаются исключительно новые собственные записи; при успехе и ошибке выполняется откат. Не заменяйте его фиксацией.

  12. Записанные собственные ссылки запоминаются сразу после записи. После отмены каждая проверяется на ПолучитьОбъект=Неопределено. Никакого удаления по имени, первой строке или всей коллекции нет.

Процедура ВыполнитьПример() Экспорт
    Описание = Метаданные.ПланыСчетов.Найти("УчебныеСчета85");
    Если Описание = Неопределено Тогда
        ВызватьИсключение "Сначала создайте собственный план УчебныеСчета85";
    КонецЕсли;
    Если Описание.ДлинаКода <> 10 Или Описание.ДлинаНаименования <> 100
        Или Описание.ДлинаПорядка <> 20 Или Описание.МаскаКода <> "@@@.@@@.@@"
        Или Описание.АвтоПорядокПоКоду Или Описание.МаксКоличествоСубконто <> 2 Тогда
        ВызватьИсключение "Настройки учебного плана не соответствуют подготовке";
    КонецЕсли;
    Если Описание.ВидыСубконто = Неопределено Тогда
        ВызватьИсключение "Назначьте собственный план аналитик";
    КонецЕсли;
    Если Описание.ВидыСубконто.Имя <> "УчебныеАналитики85" Тогда
        ВызватьИсключение "Нужны только собственные учебные аналитики";
    КонецЕсли;
    Менеджер = ПланыСчетов.УчебныеСчета85;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Не запускайте урок внутри чужой транзакции";
    КонецЕсли;
    СозданныеСсылки = Новый Массив;
    НачатьТранзакцию();
    Попытка
        Для Каждого СвойКод Из СтрРазделить("41,41.2,41.10", ",") Цикл
            Найденная = Менеджер.НайтиПоКоду(СвойКод);
            Если Найденная <> Неопределено Тогда
                Если Не Найденная.Пустая() Тогда
                    ВызватьИсключение "Один из собственных кодов опыта занят, не используйте существующий счёт";
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        Корень = Менеджер.СоздатьСчет();
        Корень.Код = "41";
        Корень.Наименование = "Собственный корень структуры";
        Корень.Вид = ВидСчета.Активный;
        Корень.Порядок = "ROOT";
        Корень.Записать();
        СозданныеСсылки.Добавить(Корень.Ссылка);
        Второй = Менеджер.СоздатьСчет();
        Второй.Код = "41.2";
        Второй.Наименование = "Собственный субсчёт 2";
        Второй.Вид = ВидСчета.Активный;
        Второй.Родитель = Корень.Ссылка;
        Второй.Порядок = "SECOND";
        Второй.Записать();
        СозданныеСсылки.Добавить(Второй.Ссылка);
        Десятый = Менеджер.СоздатьСчет();
        Десятый.Код = "41.10";
        Десятый.Наименование = "Собственный субсчёт 10";
        Десятый.Вид = ВидСчета.Активный;
        Десятый.Родитель = Корень.Ссылка;
        Десятый.Порядок = "TENTH";
        Десятый.Записать();
        СозданныеСсылки.Добавить(Десятый.Ссылка);
        СсылкаКорня = Корень.Ссылка;
        СсылкаВторого = Второй.Ссылка;
        СсылкаДесятого = Десятый.Ссылка;
        Сообщить(СсылкаВторого.ПолучитьПорядокКода() = " 41.  2");
        Сообщить(СсылкаДесятого.ПолучитьПорядокКода() = " 41. 10");
        Сообщить(СсылкаВторого.Порядок = "SECOND");
        Список = Новый ТаблицаЗначений;
        Список.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
        Список.Колонки.Добавить("ПорядокКода", Новый ОписаниеТипов("Строка"));
        СтрокаСписка = Список.Добавить();
        СтрокаСписка.Код = СсылкаВторого.Код;
        СтрокаСписка.ПорядокКода = СсылкаВторого.ПолучитьПорядокКода();
        СтрокаСписка = Список.Добавить();
        СтрокаСписка.Код = СсылкаДесятого.Код;
        СтрокаСписка.ПорядокКода = СсылкаДесятого.ПолучитьПорядокКода();
        Список.Сортировать("Код Возр");
        Сообщить(Список[0].Код = "41.10");
        Список.Сортировать("ПорядокКода Возр");
        Сообщить(Список[0].Код = "41.2");
        Сообщить(Список[1].Код = "41.10");
        Сообщить(СсылкаКорня.Уровень() = 0);
        Сообщить(СсылкаВторого.Уровень() = 1 И СсылкаДесятого.Уровень() = 1);
        Сообщить(СсылкаВторого.ПринадлежитЭлементу(СсылкаКорня));
        Сообщить(Не СсылкаВторого.ПринадлежитЭлементу(СсылкаВторого));
        Сообщить(СсылкаДесятого.Родитель = СсылкаКорня);
        ОтменитьТранзакцию();
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
    Сообщить(Не ТранзакцияАктивна());
    Для Каждого СозданнаяСсылка Из СозданныеСсылки Цикл
        Сообщить(СозданнаяСсылка.ПолучитьОбъект() = Неопределено);
    КонецЦикла;
КонецПроцедуры

Разбор по шагам

  1. Проверить, что свои три кода свободны; все записи новые, не предопределённые.

  2. Временно записать свой корень 41 и двух детей 41.2/41.10, запомнить каждую ссылку.

  3. Вызвать ПолучитьПорядокКода именно на ссылках. Маска @@@.@@@.@@ прижимает числовые части вправо пробелами.

  4. Создать собственную таблицу из двух строк и сравнить обычную сортировку кода с сортировкой выровненного порядка кода.

  5. Проверить, что ручной Порядок SECOND не подменён автоматически; АвтоПорядокПоКоду выключен.

  6. Проверить уровни 0/1, принадлежность корню и отсутствие принадлежности самому себе.

  7. Отменить все три собственные записи и проверить их отсутствие.

Как проверить результат

  1. Одиннадцать сравнений сортировки/иерархии Истина.

  2. По коду сначала 41.10, по ПорядокКода сначала 41.2.

  3. После отката три собственных определения отсутствуют; денежных движений нет.

Ожидаемый результат

Условие маски, сортировка и методы иерархии ссылки применены на полном собственном дереве счетов.

На что обратить внимание

  1. Прикладной Тип существует только после создания указанных собственных метаданных. В функциональный Новый массив передаёт аргументы конструктора.

  2. Свойства ссылки не присваиваются. Для изменения копии используется именно новый объект, который возвращает Скопировать.

  3. Уровень пустой ссылки вызывает исключение; иерархические методы используются только у записанных собственных объектов внутри транзакции.

  4. Откат БД не отменяет внешние действия обработчиков. Поэтому конфигурация пустая, модули/подписки без сети, печати, файлов и почты.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Скопировать оператор и изменить только его количество

Третий оператор — копия первого в том же запросе. Меняем его количество на 4, проверяем три строки после выполнения и только затем очищаем свою структуру.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

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

  2. СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.

  3. Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.

Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, 250");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один собственный объединённый запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
    ВызватьИсключение "Ожидался собственный запрос выбора";
КонецЕсли;
Операторы = Выбор.Операторы;
Если Операторы.Количество() <> 2 Тогда
    ВызватьИсключение "Ожидались два собственных оператора";
КонецЕсли;
Первый = Операторы.Получить(0);
Второй = Операторы.Получить(1);
Копия = Операторы.Добавить(Первый);
Копия.ТипОбъединения = ТипОбъединенияСхемыЗапроса.ОбъединитьВсе;
Если Копия.ВыбираемыеПоля.Количество() <> 2 Тогда
    ВызватьИсключение "Ожидались два собственных поля копии";
КонецЕсли;
Копия.ВыбираемыеПоля.Установить(0, Новый ВыражениеСхемыЗапроса("4"));
Сообщить(Операторы.Количество() = 3);
Сообщить(Операторы.Индекс(Копия) = 2);
Операторы.Переместить(Копия, 0);
Сообщить(Операторы.Индекс(Копия) = 0);
Операторы.Сдвинуть(Копия, 2);
Сообщить(Операторы.Индекс(Копия) = 2);
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Таблица = Запрос.Выполнить().Выгрузить();
Если Таблица.Количество() <> 3 Тогда
    ВызватьИсключение "Ожидались три собственные строки";
КонецЕсли;
Таблица.Сортировать("Количество");
Сообщить(Таблица[0].Количество = 3 И Таблица[1].Количество = 3 И Таблица[2].Количество = 4);
Сообщить(Таблица[0].Цена = 250 И Таблица[1].Цена = 250 И Таблица[2].Цена = 250);
Операторы.Удалить(2);
Сообщить(Операторы.Количество() = 2);
Операторы.Очистить();
Сообщить(Операторы.Количество() = 0);

Разбор по шагам

  1. Добавить(Первый) создаёт копию собственного оператора, а не новый объект из другой схемы.

  2. Проверяем число полей копии, затем заменяем только её первое выражение. У исходного оператора остаётся количество 3.

  3. Переместить и Сдвинуть меняют позиции операторов в структуре. После упражнения копия снова последняя.

  4. Без УПОРЯДОЧИТЬ ПО язык запросов не гарантирует порядок строк. Поэтому сначала сортируем свою выгрузку по Количество, а затем проверяем 3/3/4.

  5. Удаление и очистка выполняются после расчёта. Копия, Первый и Второй после очистки не используются.

Как проверить результат

  1. Восемь сравнений Истина.

  2. В сортированной собственной выгрузке количества 3, 3 и 4 при цене 250 у каждой строки.

Ожидаемый результат

Проверено копирование оператора, независимое изменение выражения и порядок работы с дочерней коллекцией.

На что обратить внимание

  1. Перестановка операторов не заменяет явного упорядочивания результата.

  2. После очистки операторов сформированный прежний запрос не выполняется повторно.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.