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

Литерал запроса выглядит следующим образом:

пер Запрос = Запрос{ВЫБРАТЬ 
                        Сотрудники.Ссылка КАК Ссылка,
                        Сотрудники.ФИО КАК ФИО 
                     ИЗ
                        Сотрудники КАК Сотрудники}

Весь текст запроса пишется в фигурных скобках.

При использовании литерала переменная Запрос имеет тип ТипизированныйЗапрос<тип-строки-результата-запроса>. Это запрос на выборку данных, порождаемый литералом.

тип-строки-результата-запроса это синтетическое имя типа строки результата запроса, которое порождает «1С:Шина». Например, это может быть Приложение.СтрокаРезультатаЗапроса$19$18. К такому типу нельзя обращаться по имени, но можно использовать его значения в пределах модуля, содержащего литерал запроса.

Примечание: Если запрос с литералом не выбирает данные, то его тип будет ЗапросБезВыборки.

Обход результата запроса

Чтобы выполнить запрос, используйте метод Выполнить(). Он вернет значение обобщенного типа РезультатЗапроса<тип-строки-результата-запроса>. Этот тип является производным от типа Обходимое<тип-строки-результата-запроса>, поэтому результат запроса сразу же можно использовать в цикле для ... из.

// Задать текст запроса.
пер Запрос = Запрос{ВЫБРАТЬ 
                        Сотрудники.Ссылка КАК Ссылка,
                        Сотрудники.ФИО КАК ФИО 
                     ИЗ
                        Сотрудники КАК Сотрудники}

// Обойти результат запроса и обработать его.
для СтрокаРезультата из Запрос.Выполнить()
   пер СотрудникСсылка = СтрокаРезультата.Ссылка    
   пер СотрудникФИО    = СтрокаРезультата.ФИО
; 

В этом цикле «1С:Шина» будет выдавать строки запроса в порядке получения их из базы данных, то есть в том порядке, который указан в тексте запроса.

Переменная СтрокаРезультата будет иметь тип тип-строки-результата-запроса.

Явное указание типа строки

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

ДругойМетод(РезультатЗапроса<тип-строки-результата-запроса>)

Чтобы выйти из этой ситуации можно явно задать имя типа строки результата запроса. Используйте для этого синтаксис В СТРУКТУРУ, в котором указывается нужное имя.

// Задать текст запроса.
пер Запрос = Запрос{ВЫБРАТЬ 
                        Сотрудники.Ссылка КАК Ссылка,
                        Сотрудники.ФИО КАК ФИО 
                     В СТРУКТУРУ
                        Сотрудник
                     ИЗ
                        Сотрудники КАК Сотрудники}

// Передать результат запроса в другой метод.
ДругойМетод(Запрос.Выполнить())


метод ДругойМетод(РезультатЗапроса: РезультатЗапроса<Приложение.Сотрудник>)
; 

В этом примере явно задается имя типа строки результата запроса — Сотрудник. И это же имя типа используется для параметризации обобщенного типа в параметре метода ДругойМетод().

Результирующее имя типа формируется как имя типа, владеющего модулем (в котором литерал запроса, в данном случае — Приложение) и, через точку, имя типа строки результата, указанное в запросе.

Параметры запроса

Параметры в литерал запроса передаются с помощью символа %:

  • либо %имя-переменной
  • либо %{выражение}

где выражение — это выражение встроенного языка.

Например, можно передать параметр Возраст.

// Установить значения параметров запроса.
пер Возраст = 40

// Задать текст запроса.
пер Запрос = Запрос{ВЫБРАТЬ 
                        Сотрудники.Ссылка КАК Ссылка,
                        Сотрудники.ФИО КАК ФИО 
                     ИЗ
                        Сотрудники КАК Сотрудники
                     ГДЕ
                        Сотрудники.Возраст < %Возраст}

Значения одинаковых выражений вычисляются только один раз, а не на каждое вхождение выражения в литерал.

Временные таблицы

Использование временных таблиц в запросах с литералами имеет свои особенности, в отличие от использования временных таблиц в произвольных запросах.

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

Например, если таблица ОценкиТоваров создана в модуле объекта справочника Товары, то у нее будут следующие имена:

  • ОценкиТоваров,
  • Товары.Объект.ОценкиТоваров.

Краткое имя таблицы может быть неуникальным в области видимости модуля, в то время как полное имя должно быть уникальным.

Например, если в проекте есть периодический регистр сведений КурсыВалют, то в модуле этого регистра КурсыВалют можно объявить временную таблицу КурсыВалют. Обращаться к ней можно как КурсыВалют.КурсыВалют.

В то же время в этом модуле нельзя объявить временную таблицу с именем СрезПоследних, т.к. полное имя этой таблицы, КурсыВалют.СрезПоследних, будет пересекаться с именем виртуальной таблицы этого регистра КурсыВалют.СрезПоследних.

Временные таблицы видны за пределами литерала, в котором они объявлены, только если это не пакетный запрос на выборку данных (ВЫБРАТЬ без ПОМЕСТИТЬ). В таком пакетном запросе временная таблица уничтожается по окончании выполнения пакета.

В запросах, заданных литералом, можно обращаться к временным таблицам, объявленным в других литералах. Обращаться к временным таблицам, объявленным в рамках этого же пакета запросов, тоже можно.

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

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