Использование литерала запроса
Литерал запроса выглядит следующим образом:
знч Запрос = Запрос{ВЫБРАТЬ
ОбработанныеСообщения.КодУчастника КАК КодУчастника,
ОбработанныеСообщения.ИмяПроцесса КАК ИмяПроцесса,
ОбработанныеСообщения.ИмяУзла КАК ИмяУзла
ИЗ
ОбработанныеСообщения КАК ОбработанныеСообщения}
Весь текст запроса пишется в фигурных скобках.
При использовании литерала переменная Запрос имеет тип ТипизированныйЗапрос<тип-строки-результата-запроса>. Это запрос на выборку данных, порождаемый литералом. тип-строки-результата-запроса — это тип строки результата запроса, которое порождает «1С:Шина». Например, это может быть Приложение.СтрокаРезультатаЗапроса$19$18.
Тип тип-строки-результата-запроса обладает следующими особенностями:
- Передача значений типа доступна между клиентом и сервером;
- Значения типа — не изменяемы;
- Конструктор — не доступен;
- Сравнение — «структурное».
Запрос без выборки
Если запрос с литералом не выбирает данные, то он будет иметь тип ЗапросБезВыборки. ЗапросБезВыборки.Выполнить() возвращает количество обработанных записей.
Пример:
исп ОбластьВидимостиВременныхТаблиц.Открыть()
знч Запрос = Запрос{
ВЫБРАТЬ
ОбработанныеСообщения.КодУчастника КАК КодУчастника,
ОбработанныеСообщения.ИмяПроцесса КАК ИмяПроцесса,
ОбработанныеСообщения.ИмяУзла КАК ИмяУзла
ПОМЕСТИТЬ
ВременнаяТаблица
ИЗ
ОбработанныеСообщения КАК ОбработанныеСообщения
ИНДЕКСИРОВАТЬ ПО
КодУчастника
}
знч КоличествоЗаписей = Запрос.Выполнить() // Количество записей, которые помещены во временную таблицу
Обход результата запроса
Чтобы выполнить запрос, используйте метод Выполнить(). ТипизированныйЗапрос.Выполнить() вернет значение обобщенного типа РезультатЗапроса<тип-строки-результата-запроса>. Этот тип является производным от типа Обходимое<тип-строки-результата-запроса>, поэтому результат запроса сразу же можно использовать в цикле для ... из, создать массив на его основе или использовать иные методы типа Обходимое (например — Обходимое.Единственный()).
Пример использования результат запроса в цикле для ... из:
// Задать текст запроса.
знч Запрос = Запрос{
ВЫБРАТЬ
КодУчастника,
ИмяПроцесса
ИЗ
ОбработанныеСообщения
}
// Обойти результат запроса и обработать его.
для СтрокаРезультата из Запрос.Выполнить()
пер КодУчастника = СтрокаРезультата.КодУчастника
пер ИмяПроцесса = СтрокаРезультата.ИмяПроцесса
;
// Получить единственную запись
знч ЕдинственнаяСтрока = Запрос.Выполнить().Единственный()
В этом цикле «1С:Шина» будет выдавать строки запроса в порядке получения их из базы данных, то есть в том порядке, который указан в тексте запроса. Переменная СтрокаРезультата будет иметь тип тип-строки-результата-запроса.
Пример создания массива на основе результата запроса:
// Задать текст запроса.
знч Запрос = Запрос{
ВЫБРАТЬ
КодУчастника,
ИмяПроцесса
ПОРОДИТЬ
Сообщения
ИЗ
ОбработанныеСообщения}
// Создание массива на основе результата запроса.
знч Результат = новый ЧитаемыйМассив(Запрос.Выполнить())
Явное указание имени типа строки
Если вы хотите обрабатывать результат типизированного запроса в другом методе, то вам понадобится заранее знать тип строки результата запроса, чтобы написать вызов другого метода. Однако по умолчанию у тип-строки-результата-запроса нет имени.
ДругойМетод(РезультатЗапроса<тип-строки-результата-запроса>)
Чтобы выйти из этой ситуации, можно явно задать имя типа строки результата запроса. Используйте для этого синтаксис ПОРОДИТЬ, в котором укажите нужное имя.
Вы также можете использовать существующий тип в качестве типа строки результата запроса. Для этого в запросе укажите предложение ЗАПОЛНИТЬ (подробнее).
метод СоздатьЗапрос()
// Задать текст запроса.
знч Запрос = Запрос{
ВЫБРАТЬ
КодУчастника,
ИмяПроцесса
ПОРОДИТЬ
НовыеСообщения
ИЗ
ОбработанныеСообщения
}
// Передать результат запроса в другой метод.
ДругойМетод(Запрос.Выполнить())
;
метод ДругойМетод(РезультатЗапроса: РезультатЗапроса<НовыеСообщения>)
;
В этом примере явно задается имя типа строки результата запроса — НовыеСообщения. И это же имя типа используется для параметризации обобщенн ого типа в параметре метода ДругойМетод().
Результирующее имя типа формируется как имя типа, владеющего модулем (в котором написан литерал запроса, в данном случае — Приложение) и, через точку, имя типа строки результата, указанное в запросе (Приложение.НовыеСообщения). В рамках того же модуля, в котором написан запрос, можно обращаться к типу по локальному имени — без имени типа, владеющего модулем (НовыеСообщения).
Порожденный литералом запроса тип доступен на клиенте, и значения такого типа можно передавать между клиентом и сервером.
Параметры запроса
Параметры в литерал запроса передаются с помощью символа %:
- либо
%имя-переменной - либо
%{выражение}
где выражение — это выражение языка «1С:Элемент». При этом, значения одинаковых выражений вычисляются только один раз, а не на каждое вхождение выражения в литерал.
Например, можно передать параметр ИмяПроцесса.
// Установить значения параметров запроса.
знч ИмяПроцесса = "Обмен"
// Задать текст запроса.
знч Запрос = Запрос{ВЫБРАТЬ
ОбработанныеСообщения.КодУчастника как КодУчастника,
ОбработанныеСообщения.ИмяПроцесса как ИмяПроцесса
ИЗ
ОбработанныеСообщения как ОбработанныеСообщения
ГДЕ
ОбработанныеСообщения.ИмяПроцесса == %ИмяПроцесса}
Параметры, встраиваемые в литерал, вычисляются в момент инициализации литерала, не в момент выполнения запроса.
Временные таблицы
Использование временных таблиц в запросах с литералами имеет свои особенности. Общие, для литералов и произвольных запросов, принципы работы с временными таблицами отражены здесь.
У временной таблицы, созданной в литерале запроса, есть краткое имя и полное имя. Краткое имя это собственное имя таблицы, указанное при ее создании. Полное имя — это краткое имя, к которому добавлено имя типа, владеющего модулем.
Например, если таблица Сообщения создана в модуле записи регистра сведений ОбработанныеСообщения, то у нее будут следующие имена:
Сообщения,ОбработанныеСообщения.Запись.Сообщения.
В рамках одного модуля все имена временных таблиц должны быть уникальными. В то же время, временные таблицы, содержащиеся в разных модулях, могут иметь одинаковые имена.