[Alimir_BootModal_Login]

Язык запросов 1С 8.3 для начинающих программистов: упорядочивание

Автор уроков и преподаватель школы: Владимир Милькин

Упорядочивание в запросах

Давайте напишем запрос, который получает из таблицы Справочник.Еда код и название еды:

ВЫБРАТЬ
    Код,
    Наименование
ИЗ
    Справочник.Еда

Как всегда, выполните этот запрос у себя на компьютере.

С большой долей вероятности у вас получится следующий результат:

01

Возможно вы удивитесь, но при таком написании запроса никто не гарантирует нам именно такого порядка выдачи записей в таблице. В случае использования клиент-серверного режима работы на различных СУБД результат мог бы быть и такой:

01_1

И такой:

01_2

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

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

Секция УПОРЯДОЧИТЬ ПО

Поля по которым требуется упорядочить запрос перечисляются в секции УПОРЯДОЧИТЬ ПО через запятую:

05

Следом за именем поля упорядочивания может идти одно из двух ключевых слов:

  • ВОЗР - упорядочивание по возрастанию.
  • УБЫВ - упорядочивание по убыванию.

Если не указывать ни одно из этих слов, считается, что сортировка идёт по возрастанию.

Вооружившись знаниями, давайте упорядочим результат нашего запроса по убыванию поля Код:

ВЫБРАТЬ
    Код,
    Наименование
ИЗ
    Справочник.Еда
УПОРЯДОЧИТЬ ПО
    Код УБЫВ

06

По возрастанию поля Наименование (алфавитный порядок):

ВЫБРАТЬ
    Код,
    Наименование
ИЗ
    Справочник.Еда
УПОРЯДОЧИТЬ ПО
    Наименование ВОЗР

07

А теперь упорядочим следующую таблицу

09

так, чтобы сначала шла сортировка по полю Вкус по возрастанию, а затем (среди строчек с одинаковым значением поля Вкус) шла сортировка по полю Цвет по убыванию:

ВЫБРАТЬ
    Вкус,
    Цвет
ИЗ
    Справочник.Еда
УПОРЯДОЧИТЬ ПО
    Вкус.Наименование ВОЗР,
    Цвет.Наименование УБЫВ

10

Отдельно обращаю ваше внимание на то, что мы указали сортировку не по самим полям Вкус и Цвет, а по их строковому реквизиту Наименование. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Это связано с тем, что сортировка возможна лишь по полям имеющим один из типов: СтрокаЧислоДата.

А поля Вкус и Цвет являются ссылками на элементы справочников Вкус и Цвет, сортировать по которым не имеет смысла (в этом случае сортировка будет вестись по внутреннему идентификатору ссылки). Зато можно сделать сортировку по одному из реквизитов этих элементов. Наиболее подходящим в нашем случае будет строковый реквизит Наименование.

Возможность автоупорядочивания

Ключевое слово АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим автоматического формирования полей для упорядочивания результатов запроса.

Мы сейчас познакомимся с этой возможностью подробно, но сразу хочется оговориться, что фирма "1С" в своих методических рекомендациях не советует использовать её без необходимости (о причинах этого мы поговорим ниже).

Итак, поехали.

Прежде всего, ключевое слово АВТОУПОРЯДОЧИВАНИЕ может быть расположено в запросе сразу за или вместо секции УПОРЯДОЧИТЬ ПО:

Автоупорядочивание работает по следующим принципам:

Случай #1

Если в запросе:

  • есть секция УПОРЯДОЧИТЬ ПО

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

Для таблиц справочников полями сортировки по умолчанию являются код и наименование, выбор из которых осуществляется в соответствии с настройками справочника в конфигураторе:

Для таблиц документов полем сортировки по умолчанию является дата документа.

Рассмотрим пример:

ВЫБРАТЬ
    Наименование
ИЗ
    Справочник.Клиенты
УПОРЯДОЧИТЬ ПО
    ЛюбимыйЦвет
АВТОУПОРЯДОЧИВАНИЕ

Так как поле сортировки ЛюбимыйЦвет имеет тип Справочник.Цвета, в настройках которого основным представлением выбрано поле Наименование, то этот запрос эквивалентен:

ВЫБРАТЬ
    Наименование
ИЗ
    Справочник.Клиенты
УПОРЯДОЧИТЬ ПО
    ЛюбимыйЦвет.Наименование

Случай #2

Если в запросе:

  • отсутствует секция УПОРЯДОЧИТЬ ПО
  • но есть секция ИТОГИ ПО (её мы будем проходить позже)

В этом случае результат запроса будет упорядочен по полям итогов (в той же последовательности).

Если среди этих полей есть ссылки на таблицы, то они также будут заменены полями, по которым сортируются эти таблицы по умолчанию.

Случай #3

Если в запросе:

  • отсутствует секция УПОРЯДОЧИТЬ ПО
  • отсутствует секция ИТОГИ ПО
  • но есть секция СГРУППИРОВАТЬ ПО (группировку мы проходили здесь)

В этом случае результат запроса будет упорядочен по полям группировки (в той же последовательности).

Если среди этих полей есть ссылки на таблицы, то они также будут заменены полями, по которым сортируются эти таблицы по умолчанию.

Рассмотрим пример:

ВЫБРАТЬ
    Город,
    СУММА(Количество)
ИЗ
    Документ.ПрибытиеГостей
СГРУППИРОВАТЬ ПО
    Город
АВТОУПОРЯДОЧИВАНИЕ

Так как поле группировки Город имеет тип Справочник.Города, в настройках которого основным представлением выбрано поле Наименование, то этот запрос эквивалентен:

ВЫБРАТЬ
    Город,
    СУММА(Количество)
ИЗ
    Документ.ПрибытиеГостей
СГРУППИРОВАТЬ ПО
    Город
УПОРЯДОЧИТЬ ПО
    Город.Наименование

Случай #4

Наконец, если в запросе:

  • отсутствует секция УПОРЯДОЧИТЬ ПО
  • отсутствует секция ИТОГИ ПО
  • отсутствует секция СГРУППИРОВАТЬ ПО

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

Рассмотрим пример:

ВЫБРАТЬ
    Код,
    Наименование
ИЗ
    Справочник.Еда
АВТОУПОРЯДОЧИВАНИЕ

Так как данные выбираются из справочника Еда, в настройках которого основным представлением выбрано поле Наименование, то этот запрос будет эквивалентен:

ВЫБРАТЬ
    Код,
    Наименование
ИЗ
    Справочник.Еда
УПОРЯДОЧИТЬ ПО
    Наименование

Почему использование автоупорядочивания нежелательно

Автоупорядочивание подходит:

  • для универсальных запросов, когда разработчик не может предвидеть из каких таблиц будут запрашиваться данные
  • для случаев, когда получаемый порядок записей не важен, но при этом он должен быть одинаковым в независимости от применяемой СУБД

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

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

А завтра фирма "1С" (или другой разработчик) изменят настройки базы в конфигураторе так, что полем сортировки по умолчанию для справочника Еда станет, к примеру, поле Код. И, если мы использовали автоупорядочивание в запросе, то наш отчет сломается, ведь порядок сортировки уже будет другим. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Поэтому всегда старайтесь указывать конкретные поля и конкретный порядок сортировки по ним в секции УПОРЯДОЧИТЬ ПО, такой запрос уже не сломать просто так:

ВЫБРАТЬ
    Код,
    Наименование
ИЗ
    Справочник.Еда
УПОРЯДОЧИТЬ ПО
    Наименование ВОЗР

Пройдите тест

Начать тест

Домашнее задание

а) Напишите запрос, который получает список клиентов, упорядоченный по их любимому цвету по возрастанию:

01 

Эталонное решение. Сначала пишем код сами, проверяем на компьютере (как и все примеры программ из уроков), только потом сверяемся

б) Напишите запрос, который получает список заказов клиентов (таблица Документ.ЗаказКлиента), упорядоченный по дате по убыванию:

02 

Эталонное решение. Сначала пишем код сами, проверяем на компьютере (как и все примеры программ из уроков), только потом сверяемся

в) Напишите запрос, который получает список документов "Установка цен на еду для клиентов" (таблица Документ.УстановкаЦенНаЕдуДляКлиентов), упорядоченный по клиентам по возрастанию, а затем по датам по убыванию:

03

Эталонное решение. Сначала пишем код сами, проверяем на компьютере (как и все примеры программ из уроков), только потом сверяемся