Предложение ВЫБРАТЬ (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С
Многие объекты метаданных в 1С могут иметь табличную часть. У одного объекта может быть создано неограниченное количество табличных частей.
Табличная часть может быть создана только как подчиненный объект у какого-либо объекта метаданных, например у справочника или у документа.
Строка табличной части не является отдельным объектом. К строке можно обратиться только по индексу строки в табличной части.
Программно нельзя создать табличную часть через конструктор. Можно только получить к ней доступ через основной объект:
Строка табличной части
Добавить новую строку табличной части можно с помощью методов Добавить и Вставить. Через точку от строки табличной части можно обращаться к реквизитам строки:
Заполнение табличной части
Заполнить табличную часть можно по одной строке с помощью методов Добавить и Вставить, а также с помощью методов Загрузить и ЗагрузитьКолонку для массового заполнения табличной части:
Перебор табличной части
Перебрать табличную часть можно в цикле:
Удаление строк табличной части
Удалить одну строку табличной части можно с помощью метода Удалить. Для удаления всех строк применяется метод Очистить.
Как выгрузить табличную часть
Табличную часть можно выгрузить в таблицу значений методом Выгрузить. Также можно выгрузить в массив все значения одной колонки методом ВыгрузитьКолонку:
Методом ВыгрузитьКолонки можно создать пустую таблицу значений с такими же колонками, как у табличной части:
Итог по табличной части
Для получения итога по числовой колонке табличной части можно воспользоваться методом Итог:
Свернуть табличную часть
Чтобы свернуть табличную часть можно воспользоваться методом Свернуть. Первым параметром указывается список колонок группировки, вторым колонки суммирования. Все колонки табличной части должны быть указаны или в первом или во втором параметре.
Сортировка табличной части
Для сортировки табличной части используется метод Сортировать:
Поиск в табличной части
Чтобы найти строку в табличной части можно воспользоваться методами Найти и НайтиСтроки. Метод Найти позволяет найти одну (первую попавшуюся) строку по значению. Метод НайтиСтроки позволяет найти несколько строк, подходящих под условие:
ОЧИСТКА ТАБЛИЧНОЙ ЧАСТИ ДОКУМЕНТА
Каждый раз при выполнении кода могут добавляться новые строки, а вполне возможно, что пользователю старые строки не нужны. Поэтому, чтобы очищать имеющиеся строки, перед добавлением новых строк можно воспользоваться методом Очистить объекта СписокТоваров, который имеет тип ДанныйФормыКоллекция.
После выполнения этого метода вся табличная часть будет очищена.
ТЕКУЩАЯ СТРОКА ТАБЛИЧНОЙ ЧАСТИ
В процессе работы может возникнуть необходимость отработать текущую строку табличной части, т.е. ту строку, которая в данный момент выделена.

Например, может возникать ситуация, что мы редактируем какое-нибудь поле текущей строки таблицы на форме, и нам нужно, чтобы было пересчитано другое поле (или несколько полей) этой текущей строки. Например, мы изменяем цену (или количество) нашей табличной части, и необходимо, чтобы сумма автоматически была пересчитана.
Для решения данной задачи нужно воспользоваться свойством ТекущиеДанные элемента с типом ТаблицаФормы, который соответствует нужной табличной части. Свойство ТекущиеДанные возвращает значение полей текущей строки.

Для того, чтобы отработать изменение текущего поля цены, создадим обработчик события ПриИзменении этого поля.

В этом обработчике напишем код, который будет пересчитывать значения полей текущей строки табличной части.
Ещё пример: я создал команду, которая должна увеличивать количество в текущий строке табличной части в два раза и пересчитывать сумму. Эта команда размещена в командной панели таблицы и имеет следующий код:
Теперь доработаем этот пример: после увеличения текущей строки будем сдвигать текущую строку на строку вниз. Для этого допишем предыдущий код:
В этом коде мы получаем идентификатор текущий строки при помощи свойства таблицы управляемой формы ТекущаяСтрока, и если мы не выходим за приделы таблицы, то сдвигаем нашу текущую строку на один шаг вниз.
Также при помощи текущей строки можно находить аналогичную строку в соответствующей табличной части основного реквизита формы Объект, которую также можно изменять (строка на форме тоже изменится автоматически). Мы ранее сделали пересчет суммы при изменении цены, теперь сделаем пересчет суммы при изменении количества, но напрямую через реквизит Объект.
Запрос к табличной части документа
Строки табличной части любого документа в 1С 8 можно получить при помощи запроса, для того что бы в результат запроса попали данные только одного (нужного нам) документа следует в разделе запроса ГДЕ наложить условие на поле Ссылка. Запрос к табличной части — один из самых простых способов получить данные, например для печатной формы.
1с запрос к табличной части. Пример написания
Рассмотрим запрос к табличной части Продукция документа Отчет производства за смену, пусть в переменной СсылкаНаДокумент содержится ссылка на документ табличную часть которого нам необходимо получить.
В поля запроса необязательно перемещать все имеющиеся реквизиты таб. части документа, можно использовать только необходимые вам.
Если вы не умеете писать запросы на встроенном языке 1с, можете прочитать статью Язык запросов 1с — оператор Выбрать, в ней подробно описывается из каких частей состоит запрос в 1С 8 и как он правильно пишется. Следующим этапом прочтите ее вторую часть Запросы 1с 8 — Программная работа. Изучение языка запросов поможет вам стать профессиональным программистом 1с.
Программирование в 1С:Предприятие
Вопрос: Как обратиться к текущей строке документа и получить реквизиты (например для печати контракта)?
В версии 7.7 всё просто. Даже ничего не нужно придумываться. Как только мы активируем строку документа — программно уже можно получить значение реквизитов из текущей строки.
А вот в 8.1 сложнее: Табличных частей может быть много, форм документа тоже несколько.
В 8.1 — нужно понимать что Табличная часть документа отображается только через Табличное поле , поэтому обращение к текущей строке будет так: