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