Инструменты пользователя

Инструменты сайта


1c:база:запросы

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
1c:база:запросы [2015/08/31 18:37]
admin [Соединения] уточнение
1c:база:запросы [2020/10/01 03:34] (текущий)
admin мелкое оформление
Строка 1: Строка 1:
 ====== Запросы ====== ====== Запросы ======
 ===== Описание ===== ===== Описание =====
-Запросы представляют собой, табличную модель доступа к данным. С помощью запросов удобно организовывать чтение данных, по той причине, что с помощью одного запроса (здесь читаем обращения к серверу) можно в большинстве случаев получить все необходимые для работы данные. В случае с объектной моделью доступа(работа с классом ''Справочник.Выборка''), для каждого вида объектабудет нужно отдельно обращаться к серверу. В том случае если база 1С работает под управлением СУБД (клиент-серверный вариант) использование запросов является более оптимальным, потому что работа СУБД ориентирована на использование запросов. Результатом запроса всегда является одна таблица за исключением специфических случаев (например в случае пакетного запроса). Перед тем как возьметесь за конструктор, попробуйте представить поля выходной таблицы, источники этой таблицы, приблизительно как должна получать эти данные система.+Запросы представляют собой, табличную модель доступа к данным. С помощью запросов удобно организовывать чтение данных, по той причине, что с помощью **одного** запроса (здесь читаем обращения к серверу) можно в большинстве случаев получить все необходимые для работы данные. В случае с объектной моделью доступа(работа с классом ''Справочник.Выборка''), при получении каждого элемента в переборе система будет обращаться к серверу. В том случае если база 1С работает под управлением СУБД (клиент-серверный вариант) использование запросов является более оптимальным, потому что работа СУБД ориентирована на использование запросов. **Результатом запроса всегда является одна таблица за исключением специфических случаев** (например в случае пакетного запроса). <WRAP center round tip 60%> 
 +Перед тем как возьметесь за конструктор, попробуйте представить поля выходной таблицы, источники этой таблицы, приблизительно как должна получать эти данные система. 
 +</WRAP>
  
 ===== Виды таблиц ===== ===== Виды таблиц =====
Строка 115: Строка 117:
  
 Перед построением запроса, необходимо четко определить какие данные и из каких таблиц должны попадать в результат запроса. Огромное значение имеет то, как запрос будет связывать между собой данные из нескольких таблиц. Существуют следующие виды соединений: Перед построением запроса, необходимо четко определить какие данные и из каких таблиц должны попадать в результат запроса. Огромное значение имеет то, как запрос будет связывать между собой данные из нескольких таблиц. Существуют следующие виды соединений:
-  * Декартово произведение, или cross join, такое соединение получается  если не указывать какой тип связи нам нужен, система для каждой таблицы создаст набор записей, например если в одной таблице было 7 записей а во второй 12 в результате запроса вы получите 7 * 12 = 84 то есть все комбинации которые можно составить из этих данных. Забыв указать тип соединения и объединив таблицы с несколькими десятками тысяч записей(регистр остатков товара в небольшой базе) можно создать при выполнении запроса и выводе результата серьезную нагрузку на базу. +  * **Декартово произведение**, или cross join, такое соединение получается  если не указывать какой тип связи нам нужен, система для каждой таблицы создаст набор записей, например если в одной таблице было 7 записей а во второй 12 в результате запроса вы получите 7 * 12 = 84 то есть все комбинации которые можно составить из этих данных. Забыв указать тип соединения и объединив таблицы с несколькими десятками тысяч записей(регистр остатков товара в небольшой базе) можно создать при выполнении запроса и выводе результата серьезную нагрузку на базу. 
-  * Внутреннее соединение или inner join(галочка "ВСЕ" не стоит не слева, не справа),  необходимо использовать тогда когда из двух таблиц нужно получить только те данные которые совпадают по условию связи в обоих таблицах. +  * **Внутреннее соединение** или inner join(галочка "ВСЕ" не стоит не слева, не справа),  необходимо использовать тогда когда из двух таблиц нужно получить только те данные которые совпадают по условию связи в обоих таблицах. 
-  * Левое соединение или left inner join (галочка "ВСЕ" стоит слева) – в результат запроса попадают все записи которые находятся в левой таблице, и те записи из правой таблицы которые отвечают условию связи. +  * **Левое соединение** или left inner join (галочка "ВСЕ" стоит слева) – в результат запроса попадают все записи которые находятся в левой таблице, и те записи из правой таблицы которые отвечают условию связи. 
-  * Правое соединение или right inner join тоже самое что и левое соединение, только в результат попадают все записи из таблицы справа(галочка "ВСЕ" стоит справа), следует отметить, что 1С старается придерживаться левого соединения и если вы попробуете настроить правое соединение,  с помощью конструктора, при нажатии на кнопку ОК, она поменяет местами таблицы и сделает левое соединение. +  * **Правое соединение** или right inner join тоже самое что и левое соединение, только в результат попадают все записи из таблицы справа(галочка "ВСЕ" стоит справа), следует отметить, что 1С старается придерживаться левого соединения и если вы попробуете настроить правое соединение,  с помощью конструктора, при нажатии на кнопку ОК, она поменяет местами таблицы и сделает левое соединение. 
-  * Полное соединение или full outer join (галочка "ВСЕ" стоит и слева и справа) в запрос попадут все записи из обоих таблиц, которые 1С попытается сопоставить с помощью условия связи.+  * **Полное соединение** или full outer join (галочка "ВСЕ" стоит и слева и справа) в запрос попадут все записи из обоих таблиц, которые 1С попытается сопоставить с помощью условия связи.
  
 ==== Вложенные запросы ==== ==== Вложенные запросы ====
Строка 148: Строка 150:
 ==== Использование функций ==== ==== Использование функций ====
 Язык запросов обладает ограниченным набором функций, для обработки данных, так как считается, что запросы это средство для получения данных, а не для их обработки. Но необходимый минимум, все таки имеется. Например нет возможность получить дату без времени, но есть возможность привести дату к началу дня, месяца, года, с помощью функции, начало периода. Условный оператор тоже присутствует в виде функции "Выбор". Функция "Значение" позволяет в запросе получать значения перечислений, и к некоторым значениям системных перечислений(например вид движения регистра) или значений предопределенных значений справочника. Описание функций языка запросов, отсутствует во встроенном синтаксис помощнике, но его можно найти в  справке которая находится в меню «Справка» или по кнопке F1. Там нужно открыть  содержание справки (можно сразу его открывать из этого же меню, или по shift F1) и выбрать ''Встроенный язык – Работа с запросами – Синтаксис языка запросов – Ключевые слова и функции – Функции.'' Язык запросов обладает ограниченным набором функций, для обработки данных, так как считается, что запросы это средство для получения данных, а не для их обработки. Но необходимый минимум, все таки имеется. Например нет возможность получить дату без времени, но есть возможность привести дату к началу дня, месяца, года, с помощью функции, начало периода. Условный оператор тоже присутствует в виде функции "Выбор". Функция "Значение" позволяет в запросе получать значения перечислений, и к некоторым значениям системных перечислений(например вид движения регистра) или значений предопределенных значений справочника. Описание функций языка запросов, отсутствует во встроенном синтаксис помощнике, но его можно найти в  справке которая находится в меню «Справка» или по кнопке F1. Там нужно открыть  содержание справки (можно сразу его открывать из этого же меню, или по shift F1) и выбрать ''Встроенный язык – Работа с запросами – Синтаксис языка запросов – Ключевые слова и функции – Функции.''
 +
 +===== Получение данных из табличных частей документов =====
 +Если необходимо получить данные из табличной части какого либо документа, следует обращаться напрямую к табличной части документа. Если рассматривать конструктор запросов, то вот так делать **неправильно**:
 +{{http://i.imgur.com/f3Te6zy.gif}}
 +<code>
 + Запрос.Текст = 
 + "ВЫБРАТЬ
 + | ОтчетОРозничныхПродажах.Товары.(
 + | Номенклатура
 + | )
 + |ИЗ
 + | Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах";
 +
 +</code>
 +
 +А вот так будет правильно:
 +{{http://i.imgur.com/FgYPDrB.gif}}
 +<code>
 + Запрос.Текст = 
 + "ВЫБРАТЬ
 + | ОтчетКомитентуОПродажахТовары.Номенклатура
 + |ИЗ
 + | Документ.ОтчетКомитентуОПродажах.Товары КАК ОтчетКомитентуОПродажахТовары";
 +</code>
 +Разумеется в любом случае нужно наложить условие на поле "Ссылка" что бы не получить в результате запроса табличные части всех существующих в системе документов.
1c/база/запросы.1441035432.txt.gz · Последнее изменение: 2015/08/31 18:37 — admin