Предложение ВЫБРАТЬ (SELECT) в языке запросов 1С:Предприятия 8
В данной статье рассмотрено предложение ВЫБРАТЬ, его место и роль в языке запросов 1С:Предприятия 8.
Предложение ВЫБРАТЬ является единственным обязательным элементом любого запроса, поэтому изучение языка запросов начинается именно с него. Основная цель предложения ВЫБРАТЬ заключается в том, чтобы указать поля выборки, которые должны попасть в результат запроса.
Ниже рассмотрены следующие темы:
- Место предложения ВЫБРАТЬ в структуре запроса 1С:Предприятия 8
- Примеры запросов с предложением ВЫБРАТЬ:
- Выборка всех полей (кроме виртуальных) из таблиц
- Выборка только определенных полей из таблиц
- Виртуальные поля
- Разыменование ссылочных полей
- Псевдонимы полей (ключевое слово КАК / AS)
- Обращение к табличной части как вложенной таблице
- Обращение к табличной части как таблице-источнику
- Ключевое слово РАЗЛИЧНЫЕ / DISTINCT
- Ключевое слово ПЕРВЫЕ / TOP
- Выражения в списке полей выборки
Место предложения ВЫБРАТЬ в структуре запроса
Структуру запроса 1С:Предприятия 8 можно представить в виде следующей схемы:

Из приведенной схемы можно сделать следующие выводы:
- В любом запросе должно быть хотя бы одно предложение ВЫБРАТЬ.
- В списке полей выборки должно быть описание хотя бы одного поля выборки, которое в общем случае является выражением.
Примеры запросов с предложением ВЫБРАТЬ
1. Выборка всех полей (кроме виртуальных) из таблиц
Вместо перечисления списка полей можно указать звездочку («*») и тогда в результат запроса попадут все поля таблицы-источника, кроме виртуальных. Например:
//обращение к таблице справочника
ВЫБРАТЬ * ИЗ Справочник.Номенклатура//обращение к таблице документа
ВЫБРАТЬ * ИЗ Документ.РасходныйКассовыйОрдер//обращение к основной таблице регистра накопления
ВЫБРАТЬ * ИЗ РегистрНакопления.ПродажиКомпании//обращение к виртуальной таблице регистра накопления
ВЫБРАТЬ * ИЗ РегистрНакопления.ПродажиКомпании.ОборотыЗамечание: В языке запросов есть возможность обойтись без предложения ИЗ, если описание поля содержит полный путь к нему с указанием таблицы-источника, например,
Копировать в буфер обмена
//выборка всех невиртуальных полей из таблицы справочника
ВЫБРАТЬ Справочник.Номенклатура.*//выборка определенных полей из таблицы справочника
ВЫБРАТЬ
Справочник.Номенклатура.Код,
Справочник.Номенклатура.Наименование,
Справочник.Номенклатура.Представление //виртуальное поле2. Выборка только определенных полей из таблиц
Самым обычным способом является перечисление нескольких полей из таблицы-источника запроса, тогда только эти поля попадут в результат запроса.
//обращение к таблице справочника
ВЫБРАТЬ Код, Наименование, Артикул, СтранаПроисхождения
ИЗ Справочник.Номенклатура//обращение к таблице документа
ВЫБРАТЬ Номер, Дата, ПодразделениеКомпании, СуммаДокумента
ИЗ Документ.РасходныйКассовыйОрдер3. Виртуальные поля
Некоторые поля в таблицах-источниках виртуальные, например, поле «Представление» для таблицы справочника и документа, или поле «МоментВремени» для документа. Это значит, что они не хранятся в базе данных, а генерируются «на лету». Виртуальные поля не включаются в результат запроса, когда вместо списка полей указана звездочка («*»), их нужно указывать явно, например «ВЫБРАТЬ *, Представление ИЗ Справочник.Товары». Такое решение было принято для ускорения выполнения классического запроса «ВЫБРАТЬ * ИЗ. ». В этом случае не требуется генерировать представления для элементов справочников и документов, следовательно запросы будут выполняться быстрее.
//обращение к таблице справочника (выбрать два обычных поля и одно виртуальное)
ВЫБРАТЬ Код, Наименование, Представление
ИЗ Справочник.Номенклатура//обращение к таблице документа (выбрать все невиртуальные поля и два виртуальных)
ВЫБРАТЬ *, Представление, МоментВремени
ИЗ Документ.РасходныйКассовыйОрдер4. Разыменование ссылочных полей
В 1С:Предприятии 8 допускается обращение к свойствам объектов через одну или несколько точек, например, «Номенклатура.Поставщик.Страна». Это позволяет значительно упростить написание запросов. Рекомендуется всегда пользоваться разыменованием полей там, где это возможно, чтобы не усложнять запросы лишними конструкциями.
//обращение к свойству объекта через одну точку
ВЫБРАТЬ
Ссылка,
ЮрФизЛицоКонтрагента . ИНН,
ПодразделениеКомпании . Код
ИЗ Документ.РасходныйКассовыйОрдер//обращение к свойствам объектов через несколько точек
ВЫБРАТЬ
Ссылка,
Ответственный . ОсновнойБанковскийСчет . Банк . КоррСчет
ИЗ Документ.АвансовыйОтчет5. Псевдонимы полей (ключевое слово КАК / AS)
Для поля может быть назначен псевдоним с помощью ключевого слова КАК. Это позволяет обращаться к полю по псевдониму при указании итогов и порядка сортировки, а также при обходе выборки из результата запроса, например:
ВЫБРАТЬ
Ссылка КАК Документ,
Ответственный КАК МатериальноОтветственный
ИЗ Документ.АвансовыйОтчет
УПОРЯДОЧИТЬ ПО МатериальноОтветственныйКлючевое слово КАК является необязательным, то есть вышеприведенный запрос можно записать так:
ВЫБРАТЬ
Ссылка Документ,
Ответственный МатериальноОтветственный
ИЗ Документ.АвансовыйОтчет6. Обращение к табличной части как вложенной таблице
В этом случае поле результата запроса будет иметь тип РезультатЗапроса, то есть содержать вложенный результат запроса, сформированный на основе табличной части.
//получение табличной части как вложенной таблицы результата запроса
ВЫБРАТЬ Номер, Дата, Товары
ИЗ Документ.АвансовыйОтчет//получение нескольких колонок табличной части как вложенной таблицы
ВЫБРАТЬ Номер, Дата, Товары.(Номенклатура, Количество)
ИЗ Документ.АвансовыйОтчетОбратите внимание, что если выполнить следующий запрос, то в результате запроса будет две вложенные таблицы: в первой — одна колонка Номенклатура, а во второй — колонка Количество:
ВЫБРАТЬ Номер, Дата, Товары.Номенклатура, Товары.Количество
ИЗ Документ.АвансовыйОтчет7. Обращение к табличной части как таблице-источнику
При таком способе обращения имя вложенной таблицы фигурирует в имени таблицы-источника (предложение ИЗ или полные имена полей) и в результате запроса нет вложенных таблиц.
//выборка всех полей из табличной части
ВЫБРАТЬ * ИЗ Документ.АвансовыйОтчет.Товары// выборка определенных полей из табличной части
ВЫБРАТЬ Номенклатура, Количество, Цена, Сумма
ИЗ Документ.АвансовыйОтчет.Товары//задание псевдонимов для полей табличной части
ВЫБРАТЬ Документ.АвансовыйОтчет.Товары.(Номенклатура, Сумма КАК СуммаПоСтроке)//обращение к реквизитам документа и реквизитам табличной части (поле Ссылка)
ВЫБРАТЬ
Ссылка.Номер, Ссылка.Дата, Ссылка.Ответственный, //реквизиты документа
Номенклатура, Количество, Цена, Сумма //реквизиты табличной части
ИЗ Документ.АвансовыйОтчет.Товары8. Ключевое слово РАЗЛИЧНЫЕ / DISTINCT
Ключевое слово РАЗЛИЧНЫЕ позволяет оставить в результате запроса только отличающиеся строки.
ВЫБРАТЬ РАЗЛИЧНЫЕ Ответственный
ИЗ Документ.АвансовыйОтчет9. Ключевое слово ПЕРВЫЕ / TOP
Данное ключевое слово позволяет ограничить выборку несколькими первыми записями. Часто это ключевое слово применяется в комбинации с сортировкой (предложение УПОРЯДОЧИТЬ ПО).
ВЫБРАТЬ ПЕРВЫЕ 10 Номер, Дата, СуммаДокумента
ИЗ Документ.АвансовыйОтчет
УПОРЯДОЧИТЬ ПО СуммаДокумента УБЫВ10. Выражения в списке полей выборки
В качестве описания поля выборки может быть выражение, использующее следующие элементы:
- Литералы типов: число, строка (в кавычках), булево (значения Истина и Ложь), Null, Неопределено. [ Замечание : Чтобы указать литерал типа «дата», можно воспользоваться ключевым словом языка запросов ДАТАВРЕМЯ или передать дату через параметр запроса].
- Параметры запроса (со знаком &)
- Имя поля
- Имя табличной части
- Разыменование ссылочного поля (через одну или несколько точек)
- Арифметические операции (+, -, /, *) [ Замечание : операция получения остатка % в языке запросов не поддерживается]
- Операция конкатенации строк (+) [ Замечание : операцию конкатенации нельзя использовать для виртуальных полей]
- Встроенные функции языка запросов (ДЕНЬ, МЕСЯЦ, ГОД и т.д.)
- Агрегатные функции (СУММА, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, КОЛИЧЕСТВО)
- Операция выбора ВЫБОР / CASE — позволяет получить одно из возможных значений в соответствии с указанными условиями.
- Операция приведения типов ВЫРАЗИТЬ / CAST
Ниже приведено несколько примеров с выражениями в списке полей выборки:
//арифметические операции
ВЫБРАТЬ
Номенклатура,
Количество * Цена КАК РасчСумма1,
Сумма / Количество КАК РасчСумма2
ИЗ Документ.АвансовыйОтчет.Товары//литералы типа «булево», «число», «строка», «дата»
ВЫБРАТЬ Истина, Ложь, 10.5, «Текст», ДАТАВРЕМЯ(2003,12,25)//конкатенация строк
ВЫБРАТЬ «Сотрудник » + Ответственный.Наименование
ИЗ Документ.АвансовыйОтчет//агрегатные функции
ВЫБРАТЬ
ПодразделениеКомпании,
СУММА(СуммаДокумента),
МАКСИМУМ(СуммаДокумента),
МИНИМУМ(СуммаДокумента),
СРЕДНЕЕ(СуммаДокумента),
КОЛИЧЕСТВО(*)
ИЗ Документ.АвансовыйОтчет
СГРУППИРОВАТЬ ПО ПодразделениеКомпании//операция выбора
ВЫБРАТЬ Наименование,
ВЫБОР
КОГДА СтранаПроисхождения.Наименование = «КИТАЙ» ТОГДА «Азия»
КОГДА СтранаПроисхождения.Наименование = «ТАЙВАНЬ» ТОГДА «Азия»
КОГДА СтранаПроисхождения.Наименование = «США» ТОГДА «Америка»
КОГДА СтранаПроисхождения.Наименование = «КАНАДА» ТОГДА «Америка»
ИНАЧЕ «Другое»
КОНЕЦ КАК Страна
ИЗ Справочник.Номенклатура//операция приведения типов
ВЫБРАТЬ
Ссылка,
Номенклатура,
ВЫРАЗИТЬ(Сумма / 3 КАК Число(5,2)) КАК ТретьСуммы
ИЗ Документ.АвансовыйОтчет.ТоварыТаким образом, предложение ВЫБРАТЬ является важнейшим элементом языка запросов, поскольку позволяет указать требуемые поля результата запроса. Гибкие возможности предложения ВЫБРАТЬ позволяют использовать язык запросов для решения самых разнообразных задач.
Запросы, динамические списки и отчеты на СКД: требования по локализации
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В некоторых случаях строковые литералы из текстов запросов также могут оказаться частью пользовательского интерфейса. В таких случаях строковые литералы необходимо выносить из текста запроса в параметры.
ЗапросПоВерсиям = Новый Запрос(" |ВЫБРАТЬ |Версии.Ссылка, |ВЫБОР КОГДА Версии.Выпущена = ИСТИНА | ТОГДА ""выпущена"" | ИНАЧЕ ""в разработке"" |КОНЕЦ КАК ТекстПояснения | ИЗ | Справочник.Версии КАК Версии");ТекстЗапроса = "ВЫБРАТЬ |Версии.Ссылка, |ВЫБОР КОГДА Версии.Выпущена = ИСТИНА | ТОГДА &ТекстВыпущеннойВерсии | ИНАЧЕ &ТекстНеВыпущеннойВерсии |КОНЕЦ КАК ТекстПояснения | ИЗ | Справочник.Версии КАК Версии"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстВыпущеннойВерсии", НСтр("ru='выпущена'")); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстНеВыпущеннойВерсии", НСтр("ru='в разработке'"));ЗапросПоВерсиям = Новый Запрос(" |ВЫБРАТЬ |Версии.Ссылка, |ВЫБОР КОГДА Версии.Выпущена = ИСТИНА | ТОГДА &ТекстВыпущеннойВерсии | ИНАЧЕ &ТекстНеВыпущеннойВерсии |КОНЕЦ КАК ТекстПояснения | ИЗ | Справочник.Версии КАК Версии"); ЗапросПоВерсиям.УстановитьПараметр("ТекстВыпущеннойВерсии", НСтр("ru='выпущена'")); ЗапросПоВерсиям.УстановитьПараметр("ТекстНеВыпущеннойВерсии", НСтр("ru='в разработке'"));2. Аналогичные требования предъявляются к выражениям СКД и запросам, которые используются в наборах данных СКД и содержат строковые литералы, выводимые в пользовательском интерфейсе. Например, если в выражении для параметров СКД встречаются строковые константы, требующие перевода, то следует:
а) в запросе указывать строковые константы, соответствующие «Правилам образования имен переменных» («»ЗавершитеСозданиеДокументов» КАК Рекомендация «), а в списке доступных значений поля указать локализуемый строковый литерал («Завершите создание документов»);

б) либо значение таких параметров с помощью функции НСтр устанавливать не в колонке Выражение, а в модуле отчета в обработчике события ПриКомпоновкеРезультата
ВЫБОР КОГДА ВидОперации = "Отгрузка клиентам" ТОГДА 1 КОГДА ВидОперации = "Возвраты товаров от клиентов" ТОГДА 2 КОГДА ВидОперации = "Приемка от поставщиков" ТОГДА 3 КОНЕЦ
ВЫБОР КОГДА ВидОперации = &ВидОперацииОтгрузкаКлиентам ТОГДА 1 КОГДА ВидОперации = &ВидОперацииВозвратыТоваровОтКлиентов ТОГДА 2 КОГДА ВидОперации = &ВидОперацииПриемкаОтПоставщиков ТОГДА 3 КОНЕЦ
в) В выражениях, используемых в настройках СКД, например Выражение представления и Выражение упорядочивания на закладке Наборы данных , а также в других им подобных, необходимо использовать функцию НСтр , аналогично тому, как это делается в коде модулей (см. стандарт Интерфейсные тексты в коде: требования по локализации).
Выбор Когда Объект = Раздел Тогда Выбор Когда Раздел = Значение(ПланВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка) Тогда "" Иначе "" Конец Иначе Объект Конец
Выбор Когда Объект = Раздел Тогда Выбор Когда Раздел = Значение(ПланВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка) Тогда НСтр("ru=''") Иначе НСтр("ru=''") Конец Иначе Объект Конец3. Для колонок отчета на СКД для поля выборки, полученного вычислением с заданием ему псевдонима, необходимо задавать синоним при разработке. Нельзя опираться на автоматически сгенерированный заголовок по имени/псевдониму.


В отчётах, если не стоит галочка у поля выборки, полученного вычислением с заданием ему псевдонима, оно не попадает в результаты поиска редактирования текстов интерфейсов.
См. также
Когда тогда в запросе 1с
Подскажите пож, можно ли использовать конструкцию в запросе
ВЫБРАТЬ
.
ВЫБОР
КОГДА условие1
ТОГДА значение1
КОГДА условие2
ТОГДА значение2
КОГДА (ВЫБРАТЬ
..
ИЗ ..) = ИСТИНА
ТОГДА значение3
ИНАЧЕ значение4
..
ИЗ
..то есть в одном из полей использовать запрос?
нет. ВЫБОР применяется к каждой строке выборки
(1) Че за ерунда, можно канечно.
Обычная конструкция SELECT CASE
Пробую написать в конструкторе в поле
ВЫБОР
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА ЕСТЬNULL(выбрать 1 из истина, ЛОЖЬ) = ИСТИНА
ТОГДА МАКСИМУМ(ВложенныйЗапросНДФЛ.Сумма)
ИНАЧЕ 0
КОНЕЦругается на то, что синтаксическая ошибка и «ожидается выражение выбрать»..
(2) почитай топик внимательно.
(3) в КОГДА так нельзя
(3) Может я неправильно понял тебя))
Вот как ты написал в примере правильно сказано в (1).
То есть селект в поле нельзя?
(6) конечно нельзя, делай соединение и тогда уж проверяй в своем «когда».(3) > выбрать 1 из истина
(8)
это толпа единичек. колво= колво записей ВТ истина.
я так думаю (с)
(0) Нельзя
(6) Ни где нельзя, не только в поле.
Можно только IN (SELECT)(6) Давай обратимся к матчасти:
В качестве описания поля выборки может быть выражение, использующее следующие элементы:
Литералы типов: число, строка (в кавычках), булево (значения Истина и Ложь), Null, Неопределено. [Замечание: Чтобы указать литерал типа «дата», можно воспользоваться ключевым словом языка запросов ДАТАВРЕМЯ или передать дату через параметр запроса].
Параметры запроса (со знаком &)
Имя поля
Имя табличной части
Разыменование ссылочного поля (через одну или несколько точек)
Арифметические операции (+, -, /, *) [Замечание: операция получения остатка % в языке запросов не поддерживается]
Операция конкатенации строк (+) [Замечание: операцию конкатенации нельзя использовать для виртуальных полей]
Встроенные функции языка запросов (ДЕНЬ, МЕСЯЦ, ГОД и т.д.)
Агрегатные функции (СУММА, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, КОЛИЧЕСТВО)
Операция выбора ВЫБОР / CASE — позволяет получить одно из возможных значений в соответствии с указанными условиями.
Операция приведения типов ВЫРАЗИТЬ / CAST(10) «Можно только IN (SELECT)» — то есть, что то вроде этого
ВЫБОР
КОГДА
ТОГДА 1
КОГДА
ТОГДА 2
КОГДА
ТОГДА 3
КОГДА
ТОГДА 4
КОГДА ИСТИНА В (ВЫБРАТЬ .. ИЗ ..)
ТОГДА 5
ИНАЧЕ 0
КОНЕЦКогда тогда в запросе 1с
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: условный оператор
Автор уроков и преподаватель школы: Владимир Милькин
Условный оператор в запросе
Давайте напишем запрос, который получает названия и калорийность еды:
ВЫБРАТЬ Наименование, Калорийность ИЗ Справочник.Еда

А теперь добавим в результат запроса колонку, в которую будем выводить жирность еды по следующим правилам:
- если калорийность меньше 100, то жирность низкая;
- если калорийность от 100 до 200, то жирность нормальная;
- если калорийность больше 200, то жирность высокая.
Как этого можно добиться, ведь в таблице Справочник.Еда нет колонки Жирность?
Оказывается, эту колонку мы можем добавить сами, используя условный оператор внутри запроса:
ВЫБРАТЬ Наименование, Калорийность, ВЫБОР КОГДА Калорийность 100 ТОГДА "Низкая" КОГДА Калорийность 200 ТОГДА "Нормальная" ИНАЧЕ "Высокая" КОНЕЦ ИЗ Справочник.Еда
Давайте внимательнее присмотримся к тексту запроса:

В секции ВЫБРАТЬ идёт перечисление полей выборки: Наименование, Калорийность, а затем вместо третьего поля идёт конструкция условного оператора, результат которого и попадает в третью колонку.
Условия оператора обрабатываются последовательно . Если одно из них оказалось верным, то в качестве результата возвращается соответствующее значение. Если же ни одно из условий не выполнилось, то возвращается значение из секции ИНАЧЕ. Если же ни одно из условий не выполнилось, и в операторе отсутствует секция ИНАЧЕ, то возвращается значение NULL (о нём мы поговорим в одном из следующих уроков).
Поэтому новый запрос вернёт такую таблицу:

Отступление
Обратите внимание, что третья колонка в таблице, которую вернул запрос, называется Поле1. Это имя было сгенерировано системой автоматически, потому что третьей колонке не соответствует никакого реального поля в таблице Справочник.Еда, откуда можно было бы это имя получить.
Но в наших силах дать ей это имя. Для этого сразу после описания поля нужно написать ключевое слово КАК, а после этого через пробел указать само имя. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Такое имя будет называться псевдонимом поля .
ВЫБРАТЬ Наименование, Калорийность, ВЫБОР КОГДА Калорийность 100 ТОГДА "Низкая" КОГДА Калорийность 200 ТОГДА "Нормальная" ИНАЧЕ "Высокая" КОНЕЦ КАК Жирность ИЗ Справочник.Еда

Псевдонимы можно присваивать любым полям, в том числе тем, у которых уже есть имя. Давайте сделаем псевдоним Еда для поля Наименование:
ВЫБРАТЬ Наименование КАК Еда ИЗ Справочник.ЕдаНо вернёмся к условному оператору в запросах.
Более сложные логические выражения в условиях оператора
В логических условиях оператора выбора можно использовать и более сложные выражения.
Пример использования логического оператора ПОДОБНО:
ВЫБРАТЬ Наименование, ВЫБОР КОГДА Наименование ПОДОБНО "Б%" ТОГДА "Начинается на Б" КОГДА Наименование ПОДОБНО "К%" ТОГДА "Начинается на К" ИНАЧЕ "Начинается на другую букву" КОНЕЦ ИЗ Справочник.Еда

Пример использования функции ПОДСТРОКА:
ВЫБРАТЬ Наименование, ВЫБОР КОГДА ПОДСТРОКА(Наименование, 1, 3) = "Бан" ТОГДА "Это банан" КОГДА ПОДСТРОКА(Наименование, 1, 2) = "Чи" ТОГДА "Это чипсы" ИНАЧЕ "Что-то другое" КОНЕЦ ИЗ Справочник.Еда

Более сложные результаты условного оператора
Конечно, результатом условного оператора может быть не только константная строка, но и любое другое выражение, допустимое в запросе.
Рассмотрим более общий пример:
ВЫБРАТЬ Наименование, ВЫБОР КОГДА Код = "000000001" ТОГДА "Банан" КОГДА Код = "000000002" ТОГДА Наименование КОГДА Код= "000000003" ТОГДА 555 КОГДА Код = "000000004" ТОГДА Калорийность КОГДА Код = "000000005" ТОГДА ДАТАВРЕМЯ(2014, 01, 01) КОГДА Код = "000000006" ТОГДА ИСТИНА КОГДА Код = "000000007" ТОГДА Ссылка КОНЕЦ ИЗ Справочник.Еда