рубрики: Конструктор запросов | Дата: 11 ноября, 2017
В цикле статей о языке запросов 1С было рассмотрено как создавать вложенные запросы. Сегодня поговорим о том как делать вложенные запросы с использованием конструктора запросов. Перейдем сразу к примеру.
Допустим у нас есть вот такой простейший периодический регистр сведений, где хранятся цены в разрезе товаров и поставщиков:
Мы хотим запросом получить все товары у которых количество поставщиков больше одного. Это можно реализовать с помощью вот такого запроса:
ВЫБРАТЬ
КоличествоПоставщиков.Товар КАК Товар
ИЗ
(ВЫБРАТЬ
Цена.Товар КАК Товар,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Цена.Поставщик) КАК Поставщики
ИЗ
РегистрСведений.Цена КАК Цена
СГРУППИРОВАТЬ ПО
Цена.Товар) КАК КоличествоПоставщиков
ГДЕ
КоличествоПоставщиков.Поставщики > 1
Сформируем вышеприведенный запрос с помощью конструктора.
Для этого в командной панели над полем Таблицы нажимаем кнопку Создать вложенный запрос:
После чего у нас откроется окно с еще одним экземпляром конструктора запросов:
И в этом новом окне конструируем вложенный запрос:
Нажав на кнопку Запрос в нижнем левом углу мы можем посмотреть текст вложенного запроса:
После нажатия на кнопку ОК во вспомогательном конструкторе, получаем в основном окне следующую картину:
Поскольку словосочетание ВложенныйЗапрос не очень удобно для восприятия, давайте с помощью клика правой кнопкой мыши переименуем таблицу в КоличествоПоставщиков, выберем из нее поле Товар и на закладке Условия пропишем нужное условие:
И после всех этих манипуляций мы и получаем нужный запрос. При необходимости можно создавать запросы с несколькими уровнями вложенности.
Очень часто возникает ситуация, когда начинаешь делать запрос в конструкторе и в какой то момент понимаешь, что он должен быть вложенным. Конечно в нашем примере никакой проблемы нет — можно просто все удалить и накидать запрос заново. Но на практике встречаются гораздо более сложные примеры, например, с несколькими уровнями вложенности, когда на то чтобы сделать запрос было потрачено несколько часов. И в этом случае есть достаточно простой выход. Можно воспользоваться встроенным в конструктор текстовым редактором запросов. Надо с помощью кнопки Запрос получить текст запроса (см. картинку выше) и скопировать его в буфер. Далее создаем новый вложенный запрос опять нажимаем кнопку Запрос, вставляем текст из буфера, жмем ОК. Соответственно старый запрос на верхнем уровне зачищаем. Таким образом мы при необходимости можем легко на лету создавать многоуровневые вложенные запросы.
Должно быть без РАЗЛИЧНЫЕ
ВЫБРАТЬ
КоличествоПоставщиков.Товар КАК Товар
ИЗ
(ВЫБРАТЬ
Цена.Товар КАК Товар,
КОЛИЧЕСТВО(Цена.Поставщик) КАК Поставщики
ИЗ
РегистрСведений.Цена КАК Цена
СГРУППИРОВАТЬ ПО
Цена.Товар) КАК КоличествоПоставщиков
ГДЕ
КоличествоПоставщиков.Поставщики
Это справедливо, если регистр сведений непериодический. В этом случае мы не сможем несколько раз добавить записи с одинаковым набором измерений (товар + поставщик). Я отдельно не оговаривал, что у меня регистр периодический (сейчас добавлю). А для периодического регистра сведений «РАЗЛИЧНЫЕ» будет необходимо.
При добавлении «Различные» запрос выдаст пустой результат с таким параметром.
Цитата из статьи: «Мы хотим запросом получить все товары у которых количество поставщиков больше одного».
Если у вас для одного товара всегда один и тот же поставщик, то да выдаст пустой результат. Так и задумывалось.
Проверяется легко в консоли:
ВЫБРАТЬ
«Ручка» КАК Товар,
«ООО Ручки» КАК Поставщик
ПОМЕСТИТЬ ВТ_Цена
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«Ручка»,
«ООО Канцтовары»
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КоличествоПоставщиков.Товар КАК Товар
ИЗ
(ВЫБРАТЬ
Цена.Товар КАК Товар,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Цена.Поставщик) КАК Поставщики
ИЗ
ВТ_Цена КАК Цена
СГРУППИРОВАТЬ ПО
Цена.Товар) КАК КоличествоПоставщиков
ГДЕ
КоличествоПоставщиков.Поставщики > 1