Порядок

Типы · Order

Синтаксис и применение Порядок в платформе 1С:Предприятие. Описание и примеры кода.

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

Вывести самые дорогие учебные строки первыми

Порядок отчёта сортирует вывод по сумме, затем по названию. Разбираем элементы порядка и изменение их коллекции.

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

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. Учебная внешняя обработка с пустой управляемой основной формой. Создайте команду УчебныйПример, кнопку команды и назначьте действие УчебныйПример.

  2. Вставьте полный модуль урока: клиентский обработчик и серверную функцию. Каждый урок — отдельная копия модуля.

  3. Откройте EPF в тонком клиенте Windows. Данные Книга/Ручка/Коробка создаются только в памяти; запрос урока с параметрами не читает таблицы базы.

  4. ПостроительОтчета — существующий API для изучения/сопровождения старого кода. Это не СистемаКомпоновкиДанных и не рекомендация заменять ею современные отчёты.

&НаКлиенте
Процедура УчебныйПример(Команда)
    ТабДок = СформироватьУчебныйОтчет();
    ТабДок.ТолькоПросмотр = Истина;
    ТабДок.Показать("Учебный ПостроительОтчета");
КонецПроцедуры

&НаСервере
Функция СформироватьУчебныйОтчет()
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Категория", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    Данные.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    Образцы = Новый Массив;
    Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Канцелярия", "Книга", 3, 250));
    Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Канцелярия", "Ручка", 1, 50));
    Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Упаковка", "Коробка", 2, 30));
    Для Каждого Образец Из Образцы Цикл
        СтрокаДанных = Данные.Добавить();
        ЗаполнитьЗначенияСвойств(СтрокаДанных, Образец);
        СтрокаДанных.Сумма = СтрокаДанных.Количество * СтрокаДанных.Цена;
    КонецЦикла;
    Описание = Новый ОписаниеИсточникаДанных(Данные);
    Для Каждого Колонка Из Описание.Колонки Цикл
        Колонка.Поле = Истина;
        Колонка.Отбор = Истина;
        Колонка.Порядок = Истина;
        Колонка.Измерение = Колонка.Имя = "Категория";
    КонецЦикла;
    Построитель = Новый ПостроительОтчета;
    Построитель.ИсточникДанных = Описание;
    Построитель.АвтоДетальныеЗаписи = Ложь;
    Построитель.ВыводитьДетальныеЗаписи = Истина;
    Построитель.ВыводитьЗаголовокОтчета = Истина;
    Построитель.ВыводитьОбщиеИтоги = Ложь;
    Построитель.ВыводитьПодвалОтчета = Ложь;
    Построитель.ВыводитьПодвалТаблицы = Ложь;
    Построитель.ВыводитьШапкуТаблицы = Истина;
    Построитель.ОтображатьСостояние = Ложь;
    Построитель.ОбрабатыватьПрерываниеПользователя = Истина;
    Построитель.ТекстЗаголовка = "Учебный отчёт — вымышленные данные";
    Порядок = Построитель.Порядок;
    Порядок.Очистить();
    Порядок.Добавить("Сумма", "ПоСумме", "Сумма по убыванию", НаправлениеСортировки.Убыв);
    Порядок.Добавить("Наименование", "ПоНазванию", "Название", НаправлениеСортировки.Возр);
    Сумма = Порядок.Найти("ПоСумме");
    Название = Порядок.Найти("ПоНазванию");
    Сообщить(Порядок.Количество() = 2);
    Сообщить(Сумма.Направление = НаправлениеСортировки.Убыв);
    Сообщить(Сумма.ПутьКДанным = "Сумма");
    Сообщить(Сумма.Имя = "ПоСумме");
    Сообщить(Порядок.Индекс(Название) = 1);
    Порядок.Сдвинуть(1, -1);
    Сообщить(Порядок.Получить(0).Имя = "ПоНазванию");
    Порядок.Удалить(0);
    Сообщить(Порядок.Количество() = 1);
    // Установить заменяет порядок собственным описанием по доступным путям.
    Порядок.Установить("Сумма Убыв, Наименование Возр");
    Сообщить(Данные.Получить(1).Наименование = "Ручка");

    ТабДок = Новый ТабличныйДокумент;
    Построитель.Вывести(ТабДок);
    Возврат ТабДок;
КонецФункции

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

  1. Отдельная коллекция порядка создаёт две сортировки. Направление задано явно.

  2. Имя ПоСумме отличается от пути Сумма; находим настройку по имени.

  3. Индекс/Получить относятся к позиции условия сортировки, а не к позиции товарной строки.

  4. Временно переставляем и удаляем условие по названию, затем задаём итоговый порядок строкой Установить.

  5. Исходная таблица остаётся в прежнем порядке Книга/Ручка/Коробка. Вывод сортируется отдельно.

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

  1. Восемь булевых проверок Истина.

  2. В выводе порядок Книга 750, Коробка 60, Ручка 50.

  3. Проверка исходной строки 1 всё ещё Ручка.

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

Реальная сортировка отчёта разобрана отдельно от перестановки исходных данных.

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

  1. Сдвинуть у Порядок принимает индекс, а не обязательно объект элемента: здесь используем документированный числовой вариант.

  2. Установить описывает доступные пути данных, а не пользовательские заголовки.

  3. Добавить у Порядок не используем как возвращающий объект: элемент получаем через Найти.

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

Оставить суммы не меньше 60 и отсортировать результат

Отбор исключает Ручку с суммой 50; сортировка ставит Книгу 750 перед Коробкой 60.

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

Полный серверный общий модуль собственной учебной базы.

Подготовка

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

  2. Из серверного обработчика команды своей учебной обработки вызовите УчебныйПостроительЗапроса.ВыполнитьПример(). Не переносите серверные таблицы значений в тонкий клиент.

  3. Данные Книга/Ручка/Коробка создаются самим уроком в памяти. Нет чтения справочников, документов, регистров, внешних сервисов или записи информационной базы.

  4. ПостроительЗапроса — отдельный старый API, не объект Запрос и не конструктор запросов. У него нет Вывести и оформительских свойств ПостроительОтчета.

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

Процедура ВыполнитьПример() Экспорт
    Данные = Новый ТаблицаЗначений;
    Данные.Колонки.Добавить("Категория", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
    Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    Данные.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    Образцы = Новый Массив;
    Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Канцелярия", "Книга", 3, 250));
    Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Канцелярия", "Ручка", 1, 50));
    Образцы.Добавить(Новый Структура("Категория,Наименование,Количество,Цена", "Упаковка", "Коробка", 2, 30));
    Для Каждого Образец Из Образцы Цикл
        СтрокаДанных = Данные.Добавить();
        ЗаполнитьЗначенияСвойств(СтрокаДанных, Образец);
        СтрокаДанных.Сумма = СтрокаДанных.Количество * СтрокаДанных.Цена;
    КонецЦикла;
    Описание = Новый ОписаниеИсточникаДанных(Данные);
    Для Каждого Колонка Из Описание.Колонки Цикл
        Колонка.Поле = Истина;
        Колонка.Отбор = Истина;
        Колонка.Порядок = Истина;
        Колонка.Измерение = Колонка.Имя = "Категория";
    КонецЦикла;
    Построитель = Новый ПостроительЗапроса;
    Построитель.ИсточникДанных = Описание;
    Построитель.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    Построитель.ВыбранныеПоля.Очистить();
    Построитель.ВыбранныеПоля.Добавить("Категория");
    Построитель.ВыбранныеПоля.Добавить("Наименование");
    Построитель.ВыбранныеПоля.Добавить("Количество");
    Построитель.ВыбранныеПоля.Добавить("Цена");
    Построитель.ВыбранныеПоля.Добавить("Сумма");
    Условие = Построитель.Отбор.Добавить("Сумма", "УчебныйПорог", "Сумма не меньше 60");
    Если Условие = Неопределено Тогда
        ВызватьИсключение "Собственная колонка Сумма недоступна для отбора";
    КонецЕсли;
    Условие.ВидСравнения = ВидСравнения.БольшеИлиРавно;
    Условие.Значение = 60;
    Условие.Использование = Истина;
    Построитель.Порядок.Очистить();
    Построитель.Порядок.Добавить("Сумма", "УчебнаяСортировка", "Сумма по убыванию", НаправлениеСортировки.Убыв);
    Построитель.Выполнить();
    Строки = Построитель.Результат.Выгрузить();
    Сообщить(Строки.Количество() = 2);
    Сообщить(Строки.Получить(0).Наименование = "Книга");
    Сообщить(Строки.Получить(0).Сумма = 750);
    Сообщить(Строки.Получить(1).Наименование = "Коробка");
    Сообщить(Строки.Получить(1).Сумма = 60);
    Сообщить(Строки.Итог("Сумма") = 810);
    Сообщить(Данные.Количество() = 3);
    Сообщить(Данные.Получить(1).Наименование = "Ручка");
    Сообщить(Построитель.Отбор.Найти("УчебныйПорог") = Условие);
    Сообщить(Построитель.Порядок.Количество() = 1);
КонецПроцедуры

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

  1. Отбор возвращает ЭлементОтбора или Неопределено; проверяем его до обращения к свойствам.

  2. Порог 60 передаётся как число. Разрешения на отбор уже заданы в описании источника.

  3. Использование включается явно, иначе созданный элемент может не фильтровать строки.

  4. Добавить у Порядок не используем как возвращающий элемент: задаём описание и направление.

  5. После выполнения сравниваем результат с исходными данными, а не удаляем строки исходной таблицы.

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

  1. Десять булевых проверок Истина. В результате две строки и итог 810.

  2. Исходная Ручка остаётся на месте: обработан результат, не исходная таблица.

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

Получен проверяемый отфильтрованный и упорядоченный результат.

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

  1. Порядок настроек сортировки и порядок исходных товарных строк — разные коллекции.

  2. Имя УчебныйПорог используется для поиска настройки, путь Сумма — для доступа к данным.

  3. Это не RLS и не ограничение доступа: правила только формируют учебный результат.

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

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

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

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

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