какие виды соединений существуют в запросах 1с
1c8.pl.ua
Соединение — одна из наиболее частых операций, выполняемых над базами данных. Соединения используются для того, что бы поставить в соответствие строки из одной таблицы строкам в другой. Соответствие производится по значению одного из полей, которое мы будем называть ключевым.
Принципиально, соединения используются для того, что бы получить в одной выборке информацию из разных источников. Иначе говоря, источники соединяются в том случае, когда отличается их физический смысл.
Существует четыре вида соединений таблиц, которые обрабатывает механизм запросов 1С:Прсдприятия: Внутреннее, Левое внешнее. Правое внешнее, Полное Внешнее (или. проще. Внутреннее, Левое, Правое, Полное).
Внутреннее соединение
[ВНУТРЕННЕЕ] СОЕДИНЕНИЕ означает, что из обеих исходных таблиц – источников данных в результат запроса необходимо включить только те комбинации записей, которые соответствуют указанному условию. Остальные записи в результат не попадают.Ключевое слова ВНУТРЕННЕЕ можно не указывать вообще, оно повышает наглядность и удобочитаемость текста запроса.
Самый простейший вид соединения — внутреннее. В этом случае запрос просто находит пары строк с совпадающим значением» ключа (в данном примере, как и во всех последующих, в качестве ключевого поля используется поле «Контрагент»).
Контрагенты | |
Контрагент | Полное наименование |
Иванов | Иванов И.И. |
Петров | Петров П.П. |
Сидоров | Сидоров С.С. |
Продажи | |
Контрагент | Сумма |
Иванов | 5000 |
Петров | 7500 |
Сидоров | 15000 |
Результирующая таблица:
Продажи контрагентам | ||
Контрагент | Полное наименование | Сумма |
Иванов | Иванов И.И. | 5000 |
Петров | Петров П.П. | 7500 |
Сидоров | Сидоров С.С. | 15000 |
Левое (Правое) соединение
ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Но, в отличие от внутреннего соединения, в результат запроса надо включить также еще и записи из первого (указанного слева от слова СОЕДИНЕНИЕ) источника, для которых не найдено соответствующих условию записей из второго источника. Таким образом, в результат запроса будут включены все записи из первого источника; они будут соединены с записями из второго источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из второго источника, будут содержать NULL в полях, формируемых на основании записей из этого источника.
ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и записи из второго (указанного справа от слова СОЕДИНЕНИЕ) источника, для которых не найдено соответствующих условию записей из первого источника.Таким образом, в результат запроса будут включены все записи из второго источника; они будут соединены с записями из первого источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из первого источника, будут содержать NULL в полях, формируемых на основании записей из этого источника.
Ситуация осложняется, когда источники совпадают не полностью. ‘Го есть, в одной таблице есть запись с некоторым значением ключа, а в другой такой записи нет. На схеме показана ситуация, когда запись есть в таблице контрагентов, но нет в таблице продаж. Это означает, что некий контрагент ничего у нас не покупал, хотя в справочнике контрагентов он у нас имеется (например, попросил человек выписать ему счёт на оплату, а покупать передумал; вполне жизненная ситуация). В этом случае в выборке на месте отсутствующей записи появится значение Null.
Контрагенты | |
Контрагент | Полное наименование |
Иванов | Иванов И.И. |
Петров | Петров П.П. |
Сидоров | Сидоров С.С. |
Семёнов | Семёнов С.С. |
Продажи | |
Контрагент | Сумма |
Иванов | 5000 |
Петров | 7500 |
Сидоров | 15000 |
Результирующая таблица:
Продажи контрагентам | ||
Контрагент | Полное наименование | Сумма |
Иванов | Иванов И.И. | 5000 |
Петров | Петров П.П. | 7500 |
Сидоров | Сидоров С.С. | 15000 |
Семёнов | Семёнов С.С. | Null |
Полное соединение
ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и записи из второго (указанного справа от слова СОЕДИНЕНИЕ) источника, для которых не найдено соответствующих условию записей из первого источника.Таким образом, в результат запроса будут включены все записи из второго источника; они будут соединены с записями из первого источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из первого источника, будут содержать NULL в полях, формируемых на основании записей из этого источника.
Полное внешнее соединение, это, как ясно уже из названия, дальнейшее развитие Левого (или Правого) соединений. При организации полного соединения важно учитывать такое обстоятельство: при соединении данного вида в запрос попадают все записи из обеих таблиц. Иначе говоря, значение ключевого ноля нам нужно будет получать и из левой, и из правой таблиц. Обратите внимание: обязательно из обеих таблиц! Один из вариантов решения такой: создать для этого дополнительное поле, в котором делать проверку на Null. Если ключ в одной из таблиц равен Null, тогда нужно брать его значение из другой таблицы.
Поскольку полное соединение несколько сложнее других видов соединений, немного изменим наш пример. Теперь нам нужно получить не просто развёрнутый список продаж, а список всех действующих контрагентов.
Закупки | |
Контрагент | Сумма |
Иванов | 4000 |
Андреев | 3500 |
Продажи | |
Контрагент | Сумма |
Иванов | 5000 |
Петров | 7500 |
Сидоров | 15000 |
Таблица после полного соединения, со всеми полями исходных таблиц:
Действующие контрагенты | |||
КонтрагентЗакупки | СуммаЗакупки | КонтрагентПродажи | СуммаПродажи |
Иванов | 4000 | Иванов | 5000 |
Null | Null | Петров | 7500 |
Null | Null | Сидоров | 15000 |
Андреев | 3500 | Null | Null |
Окончательный вид таблицы, в которой контрагенты сведены в одно поле:
Действующие контрагенты | ||
Контрагент | СуммаЗакупки | СуммаПродажи |
Иванов | 4000 | 5000 |
Петров | 7500 | |
Сидоров | 15000 | |
Андреев | 3500 |
Ниже приводится вариант соответствующего запроса. Обратите внимание, что данные по контрагентам мы получаем не просто из документов, а из подзапросов. В них мы выполняем группировку по контрагентам таким образом, что бы каждый контрагент был представлен в выборке но одному разу. И, естественно, не забываем про Null:
Обучение программированию на 1С
Соединяем таблицы вместе и отбираем записи
Язык запросов является существенным отличием версии 7.7 от 8-ой программного продукта компании 1С. Именно язык запросов – важная составляющая изучения параметров программирования в 1С. Благодаря языку запросов программа версии 8 стала более функциональной, теперь гораздо проще получать данные в автоматизированном решении.
Алгоритм соединения данных таблиц
Как происходит соединение данных из двух таблиц нагляднее показать на конкретном примере. Здесь начинают действовать такие понятия как: ЛЕВОЕ СОЕДИНЕНИЕ, ПРАВОЕ СОЕДИНЕНИЕ, ПОЛНОЕ СОЕДИНЕНИЕ и ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Действительно, соединения данных в программировании бывают 4-х типов.
Возьмём для примера данные, сгруппированные в две таблице. В одной таблице представлены сведения описательного характера, в другой – остатки по каждой позиции.
Таблица 1. «Номенклатура» (левая таблица).
Товар | Материал |
Диван | Кож/зам |
Стол | Пластик |
Стол | Дерево |
Кресло | Кожа |
Табурет | Пластик/металл |
Табурет | Дерево/металл |
Таблица 2. «Остатки номенклатуры» (правая таблица).
Товар | Материал | Кол-во |
Диван | Кож/зам | 1 |
Стол | Дерево | 15 |
Табурет | Дерево/металл | 46 |
Варианты стандартных соединений в языке запросов для 1С
Левое соединение
Нам нужно получить единую таблицу, содержащую данные таблицы «Номенклатура» и таблицы «Остатки номенклатуры», которые удовлетворяют требованию связки: Поле «Товар», Условие «Равно». Получаем следующий результат:
Товар | Материал/Номенклатура | Материал/Остатки | Кол-во |
Диван | Кож/зам | Кож/зам | 1 |
Стол | Пластик | Дерево | 15 |
Стол | Дерево | Дерево | 15 |
Кресло | Кожа | NULL | NULL |
Табурет | Пластик/металл | Дерево/металл | 46 |
Табурет | Дерево/металл | Дерево/металл | 46 |
Значением NULL заполняются ячейки, для которых нет показателей при сопоставлении данных двух таблиц. Исходя из языка запросов, NULL работает по функции ЕСТЬ NULL.
После обработки функции ЕСТЬ NULL, результатом становится следующая таблица:
Товар | Материал | Кол-во |
Диван | Кож/зам | 1 |
Стол | Пластик | 0 |
Стол | Дерево | 15 |
Кресло | Кожа | 0 |
Табурет | Пластик/металл | 0 |
Табурет | Дерево/металл | 46 |
ЛЕВОЕ СОЕДИНЕНИЕ и ПРАВОЕ СОЕДИНЕНИЕ работают аналогично с той лишь разницей, что первая запись будет браться из таблицы, исходя из наименования соединения. По своей сути это цикл в цикле. Сначала берётся первая запись из левой/правой таблицы (для левого/правого соединений соответственно) и происходит поиск на предмет наличия связи для этой записи из данных другой таблицы. И так далее…
ВНУТРЕННЕЕ и ПОЛНОЕ варианты СОЕДИНЕНИЙ
Язык запросов в 1С 8-ой версии позволяет получить только результативные записи, для этого используется функционал внутреннего соединения, в результате чего имеем следующие данные:
Товар | Материал | Кол-во |
Диван | Кож/зам | 1 |
Стол | Дерево | 15 |
Табурет | Дерево/металл | 46 |
А полное соединение позволит получить все записи, причём, те записи, которые будут удовлетворять условиям взаимосвязи, будут специально связаны, остальные же также будут в выдаче результата запроса, но со значениями NULL. Таким образом, можно сказать, что ПОЛНОЕ СОЕДИНЕНИЕ – это функционал левого и правого соединений, сведённый воедино.
Это небольшие выдержки из синтаксиса языка запросов программного продукта 1С. На самом деле для эффективного программирования в системе нужно знать массу моментов, учитывать способы эффективной оптимизации.
Какие виды соединений существуют в запросах 1с
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: соединения
Автор уроков и преподаватель школы: Владимир Милькин
Соединения в запросах
Соединения используются для того, чтобы сопоставить строки одной таблицы строкам другой таблицы.
Для того, чтобы осознать необходимость соединений давайте решим следующую задачу.
У нас в базе есть справочник Клиенты:
И справочник Ассоциации:
Наша задача вывести любимые ассоциации клиентов, основываясь на цвете.
Для Андрея вообще нет подходящей ассоциации, так его любимый цвет красный, а ассоциаций красного цвета в базе нет.
Будем решать задачу постепенно.
Сначала запросим всех клиентов и их любимые цвета :
Затем запросим все ассоциации и их цвета :
Теперь нам каким-то образом следует совместить первую и вторую таблицу. Чтобы это сделать запросим информацию сразу из двух таблиц. Для этого перечислим обе таблицы в секции ИЗ через запятую. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. А в секции ВЫБРАТЬ укажем поля из обеих таблиц:
Если мы попробуем выполнить этот запрос, то получим ошибку:
Причина ошибки в том, что поле Наименование присутствует сразу в обеих таблицах (Клиенты и Ассоциации) и система просто не знает поле из какой именно таблицы имеется в виду.
Чтобы устранять подобные неоднозначности при выборке из более чем одной таблицы принято указывать полные названия полей. Полное название поля включает в себя полное имя таблицы (например, Справочник.Клиенты) и имя самого поля (например, Наименование).
Таким образом полное название поля Наименование из таблицы Клиенты будет Справочник.Клиенты.Наименование.
А полное названия поля Наименование из таблицы Ассоциации будет Справочник.Ассоциации.Наименование.
Перекрёстное соединение
Перепишем предыдущий запрос с полными именами полей:
Только что мы произвели перекрёстное соединение двух таблиц. Обратите внимание на то, каким образом сформировался результат:
Внутреннее соединение
Очевидно, что результат перекрестного соединения двух таблиц не есть решение нашей задачи. Нам нужны не все записи из перекрёстного соединения, а только те у которых поля ЛюбимыйЦвет и Цвет имеют одинаковое значение:
Чтобы получить эти записи добавим к предыдущему запросу секцию ГДЕ:
Есть ещё один вариант написания того же самого внутреннего соединения :
Сравните этот и предыдущий запрос. Они совершенно одинаковы с точки зрения платформы, просто имеют разный синтаксис. И этот и предыдущий запросы содержат внутреннее соединение таблицы Клиенты с таблицей Ассоциации по полям ЛюбимыйЦвет и Цвет соответственно.
Левое внешнее соединение
Обратите внимание на то, что в результат внутреннего соединения не попал Андрей. А всё потому, что его любимый цвет красный, а красных ассоциаций у нас в базе нет вовсе.
Получается, что для Андрея с его красным цветом просто не нашлось пары из таблицы ассоциаций.
Перепишем запрос так, чтобы в результат попадали в том числе те записи из первой таблицы, для которых не нашлось ни одной пары из второй таблицы (в данном случае Андрей):
Такое соединение называется левым внешним соединением (слово внешнее можно опускать для простоты).
Правое внешнее соединение
Но давайте снова вернёмся к внутреннему соединению:
Обратите внимание на то, что результат внутреннего соединения не содержит ассоциацию белый снег, так как не нашлось ни одного клиента, у которого любимым цветом был бы белый.
Перепишем запрос так, чтобы в результат попадали в том числе те записи из второй таблицы, для которых не нашлась ни одной пары из первой таблицы (в данном случае белый снег):
Такое соединение называется правым внешним соединением (слово внешнее можно опускать для простоты).
Полное соединение
А что если нам нужно, чтобы в результат запроса попадали помимо внутреннего соединения Андрей и Снег одновременно?
Для этого потребуется совместить результаты левого и правого соединений. Такой вид соединения уже придуман и называется полным соединением:
Результат полного соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из первой таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары) ПЛЮС все записи из второй таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары).
Псевдонимы таблиц
Согласитесь, что все запросы, которые мы писали в этом уроке выглядят довольно громоздко. Это связано с тем, что мы вынуждены указывать полные имена полей, чтобы избежать возникновение неоднозначности.
А чтобы результат запроса был ещё нагляднее добавим псевдонимы полей, которые мы уже рассматривали на одном из прошлых уроков:
Обработка NULL
Присмотритесь к результатам последнего запроса (как впрочем и многих предыдущих на этом уроке).
Чему равны значения полей Ассоциация и ЕёЦвет для первой строчки? А что вы скажете насчет полей Клиент и ЕгоЦвет для последней строки?
Они равны NULL, которое как мы уже знаем означает отсутствие какого либо значения:
Поэтому обязательной считается обработка значений NULL всегда, когда они могут возникнуть.
Под обработкой подразумевается то, что мы должны сказать в нашем запросе, что если одно из полей будет равно NULL, то в это поле следует подставить какое-то другое значение.
В данном случае для полей Клиент и Ассоциация в случае обнаружения NULL мы будем подставлять пустую строку «».
А вот поля ЕгоЦвет и ЕёЦвет являются ссылками на элементы справочника Цвета, поэтому в них можно подставлять только значения являющиеся ссылками указанных типов. Каждый ссылочный тип (например, Справочник или Документ) имеет предопределенный элемент ПустаяСсылка. Чтобы указать его значение в запросе воспользуемся функцией ЗНАЧЕНИЕ.
Для определения того, что в поле попало NULL будем использовать уже знакомую нам по прошлым урокам функцию ЕСТЬNULL:
С виду (из консоли запросов) результат не изменился. Мы по-прежнему видим пустые поля. Но это только потому, что строковые представления у NULL и у пустых полей всех типов совпадают и равны пустой строке.
На самом же деле эти пустые поля уже не есть NULL (отсутствие значения), теперь в них появились значения (пустые), с которыми уже можно работать (совершать операции).
Соединение более двух таблиц
Можно последовательно соединять сколько угодно таблиц.
Предположим нужно решить следующую задачу. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Вывести все возможные варианты клиентов и их любимых ассоциаций и их любимых продуктов исходя из их любимого цвета.
Для этого последовательно соединим по цвету таблицу Клиенты с таблицей Ассоциации, а затем (получившийся результат) с таблицей Еда: