Как передать значение поля запроса, как параметр во вложенный запрос?
Всем привет! Не смог найти на форуме и КБ.
Есть запрос к регистру сведений:
ВЫБРАТЬ
РаботникиОрганизацийСрезПоследних.Период КАК Период,
РаботникиОрганизацийСрезПоследних.ГрафикРаботы КАК ГрафикРаботы,
РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния КАК ПричинаИзмененияСостояния,
РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник
ИЗ
РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаКалендаря, ) КАК РаботникиОрганизацийСрезПоследних
ГДЕ
РаботникиОрганизацийСрезПоследних.Сотрудник = &Сотрудник
Нужно мне сделать его вложенным в другой запрос. В другом запросе есть поле «ДатаКалендаря».
Вопрос: как передать значение данного поля во вложенный запрос?
Да и. может будет другой вариант для цели: получить данные с Дата1 по Дата2 день из «Среза»?
как параметр к виртуальной таблице никак. соединятся надо причем пару раз к самой таблицы рс. один раз найти все максимальные на даты записи не превыщающие поле дата календаря из «другого запроса». второй раз снять по этим датам данные )
на второй вопрос сегодня отвечали )
Книга знаний: Срез последних на каждую дату в запросе
почитал я данную статью, но не могу понять.
попробовал сделать, но на выходе получаются записи с теми датами, когда было движение. А мне нужно получить данные по состоянию на каждый день (нужного мне периода) не зависимо от того были движения или нет.
Как я понял в статье запрос делается не из срезов.
Вот мой запрос:
ИЗ
или статья не применима к данной проблеме.
Может тогда срез через цикл сделать?
Ошибка во втором левом соединении:
Нужно
(6) Вот спасибо! Вроде получилось. теперь ЗУПу кранты!
(1) извините, самому потом смешно было))))
Вложенные запросы в 1С 8.3. Оператор В
Вложенные запросы
Язык запросов 1С поддерживает вложенные запросы. Вложенный запрос — это когда выборка выполняется не из таблицы, а из результата другого запроса, например:
Сначала во вложенном запросе свернули таблицу по цвету, а потом из результата выбрали все поля.
Во вложенном запросе нельзя использовать итоги, потому что итоги рассчитываются сервером 1С, а не СУБД. Также во вложенном запросе нельзя использовать предложение УПОРЯДОЧИТЬ ПО, кроме случаев когда используется ключевое слово ПЕРВЫЕ:
Количество вложенности запросов не ограничено.
Оператор В
Допустим, нам нужно выбрать все камеры хранения, где площадь равна 100 или 200. Для этого можно использовать следующий запрос:
Оператор В позволяет сократить текст запроса и сделать его более понятным для чтения:
После оператора В в скобках перечисляются все возможные значения. Это может быть одно значение, десять или любое другое количество.
Также параметром можно передать массив или список значений:
Можно указать вложенный запрос:
Данный запрос выберет те камеры хранения, где площадь равна максимальной среди всех камер.
Можно использовать несколько полей:
Количество полей слева от оператора В и в результате вложенного запроса должно совпадать, иначе будет ошибка «В запросах операции «В» должно выбираться столько полей, сколько операндов имеет левая часть операции.».
Также важна последовательность. В запросе выше поле Спр.Площадь сравнивается с первым полем вложенного запроса, а Спр.Цвет со вторым.
Из вложенного запроса можно обращаться к полям внешнего запроса:
Запросы. Как передать параметр во вложенный запрос?
Есть вложенный запрос, работает крайне медленно. Надеюсь ускорить, если можно передать параметр из запроса во вложенный запрос.
ВЫБРАТЬ ПЕРВЫЕ 100
РМС_СтатусыСтрок.ID КАК ID,
РМС_СтатусыСтрок.Статус,
РМС_СтатусыСтрок.Номенклатура.РМС_Производитель,
РМС_СтатусыСтрок.Номенклатура.Артикул,
РМС_СтатусыСтрок.КоличествоОстаток,
РМС_СтатусыСтрок.ЗаказПокупателя.Номер,
РМС_СтатусыСтрок.ЗаказПокупателя.Дата,
РМС_СтатусыСтрок.ЗаказПокупателя.Контрагент.Код,
РМС_СтатусыСтрок.Цена,
РМС_СтатусыСтрок.ЗаказПоставщику.Номер,
РМС_СтатусыСтрок.ЗаказПоставщику.Дата,
РМС_СтатусыСтрок.ЗаказПоставщику.Контрагент.РМС_КодВеб,
РМС_СтатусыСтрок.ЦенаЗаказПоставщику
ИЗ
РегистрНакопления.РМС_СтатусыСтрок.Остатки(&КонДата, ) КАК РМС_СтатусыСтрок
ЛЕВОЕ СОЕДИНЕНИЕ
(
ВЫБРАТЬ
НевозможныйПоследний.ID КАК ИД,
МАКСИМУМ(НевозможныйПоследний.Регистратор.Дата),
СУММА(НевозможныйПоследний.Количество) КАК Количество
ИЗ
РегистрНакопления.РМС_СтатусыСтрок КАК НевозможныйПоследний
ГДЕ
НевозможныйПоследний.Статус = &ЗаказНевозможен
И НевозможныйПоследний.ID = &ИД /////вот тут надо как то иначе написать
СГРУППИРОВАТЬ ПО
НевозможныйПоследний.ID
) КАК ВложенныйЗапросБеклоги
ПО ВложенныйЗапросБеклоги.ИД = РМС_СтатусыСтрок.ID
И НевозможныйПоследний.ID = &ИД
И передал ИД, но это не решение вовсе. ИД должен не из формы браться, а из запроса, т.е. &ИД должно быть несколько, а не один 🙂
Прошу подскажите как 🙂
И НевозможныйПоследний.ID В (ВЫБРАТЬ. и далее текст запроса)
ВЫБРАТЬ
ПартииТоваровНаСкладахОстатки.Номенклатура,
ПартииТоваровНаСкладахОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
(5) Это всё равно слишком медленно будет. Вложенный вопрос будет собирать данные по нескольким сотням тысяч идентификаторов. Хотя хотелось бы чтобы собирал по одному только.
Должен быть другой способ. Надо способ передать параметр.
Вложенные запросы
Вложенные запросы
Вложенным называется запрос, который является источником выборки основного запроса. Допускается произвольная вложенность таких запросов.
Синтаксис вложенного запроса:
ВЫБРАТЬ * из (ВЫБРАТЬ 1) КАК ВложенныйЗапрос
ВЫБРАТЬ * ИЗ Справочник.Контрагенты ГДЕ Ссылка В (ВЫБРАТЬсколько с Ссылка ИЗ Справочник.Контрагенты)
ВЫБРАТЬ * ИЗ Справочник.Контрагенты ГДЕ (Ссылка,Наименование) В (ВЫБРАТЬ Ссылка,Наименование ИЗ Справочник.Контрагенты)
В конструкторе вложенный запрос создается на основной вкладке по специальной кнопке:
Иконка у таблицы вложенного запроса отличается от других таблиц:
Прочие сведения о вложенных запросах
Считается, что вложенные запросы менее оптимизированы на скорость, но с появлением платформы 8.3 данный фактор справедлив только для Postgres SQL (возможно особенность конкретной сборки).
В целом, в большинстве случаев, запросы можно переписать на использование временных таблиц, но не для запроса динамического списка управляемого интерфейса (там это запрещено на уровне платформы). Вложенный запрос же использовать в нем допустимо, если он не вызывает дублей ключевых полей (Ссылка).
Если вложенный запрос основной, то основная таблица динамического списка будет пустой, что отключит событийные команды такого списка.
(для примера выше, нельзя будет добавить новый элемент или группу).
Допускается вложенный запрос и при соединениях таблиц.
Например:
ВЫБРАТЬ * ИЗ Справочник.Контрагенты КАК Основная ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ Справочник.Контрагенты ) КАК Вложенный ПО Основная.Ссылка = Вложенный.Ссылка
Примеры выше подобраны в учебных целях: максимально простого синтаксиса, а не для решения какой-либо задачи.
Зачем может потребоваться вложенный запрос в приоритетном порядке:
В случае использования результата агрегатной функции в качестве условия соединения таблиц:
ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта В(ВЫБРАТЬ ссылка из Справочник.Валюты. ГДЕ Наименование = «Рубль»))
ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Наименование = «Рубль»)
Мода имеет такое же отношение к оригинальности, как любая другая реклама к товару.
Вложенные запросы в 1С Предприятие 8.3
Зачастую нужно заранее сделать выборку из базы данных по некоему условию. Для этого в 1С 8.3 необходимо использовать вложенные запросы.
Но следует учитывать, что в большинстве случаев вложенные запросы в 1С бесполезны без соединения их результата с другими таблицами. Такое соединение практически в любом случае приведет к сильному замедлению выполнения запроса в целом.
Пример вложенного запроса на языке запросов
Приведу пример вложенного запроса на языке запросов 1С. Допустим, нам нужно сделать выборку суммы некоторого остатка по отдельным клиентам на определенную дату:
ВЫБРАТЬ
НераспОплатыОстатки.Заказчик,
НераспОплатыОстатки.СуммаОст
ИЗ
(ВЫБРАТЬ
Заказчики.Ссылка КАК СсылкаНаСпрЗаказчики
ИЗ
Справочник.Заказчики КАК Заказчики
ГДЕ
Заказчики.Ссылка В(&Заказчики)) КАК ВложЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. НераспОплаты.Остатки КАК НераспОплаты
ПО ВложЗапрос.СсылкаНаСпрЗаказчики = НераспОплатыОстатки.Заказчик
Когда СУБД будет выполнять такой запрос, не исключены неверные действия оптимизатора, так как трудно определиться с планом обработки запроса. Когда СУБД соединяет две таблицы, оптимизатор строит алгоритм на основе вычисления количества записей в этих таблицах.
Когда же используется вложенный запрос, вычислить количество записей, вернувшихся из вложенного запроса, очень трудно.
Как лучше?
Именно поэтому фирма 1С крайне не рекомендует использовать вложенные запросы, а вместо них разработала временные таблицы. С использованием временных таблиц наш предыдущий запрос будет выглядеть так:
// Временная таблица
ВЫБРАТЬ
Заказчики.Ссылка КАК Заказчики
ПОМЕСТИТЬ табЗаказчики
ИЗ
Справочник.Заказчики КАК Заказчики
ГДЕ Заказчики.Ссылка В (&Заказчики)
;
// Основной запрос
ВЫБРАТЬ
табКлиенты.Ссылка,
НераспОплатыОстатки.СуммаОст,
ИЗ
табЗаказчики КАК табЗаказчики
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НераспОплаты.Остатки(
,
Заказчик В
(ВЫБРАТЬ
табЗаказчики.Заказчики
ИЗ
табЗаказчики)) КАК НераспОплатыОстатки
ПО табЗаказчики.Заказчики = НераспОплатыОстатки.Заказчики
Смотрите также видео-урок про вложенные запросы:
Теперь оптимизатор знает заранее, сколько записей во временной таблице, и без труда оптимизирует алгоритм выполнения соединения таблиц.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.


