Перейти к содержимому

1с запрос временная таблица как параметр

  • автор:

1с запрос временная таблица как параметр

Возможно ли установить временную таблицу как параметр к критерию отбора в запросе. если можно то как?

можно.
к примеру
где
реквизит В (выбрать реквизит из ВТ)

или
Внутреннее соединение с ВТ

можно

ВЫБРАТЬ
Магазин
, Номенклатура
ПОМЕСТИТЬ Врем
ИЗ
(
ВЫбрать
&Магазин1 магазин
, &Товар1 Номенклатура

ВЫбрать
&Магазин2 магазин
, &Товар2 Номенклатура

;
///////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЦеныНоменклатурыМагазиновСрезПоследних.Магазин,
ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура,
ЦеныНоменклатурыМагазиновСрезПоследних.Цена
ИЗ
РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних(&д1, ((Магазин, Номенклатура) в (ВЫБРАТЬ Магазин, Номенклатура ИЗ Врем))) КАК ЦеныНоменклатурыМагазиновСрезПоследних

(2)
(3)
это не критерий,
это жалкий срез последних

ВЫБРАТЬ
бит_стр_ЗаявкаНаМПЗ.Ссылка
ПОМЕСТИТЬ ВТЗаказ
ИЗ
Документ.бит_стр_ЗаявкаНаМПЗ КАК бит_стр_ЗаявкаНаМПЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
бит_стр_СвязанныеДокументыУпр.Ссылка(в (Выбрать Ссылка из ВТЗаказ))
ИЗ
КритерийОтбора.бит_стр_СвязанныеДокументыУпр КАК бит_стр_СвязанныеДокументыУпр

вот так работать не хочет

ВЫБРАТЬ
бит_стр_СвязанныеДокументыУпр.Ссылка
ИЗ
КритерийОтбора.бит_стр_СвязанныеДокументыУпр КАК бит_стр_СвязанныеДокументыУпр
ГДЕ
бит_стр_СвязанныеДокументыУпр.Ссылка в (Выбрать Ссылка из ВТЗаказ)

Обращения к виртуальным таблицам

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. При использовании виртуальных таблиц в запросах, следует передавать в параметры таблиц все условия, относящиеся к данной виртуальной таблице. Не рекомендуется обращаться к виртуальным таблицам при помощи условий в секции ГДЕ и т.п.

Такой запрос будет возвращать правильный (с точки зрения функциональности) результат, но СУБД будет намного сложнее выбрать оптимальный план для его выполнения. В некоторых случаях это может привести к ошибкам оптимизатора СУБД и значительному замедлению работы запроса.

Например, следующий запрос использует секцию ГДЕ запроса для выборки из виртуальной таблицы:

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

Рекомендуется ограничивать количество выбираемых записей на самом раннем этапе обработки запроса. Для этого следует передать условия в параметры виртуальной таблицы.

2.1. При обращении к виртуальной таблице следует передавать в условия наиболее простые конструкции, например, «Измерение = Значение». Не рекомендуется использовать подзапросы и соединения(*) в параметрах виртуальной таблицы, так как это приводит к медленной работе запроса.

* Примечание: как явные соединения в подзапросах, так и неявные – при обращении к полям «через точку» от ссылки и соединения, добавляемые из ограничений доступа к данным (RLS), предусмотренных в ролях конфигурации.

2.2. При необходимости использовать подзапросы рекомендуется соблюдать следующие условия:

в подзапросе только одна таблица, нет соединений с другими таблицами;

если в подзапросе таблица табличной части (например, Документ.Накладная.СписокТоваров ), то не должно быть обращения к реквизитам таблицы-шапки ( Накладная.Проведен );

если в подзапросе таблица, у которой могут быть табличные части (например, Документ.Накладная ), то не должно быть обращений к табличным частям (например, ГДЕ Документ.Накладная.СписокТоваров.Номенклатура = «1» );

если в подзапросе временная таблица, то не должно быть условий (раздела ГДЕ );

если в подзапросе постоянная таблица, то условие (раздел ГДЕ ) допустимо, только если условие выполняется для 80% (или более) случаев; отсутствие условия означает выполнение для 100% случаев.

если в подзапросе постоянная таблица, то в ограничениях доступа к данным (RLS) не должно содержатся подзапросов и соединений (допускаются только простые условия вида ГДЕ Реквизит = Значение , «ГДЕ Истина» ). Например, при использовании стандартных шаблонов RLS, входящих в состав подсистемы «Управление доступом» Библиотеки стандартных подсистем к запросу неявно добавляется конструкция Exists с несколькими подзапросами и соединениями. В таких случаях следует переписать исходный запрос с использованием временной таблицы или привилегированного режима.

. ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(
&ДатаОтгрузки,
&ОтображениеРаспоряжений
И ДокументОтгрузки.Склад = &Склад — неявное соединение «через точку»
ИЛИ ДокументОтгрузки В
(ВЫБРАТЬ — подзапрос с соединением
Распоряжения.Распоряжение КАК ДокументОтгрузки
ИЗ
Документ.ЗаданиеНаПеревозку.Распоряжения КАК Распоряжения –- доступ к этому документу ограничен по сложному RLS, который неявно добавляет еще пару соединений
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаПеревозку.СкладыПогрузки КАК СкладыПогрузки
ПО
Распоряжения.Ссылка = СкладыПогрузки.Ссылка
И СкладыПогрузки.Склад = &Склад
И Распоряжения.Ссылка.Проведен –- здесь и ниже обращения к реквизитам шапки
И Распоряжения.Ссылка.Статус В (. )))

. ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(
&ДатаОтгрузки,
Склад = &Склад — теперь это реквизит регистра
ИЛИ ДокументОтгрузки В
(ВЫБРАТЬ
ЗаданияНаПеревозку.Распоряжение
ИЗ
ВременнаяТаблицаЗаданийНаПеревозку КАК ЗаданияНаПеревозку)) — выборка из временной таблицы без условий

2.3. В случае, если нужно использовать несколько условий с подзапросами, следует выбрать одно, удовлетворяющее условиям выше и отфильтровывающее максимальное количество записей. Остальные условия следует накладывать на внешний запрос.

Кроме того, в ряде случаев можно обойтись и без перемещения условий на внешний запрос, если применять временные таблицы.
Например, вместо условия (неправильно):

Номенклатура В (. ) И Характеристика В (. ) И Серия В(. )

(Номенклатура, Характеристика, Серия) В (ВЫБРАТЬ Номенклатура, Характеристика, Серия ИЗ ВременнаяТаблицаТоваров)

1с запрос временная таблица как параметр

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: пакетные запросы и временные таблицы

Автор уроков и преподаватель школы: Владимир Милькин

  • Пакетные запросы
  • Временные таблицы
  • Пройдите тест
  • Домашнее задание
  • В заключении модуля

Пакетные запросы

Пусть у нас есть запрос, выбирающий наименования цветов:

ВЫБРАТЬ Наименование КАК Цвет ИЗ Справочник.Цвета

И запрос, выбирающий наименования вкусов:

ВЫБРАТЬ Наименование КАК Вкус ИЗ Справочник.Вкусы

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

Вот бы иметь возможность выполнить оба этих запроса последовательно, но в один присест. Так сказать в одном пакете. У платформы есть такая возможность и она называется пакетный запрос.

Чтобы получить пакетный запрос нужно перечислить входящие в него запросы и отделить их друг от друга точкой с запятой.

Таким образом наш пакетный запрос для двух вышеперечисленных запросов будет таким:

ВЫБРАТЬ Наименование КАК Цвет ИЗ Справочник.Цвета ; ВЫБРАТЬ Наименование КАК Вкус ИЗ Справочник.Вкусы

В результате пакетный запрос вернёт нам сразу две таблицы:

01

Разумеется в пакетный запрос может входить и 3 и 4 и сколько угодно запросов. Главное отделять их друг от друга точкой с запятой.

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

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

К примеру, давайте поставим себе цель написать пакетный запрос, который первым запросом выбирает все цвета и помещает их во временную таблицу с именем ТАБЛИЦА_ЦВЕТОВ, вторым запросом выбирает все вкусы и помещает их во временную таблицу с именем ТАБЛИЦА_ВКУСОВ, а третьим запросом делает объединение полученных ранее результатов в одну таблицу:

ВЫБРАТЬ Наименование КАК Цвет ПОМЕСТИТЬ ТАБЛИЦА_ЦВЕТОВ ИЗ Справочник.Цвета ; ВЫБРАТЬ Наименование КАК Вкус ПОМЕСТИТЬ ТАБЛИЦА_ВКУСОВ ИЗ Справочник.Вкусы ; ВЫБРАТЬ Цвет КАК Поле ИЗ ТАБЛИЦА_ЦВЕТОВ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Вкус ИЗ ТАБЛИЦА_ВКУСОВ

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

Временные таблицы вместе с пакетными запросами позволяют писать достаточно сложные запросы, разбивая их на маленькие кусочки.

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

Как в запросе, в качестве источника данных, использовать таблицу значений?

Если при использовании в запросе таблицы значений, возникает ошибка: «Тип не может быть выбран в запросе», то нужно явно указать Тип значения колонок ТЗ!
Т.е. если мы используем таблицу значений, так же в свою очередь выгруженную из результата запроса или из табличной части документа например — то такой проблемы не возникает, т.к. в таком случае колонки будут типизированными. А если мы сами создаем таблицу значений, то нужно явно указать тип для каждой колонки:
Код 1C v 8.х

 ТЗ = Новый ТаблицаЗначений; 
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

Аренда 1С в облаке

Запрос к Таблице Значений

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *