Основные объекты: Запросы. Часть 2. Работа с Конструктором запросов

Программа 1С включает в себя мощный инструмент для помощи программисту и пользователю в формировании запросов – Конструктор запросов. В данном разделе мы посмотрим, как работает этот инструмент, а также создадим и исследуем несколько несложных запросов.

Для изучения возможностей Конструктора запросов создадим новый объект типа Отчет (заодно сможем познакомиться с объектами Отчет, которые функционально аналогичны рассмотренным нами ранее объектам Обработка).

Создадим объект Отчет с именем “НашПервыйЗапрос”:

Далее перейдем на закладку “Формы” и создадим форму отчета:

Форма будет включать в себя две панели (страницы): “Основная” и “Параметры”.

Напомним, что для создания первой панели (страницы) можно использовать кнопку “Панель” () (эта кнопка находится на панели “Элементы управления” в нижней части экрана). Вторую страницу можно создать с помощью опции контекстного меню “Добавить страницу” (контекстное меню вызывается с помощью правой кнопки мыши):

В свойствах панели укажем новые имена и заголовки панелей: “Основная” и “Параметры”.

На первую вкладку “Основная” разместим поле текстового документа “ТекстЗапроса” и табличное поле “РезультатЗапроса”. Вторая вкладка (“Параметры”) пока остается пустой.

Примечание: Поле текстового документа по умолчанию не отражается на панели “Элементы управления” в правой нижней части экрана. Его можно добавить на панель “Элементы управления” с помощью опции “Добавить или удалить кнопки”:

У поля текстового документа в свойстве “Расширение” установим значение “Язык запросов”:

Установка данного свойства позволит вызвать в пользовательском режиме 1С Конструктор запросов и выполнить запрос.

У табличного поля “РезультатЗапроса” необходимо определить тип значения “Таблица значений”:

Далее перейдем в пользовательский режим 1С и откроем созданный нами отчет “Наш первый запрос”. Чтобы открыть Конструктор запросов, нужно щелкнуть правой кнопкой мыши в области поля текстового документа и в открывшемся контекстном меню выбрать опцию Конструктор запросов:

На экране откроется Конструктор запросов:

Вначале выполним простой пример: нужно составить запрос, позволяющий выбрать коды и наименования номенклатуры из справочника “Номенклатура”.

Выбираем таблицу – источник данных. Нетрудно понять, что такой таблицей в нашем случае будет справочник “Номенклатура”. На закладке “Таблицы и поля” Конструктора запросов в колонке “База данных” раскроем строку “Справочники”, в раскрывшемся перечне выберем строку “Номенклатура” и двойным щелчком мыши или с помощью кнопки перенесем эту строку в колонку “Таблицы”:

Далее выполним аналогичные действия для задания полей запроса. В колонке “Таблицы” раскроем строку “Номенклатура”, в раскрывшемся перечне выберем строки “Код” и “Наименование” и двойным щелчком мыши или с помощью кнопки перенесем их в колонку “Поля”. Теперь в колонке “Поля” записаны два поля “Номенклатура.Код” и “Номенклатура.Наименование”:

Исходные данные для составления простого запроса введены. Нажав на кнопку “Запрос” мы получим текст запроса:

ВЫБРАТЬ

Номенклатура.Код,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура

Нас пока удовлетворяет сформированный текст запроса. Выполним запрос и посмотрим полученный результат. Для этого в окне “Запрос” нажмем на кнопку “Выполнить запрос” . Мы получили список кодов и наименований товаров вместе с наименованиями групп в порядке возрастания кодов:

Интересно также будет посмотреть все данные таблицы Номенклатура. Это можно будет сделать с помощью следующего запроса:

ВЫБРАТЬ

Номенклатура.Ссылка,
Номенклатура.ПометкаУдаления,
Номенклатура.Предопределенный,
Номенклатура.Родитель,
Номенклатура.ЭтоГруппа,
Номенклатура.Код,
Номенклатура.Наименование,
Номенклатура.Цена,
Номенклатура.ЕдИзмерения,
Номенклатура.Представление
ИЗ
Справочник.Номенклатура КАК Номенклатура

На приведенном выше рисунке, в частности, можно увидеть, что значения параметров Номенклатура.Ссылка и Номенклатура.Представление соответствуют значению параметра Номенклатура.Наименование. В некоторых строках указываются наименования родительского элемента (в основном, это группы, для которых значение параметра Номенклатура.ЭтоГруппа равно “Истина”.

Теперь попробуем отсортировать наименования товаров по алфавиту. Для этого вернемся в Конструкторе запросов к первоначальному запросу и перейдем на закладку “Порядок”. Перенесем из левой в правую часть строку “Наименование” и установим режим сортировки “Возрастание”:

После нажатия на кнопку “Запрос” получим следующий текст запроса:

ВЫБРАТЬ

Номенклатура.Код,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование

Результат выполнения запроса будет следующим:

Если добавить в раздел УПОРЯДОЧИТЬ ПО текста запроса слово ИЕРАРХИЯ, то мы получим следующий результат:

ВЫБРАТЬ

Номенклатура.Код,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование ИЕРАРХИЯ

Товары оказались отсортированными по группам.

Теперь уберем из результата запроса названия групп. Это можно сделать на закладке “Условия” Конструктора запросов. Из левой части окна в правую перенесем в правую параметр ЭтоГруппа и установим условие отбора:
Номенклатура.ЭтоГруппа=Ложь

Обратим внимание, что установлен флажок Произвольное для того, чтобы можно было записать произвольное выражение условия. Если данный флажок снят, то условие будет восприниматься программой, как такое: Номенклатура.ЭтоГруппа = &Ложь (значение &Ложь будет воспринято как параметр).

После нажатия на кнопку “Запрос” мы получим следующее:

ВЫБРАТЬ

Номенклатура.Код,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = Ложь
УПОРЯДОЧИТЬ ПО
Наименование

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

Упражнение: 1. Поэкспериментируйте с другими закладками Конструктора запросов.
2. Составьте запрос, выводящий список всех сотрудников организации (поля отбора: Код, Наименование, Фамилия, Имя, Отчество).
3. Составьте запрос, выводящий перечень всех приходных накладных со следующими данными: Номер, Дата, Поставщик, КонтактноеЛицо, Сотрудник, СуммаДокумента.

Теперь перейдем к более сложной задаче: попробуем получить с помощью Конструктора запросов перечень всех проданных товаров с указанием суммы реализации. Введем в Конструктор запросов следующие данные:

Получим следующий результат:

ВЫБРАТЬ

РасходнаяТовары.Номенклатура,
РасходнаяТовары.Сумма
ИЗ
Документ.Расходная.Товары КАК РасходнаяТовары

Примечание. Обратите внимание, что в столбце “База данных” Конструктора запросов мы должны выбрать таблицу “Товары” документа “Расходная”, а не сам документ “Расходная”. Если мы выберем документ “Расходная” и поля Расходная.Товары.Номенклатура и Расходная.Товары.Сумма

то мы получим следующий некорректный результат:

Сам текст запроса в этом случае будет следующим:

 

ВЫБРАТЬ

Расходная.Товары.(
Номенклатура,
Сумма
)
ИЗ
Документ.Расходная КАК Расходная

Не спасает даже преобразование данного запроса в такую форму:

ВЫБРАТЬ

Расходная.Товары.Номенклатура,
Расходная.Товары.Сумма
ИЗ
Документ.Расходная КАК Расходная

поскольку система 1С, по-видимому, не позволяет использовать в разделе запроса ВЫБРАТЬ параметров с двумя и более точками (уровнями вложенности).

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

Для решения данной задачи может быть использована закладка “Группировка”:

Результат запроса корректен:

ВЫБРАТЬ

РасходнаяТовары.Номенклатура,
СУММА(РасходнаяТовары.Сумма) КАК Сумма
ИЗ
Документ.Расходная.Товары КАК РасходнаяТовары
СГРУППИРОВАТЬ ПО
РасходнаяТовары.Номенклатура

Наконец, выполним еще один пример – на этот раз с объединением нескольких таблиц. Сделаем выборку по покупкам и продажам товаров по всей номенклатуре. Для запроса будут использованы поля таблиц базы данных: справочника “Номенклатура” и документов “Приходная” и “Расходная”.

Для того, чтобы избежать дублирования наименований параметров, переименуем таблицу “Номенклатура” в “Номенклатура1” (Правая кнопка мыши – Переименовать таблицу...):

Выберем три указанные выше таблицы и соответствующие поля из этих таблиц:

После того, как было выбрано более одной таблицы в Конструкторе запросов появляется закладка “Связи”. Заполним ее следующим образом:

Обратим внимание на установленный флажок “Все” около столбца “Таблица 1” (это обеспечивает так называемое левое соединение таблиц, при котором в результат запроса будет включена вся номенклатура). Связь таблиц производится по параметру Номенклатура. Также нужно обратить внимание на то, что в качестве условия связи используется поле Номенклатура1.Ссылка, а не Номенклатура1.Наименование.

Следующая закладка “Группировка”. Группировка производится по полю Номенклатура1.Ссылка, а по полям ПриходнаяТовары.Сумма и РасходнаяТовары.Сумма осуществляется суммирование:

На закладке “Условия” указываем, что из запроса исключаются наименования групп (установлен флажок Произвольное для того, чтобы можно было записать произвольное выражение условия):

На закладке “Объединения/Псевдонимы” указываются названия колонок в результирующей таблице:

На закладке “Порядок” указывается, что сортировка результата запроса производится по полю Номенклатура1.Наименование:

Наконец, на закладке “Итоги” установлен флажок “Общие итоги”, также итоги будут подводиться по полям результирующей таблицы “Покупка” и “Продажа”:

При нажатии на кнопку “Запрос” после небольшого преобразования получится следующий текст:

ВЫБРАТЬ

Номенклатура1.Ссылка КАК Наименование,
СУММА(ПриходнаяТовары.Сумма) КАК Покупка,
СУММА(РасходнаяТовары.Сумма) КАК Продажа
ИЗ
Справочник.Номенклатура КАК Номенклатура1
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Расходная.Товары КАК РасходнаяТовары
ПО Номенклатура1.Ссылка = РасходнаяТовары.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Приходная.Товары КАК ПриходнаяТовары
ПО Номенклатура1.Ссылка = ПриходнаяТовары.Номенклатура
ГДЕ
Номенклатура1.ЭтоГруппа = Ложь
СГРУППИРОВАТЬ ПО
Номенклатура1.Ссылка
УПОРЯДОЧИТЬ ПО
Номенклатура1.Наименование
ИТОГИ
СУММА(Покупка),
СУММА(Продажа)
ПО
ОБЩИЕ

Получаем следующий результат выполнения запроса:

Нажмем на кнопку OK, чтобы сохранить полученный текст запроса в поле текстового документа “ТекстЗапроса”. Закроем Конструктор запросов и снова откроем его. Убедимся, что в Конструкторе запросов все установленные нами ранее параметры восстановились корректно.