Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.03.2019

Просмотров: 50430

Скачиваний: 8600

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

соединения не попадают.

Рис. 1.80. Комбинация типов соединений данных справочника «Товары» и данных таблиц остатков и оборотов товаров

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

Теперь изменим тип первого (по порядку следования в запросе) соединения на
внутреннее соединение, а тип второго соединения оставим без изменений (листинг 1.83).

Листинг 1.83. Комбинация типов соединений данных справочника «Товары» и данных таблиц остатков и оборотов
товаров

При выполнении запроса на первом этапе все происходит так же, как и в предыдущем
случае (см. объяснение над рис. 1.80). Результат этого соединения мы видим на рис.
1.81, слева.


background image

Рис. 1.81. Комбинация типов соединений данных справочника «Товары» и данных таблиц остатков и оборотов товаров

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

Как видно из рассмотренных выше случаев (листинги 1.80–1.83), порядок расположения
синтаксических конструкций в предложении ИЗ был следующий: <Имя первой таблицы>
<Тип соединения> <Имя второй таблицы> <Тип соединения> <Имя третьей
таблицы> <Условие связи второй и третьей таблицы> <Условие связи первой и
второй таблицы>
.

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

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

В начале главы "

Как хранятся данные в «1С:Предприятии»

" мы рассматривали, как

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


background image

Рис. 1.82. Связь данных документа и справочника по ссылочному полю в информационной базе

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

Теперь посмотрим, как это реализуется с помощью языка запросов. Допустим, нам нужно
вывести список документов Событие и при этом для каждого клиента отобразить его
адрес и телефон. Это можно сделать с помощью следующего запроса (листинг 1.84).

Листинг 1.84. Вывод полей из таблицы, на которую ссылается поле исходной таблицы запроса

В списке выборки запроса перечислены поля ДатаВидСобытия и Клиент исходной
таблицы запроса – документа Событие, а также поля Адрес и Телефон таблицы


background image

справочника Клиенты, на которую ссылается поле документа Клиент. Имена полей
таблицы справочника пишутся через точку, например, Клиент.Адрес.

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

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

Рис. 1.83. Вывод полей из таблицы, на которую ссылается поле исходной таблицы запроса

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

подробнее

О поле 

Представление

 рассказано в разделе «

Как получить текстовое представление

ссылочного поля

».

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

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

Подробнее

Раздел «

Ограничить получение данных через точку от полей составного ссылочного типа

».


background image

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

Таким образом, предыдущий запрос можно представить в следующих вариантах (листинг
1.85).

Листинг 1.85. Вывод полей из таблицы, на которую ссылается поле исходной таблицы запроса

Во втором варианте запроса после ключевого слова ИЗ перечислены источники запроса –
таблица Документ.Событие, содержащая ссылочное поле Клиент, и таблица
Справочник.Клиенты, на которую ссылается это поле. Но таблицы не просто
перечислены через запятую, а связаны между собой левым соединением (между
именами таблиц находятся ключевые слова ЛЕВОЕ СОЕДИНЕНИЕ). Тип соединения
таблиц определяет, должны ли записи каждой из таблиц удовлетворять условию связи.

подробнее

Типы соединений источников запроса подробно рассмотрены в разделе «

Как получить

данные из разных таблиц для одного и того же поля

».