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

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

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

В этом случае нам надо сначала создать описание временной таблицы. А затем прописать ее имя на закладке Дополнительно.
То есть получается комбинация двух предудущих методов. Причем знак амперсанта можно также проставить в поле с именем таблицы:
Дополнительные возможности по работе с временными таблицами
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Планируется в 8.3.25
Добавление данных в существующую временную таблицу
Как известно, временная таблица создается при выполнении запроса с помощью предложения ПОМЕСТИТЬ, идущего после перечисления полей в инструкции ВЫБРАТЬ. Имя временной таблицы идет после ПОМЕСТИТЬ, а её структура определяется структурой самого запроса.
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
Справочник.Номенклатура КАК Номенклатура
создаст временную таблицу ВТ_Товары с полями Код и Наименование.
Добавить данные в уже созданную временную таблицу нельзя. Если мы захотим сложить в ВТ_Товары ещё и содержимое справочника Услуги:
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
Справочник.Номенклатура КАК Номенклатура
Услуги.Код КАК Код,
Услуги.Наименование КАК Наименование
Справочник.Услуги КАК Услуги
мы получим ошибку «Временная таблица уже существует».
В версии 8.3.25 появится возможность добавлять данные в уже существующую временную таблицу с помощью предложения ДОБАВИТЬ (ADD):
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
Справочник.Номенклатура КАК Номенклатура
Услуги.Код КАК Код,
Услуги.Наименование КАК Наименование
Справочник.Услуги КАК Услуги
;
Структура запросов, добавляющих данные в существующую временную таблицу (состав колонок и их типы) должны совпадать со структурой временной таблицы, иначе возникнет ошибка «Структура существующей временной таблицы не соответствует структуре добавляемых данных».
Возможность добавлять данные в существующую временную таблицу позволит в ряде сценариев сократить количество «однотипных» временных таблиц в запросе, сделать текст запроса более читаемым, а исполнение запроса – более эффективным.
Создание нескольких индексов для временной таблицы
Для временной таблицы можно будет создавать несколько индексов для ускорения поиска по временной таблице. Для предложения ИНДЕКСИРОВАТЬ ПО будет реализовано расширение НАБОРАМ (SETS):
ИНДЕКСИРОВАТЬ ПО НАБОРАМ ((НаборПолей1)[ ,(НаборПолей2)[,…]])
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
Передать в запрос 1С 8.3 таблицу значений

Большинство разработчиков 1С знают, что выполнение запроса в цикле крайне нежелательно из-за множественных серверных вызовов базы данных. Однако далеко не все из них понимают, как избежать использования этой неоптимальной конструкции. А помочь в этом разработчикам может использование таблиц значений в качестве параметра запроса 1С. Поняв суть этого решения, программист 1С никогда больше не вернется к выполнению запросов в цикле.
Пример передачи таблицы в запрос
Использование таблиц значений в запросе 1С является одним из признаков хорошего тона разработки, поэтому важно понимать его суть. Состоит она в том, что мы формируем ТЗ, передаем ее параметром в наш запрос и помещаем во временную таблицу. Имея в запросе нужные данные, можно будет сделать соединение таблиц в запросе 1С, информация из которых необходима. Такой прием сделает структуру кода более понятной и позволит использовать временную таблицу в нескольких частях запроса.
Получить ТЗ в 1С можно 2 способами:
- Выгрузить в нужный тип данных информацию;
- Программно создать внешнюю таблицу значений и заполнить ее, загрузив данные из файлов или вручную. Учтите, что при создании таблицы значений придется типизировать ее колонки с помощью описания типов.
ТаблицаАвтомобилей = Новый ТаблицаЗначений; ТаблицаАвтомобилей.Колонки.Добавить("Автомобиль", Новый ОписаниеТипов("СправочникСсылка.АвтомобилиКомпании"));
Чтобы поместить описанную таблицу в запрос, придется загрузить ее сначала во временную таблицу, а уже потом соединять с нужными данными. Это правило работы платформы, и если проигнорировать его, то при работе кода 1С выдаст ошибку. Если система сообщает, что данные могут быть выбраны исключительно во временную таблицу, то проверяйте, помещаете ли вы ТЗ в нее.

Чтобы в запросе получилась временная таблица, открыв конструктор запросов, необходимо нажать на специальную кнопку в среднем окне. Нам нужно правильно назвать таблицу и не ошибиться в написании наименования полей. Затем помещаем результат запроса во временную таблицу и во втором запросе из пакета соединяем данные. Этим простым запросом мы добавили таблицу в запрос 1С, состоящую из 1 колонки.

Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Автомобили.Автомобиль |ПОМЕСТИТЬ ВнутренняяТаблицаАвтомобилей |ИЗ | &Автомобили КАК Автомобили |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВнутренняяТаблицаАвтомобилей.Автомобиль, | ЗанятостьАвтомобилей.ДатаДоставки, | ЗанятостьАвтомобилей.Занятость |ИЗ | ВнутренняяТаблицаАвтомобилей КАК ВнутренняяТаблицаАвтомобилей | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗанятостьАвтомобилей КАК ЗанятостьАвтомобилей | ПО ВнутренняяТаблицаАвтомобилей.Автомобиль = ЗанятостьАвтомобилей.Автомобиль"; //Передаем таблицу Запрос.УстановитьПараметр("Автомобили",ТаблицаАвтомобилей); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Обработка данных КонецЦикла;
Несмотря на очевидную пользу и простоту, у этой операции есть и определенные правила работы с ТЗ. Опытным путем установлено, что отладка и тестирование использования подобного приема затруднительна. Посмотреть временную таблицу в запросе возможно лишь с помощью типовых функций, заложенных в общие модули, или в консоли запросов. Вторым же правилом является необходимость типизировать колонки таблицы значений при ее объявлении, что зачастую забывают делать разработчики 1С.
Кроме вышеописанного применения программистам 1С приходится загружать таблицу в запрос 1С в сложных участках кода. Это позволяет не выполнять по нескольку раз 1 запрос – его выходной результат сохраняют в таблицу значений. А уже ее используют во всех следующих запросах в коде.
На многих собеседованиях на должность разработчика 1С в крупных компаниях проверяется именно способность грамотно использовать возможности платформы. И если вы продемонстрируете выполнение кода в цикле, а не передадите таблицу значений в запросе 1С, то это будет грубая ошибка.