Левое соединение в конструкторе запросов

Обновлено: 02.05.2024

Конструктор запросов в 1С 8.3 и 8.2 — мощнейший инструмент разработки. Он позволяет составить текст запроса при помощи специальной визуальной среды. Таким образом, чтобы создать запрос 1с не обязательно знать встроенный язык запросов, достаточно ориентироваться в не сложном и интуитивно понятном интерфейсе конструктора.

Конструктор запросов представляет из себя набор вкладок, каждая из которых отвечает за свою часть запроса. Так заполняя вкладку Таблицы и поля мы выбираем таблицы из которых запрос 1с будет получать данные и поля этих таблиц необходимые для решения конкретной задачи. Заполняя в кладку Условия мы накладываем условия на выбранные таблицы, для того чтобы выбрать из них только нужные нам данные и так далее.

Для того чтобы вызвать конструктор запросов 1с 8 в программном коде необходимо:

  • Создать новый запрос
  • Задать пустую строку текста запроса
  • Поставить курсор мышки между кавычками, нажать правую кнопку мыши. В открывшемся контекстном меню выбрать пункт Конструктор запроса и ответить Да на вопрос о создании нового запроса. Если текст запроса уже записан, то необходимо щелкнуть на любом месте внутри него и вызвать конструктор;

Рассмотрим на небольших примерах с возрастающей сложностью все основные вкладки конструктора запросов. Такой подход позволит начинающему программисту 1с более эффективно изучить конструктор и все его возможности. Для примеров будем использовать конфигурацию Бухгалтерия 3.0.

Урок №1. Конструктор запросов — простейший пример использования.

Задача: написать запрос к справочнику номенклатура, выбрать всю номенклатуру справочника.

Новые вкладки: Таблицы и поля.

Новые механизмы: просмотр и редактирование текста запроса при помощи кнопки «Запрос».

Для начала создания запроса создадим новый запрос и вызовем конструктор (как это делается написано несколькими абзацами выше). После этого откроется окно конструктора на вкладке Таблицы и поля.

Теоретическая часть урока №1

Вкладка Таблицы и поля состоит из трех разделов:

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

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

  • Либо дважды щелкнуть по таблице;
  • Либо воспользоваться кнопками «>» или «>>».

Над разделом Таблицы присутствует ряд кнопок. Про большинство из них будет подробнее рассказано в следующих уроках. А пока дам только краткие пояснения.

  • Создать вложенный запрос (красная линия). Предназначена для создания нового вложенного запроса;
  • Создать описание временной таблицы (желтая линия). Позволяет задать имя временной таблицы, которая расположена вне данного запроса, также можно использовать для передачи в запрос таблицы значений;
  • Изменить текущий элемент (зеленая линия). Позволяет перейти в выделенный вложенный запрос, временную таблицу или описание временной таблицы;
  • Удалить текущий элемент (голубая линия). Удаляет выделенную таблицу из выбранных таблиц;
  • Заменить таблицу (синяя линия). Открывает диалог замены выделенной таблицы. Полезно, если вы неверно выбрали виртуальную таблицу регистра, так как происходит позиционирование на текущей выбранной таблице в списке.
  • Параметры виртуальной таблицы (фиолетовая линия). Открывает параметры виртуальной таблицы регистра.

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

  • Либо дважды щелкнуть по полю;
  • Либо воспользоваться кнопками «>» или «>>»;
  • Также можно добавить новое поле самостоятельно, используя произвольное выражение из полей выбранных таблиц и функций языка запросов.

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

  • Добавить (зеленая линия). Предназначена для добавления нового поля при помощи редактора произвольных выражений;
  • Изменить текущий элемент (красная линия). Позволяет изменить выделенное поле при помощи редактора;
  • Удалить текущий (синяя линия). Удаляет выделенное поле из списка.

Практическая часть урока №1

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

Приступим к созданию запроса по номенклатуре:

  • Создадим новый запрос и откроем конструктор методом указанным в начале урока;
  • В разделе База данных, откроем ветку Справочники и найдем там справочник Номенклатура;
  • Выделим его и при помощи кнопки «>» перенесем в раздел Таблицы;
  • В разделе Таблицы раскроем справочник номенклатура при помощи значка «+»;
  • В раскрывшемся списке полей найдем поле Ссылка и перенесем его в раздел Поля при помощи кнопки «>»
  • Запрос по номенклатуре готов, нажимаем кнопку «ОК» в нижней части окна конструктора.

В итоге у нас получится запрос со следующим текстом:

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

Язык запросов 1С позволяет сделать соединения двух и более таблиц. Под соединением понимается состыковка двух таблиц по ключевым полям.


Всего 4 вида соединений

  • Полное соединение — в результате получается одна таблица, содержащая все выбранные колонки, обычно число строк равняется количеству совпадающих по ключам строк плюс все несовпадающие.
  • Левое соединение — на выходе будет выбранные поля обеих таблиц (полностью первой и совпадающие по ключам соединения второй), количество строк всегда больше или равно количеству в первой таблице (условие соединения может вызывать дубли, если в правой таблице поля соединения дублируются))
  • Правое соединение — обратное левому (главная таблица вторая).
  • Внутреннее соединение — количество строк такой таблице равно количеству совпадающих по условию объединения строк.

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

Условием соединения может быть и простое условие «ИСТИНА», которое соединит таблицы с значительным увеличением количества строк (каждая строка соединится с каждой строкой второй таблицы).

Различные виды объединений используются для своих своих задач и целей:

Левое, когда требуется к одной основной таблице добавить какие-то свойства из другой. Например к списку контрагентов добавить задолженность, банковские реквизиты, фио руководителей.
При формировании такого запроса, следует добиться отсутствия в правой таблице дублей строк, этому способствует использование временных таблиц или вложенных. В противном случае в левой таблице появятся дубли контрагентов, что будет мешать верному восприятию.

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

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

В управлении торговлей для решения такой задачи соединение не так уж важно, достаточного было бы обратится к регистру «Продажи», а вот в «Бухгалтерии предприятия» соединение будет более верным решением: ведь мы не знаем заранее какой счет учета используется для продажи, могут быть созданные пользователем субсчета (это даст более короткое решение, но все зависит от ситуации — не обязательно же оно должно быть универсальным).

При необходимости соединения более двух таблиц производится цепочка соединений — сначала производится первое соединение, а с результатом производится соединение последующих таблиц.

Требование к таким таблицам:

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

Как задать соединение в конструкторе запроса:


Шаг 1: выберите необходимые таблицы, которые возможно соединить

  • Это производится на вкладке таблицы конструктора запроса.
  • Далее можно сразу выбрать нужные поля.


Шаг 2: Переходим на вкладку «Связи»

  • Для простых таблиц, где явно определяются связи, система их объединит самостоятельно
  • В данном случае левое соединение
  • Чтобы получить внутреннее: снимаются оба флажка «Все» — тогда в таблицу попадут только контрагенты у которых есть контактные лица
  • Чтобы получить полное: устанавливаются оба флажка
  • Если требуется соединение по двум условиям добавляется еще одна строка связи.

Вид соединения задается соответствующим словом перед «СОЕДИНЕНИЕ», остальной синтаксис идентичен. Правое не рассматриваем, так как конструктор запроса автоматически поменяет таблицы местами и сделает левое соединение.

Пример текста запроса «Внутреннее соединение»:

ВЫБРАТЬ
Контрагенты . Ссылка ,
КонтактныеЛица . Ссылка КАК КонтактноеЛицо
ИЗ
Справочник . Контрагенты КАК Контрагенты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник . КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты . ОсновноеКонтактноеЛицо = КонтактныеЛица . Ссылка
И ( Контрагенты . ЮрФизЛицо = ЗНАЧЕНИЕ ( Перечисление . ЮрФизЛицо . ЮрЛицо )

Пример левого соединения

ВЫБРАТЬ
Контрагенты . Ссылка ,
КонтактныеЛица . Ссылка КАК КонтактноеЛицо
ИЗ
Справочник . Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник . КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты . ОсновноеКонтактноеЛицо = КонтактныеЛица . Ссылка
И ( Контрагенты . ЮрФизЛицо = ЗНАЧЕНИЕ ( Перечисление . ЮрФизЛицо . ЮрЛицо )

Пример «полного соединения»

ВЫБРАТЬ
Контрагенты . Ссылка ,
КонтактныеЛица . Ссылка КАК КонтактноеЛицо
ИЗ
Справочник . Контрагенты КАК Контрагенты
ПОЛНОЕ СОЕДИНЕНИЕ Справочник . КонтактныеЛица КАК КонтактныеЛица
ПО Контрагенты . ОсновноеКонтактноеЛицо = КонтактныеЛица . Ссылка
И ( Контрагенты . ЮрФизЛицо = ЗНАЧЕНИЕ ( Перечисление . ЮрФизЛицо . ЮрЛицо )

На что следует обратить внимание:

  • Как уже было сказано на пустые значения при левом или полном соединении.
  • С осторожностью используйте полные соединения и срезы последних из регистров, это может сильно замедлить выборку.
  • При использовании конструктора обращайте внимание на соединяемые таблицы иногда он может подставить в левую таблицу не ожидаемое вами, если это упустить вначале придется затем исправлять руками или через правое (одна секунда внимания сбережет время в дальнейшем).
  • Если вы выберете 2 таблицы, но не укажите связи, то получится неявное полное соединение (таблицы будут через «запятую»). Пример:

ВЫБРАТЬ
Контрагенты . Ссылка ,
КонтактныеЛица . Ссылка КАК КонтактноеЛицо
ИЗ
Справочник . Контрагенты КАК Контрагенты ,
Справочник . КонтактныеЛица КАК КонтактныеЛица

Реклама — фантазирование об обычном предмете в извращенной форме.

— Равиль Алев

Структура кода запроса в 1С легко изучить. Начнем от простого запроса к более сложным вариантам.

Выбрать

Любой запрос имеет команду ВЫБРАТЬ, после которой могут идти дополнительные параметры выборки, которые позднее рассмотрим отдельно:
ПЕРВЫЕ
РАЗЛИЧНЫЕ
РАЗРЕШЕННЫЕ

Далее идет список полей выборки.

Простейший запрос в 1С может иметь такой вид:

Данный запрос вернет таблицу, состоящую из одной строки и одной колонки, в которой будет числовое значение равное 1.

Усложняем запрос: добавим еще поля, разделив их запятой
ВЫБРАТЬ 1, 2, "3"

Этот запрос также вернет 1 строку, но уже с 3 колонками, две из которых содержат числа, а 3 строковое.

Система 1С автоматически присвоит этим полям имена «Поле1», «Поле2», «Поле3», что неплохо, но не всегда удобно, ведь полей может быть значительно больше.

Поэтому в языке запросов существует специальный оператор именования КАК , который идет после поля,

Предыдущий запрос можно представить в таком виде:
ВЫБРАТЬ 1 КАК Один, 2 КАК Два, "3" КАК ЦифраТриСтрокой

Имена полей задаются по правилам именования переменных: не могут начинаться со строки, содержать пробелы, не должны повторятся в одной выборке, а также отсутствовать (они поставятся автоматически).
Возможно опускать слово КАК, но лучше такой вариант не использовать, так как конструктор запросов это исправит:
ВЫБРАТЬ ссылка ссылка ИЗ Справочник.ФизическиеЛица

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

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

Пример простого запроса к реальной таблице справочника:

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

В таких запросах мы можем указать конкретные поля, которые нам нужны или указать *.

ВЫБРАТЬ * ИЗ Справочник.Контрагенты

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

Вложенные таблицы

Также возможно обращение к вложенной таблице:

ВЫБРАТЬ * ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтактнаяИнформация

Как видите, здесь мы впервые использовали именование таблицы, которое также упрощает работу при написании запроса, это дает возможность обращения по этому имени к полям:

ВЫБРАТЬ КИ.Ссылка ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ //так иногда будет короче

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

ВЫБРАТЬ Ссылка.Наименование ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтактнаяИнформация

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

ВЫБРАТЬ Ссылка, ОсновнойДоговор.Наименование КАК НазваниеДоговора ИЗ Справочник.Контрагенты

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

Дополнительно

Вернемся к запросу

ВЫБРАТЬ КИ.Ссылка ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ

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

Чтобы избежать этого можно воспользоваться служебным словом РАЗЛИЧНЫЕ: система устранит все дубли автоматически.

ВЫБРАТЬ РАЗЛИЧНЫЕ КИ.Ссылка ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ

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

ВЫБРАТЬ ПЕРВЫЕ 100 КИ.Ссылка ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ

Последнее, что следует упомянуть при изучении основ выборки запросов 1С:
Команду «ПОМЕСТИТЬ », позволяющую помещать выборку в таблицу для многократного последующего использования.
Источник может также выборкой из запроса, указанной в скобках:

ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ Справочник.Контрагенты) КАК ВложеннаяТаблица

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

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

Регистр команд, имен и полей запроса не имеет значение: Выбрать и ВыБРатЬ равносильны.

Можно дурачить всех все время, — при условии, что реклама ведется правильно, а расходы на нее достаточно велики.

— Джозеф Левин

Для быстрого написания запросов для конфигураций на платформе 1С 8 существует
такая вещь как Конструктор запросов.
Для его вызова достаточно щелкнуть правой кнопкой мыши в окне редактирования кода и выбрать пункт
Конструктор запроса.

konstruktorzaprosamenyu_vz

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

Как видно из рисунка окно конструктора запросов представлено несколькими закладками,
первая из которых Таблицы и поля. На ней присутствует три поля. В левом
отображается дерево метаданных как оно задано в конфигураторе. В среднем –
список таблиц, которые используются в запросе. И в правом – поля, выбранные из таблиц.

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

konstruktorspravochnik_vz

Нажимаем кнопку ОК и в окне редактирования кода видим следующий запрос:

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

  • Скорость написания запросов. Даже на небольшом примере выше видно, что с использованием
    конструктора скорость написания запроса возрастает в несколько раз.
  • Качество кода. Практически исключена возможность опечаток, т.к. текст генерируется
    автоматически.
  • В конструкторе удобно анализировать тексты больших запросов, количество строк которых
    может достигать две-три тысячи со множеством временных таблиц и вложенных запросов.
    И понять что-то в таком запросе только смотря на текст просто нереально. В конструкторе
    же информация представлена более укрупненно и наглядно.
  • Есть встроенная справочная информация по различным функциям языка запросов.

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

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

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

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

Условия в запросах

Давайте напишем запрос, который запрашивает из таблицы Справочник.Еда наименование еды, её цвет, вкус и калорийность:

02

Секция ГДЕ

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

03

В нашем случае таким условием будет равенство реквизита Цвет (а вернее его свойства Наименование) строковому значению "Жёлтый" ( через ё ):

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

01

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

Обратите внимание, что поля, которые участвуют в условии (в нашем случае поле Цвет) не обязаны входить в список выбираемых полей:

В данном случае реквизит Цвет участвует в условии (секция ГДЕ ), но не участвует в списке выбираемых полей (секция ВЫБРАТЬ ):

04

Условие отбора может определяться и как простое логическое выражение , и как более сложное , в котором простые логические выражения соединяются между собой логическими операторами И, ИЛИ, НЕ.

Для примера, давайте выберем еду, у которой цвет белый или калорийность больше 100:

05

Секция ИМЕЮЩИЕ

Если в запросе используется группировка (см. предыдущий урок) и мы хотим наложить условие на результаты группировки, секция ГДЕ не подойдёт. Вместо неё нужно использовать секцию ИМЕЮЩИЕ .

Давайте подсчитаем суммарную калорийность еды по цветам. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Для этого используем группировку по цвету и агрегатную функцию СУММА по калорийности:

А теперь наложим условие на результат группировки так, чтобы остались только цвета с суммарной калорийностью больше 100:

06

Таким образом, секция ИМЕЮЩИЕ позволяет накладывать условия на значения агрегатных функций при группировке.

Обратите внимание, что агрегатные функции, которые участвуют в условии (в нашем случае поле СУММА(Калорийность)) не обязаны входить в список выборки:

В данном случае агрегатная функция СУММА(Калорийность) участвует в условии (секция ИМЕЮЩИЕ), но не участвует в списке выборки (секция ВЫБРАТЬ):

Условие отбора секции ИМЕЮЩИЕ может также определяться и как простое логическое выражение , и как более сложное , в котором простые логические выражения соединяются между собой логическими операторами И, ИЛИ, НЕ.

Для примера, давайте выберем цвета, имеющие суммарную калорийность больше 200 И меньше 300:

Читайте также: