1с временная таблица как параметр запроса
Возможно ли установить временную таблицу как параметр к критерию отбора в запросе. если можно то как?
можно.
к примеру
где
реквизит В (выбрать реквизит из ВТ)
или
Внутреннее соединение с ВТ
можно
ВЫБРАТЬ
Магазин
, Номенклатура
ПОМЕСТИТЬ Врем
ИЗ
(
ВЫбрать
&Магазин1 магазин
, &Товар1 Номенклатура
ВЫбрать
&Магазин2 магазин
, &Товар2 Номенклатура
;
///////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЦеныНоменклатурыМагазиновСрезПоследних.Магазин,
ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура,
ЦеныНоменклатурыМагазиновСрезПоследних.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних(&д1, ((Магазин, Номенклатура) в (ВЫБРАТЬ Магазин, Номенклатура ИЗ Врем))) КАК ЦеныНоменклатурыМагазиновСрезПоследних
(2)
(3)
это не критерий,
это жалкий срез последних
ВЫБРАТЬ
бит_стр_ЗаявкаНаМПЗ.Ссылка
ПОМЕСТИТЬ ВТЗаказ
ИЗ
Документ.бит_стр_ЗаявкаНаМПЗ КАК бит_стр_ЗаявкаНаМПЗ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
бит_стр_СвязанныеДокументыУпр.Ссылка(в (Выбрать Ссылка из ВТЗаказ))
ИЗ
КритерийОтбора.бит_стр_СвязанныеДокументыУпр КАК бит_стр_СвязанныеДокументыУпр
вот так работать не хочет
ВЫБРАТЬ
бит_стр_СвязанныеДокументыУпр.Ссылка
ИЗ
КритерийОтбора.бит_стр_СвязанныеДокументыУпр КАК бит_стр_СвязанныеДокументыУпр
ГДЕ
бит_стр_СвязанныеДокументыУпр.Ссылка в (Выбрать Ссылка из ВТЗаказ)
1с временная таблица как параметр запроса
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: пакетные запросы и временные таблицы
Автор уроков и преподаватель школы: Владимир Милькин
- Пакетные запросы
- Временные таблицы
- Пройдите тест
- Домашнее задание
- В заключении модуля
Пакетные запросы
Пусть у нас есть запрос, выбирающий наименования цветов:
ВЫБРАТЬ Наименование КАК Цвет ИЗ Справочник.Цвета
И запрос, выбирающий наименования вкусов:
ВЫБРАТЬ Наименование КАК Вкус ИЗ Справочник.Вкусы
Если нам потребуется получить результат каждого из этих запросов, то мы сначала вставим в консоль первый запрос, выполним его и сохраним результат, а затем проделаем то же самое со вторым запросом.
Вот бы иметь возможность выполнить оба этих запроса последовательно, но в один присест. Так сказать в одном пакете. У платформы есть такая возможность и она называется пакетный запрос.
Чтобы получить пакетный запрос нужно перечислить входящие в него запросы и отделить их друг от друга точкой с запятой.
Таким образом наш пакетный запрос для двух вышеперечисленных запросов будет таким:
ВЫБРАТЬ Наименование КАК Цвет ИЗ Справочник.Цвета ; ВЫБРАТЬ Наименование КАК Вкус ИЗ Справочник.Вкусы
В результате пакетный запрос вернёт нам сразу две таблицы:
Разумеется в пакетный запрос может входить и 3 и 4 и сколько угодно запросов. Главное отделять их друг от друга точкой с запятой.
Временные таблицы
При пакетном исполнении запроса мы можем любой из его промежуточных результатов поместить во временную таблицу, которая создаётся в памяти компьютера на время исполнения запроса. Это делается для того, чтобы мы смогли обратиться к этому результату в ходе исполнения пакетного запроса ниже.
К примеру, давайте поставим себе цель написать пакетный запрос, который первым запросом выбирает все цвета и помещает их во временную таблицу с именем ТАБЛИЦА_ЦВЕТОВ, вторым запросом выбирает все вкусы и помещает их во временную таблицу с именем ТАБЛИЦА_ВКУСОВ, а третьим запросом делает объединение полученных ранее результатов в одну таблицу:
ВЫБРАТЬ Наименование КАК Цвет ПОМЕСТИТЬ ТАБЛИЦА_ЦВЕТОВ ИЗ Справочник.Цвета ; ВЫБРАТЬ Наименование КАК Вкус ПОМЕСТИТЬ ТАБЛИЦА_ВКУСОВ ИЗ Справочник.Вкусы ; ВЫБРАТЬ Цвет КАК Поле ИЗ ТАБЛИЦА_ЦВЕТОВ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Вкус ИЗ ТАБЛИЦА_ВКУСОВ
Обратите внимание на то, что последняя часть пакетного запроса делает выборку из временных таблиц так, словно это реальные таблицы в базе данных.
Временные таблицы вместе с пакетными запросами позволяют писать достаточно сложные запросы, разбивая их на маленькие кусочки.
Не пугайтесь, если применение этих приемов для вас пока не совсем очевидно. Просто имейте в виду такую возможность и однажды (уже на практике) она обязательно вам пригодится.
Временные таблицы в конструкторе запросов
Рассмотрим создание временных таблиц при помощи конструктора запросов. Рассмотрим несколько ситуаций.
Как поместить результат запроса во временную таблицу

Создадим с помощью конструктора вот такой простейший запрос:
Соответственно текст запроса будет выглядеть следующим образом:
ВЫБРАТЬ Товары.Ссылка ИЗ Справочник.Товары КАК Товары
Но мы хотим поместить результат запроса во временную таблицу, которую назовем ВТ_Товары, то есть привести наш запрос вот к такому виду
ВЫБРАТЬ Товары.Ссылка ПОМЕСТИТЬ ВТ_Товары ИЗ Справочник.Товары КАК Товары

Для этого нам необходимо перейти на закладку Дополнительно, установить тип запроса в положение Создание временной таблицы и заполнить поле с именем таблицы
Как прочитать временную таблицу из другого запроса
Очень часто при проектировании запросов большого объема возникает необходимость передавать временные таблицы из одного запроса в другой с использованием объекта МенеджерВременныхТаблиц. То есть вот такая ситуация:
МенеджерВТ Чтобы выбрать данные из временной таблицы, необходимо на закладке Таблицы и поля нажать на кнопку Создать описание временной таблицы и в открывшейся форме заполнить наименование таблицы и ее поля:
Как создать временную таблицу из параметра запроса
А теперь представим, что мы хотим выбрать данные во временную таблицу без использования менеджера временных таблиц — из внешнего источника данных, например, из таблицы значений. Такая ситуация уже рассматривалась ранее в статье о том как правильно поместить таблицу значений во временную. Применительно к текущей статье текст запроса выглядит вот так:
ВЫБРАТЬ ТаблицаЗначений.Ссылка ПОМЕСТИТЬ ВТ_Товары ИЗ &ТаблицаЗначений КАК ТаблицаЗначений

В этом случае нам надо сначала создать описание временной таблицы. А затем прописать ее имя на закладке Дополнительно.
То есть получается комбинация двух предудущих методов. Причем знак амперсанта можно также проставить в поле с именем таблицы:
Таблица как параметр запроса
На днях столкнулся с ситуацией, когда стало необходимо передать в запрос в качестве параметра таблицу и делать из нее выборку. На просторах Гугла нашлось много подобных вопросов, но среди них было в основном указано, что, мол да, можно туда закинуть.. Что все это со временными таблицами.. Но так и не попалось конкретное объяснение, как получить требуемый результат. Т.к. при обычном запросе, пусть платформа и перестала ругаться на ошибки, но то, что возвращал запрос, было совсем не тем, чего хотелось.
Допустим, у нас есть переменная ДокБон хранящая Таблицу значений, и по каким-либо причинам есть необходимость передать ее в запрос, а после обработки получить результат в таблице Отбор .
//Передаем данные из ДокБон во временную таблицу Запрос = Новый Запрос; Запрос.Текст color: #006600;">ВТТаб1 ИЗ &ДБ как ДокБон"; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("ДБ", ДокБон); Запрос.Выполнить();
Данным шагом, в виртуальную таблицу ВТТаб1 мы передали все данные из нашей таблицы ДокБон. В случае, если необходимы конкретные поля, делаем как обычно:
Запрос.Текст = » ВЫБРАТЬ ДокБон.Поле1, ДокБон.Поле2 ПОМЕСТИТЬ ВТТаб1 ИЗ &ДБ как ДокБон«;
При этом рекомендуется указывать именно ДокБон.Поле1, а не Поле1. Т.к. в последнем случае программа часто сбивается.
Вот дальше-то и крылась загвоздка: казалось бы можно прямо в этом запросе установить параметры отбора и выгрузить в таблицу Отбор: Отбор=Запрос.Выполнить().Выгрузить(); Такой шаг ОШИБОЧЕН, и ожидаемого результата не принесет!
//Забираем данные из Временной таблицы Запрос2 = Новый Запрос; Запрос2.Текст = " ВЫБРАТЬ * ИЗ ВТТаб1 ГДЕ ВТТаб1.Поле1=& Перем1 И ВТТаб1.Поле2=&Перем2"; Запрос2.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц; Запрос2.УстановитьПараметр("Перем1",Перем1); Запрос2.УстановитьПараметр("Перем2",Перем2);
И только после выборки по параметрам из созданной нами ранее временной таблицы мы получаем необходимый нам результат.
Отбор = Запрос2.Выполнить().Выгрузить();
Далее с таблице Отбор можно работать как и с любой другой, и она будет содержать именно те значения, которые мы определим в тексте запроса.
