1С 8 запрос соединение таблиц как выбрать одну строку со второй таблицы


Соединения в запросах в 1С 8.3, 8.2 (в примерах)

Соединение в запросах в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

2017-12-18T22:45:25+00:00 Основы Группировка Условия Упорядочивание Функции
Итоги Соединение Объединение Параметры

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

Оглавление (нажмите, чтобы раскрыть)

/// Как сделать внутреннее соединение таблиц в 1с 8.3, 8.2   &НаСервере Процедура ВнутреннееСоединениеТаблиц()   // Соединения используются, чтобы сопоставить (соединить) // строки одной таблицы строкам другой таблицы // по определенному признаку.   // ------------- -------------------------------- // |Люди | | Характеристики | // ------------- --------------------------------- // |ИМЯ | | ИМЯ ВОЗРАСТ | // ------------- --------------------------------- // |Алена | | Алена 21 | // |Алефтина | | Алефтина 18 | // |Владимир | | Павел 25 | // |Владислав | | Петр 30 | // | | | Порфирий 50 | // ------------- ---------------------------------   // Результат внутреннего соединения по имени:   // ИмяИзТаблицы1 ИмяИзТаблицы2 ВозрастИзТаблицы2 // Алена Алена 21 // Алефтина Алефтина 18     Запрос = Новый Запрос( "ВЫБРАТЬ | Люди.Наименование КАК ИмяИзТаблицы1, | Характеристики.Наименование КАК ИмяИзТаблицы2, | Характеристики.Возраст КАК ВозрастИзТаблицы2 |ИЗ | Справочник.Люди КАК Люди | ВНУТРЕННЕЕ СОЕДИНЕНИЕ | Справочник.Характеристики КАК Характеристики | ПО | Люди.Наименование = Характеристики.Наименование" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как сделать левое внешнее соединение таблиц в 1с 8.3, 8.2   &НаСервере Процедура ЛевоеСоединениеТаблиц()   // Левое соединение - это внутреннее // соединение + строки из левой таблицы, для которых не // найдены соответствия.   // ------------- -------------------------------- // |Люди | | Характеристики | // ------------- --------------------------------- // |ИМЯ | | ИМЯ ВОЗРАСТ | // ------------- --------------------------------- // |Алена | | Алена 21 | // |Алефтина | | Алефтина 18 | // |Владимир | | Павел 25 | // |Владислав | | Петр 30 | // | | | Порфирий 50 | // ------------- ---------------------------------   // Результат левого внешнего соединения по имени:   // ИмяИзТаблицы1 ИмяИзТаблицы2 ВозрастИзТаблицы2 // Алена Алена 21 // Алефтина Алефтина 18 // Владимир NULL NULL // Владислав NULL NULL   Запрос = Новый Запрос( "ВЫБРАТЬ | Люди.Наименование КАК ИмяИзТаблицы1, | Характеристики.Наименование КАК ИмяИзТаблицы2, | Характеристики.Возраст КАК ВозрастИзТаблицы2 |ИЗ | Справочник.Люди КАК Люди | ЛЕВОЕ СОЕДИНЕНИЕ | Справочник.Характеристики КАК Характеристики | ПО | Люди.Наименование = Характеристики.Наименование" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как сделать правое внешнее соединение таблиц в 1с 8.3, 8.2   &НаСервере Процедура ПравоеСоединениеТаблиц()   // Правое соединение - это внутреннее // соединение + строки из правой таблицы, для которых // не найдены соответствия.   // ------------- -------------------------------- // |Люди | | Характеристики | // ------------- --------------------------------- // |ИМЯ | | ИМЯ ВОЗРАСТ | // ------------- --------------------------------- // |Алена | | Алена 21 | // |Алефтина | | Алефтина 18 | // |Владимир | | Павел 25 | // |Владислав | | Петр 30 | // | | | Порфирий 50 | // ------------- ---------------------------------   // Результат правого внешнего соединения по имени:   // ИмяИзТаблицы1 ИмяИзТаблицы2 ВозрастИзТаблицы2 // Алена Алена 21 // Алефтина Алефтина 18 // NULL Павел 25 // NULL Петр 30 // NULL Порфирий 50   Запрос = Новый Запрос( "ВЫБРАТЬ | Люди.Наименование КАК ИмяИзТаблицы1, | Характеристики.Наименование КАК ИмяИзТаблицы2, | Характеристики.Возраст КАК ВозрастИзТаблицы2 |ИЗ | Справочник.Люди КАК Люди | ПРАВОЕ СОЕДИНЕНИЕ | Справочник.Характеристики КАК Характеристики | ПО | Люди.Наименование = Характеристики.Наименование" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как сделать полное внешнее соединение таблиц в 1с 8.3, 8.2   &НаСервере Процедура ПолноеСоединениеТаблиц()   // Полное соединение - это левое соединение + правое соединение.   // ------------- -------------------------------- // |Люди | | Характеристики | // ------------- --------------------------------- // |ИМЯ | | ИМЯ ВОЗРАСТ | // ------------- --------------------------------- // |Алена | | Алена 21 | // |Алефтина | | Алефтина 18 | // |Владимир | | Павел 25 | // |Владислав | | Петр 30 | // | | | Порфирий 50 | // ------------- ---------------------------------   // Результат полного внешнего соединения по имени:   // ИмяИзТаблицы1 ИмяИзТаблицы2 ВозрастИзТаблицы2 // Алена Алена 21 // Алефтина Алефтина 18 // Владимир NULL NULL // Владислав NULL NULL // NULL Павел 25 // NULL Петр 30 // NULL Порфирий 50   Запрос = Новый Запрос( " ВЫБРАТЬ | Люди.Наименование КАК ИмяИзТаблицы1, | Характеристики.Наименование КАК ИмяИзТаблицы2, | Характеристики.Возраст КАК ВозрастИзТаблицы2 |ИЗ | Справочник.Люди КАК Люди | ПОЛНОЕ СОЕДИНЕНИЕ | Справочник.Характеристики КАК Характеристики | ПО |Люди.Наименование = Характеристики.Наименование" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как сделать перекрестное соединение таблиц в 1с 8.3, 8.2   &НаСервере Процедура ПерекрестноеСоединениеТаблиц()   // ------------- -------------------------------- // |Люди | | Характеристики | // ------------- --------------------------------- // |ИМЯ | | ИМЯ ВОЗРАСТ | // ------------- --------------------------------- // |Алена | | Алена 21 | // |Алефтина | | Алефтина 18 | // |Владимир | | Павел 25 | // |Владислав | | Петр 30 | // | | | Порфирий 50 | // ------------- ---------------------------------   // Результат перекрестного соединения:   // ИмяИзТаблицы1 ИмяИзТаблицы2 ВозрастИзТаблицы2 // Алена Алена 21 // Алена Алефтина 18 // Алена Павел 25 // Алена Петр 30 // Алена Порфирий 50 // Алефтина Алена 21 // Алефтина Алефтина 18 // Алефтина Павел 25 // Алефтина Петр 30 // Алефтина Порфирий 50 // Владимир Алена 21 // Владимир Алефтина 18 // Владимир Павел 25 // Владимир Петр 30 // Владимир Порфирий 50 // Владислав Алена 21 // Владислав Алефтина 18 // Владислав Павел 25 // Владислав Петр 30 // Владислав Порфирий 50   Запрос = Новый Запрос( "ВЫБРАТЬ | Люди.Наименование КАК ИмяИзТаблицы1, | Характеристики.Наименование КАК ИмяИзТаблицы2, | Характеристики.Возраст КАК ВозрастИзТаблицы2 |ИЗ | Справочник.Люди КАК Люди, | Справочник.Характеристики КАК Характеристики" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Скачать и выполнить эти примеры на компьютере

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)

Соединение в запросах в языке 1С 8.3, 8.2 (в примерах)

Основы Группировка Условия Упорядочивание Функции
Итоги Соединение Объединение Параметры

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

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

Нажмите одну из кнопок, чтобы поделиться:

helpme1c.ru

Соединение таблиц в запросе

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

Быстрый переход

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

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

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

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

[qu_note note_color=»#f7ebe6″]Такие запросы на больших источниках может вызвать нехватку памяти, либо длительно выполнятся, вплоть до «зависания».[/qu_note]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

 

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

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

 

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

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

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

Реклама — это искусство делать из полуправды целую ложь.

— Эдгар Шоафф

capitally.ru

Запросы 1С 8. Полный курс

Автор: Дмитрий Котельников

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

  • левое;
  • правое,
  • внутреннее;
  • полное.

Каждый тип мы рассмотрим на абстрактном примере. Имеется 2 таблицы, в первой храним описательную информацию о номенклатуре, во второй о ее остатках:

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

Левое соединение

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

Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Товар,
    |    Номенклатура.Цвет КАК ЦветНоменклатура,
    |    Остатки.Цвет КАК ЦветОстатки,
    |    Остатки.Количество
    |ИЗ
    |    Номенклатура КАК Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
    |        ПО Номенклатура.Товар = Остатки.Товар";

Для стула не нашлось сопоставлений из таблицы остатков, поэтому поля заполнились значениями NULL, которые обязательно нужно обработать функцией ЕСТЬNULL, см. Функции языка запросов 1С 8.

Левое соединение работает примерно как цикл в цикле - берется первая запись из левой таблицы и пробегаются все записи из правой на предмет удовлетворения условию связи. Затем берется вторая запись из левой таблицы и т.д. Если вдруг условию связи удовлетворяют несколько записей из правой таблицы, то в результирующую таблицу будет добавлено несколько строк (по количеству удачных связей).Как видим, полученная таблица не информативна, данные не отражают реальную суть, поэтому лучше связать эти таблицы по двум полям: Товар и Цвет, только на этот раз обработаем NULLы:

Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Товар,
    |    Номенклатура.Цвет,
    |    ЕСТЬNULL(Остатки.Количество, 0) КАК Количество
    |ИЗ
    |    Номенклатура КАК Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
    |        ПО Номенклатура.Товар = Остатки.Товар
    |            И Номенклатура.Цвет = Остатки.Цвет";

Правое соединение

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

Внутреннее соединение

Используя внутреннее соединение мы говорим системе, что в результате хотим видеть только те записи, которые удовлетворяют условию связи как из правой таблицы, так и из левой. Таким образом, количество результирующих записей будет меньше или равно количеству записей самой "короткой таблицы", участвующей в соединении. Применим внутреннее соединение к полям Товар и Цвет наших таблиц:

Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Товар,
    |    Номенклатура.Цвет,
    |    Остатки.Количество КАК Количество
    |ИЗ
    |    Номенклатура КАК Номенклатура
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Остатки КАК Остатки
    |        ПО Номенклатура.Товар = Остатки.Товар
    |            И Номенклатура.Цвет = Остатки.Цвет";

Полное соединение

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

Задач на эту тему может быть много, давайте попробуем решить одну из них. Наша организация является дилером 2 мебельных фабрик: "Заря" и "Рассвет". Ассортимент со стоимостью каждой из фабрик хранится в разных таблицах. Необходимо составить единый прайс лист, причем брать в него продукцию по минимальной цене:

Применим полное соединение с выборкой всех полей, связывать будем по товару:

Запрос.Текст =
    "ВЫБРАТЬ
    |    НоменклатураЗаря.Товар КАК ТоварЗаря,
    |    НоменклатураЗаря.Цена КАК ЦенаЗаря,
    |    НоменклатураРассвет.Товар КАК ТоварРассвет,
    |    НоменклатураРассвет.Цена КАК ЦенаРассвет
    |ИЗ
    |    НоменклатураЗаря КАК НоменклатураЗаря
    |        ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
    |        ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар";

Это не совсем то, что нам нужно, давайте соединим поле товар в одно и обработаем NULLы:

Запрос.Текст =
    "ВЫБРАТЬ
    //конструкция ЕСТЬNULL рассматривалась в разделе функции языка запросов
    |    ЕСТЬNULL(НоменклатураЗаря.Товар, НоменклатураРассвет.Товар) КАК Товар,
//если цена не определена, то инициализируем ее
//почему 1000000 см. пояснения ниже
    |    ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000) КАК ЦенаЗаря,
    |    ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000) КАК ЦенаРассвет
    |ИЗ
    |    НоменклатураЗаря КАК НоменклатураЗаря
    |        ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
    |        ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар";

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

Запрос.Текст =
    "ВЫБРАТЬ
    |    ЕСТЬNULL(НоменклатураЗаря.Товар, НоменклатураРассвет.Товар) КАК Товар,
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000) > ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000)
    |            ТОГДА ЕСТЬNULL(НоменклатураРассвет.Цена, 1000000)
    |        ИНАЧЕ ЕСТЬNULL(НоменклатураЗаря.Цена, 1000000)
    |    КОНЕЦ КАК Цена
    |ИЗ
    |    НоменклатураЗаря КАК НоменклатураЗаря
    |        ПОЛНОЕ СОЕДИНЕНИЕ НоменклатураРассвет КАК НоменклатураРассвет
    |        ПО НоменклатураЗаря.Товар = НоменклатураРассвет.Товар";

Если цена не определена (NULL), то ее необходимо инициализировать каким либо значением, иначе операция сравнения на больше/меньше вывалится с ошибкой. инициализируем цену нереально большой суммой, чтобы она "проиграла" в операции сравнения, ведь по условию задачи мы подбираем наименьшую цену.

 

← Функции языка запросов 1C 8 | Объединения в запросах 1С 8 →

 

Добавить комментарий

zapros-1c-8.ru

Профессия — 1С » Соединение таблиц в запросах 1С

ЛЕВОЕ СОЕДИНЕНИЕ

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

КодТовара Наименование
001 Яблоки
002 Апельсины
003 Мандарины

Сформируем эту таблицу в консоли запросов 1С с помощью вот такого запроса:


 ВЫБРАТЬ
 "001" КАК КодТовара,
 "Яблоки" КАК Наименование
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "002",
 "Апельсины"
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "003",
 "Мандарины"
 

А еще есть таблица «Страны» вот такого вида:

КодТовара Страна
001 Россия
002 Турция
003 Марокко

Также сконструируем ее запросом:


 ВЫБРАТЬ
 "001" КАК КодТовара,
 "Россия" КАК Страна
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "002",
 "Турция"
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "003",
 "Марокко"
 

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


Записи будем связывать конечно же по полям КодТовара


 ВЫБРАТЬ
 "001" КАК КодТовара,
 "Яблоки" КАК Наименование
 ПОМЕСТИТЬ ВТ_Товар
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "002",
 "Апельсины"
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "003",
 "Мандарины"
 ;
 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
 "001" КАК КодТовара,
 "Россия" КАК Страна
 ПОМЕСТИТЬ ВТ_Страна
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "002",
 "Турция"
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "003",
 "Марокко"
 ;
 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
 ВТ_Товар.КодТовара,
 ВТ_Товар.Наименование,
 ВТ_Страна.Страна
 ИЗ
 ВТ_Товар КАК ВТ_Товар
 ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Страна КАК ВТ_Страна
 ПО ВТ_Товар.КодТовара = ВТ_Страна.КодТовара
 

Можете скопировать этот код в консоль запросов и выполнив его получите вот такой результат:

КодТовара Наименование Страна
001 Яблоки Россия
002 Апельсины Турция
003 Мандарины Марокко

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


Допустим для нашего товара у нас есть еще цены. Причем они могут меняться в зависимости от даты:

КодТовара Дата Цена
001 01.01.2016 120
001 01.02.2016 150
002 01.01.2016 200
004 01.01.2016 350

Здесь мы видим, что для товара с кодом 001 (Яблоки) у нас 2 записи в таблице цен. Для мандаринов цена отсутствует. И кроме того в ценах есть код товара 004, которого нет в таблице с товарами. Давайте выполним левое соединение для товаров и цен с условием связи по полю код и посмотрим, что у нас получится.


 ВЫБРАТЬ
 "001" КАК КодТовара,
 "Яблоки" КАК Наименование
 ПОМЕСТИТЬ ВТ_Товар
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "002",
 "Апельсины"
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "003",
 "Мандарины"
 ;
 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
 "001" КАК КодТовара,
 "01.01.2016" КАК Дата,
 120 КАК Цена
 ПОМЕСТИТЬ ВТ_Цена
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "001",
 "01.02.2016",
 150
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "002",
 "01.01.2016",
 200
 
 ОБЪЕДИНИТЬ ВСЕ
 ВЫБРАТЬ
 "004",
 "01.01.2016",
 350
 ;
 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
 ВТ_Товар.КодТовара,
 ВТ_Товар.Наименование,
 ВТ_Цена.Цена,
 ВТ_Цена.Дата
 ИЗ
 ВТ_Товар КАК ВТ_Товар
 ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Цена КАК ВТ_Цена
 ПО ВТ_Товар.КодТовара = ВТ_Цена.КодТовара
 

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

КодТовара Наименование Цена Дата
001 Яблоки 120 01.01.2016
001 Яблоки 150 01.02.2016
002 Апельсины 200 01.01.2016
003 Мандарины NULL NULL

Проанализируем полученный результат. Из таблицы «Товары» были выбраны все записи, т.к. она у нас основная. Для мандаринов цена имеет значение NULL, т.к. записи с кодом 003 нет в таблице с ценами. А запись с кодом 004 из таблицы цен (а она у нас вспомогательная) была проигнорирована, т.к. для нее нет соответствия в таблице товаров. И как мы видим у нас появилось 2 записи с яблоками несмотря на то, что в таблице товаров запись с кодом 001 одна. В этом и заключается некоторое коварство соединений таблиц.


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

professia1c.ru

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

Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите на сайт как ученик

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

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

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

Соединения в запросах

Соединение - одна из самых важных и нужных операций, выполняемых реляционными системами управления базами данных.

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

Для того, чтобы осознать необходимость соединений давайте решим следующую задачу.

У нас в базе есть справочник Клиенты:

Справочник Цвета:

И справочник Ассоциации:

Наша задача вывести любимые ассоциации клиентов, основываясь на цвете.

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

Для Андрея вообще нет подходящей ассоциации, так его любимый цвет красный, а ассоциаций красного цвета в базе нет.

Будем решать задачу постепенно.

Сначала запросим всех клиентов и их любимые цвета:

ВЫБРАТЬ Наименование, ЛюбимыйЦвет ИЗ Справочник.Клиенты

Затем запросим все ассоциации и их цвета:

ВЫБРАТЬ Наименование, Цвет ИЗ Справочник.Ассоциации

Теперь нам каким-то образом следует совместить первую и вторую таблицу. Чтобы это сделать запросим информацию сразу из двух таблиц. Для этого перечислим обе таблицы в секции ИЗ через запятую. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. А в секции ВЫБРАТЬ укажем поля из обеих таблиц:

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

Если мы попробуем выполнить этот запрос, то получим ошибку:

Причина ошибки в том, что поле Наименование присутствует сразу в обеих таблицах (Клиенты и Ассоциации) и система просто не знает поле из какой именно таблицы имеется в виду.

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

Таким образом полное название поля Наименование из таблицы Клиенты будет Справочник.Клиенты.Наименование.

А полное названия поля Наименование из таблицы Ассоциации будет Справочник.Ассоциации.Наименование.

Перекрёстное соединение

Перепишем предыдущий запрос с полными именами полей:

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

Только что мы произвели перекрёстное соединение двух таблиц. Обратите внимание на то, каким образом сформировался результат:

Внутреннее соединение

Очевидно, что результат перекрестного соединения двух таблиц не есть решение нашей задачи. Нам нужны не все записи из перекрёстного соединения, а только те у которых поля ЛюбимыйЦвет и Цвет имеют одинаковое значение:

Чтобы получить эти записи добавим к предыдущему запросу секцию ГДЕ:

ВЫБРАТЬ Справочник.Клиенты.Наименование, Справочник.Клиенты.ЛюбимыйЦвет, Справочник.Ассоциации.Наименование, Справочник.Ассоциации.Цвет ИЗ Справочник.Клиенты, Справочник.Ассоциации ГДЕ Справочник.Клиенты.ЛюбимыйЦвет = Справочник.Ассоциации.Цвет

Это то, что нужно - мы решили, поставленную задачу!

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

Есть ещё один вариант написания того же самого внутреннего соединения :

ВЫБРАТЬ Справочник.Клиенты.Наименование, Справочник.Клиенты.ЛюбимыйЦвет, Справочник.Ассоциации.Наименование, Справочник.Ассоциации.Цвет ИЗ Справочник.Клиенты ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Ассоциации ПО Справочник.Клиенты.ЛюбимыйЦвет = Справочник.Ассоциации.Цвет

Сравните этот и предыдущий запрос. Они совершенно одинаковы с точки зрения платформы, просто имеют разный синтаксис. И этот и предыдущий запросы содержат внутреннее соединение таблицы Клиенты с таблицей Ассоциации по полям ЛюбимыйЦвет и Цвет соответственно.

Левое внешнее соединение

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

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

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

ВЫБРАТЬ Справочник.Клиенты.Наименование, Справочник.Клиенты.ЛюбимыйЦвет, Справочник.Ассоциации.Наименование, Справочник.Ассоциации.Цвет ИЗ Справочник.Клиенты ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Ассоциации ПО Справочник.Клиенты.ЛюбимыйЦвет = Справочник.Ассоциации.Цвет

Такое соединение называется левым внешним соединением (слово внешнее можно опускать для простоты).

Результат левого внешнего соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из первой таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары).

Правое внешнее соединение

Но давайте снова вернёмся к внутреннему соединению:

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

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

ВЫБРАТЬ Справочник.Клиенты.Наименование, Справочник.Клиенты.ЛюбимыйЦвет, Справочник.Ассоциации.Наименование, Справочник.Ассоциации.Цвет ИЗ Справочник.Клиенты ПРАВОЕ СОЕДИНЕНИЕ Справочник.Ассоциации ПО Справочник.Клиенты.ЛюбимыйЦвет = Справочник.Ассоциации.Цвет

Такое соединение называется правым внешним соединением (слово внешнее можно опускать для простоты).

Результат правого внешнего соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из второй таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары).

Полное соединение

А что если нам нужно, чтобы в результат запроса попадали помимо внутреннего соединения Андрей и Снег одновременно?

Для этого потребуется совместить результаты левого и правого соединений. Такой вид соединения уже придуман и называется полным соединением:

ВЫБРАТЬ Справочник.Клиенты.Наименование, Справочник.Клиенты.ЛюбимыйЦвет, Справочник.Ассоциации.Наименование, Справочник.Ассоциации.Цвет ИЗ Справочник.Клиенты ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Ассоциации ПО Справочник.Клиенты.ЛюбимыйЦвет = Справочник.Ассоциации.Цвет

Результат полного соединения представляет из себя: все записи из внутреннего соединения ПЛЮС все записи из первой таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары) ПЛЮС все записи из второй таблицы, не попавшие во внутреннее соединение (для которых не нашлось пары).

Псевдонимы таблиц

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

Чтобы сократить полное написание имени таблицы (например, Справочник.Клиенты) допустимо (как и для самих полей)  использовать псевдонимы.

Давайте перепишем последний запрос так, чтобы при формировании полных имён полей вместо Справочник.Клиенты можно было использовать псевдоним К, а вместо Справочник.Ассоциации - псевдоним А:

ВЫБРАТЬ К.Наименование, К.ЛюбимыйЦвет, А.Наименование, А.Цвет ИЗ Справочник.Клиенты КАК К ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК А ПО К.ЛюбимыйЦвет = А.Цвет

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

ВЫБРАТЬ К.Наименование КАК Клиент, К.ЛюбимыйЦвет КАК ЕгоЦвет, А.Наименование КАК Ассоциация, А.Цвет КАК ЕёЦвет ИЗ Справочник.Клиенты КАК К ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК А ПО К.ЛюбимыйЦвет = А.Цвет

Обработка NULL

Присмотритесь к результатам последнего запроса (как впрочем и многих предыдущих на этом уроке).

Чему равны значения полей Ассоциация и ЕёЦвет для первой строчки? А что вы скажете насчет полей Клиент и ЕгоЦвет для последней строки?

Они равны NULL, которое как мы уже знаем означает отсутствие какого либо значения:

А так как NULL означает отсутствие значения, то любая попытка выполнить с ним какую-либо операцию (сравнение, сложение ...) вызовет неопределенное поведение базы данных, непредсказуемую ошибку.

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

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

В данном случае для полей Клиент и Ассоциация в случае обнаружения NULL мы будем подставлять пустую строку "".

А вот поля ЕгоЦвет и ЕёЦвет являются ссылками на элементы справочника Цвета, поэтому в них можно подставлять только значения являющиеся ссылками указанных типов. Каждый ссылочный тип (например, Справочник или Документ) имеет предопределенный элемент ПустаяСсылка. Чтобы указать его значение в запросе воспользуемся функцией ЗНАЧЕНИЕ.

Для определения того, что в поле попало NULL будем использовать уже знакомую нам по прошлым урокам функцию ЕСТЬNULL:

ВЫБРАТЬ ЕСТЬNULL( К.Наименование, "" ) КАК Клиент,   ЕСТЬNULL( К.ЛюбимыйЦвет, ЗНАЧЕНИЕ(Справочник.Цвета.ПустаяСсылка) ) КАК ЕгоЦвет,   ЕСТЬNULL( А.Наименование, "" ) КАК Ассоциация,   ЕСТЬNULL( А.Цвет, ЗНАЧЕНИЕ(Справочник.Цвета.ПустаяСсылка) ) КАК ЕёЦвет ИЗ Справочник.Клиенты КАК К ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК А ПО К.ЛюбимыйЦвет = А.Цвет

С виду (из консоли запросов) результат не изменился. Мы по-прежнему видим пустые поля. Но это только потому, что строковые представления у NULL и у пустых полей всех типов совпадают и равны пустой строке.

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

Запомните пустое значение и отсутствие значение - это две большие разницы.

Соединение более двух таблиц

Можно последовательно соединять сколько угодно таблиц.

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

Для этого последовательно соединим по цвету таблицу Клиенты с таблицей Ассоциации, а затем (получившийся результат) с таблицей Еда:

ВЫБРАТЬ К.Наименование, К.ЛюбимыйЦвет, А.Наименование, А.Цвет, Е.Наименование, Е.Цвет ИЗ Справочник.Клиенты КАК К   ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Ассоциации КАК А ПО К.ЛюбимыйЦвет = А.Цвет   ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Еда КАК Е ПО К.ЛюбимыйЦвет = Е.Цвет

Пройдите тест

Начать тест

2. Соединения бывают

внешнее, полное, внутреннее, перекрёстное

крайнее, внутреннее, левое, правое, полное

перекрёстное, внутреннее, левое, правое, полное

перекрёстное, полное, среднее, правое, левое


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

helpme1c.ru

Запросы в языке 1С 8.3, 8.2 (в примерах)

Основы запросов в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

2017-12-18T22:39:43+00:00 Основы Группировка Условия Упорядочивание Функции
Итоги Соединение Объединение Параметры

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

Оглавление (нажмите, чтобы раскрыть)

/// Как запросить все строки со значениями всех столбцов /// из таблицы в 1с 8.3, 8.2   &НаСервере Процедура КакЗапроситьВсеСтрокиИВсеСтолбцыИзТаблицыНаСервере()   // Если нужно выбрать абсолютно все столбцы // из таблицы - используем звёздочку.   Запрос = Новый Запрос( "ВЫБРАТЬ | * |ИЗ | Справочник.Номенклатура" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как запросить все строки со значениями определенных столбцов /// в 1с 8.3, 8.2   &НаСервере Процедура КакЗапроситьВсеСтрокиСЗначениямиОпределенныхСтолбцовНаСервере()   // У каждого столбца в таблице есть своё имя.   Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование, | Вкус, | Цвет |ИЗ | Справочник.Номенклатура" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как использовать в запросах псевдонимы для столбцов и таблиц /// в 1с 8.3, 8.2   &НаСервере Процедура КакИспользоватьПсевдонимыВЗапросахНаСервере()   // Псевдонимы делают текст запроса более лаконичным // и понятным.   Запрос = Новый Запрос( "ВЫБРАТЬ | Продукты.Наименование КАК ИмяПродукта, | Продукты.Вкус КАК ВкусПродукта | ИЗ | Справочник.Номенклатура КАК Продукты" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как добавить в результат запроса столбец с определенным /// значением в 1с 8.3, 8.2   &НаСервере Процедура КакДобавитьВРезультатЗапросаСтолбецСОпределеннымЗначениемНаСервере()   Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование, | 1000 КАК Цена, | Калорийность |ИЗ | Справочник.Номенклатура" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как убрать дубликаты из результата запроса в 1с 8.3, 8.2   &НаСервере Процедура КакУбратьДубликатыИзРезультатаЗапросаНаСервере()   // В справочнике Цвета есть повторящиеся элементы. // Построим запрос так, чтобы в результат попали // только различные цвета.   Запрос = Новый Запрос( "ВЫБРАТЬ РАЗЛИЧНЫЕ | Наименование |ИЗ | Справочник.Цвета" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как ограничить количество строк в результате запроса /// в 1с 8.3, 8.2   &НаСервере Процедура КакОграничитьКоличествоСтрокВРезультатеЗапросаНаСервере()   // Сделаем выборку первых 5 самых каллорийных продуктов.   Запрос = Новый Запрос( "ВЫБРАТЬ ПЕРВЫЕ 5 | Наименование, | Калорийность |ИЗ | Справочник.Номенклатура |УПОРЯДОЧИТЬ ПО | Калорийность УБЫВ" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как отобрать из таблицы только те строки, /// на чтение которых у пользователя есть права в 1с 8.3, 8.2   &НаСервере Процедура КакВыбратьТолькоРазрешенныеСтрокиНаСервере()   // Эта возможность нужна для баз, в которых // включено ограничение прав на уровне записей (RLS).   // Например, мы хотим, чтобы конкретный пользователь ни // при каких условиях не смог прочитать документы // другой организации, которые хранятся в этой же базе.   // Вот и получается, что на некоторые записи (строки) таблицы // документов ему надо дать права на чтение, а не некоторые нет.   // Если данное слово не указать, то в случае, когда запрос // выберет записи, на которые у пользователя нет прав, // запрос отработает с ошибкой.   Запрос = Новый Запрос( "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Ссылка | ИЗ | Документ.ПродажаЕды" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Скачать и выполнить эти примеры на компьютере

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)

Основы запросов в языке 1С 8.3, 8.2 (в примерах)

Основы Группировка Условия Упорядочивание Функции
Итоги Соединение Объединение Параметры

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

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

Нажмите одну из кнопок, чтобы поделиться:

helpme1c.ru

Язык запросов 1С 8.3 и 8.2

Язык запросов 1С — одно из основных отличий между версиями 7.7 и 8. Одним из важнейших пунктов в изучении 1С-программирования является язык запросов.  В 1С 8.3 запросы — самый мощный и эффективный инструмент получения данных. Язык запросов позволяет в удобном виде получать информацию из базы данных.

Сам синтаксис очень сильно напоминает классический T-SQL, за исключением того, что в 1С с помощью языка запросов можно только получать данные, используя конструкцию Выбрать(select). Язык поддерживает и более сложные конструкции, например, вложенные запросы (запрос в запросе).  Запросы в 1С 8 можно составлять как на кириллице, так и на латинице.

В статье я постараюсь рассказать про основные ключевые слова в языке запросов 1С:

  • выбрать
  • разрешенные
  • различные
  • выразить
  • первые
  • для изменения
  • значение
  • тип значения (и оператор ССЫЛКА)
  • выбор
  • сгруппировать по
  • имеющие
  • ЕСТЬNULL
  • Есть NULL
  • соединения — правые, левые, внутренние, полные.

А так же небольшие хитрости языка 1С, применяя которые вы сможете оптимально построить текст запроса.

Для отладки запросов в системе 1С 8.2 предусмотрен специальный инструмент — консоль запросов. Увидеть описание и скачать его можно по ссылке — консоль запросов 1C.

Основные конструкции языка запросов

Рассмотрим самые важные и интересные операторы языка запросов 1С.

ВЫБРАТЬ (SELECT)

В языке запросов 1С предприятия 8 любой запрос начинается с ключевого слова ВЫБРАТЬ. В языке 1С нет конструкций UPDATE, DELETE, CREATE TABLE, INSERT, эти манипуляции производятся в объектной технике. Предназначение его — только чтение данных.

Например:

ВЫБРАТЬ
ТекущийСправочник.Наименование
ИЗ
Справочник.Номенклатура КАК ТекущийСправочник

Запрос вернёт таблицу с наименованиями номенклатуры.

Рядом с конструкцией ВЫБРАТЬ можно встретить ключевые слова ДЛЯ ИЗМЕНЕНИЯ, РАЗРЕШЕННЫЕ, РАЗЛИЧНЫЕ, ПЕРВЫЕ

ДЛЯ ИЗМЕНЕНИЯ — блокирует записи таблицы на время транзакции (не актуально для управляемых блокировок). Подробнее в статье ДЛЯ ИЗМЕНЕНИЯ в запросах 1С.

РАЗРЕШЕННЫЕ — выбирает только записи из таблицы, на которые есть права у текущего пользователя.

РАЗЛИЧНЫЕ — означает, что в результат не попадет дублирующих строк.

ПЕРВЫЕ n — в языке 1С 8.3 запрос отберет только n первых записей.

ВЫБОР (CASE)

Очень часто данная конструкция недооценивается программистами. Пример её использования:

ВЫБРАТЬ

ТекущийСправочник.Наименование,

ВЫБОР

КОГДА ТекущийСправочник.Услуга ТОГДА

«Услуга»

ИНАЧЕ

«Товар»

КОНЕЦ КАК ВидНоменклатуры

ИЗ

Справочник.Номенклатура КАК ТекущийСправочник

Пример возвратит в поле «ВидНоменклатуры» текстовое значение — «Товар» или «Услуга».

ГДЕ (WHERE)

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

Пример:

ВЫБРАТЬ
Справочник.Наименование
ИЗ
ТекущийСправочник.Номенклатура КАК ТекущийСправочник
ГДЕ ТекущийСправочник.Услуга = ИСТИНА

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

«ГДЕ Услуга»

По сути, мы отбираем строки, у которых выражение после ключевого слова равно «Истина».

В выражениях можно использовать прямые условия:

ГДЕ Код = «005215»

С помощью оператора «ЗНАЧЕНИЕ()» в условиях использовать обращение к предопределенным элементам и перечислениям в запросе 1С:

ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Товар)

Значения времени могут указываться следующим образом:

ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01):

Чаще всего условия указываются в виде параметров, передаваемых в запрос:

Получите 267 видеоуроков по 1С бесплатно:

ГДЕ НоменклатурнаяГруппа= &НоменклатурнаяГруппа

Условие можно наложить на тип реквизита, если он составного типа:

ГДЕ РегистрНакопления.Регистратор ССЫЛКА Документ.ПоступленияТоваров

Если необходимо ограничивать отбор из списка значений или массива, можно поступить следующим образом:

ГДЕ РегистрНакопления.Регистратор В (&СписокДокументовДляОтбора)

Условие может быть и сложное, состоящее из нескольких условий:

ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01)  И НоменклатурнаяГруппа= &НоменклатурнаяГруппа И НЕ Услуга

СГРУППИРОВАТЬ ПО (GROUP BY)

Конструкция языка запросов 1С 8.2, используемая для группировки результата.

Например:

ВЫБРАТЬ
ПоступлениеТоваровУслугTовары.Товар,
СУММА(ПоступлениеТоваровУслугTовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугTовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугTовары

СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугTовары.Товар

Данный запрос просуммирует все поступления по сумме и количеству в разрезе номенклатуры.

Помимо ключевого слова СУММА можно использовать другие агрегатные функции: КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗНЫХ, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ.

ИМЕЮЩИЕ (HAVING)

Конструкция, о которой часто забывают, но она очень важна и полезна. Она позволяет указать отбор в виде агрегатной функции, этого нельзя сделать в конструкции ГДЕ.

Пример использования ИМЕЮЩИЕ в запросе 1С:

ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Товар,
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.товар

ИМЕЮЩИЕ

СУММА(ПоступлениеТоваровУслугТовары.Количество) > 5

Так мы отберем количество товаров, которых поступило более 5 штук.

ЗНАЧЕНИЕ()

В запросе 1C ЗНАЧЕНИЕ ()  можно использовать для указания предопределенных значений, таких как значения перечисления, пустую ссылку или значение предопределенного элемента (справочника, плана счетов, ПВХ  и т.д).

Например:

ГДЕ  Банк = Значение(Справочник.Банки.ПустаяСсылка)

или

ГДЕ ВидНоменклатуры = Значение(Справочник.ВидыНоменклатуры.Товар)

или

ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Услуга)

ТИП в запросе

Тип данных можно проверить следующим образом: с помощью функций ТИП() и ТИПЗНАЧЕНИЯ() или с помощью  логического оператора ССЫЛКА.

Пример:

ГДЕ ТИПЗНАЧЕНИЯ(Проект.Ссылка) <> ТИП(Справочник.Проект)

или

ГДЕ Проект.Ссылка ССЫЛКА Справочник.Проект

ВЫРАЗИТЬ()

Оператор Выразить в запросах 1С служит для преобразования типов данных.

Синтаксис: ВЫРАЗИТЬ(<Выражение> КАК <Тип значения>) 

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

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

Пример:

ВЫБРАТЬ
КонтактнаяИнформация.Объект,
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)) КАК Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация

СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)),
КонтактнаяИнформация.Объект

ЕСТЬNULL (ISNULL)

Достаточно полезная функция языка запросов 1С, которая проверяет значение в записи, и если оно равно NULL, то позволяет заменить на своё значение. Чаще всего используется при получении виртуальных таблиц остатков и оборотов, чтобы скрыть NULL  и поставить понятный 0 (ноль).

Пример:

ЕСТЬNULL(НалогиПредМесяца.ПримененнаяЛьготаФСС, 0)

Такая функция языка запросов 1С ЕСТЬNULL при отсутствии значения вернет ноль, что позволит избежать ошибки.

СОЕДИНЕНИЕ (JOIN)

Соединения бывают 4 типов: ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ, ВНУТРЕННЕЕ.

ЛЕВОЕ и ПРАВОЕ СОЕДИНЕНИЕ

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

Пример левого соединения в запросе 1С:

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

Вернет всю таблицу Контрагентов и заполнит поле «Банк» лишь в тех местах, где будет соблюдаться условие «Контрагенты.Наименование = Банки.Наименование». Если условие не соблюдается, в поле Банк будет установлено NULL.

ПРАВОЕ СОЕДИНЕНИЕ в языке 1С 8.3 абсолютно аналогично ЛЕВОМУ соединению, за исключением одного отличия: в ПРАВОМ СОЕДИНЕНИИ «главная» таблица — вторая, а не первая.

ПОЛНОЕ СОЕДИНЕНИЕ

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

Например:

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

ПОЛНОЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки

ПО
Клиенты.Наименование = Банки.Наименование

Язык запросов вернет обе таблицы полностью лишь по выполненному условию Соединить записи. В отличие от левого/правого соединения возможно появления NULL в двух полях.

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

ВНУТРЕННЕЕ СОЕДИНЕНИЕ отличается от полного тем, что выводит только те записи, которые смогли соединить по заданному условию.

Например:

ВЫБРАТЬ
Клиенты.Ссылка КАК Клиенты,
Банки.Ссылка КАК Банк

ИЗ
Справочник.Контрагенты КАК Клиенты

ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки

ПО
Клиенты.Наименование = Банки.Наименование

Данный запрос вернет только строки, в которых у банка и контрагента будет одинаковое наименование.

Заключение

Это лишь небольшая часть синтаксиса из языка запросов 1С 8, в дальнейшем я попробую рассмотреть более подробно некоторые моменты, показать способы оптимизации запросов и многое другое!

Рубрикатор статей сайта по запросам

Видеокурс по 1С

Если вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые виде):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

programmist1s.ru

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

Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите на сайт как ученик

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

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

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

Объединение в запросах

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

Как всегда начнём с примера.

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

Цвета мы умеем выбирать так:

ВЫБРАТЬ Наименование ИЗ Справочник.Цвета

Вкусы так:

ВЫБРАТЬ Наименование ИЗ Справочник.Вкусы

А вот, чтобы объединить эти два результата в один как раз и потребуется операция объединения:

ВЫБРАТЬ Наименование ИЗ Справочник.Цвета   ОБЪЕДИНИТЬ   ВЫБРАТЬ Наименование ИЗ Справочник.Вкусы

Обратите внимание на то, что операция объединения вовсе не гарантирует, что элементы будут идти в каком-то определённом порядке. В общем случае они могут следовать друг за другом как угодно, поэтому если важен порядок необходимо как и всегда указывать его явно (через секцию УПОРЯДОЧИТЬ).

Требования к запросам, участвующим в объединении

У объединяемых запросов должно быть одинаковое количество полей. Иначе мы получим такую ошибку:

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

ВЫБРАТЬ Наименование ИЗ Справочник.Цвета   ОБЪЕДИНИТЬ   ВЫБРАТЬ Калорийность ИЗ Справочник.Еда

Несмотря на то, что поле первого запроса имеет тип СТРОКА, а второго ЧИСЛО, нам удалось объединить их в одну таблицу. Но тип результатирующего поля стал составным и нам придётся учитывать это в дальнейшем. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Кстати, вы заметили, что поле итоговой таблицы (после объединения) называется Наименование, а не Калорийность? Эта такое правило: поля итоговой таблицы всегда имеют названия совпадающие с именами описанными в первом из объединяемых запросов.

Объединение более двух запросов

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

Напишем объединение трёх запросов:

ВЫБРАТЬ Наименование ИЗ Справочник.Цвета   ОБЪЕДИНИТЬ   ВЫБРАТЬ Калорийность ИЗ Справочник.Еда   ОБЪЕДИНИТЬ   ВЫБРАТЬ Код ИЗ Справочник.Вкусы

Повторяющиеся строки

Давайте объединим один и тот же запрос сам с собой:

ВЫБРАТЬ Наименование ИЗ Справочник.Цвета   ОБЪЕДИНИТЬ   ВЫБРАТЬ Наименование ИЗ Справочник.Цвета

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

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

Если требуется, чтобы были оставлены в том числе одинаковые строки (дубли), необходимо указать ключевое слово ВСЕ:

ВЫБРАТЬ Наименование ИЗ Справочник.Цвета   ОБЪЕДИНИТЬ ВСЕ   ВЫБРАТЬ Наименование ИЗ Справочник.Цвета

Упорядочивание при объединении

Пытаться отдельно упорядочивать результаты запросов, участвующих в объединении не имеет смысла. Поэтому при попытке написать:

ВЫБРАТЬ Наименование ИЗ Справочник.Цвета УПОРЯДОЧИТЬ ПО Наименование   ОБЪЕДИНИТЬ   ВЫБРАТЬ Наименование ИЗ Справочник.Вкусы

Получим ошибку:

Упорядочивать можно только результат объединения:

ВЫБРАТЬ Наименование ИЗ Справочник.Цвета   ОБЪЕДИНИТЬ   ВЫБРАТЬ Наименование ИЗ Справочник.Вкусы   УПОРЯДОЧИТЬ ПО Наименование УБЫВ

Обратите внимание на то, что секция УПОРЯДОЧИТЬ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.

Подведение итогов при объединении

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

ВЫБРАТЬ Вкус ИЗ Справочник.Еда ИТОГИ ПО Вкус   ОБЪЕДИНИТЬ ВСЕ   ВЫБРАТЬ Цвет ИЗ Справочник.Еда

Получим ошибку:

Подводить итоги можно только по результату объединения:

ВЫБРАТЬ Вкус ИЗ Справочник.Еда   ОБЪЕДИНИТЬ ВСЕ   ВЫБРАТЬ Цвет ИЗ Справочник.Еда   ИТОГИ ПО Вкус

Обратите внимание  на то, что секция ИТОГИ ПО в данном случае относится не к последнему запросу, а уже к результату объединения запросов.

Рабочий пример

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

Поступление еды у нас в базе происходит документом ПоступлениеЕды. У документа есть табличная часть Еда, с реквизитами Номенклатура и Количество.

Сначала выберем все строки табличной части Еда из всех поступлений:

ВЫБРАТЬ Номенклатура, Количество ИЗ Документ.ПоступлениеЕды.Еда

Теперь сгруппируем этот результат по еде с суммированием количества:

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

Аналогичным образом получим продажу еды из документов ПродажаЕды:

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

Осталось объединить эти два запроса:

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

Обратите внимание на то, как мы дополнили оба запроса ещё одним полем СУММА(0). Мы вынуждены были сделать это, так как оба запроса содержат по два поля, а объединение запросов должно содержать три поля. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Если бы мы не сделали этого, а написали просто:

ВЫБРАТЬ Номенклатура, СУММА(Количество) КАК Приход ИЗ Документ.ПоступлениеЕды.Еда СГРУППИРОВАТЬ ПО Номенклатура   ОБЪЕДИНИТЬ ВСЕ   ВЫБРАТЬ Номенклатура, СУММА(Количество) КАК Расход ИЗ Документ.ПродажаЕды.Еда СГРУППИРОВАТЬ ПО Номенклатура

то получили бы совсем другой результат:

Сравните этот и предыдущий запрос и их результаты.

Пройдите тест

а) Напишите запрос, который получает следующий результат, используя объединение:

helpme1c.ru

1С 8.x : Использование СГРУППИРОВАТЬ ПО и ИТОГИ, Виртуальные таблицы » Запросы » FAQ 1С 8.x : » HelpF.pro

Виртуальная таблица
Виртуальная таблица применяется для обращения к итогам и автоматической свертки по нужным полям.
Например:
можно получить все итоги регистра (итоги по всем измерениям и ресурсам),
Код 1C v 8.х
 Выбрать * Из РегистрНакопления.Продажи.Обороты 

итоги по контрагенту и ресурсу Сумма
Код 1C v 8.х
 Выбрать Контрагент,СуммаОборот Из РегистрНакопления.Продажи.Обороты 

итоги в разрезе контрагентов и товаров по двум ресурсам
Код 1C v 8.х
 Выбрать Контрагент,Номенклатура,СуммаОборот,СуммаУпрОборот Из РегистрНакопления.Продажи.Обороты 

Если другой информации извлекать не нужно и не нужно использовать сводные таблицы или сводные диаграммы, то в запросе НЕ НУЖНО использовать ИТОГИ и СГРУППИРОВАТЬ ПО. Это приведет только к увеличению времени выполнения запроса и пересылки результата запроса по сети.

Сгруппировать по
Конструкция - сгруппировать по аналогично методу Свернуть для таблицы значений и слову Группировка в языке запросов 7.7. При применении этой конструкции в результате запроса остаются только группировочные записи. Это ключевое слово обычно применяется совместно с агрегатными функциями в списке полей выборки.

Код 1C v 8.х
 Выбрать Контрагент,Сумма(Сумма), Максимум(Сумма), Минимум(Сумма)
ИЗ РегистрНакопления.Продажи.Обороты(&ДатаС,&ДатаПо)
Сгруппировать По Контрагент
Код 1C v 8.х
 Итоги . . . по 

Итоги применяются для построения отчетов, сводной таблицы или сводной диаграммы. Для двух последних использование ИТОГОВ обязательно!
При применении этой конструкции в результате запроса остаются детальные записи И итоговые записи (напоминает Сгруппировать По). При этом агрегатные функции перечисляются в предложении ИТОГИ, а не в списке полей ВЫБРАТЬ.
Код 1C v 8.х
 ВЫБРАТЬ
Номенклатура,
ПодразделениеКомпании,
СуммаПродажиОборот,
КоличествоОборот
ИЗ
РегистрНакопления.ПродажиКомпании.Обороты

ИТОГИ СУММА(КоличествоОборот), СУММА(СуммаПродажиОборот) ПО
ОБЩИЕ,
Номенклатура,
ПодразделениеКомпании

helpf.pro

Как поместить таблицу в запрос 1С или запрос к таблице значений

Многие начинающие программисты не знают, как поместить таблицу значений в запрос 1С 8. Очень часто это порождает распространенную ошибку — запрос в цикле. То есть разработчик не умеет включать таблицу значений в запрос и поэтому начинает обходить её в цикле и делать на каждую итерацию свой запрос. Рассмотрим на простом примере, как это сделать.

Пример

В качестве примера размещения таблицы значения в запросе 1С 8.3 возьмем простую ситуацию — есть таблица значений, в которой содержится список номенклатуры. Необходимо получить данные по остаткам на складах по каждой номенклатурной позиции.

Получите 267 видеоуроков по 1С бесплатно:

Может быть две ситуации, как создана таблица значений, — программно и уже получена откуда-то (например, ТЧ документа). Если таблица создана программно, необходимо установить тип колонки, сделать это несложно

Т.е. при добавление колонки необходимо вторым параметром указать типы данных с помощью конструктора объекта «ОписаниеТипов».

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

Обязательный нюанс — созданную таблицу необходимо поместить результат во временную таблицу, в противном случае система выдаст сообщение: «Ошибка при вызове метода контекста (Выполнить): Содержимое объекта данных может быть выбрано только во временную таблицу».

Таким образом, мы помещаем первый запрос во временную таблицу,  а потом соединяем её с регистром остатков номенклатуры.

Вот и всё, проблема решена.

Читайте также и другие статьи про язык запросов 1С.

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

programmist1s.ru

Объединение в запросах в 1С 8.3, 8.2 (в примерах)

Объединение в запросах в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

2017-12-18T22:46:15+00:00 Основы Группировка Условия Упорядочивание Функции
Итоги Соединение Объединение Параметры

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

Оглавление (нажмите, чтобы раскрыть)

/// Как объединить две таблицы в одну в 1с 8.3, 8.2   &НаСервере Процедура КакОбъединитьДвеТаблицыВОднуНаСервере()   // Требования к объединяем таблицам: // - Одинаковое количество полей   // Если соотв. друг другу поля в разных таблицах имеют // один и тот же тип, то результатирующее поле будет // также иметь этот тип.   // Если же соотв. друг другу поля в разных таблицах имеют // разный тип, то результатирующее поле будет иметь // составной тип.   // Объединим таблицу Вкусы и Цвета в одну.   Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Вкусы | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | Наименование |ИЗ | Справочник.Цвета" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как объединить больше двух таблиц в одну в 1с 8.3, 8.2   &НаСервере Процедура КакОбъединитьБольшеДвухТаблицНаСервере()   // Очень легко. Для примера объединим сразу 3 таблицы: // Контрагенты, Номенклатура и Города.   Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Контрагенты | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | Наименование |ИЗ | Справочник.Номенклатура | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | Наименование |ИЗ | Справочник.Города" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как оставить дубликаты в результате /// объединения таблиц в 1с 8.3, 8.2   &НаСервере Процедура КакОставитьДубликатыВРезультатеОбъединенияНаСервере()   // По умолчанию (при использовании ключевого слова ОБЪЕДИНИТЬ) // все дубликаты (образованные из разных запросов) из результата // объединения удаляются. Если нужно оставить все строки - // используем ОБЪЕДИНИТЬ ВСЕ   // Для примера объединим таблицу саму с собой так, чтобы дубликаты, // которые при этом неизбежно образуются остались в результате.   Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Цвета | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | Наименование |ИЗ | Справочник.Цвета" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Как упорядочить объединение таблиц в 1с 8.3, 8.2   &НаСервере Процедура КакУпорядочитьОбъединениеТаблицНаСервере()   // Нет смысла применять упорядочивание к отдельным таблицам // до их объединения. Упорядочивать (группировать, подводить итоги) // имеет смысл только конечный результат объединения.   Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Номенклатура | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | Наименование |ИЗ | Справочник.Цвета | |УПОРЯДОЧИТЬ ПО | Наименование УБЫВ" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры     /// Как объединить таблицы с разным количеством полей /// в 1с 8.3, 8.2   &НаСервере Процедура КакОбъединитьТаблицыСРазнымКоличествомПолейНаСервере()   // Нужно дописать недостающие поля и присвоить им // какие-то значения.   Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование, | Калорийность |ИЗ | Справочник.Номенклатура | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | Наименование, | 0 |ИЗ | Справочник.Вкусы" );   ВыполнитьЗапросИВывестиНаФорму(Запрос);   КонецПроцедуры   /// Скачать и выполнить эти примеры на компьютере

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)

Объединение в запросах в языке 1С 8.3, 8.2 (в примерах)

Основы Группировка Условия Упорядочивание Функции
Итоги Соединение Объединение Параметры

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

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

Нажмите одну из кнопок, чтобы поделиться:

helpme1c.ru


Смотрите также