Механизм запросов
Механизм запросов — это один из способов доступа к данным, которые поддерживает платформа. Используя этот механизм, разработчик может читать и обрабатывать данные, хранящиеся в информационной базе; изменение данных с помощью запросов невозможно. Это объясняется тем, что запросы специально предназначены для быстрого получения и обработки некоторой выборки из больших массивов данных, которые могут храниться в базе данных.
Табличный способ доступа к данным
Запросы реализуют табличный способ доступа к данным, которые хранятся в базе данных. Это означает, что все данные представляются в виде совокупности связанных между собой таблиц, к которым можно обращаться как по-отдельности, так и к нескольким таблицам во взаимосвязи:
Такой способ работы с данными позволяет получать сложные выборки данных, сгруппированные и отсортированные определенным образом. Для этих выборок могут быть рассчитаны общие и промежуточные итоги, наложены ограничения на количество или состав записей и пр.
Язык запросов
Для того чтобы разработчик имел возможность использовать запросы для реализации собственных алгоритмов, в платформе реализован язык запросов. Этот язык основан на SQL, но при этом содержит значительное количество расширений, ориентированных на отражение специфики финансово-экономических задач и на максимальное сокращение усилий по разработке прикладных решений. Можно перечислить наиболее существенные возможности, реализуемые языком запросов:
Обращение к полям через точку (».»)
Если поля какой-либо таблицы имеют ссылочный тип (хранят ссылки на объекты другой таблицы), разработчик может в тексте запроса ссылаться на них через «.», при этом количество уровней вложенности таких ссылок система не ограничивает.
Обращение к вложенным таблицам (табличным частям документов и элементов справочников)
Система поддерживает обращения к вложенным табличным частям и как к отдельным таблицам, и как к целым полям одной таблицы. Например, при обращении к документу Реализация товаров (содержащему табличную часть Товары с составом отгружаемых товаров), мы можем считать табличную часть как отдельную таблицу:
Но также мы можем считать заголовочную запись документа, в которой значением поля Товары будут все записи вложенной таблицы, подчиненные этому объекту (документу):
Автоматическое упорядочивание
Для выбора наиболее правильного («естественного») порядка вывода информации на экран или в отчет разработчику в большинстве случаев достаточно задать режим автоматического упорядочивания.
Многомерное и многоуровневое формирование итогов
Итоги и подитоги формируются с учетом группировки и иерархии, обход уровней может выполняться в произвольном порядке с подведением подитогов, обеспечивается корректное построение итогов по временным измерениям.
Поддержка виртуальных таблиц
Виртуальные таблицы, предоставляемые системой, позволяют получить практически готовые данные для большинства прикладных решений без необходимости составления сложных запросов. Например, такая виртуальная таблица может предоставить данные по остаткам товаров в разрезе периодов на какой-то момент времени. При этом виртуальные таблицы максимально используют хранимую информацию, например, ранее рассчитанные итоги и т. д.
Стандартные SQL операции
В языке запросов поддерживаются стандартные для SQL операции, такие, как объединение (Union), соединение (Join) и т. д.
Временные таблицы
Язык запросов позволяет использовать в запросах временные таблицы. С их помощью можно повысить производительность запросов, в некоторых случаях снизить количество блокировок и сделать текст запроса более легким для восприятия.
Предположим, нужно получить данные из двух регистров накопления. Данные из одного регистра поместим во временную таблицу:
Запрос, использующий временную таблицу, будет иметь вид:
Пакетные запросы
Для более удобной работы с временными таблицами в языке запросов поддерживается работа с пакетными запросами — таким образом, создание временной таблицы и ее использование помещаются в один запрос. Пакетный запрос представляет собой последовательность запросов, разделенных символом «;». Запросы исполняются один за другим. Результатом выполнения пакетного запроса в зависимости от используемого метода будет являться либо результат, возвращаемый последним запросом пакета, либо массив результатов всех запросов пакета в той последовательности, в которой следуют запросы в пакете.
Конструкторы запроса
- Конструктор запроса позволяет составить только текст запроса. Подробнее…
- Конструктор запроса с обработкой результата помимо текста запроса формирует фрагмент программного кода, который исполняет запрос и выводит результаты в табличный документ или диаграмму. Подробнее…
Консоль запросов
Инструмент «Консоль запросов» позволяет разработчикам конфигураций и специалистам по внедрению отлаживать запросы и просматривать результаты их выполнения в режиме «1С:Предприятие 8». Подробнее…
Для чего нужны виртуальные таблицы?
(0) Сможешь сделать правильный запрос по остаткам и оборотам по реальным таблицам? И я не смогу. И мало кто здесь сможет. Вот тебе и ответ.
Другой ответ. Это функции "стандартной библиотеки" 1С, синтаксически оформленные в виде "таблиц".
(6)
Дата регистрации: 27 апреля 2019; Стаж: 1 месяц 22 дня
Дата регистрации: 06 сентября 2009; Стаж: 9 лет 9 месяцев 13 дней
виртуальные таблицы-это определенным образом представленные выборки из реальных таблиц данных.
для дальнейшего использования рассматриваются только их поля,а то,что происходит при их формировании от конечного программиста скрыто.
в принципе,любой вложенный запрос можно считать виртуальной таблицей,так как на верху мы видим только выбранные данные.
Обзор виртуальных таблиц
Как известно при чтении данных платформа 1С обращается к таблицам базы данных. Но для регистров платформа 1С на основе реальных таблиц умеет формировать виртуальные таблицы, которые физически в базе данных не храняться. Это позволяет разработчику вместо того, чтобы делать сложный запрос к реальной таблице, сразу получить данные из виртуальной простейшим запросом. А также исключает возможные ошибки. Поэтому использовать виртуальные таблицы нужно всегда, когда есть такая возможность. Особенно при сдаче экзамена 1С:Специалист. Рассмотрим разные типы регистров и посмотрим какие виртуальные таблицы предоставляет платформа для каждого типа регистров.
Регистры сведений
Платформа формирует виртуальные таблицы только для периодических регистров сведений. Доступны следиющие их типы
- СрезПервых
- СрезПоследних
Регистры накопления
Для регистров накопления набор предоставляемых виртуальных таблиц также зависит от вида регистра. Как известно есть два вида регистров накопления: Остатки и Обороты
Регистр накопления остатков
Доступны следующие виртуальные таблицы
- Остатки
- Обороты
- ОстаткиИОбороты
Регистр накопления оборотов
Доступна только одна виртуальная таблица
- Обороты
Регистры расчета
Здесь также в зависимости от настроек доступны следующие виртуальные таблицы
- ДанныеГрафика
- ФактическийПериодДействия
- База
Здесь на самом деле может быть несколько виртуальных таблиц в зависимости от настроек планов видов расчета и количества регистров расчета входящих в тот или иной план видов расчета.
Допустим, что у нас есть два плана видов расчета: Начисления и Удержания. И для Удержаний в качестве базового плана видов расчета указан ПВР Начисления
В свою очередь есть три регистра расчета: Начисления, НачисленияДополнительные и Удержания. И регистры Начисления и НачисленияДополнительные включены в план видов расчета Начисления, а регистр Удержания соответственно в план видов расчета Удержания.
Регистры бухгалтерии
Самым большим набором виртуальных таблиц обладают регистры бухгалтерии
- Остатки
- Обороты
- ОборотыДтКт
- ОстаткиИОбороты
- Субконто
- ДвиженияССубконто
Но скорость обращения к регистрам бухгалтерии самая низкая. Поэтому если есть возможность получить те же остатки или обороты с использованием регистров накопления, то их и надо использовать.
Запросы в 1С
Запросы предназначены для извлечения и обработки информации из базы данных для предоставления пользователю в требуемом виде. Под обработкой здесь подразумевается группировка полей, сортировка строк, расчет итогов и т.д. Изменять данные с помощью запросов в 1С нельзя!
Запрос выполняется в соответствии с заданными инструкциями — текстом запроса. Текст запроса составляется в соответствии с синтаксисом и правилами языка запросов. Язык запросов 1С:Предприятие 8 основан на базе стандартного SQL, но имеет некоторые отличия и расширения.
Схема работы с запросом
Общая схема работы с запросом состоит из нескольких последовательных этапов:
- Создание объекта Запрос и установка текста запроса;
- Установка параметров запроса;
- Выполнение запроса и получение результата;
- Обход результата запроса и обработка полученных данных.
1. Объект Запрос имеет свойство Текст, которому необходимо присвоить текст запроса.
// Вариант 1
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта» ;// Вариант 2
Запрос = Новый Запрос ( «ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта» );
2. Установка значений параметров осуществляется методом УстановитьПараметр (< Имя >, < Значение >) . Параметры в тексте запроса обозначаются символом «&» и обычно используются в условиях отбора (секция ГДЕ) и в параметрах виртуальных таблиц.
Запрос . УстановитьПараметр ( «Валюта» , ВыбраннаяВалюта );
3. После присвоения текста и установки параметров запрос необходимо выполнить и получить результат выполнения. Выполнение производится методом Выполнить () , который возвращает объект РезультатЗапроса. Из результата запроса можно:
- получить выборку с помощью метода Выбрать (< ТипОбхода >, < Группировки >, < ГруппировкиДляЗначенийГруппировок >) ;
- выгрузить значения в таблицу значений или дерево значений с помощью метода Выгрузить (< ТипОбхода >) .
// Получение выборки
РезультатЗапроса = Запрос . Выполнить ();
Выборка = РезультатЗапроса . Выбрать ();// Получение таблицы значений
РезультатЗапроса = Запрос . Выполнить ();
Таблица = РезультатЗапроса . Выгрузить ();
4. Обойти выборку результата запроса можно с помощью цикла:
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Курс );
КонецЦикла;
Полный пример работы с запросом может выглядеть так:
// Этап 1. Создание запроса и установка текста запроса
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта» ;// Этап 2. Установка параметров
Запрос . УстановитьПараметр ( «Валюта» , ВыбраннаяВалюта );// Этап 3. Выполнение запроса и получение выборки
РезультатЗапроса = Запрос . Выполнить ();
Выборка = РезультатЗапроса . Выбрать ();// Обход выборки
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Курс );
КонецЦикла;
Состав текста запроса
Текст запроса состоит из нескольких секций:
- Описание запроса — перечень выбираемых полей и источников данных;
- Объединение запросов — выражения «ОБЪЕДИНИТЬ» и «ОБЪЕДИНИТЬ ВСЕ»;
- Упорядочивание результатов — выражение «УПОРЯДОЧИТЬ ПО …»;
- Автоупорядочивание — выражение «АВТОУПОРЯДОЧИВАНИЕ»;
- Описание итогов — выражение «ИТОГИ … ПО …».
Обязательной является только первая секция.
Временные таблицы и пакетные запросы
Язык запросов 1С поддерживает использование временных таблиц — таблиц, полученных в результате выполнения запроса и сохраненных на временной основе.
Часто можно столкнуться с ситуацией, когда в качестве источника запроса нужно использовать не таблицы базы данных, а результат выполнения другого запроса. Эту задачу можно решить с помощью вложенных запросов или временных таблиц. Применение временных таблиц позволяет упростить текст сложного запроса, разделив его на составные части, а также, в некоторых случаях, ускорить выполнение запроса и уменьшить количество блокировок. Для работы с временными таблицами используется объект МенеджерВременныхТаблиц. Создание временной таблицы производится при помощи ключевого слова ПОМЕСТИТЬ, за которым следует наименование временной таблицы.
МенеджерВТ = Новый МенеджерВременныхТаблиц ;
Запрос = Новый Запрос ;
Запрос . МенеджерВременныхТаблиц = МенеджерВТ ;Запрос . Текст =
«ВЫБРАТЬ
| Валюты.Код,
| Валюты.Наименование
|ПОМЕСТИТЬ ВТВалюты
|ИЗ
| Справочник.Валюты КАК Валюты» ;РезультатЗапроса = Запрос . Выполнить ();
Для использования временной таблицы ВТВалюты в других запросах необходимо этим запросам присвоить общий менеджер временных таблиц — МенеджерВТ.
Пакетный запрос — это запрос, в котором содержится несколько запросов, разделенных символом «;». При выполнении пакетного запроса все входящие в него запросы выполняются последовательно, причем результаты всех временных таблиц доступны всем последующим запросам. Явное присвоение менеджера временных таблиц пакетным запросам не обязательно. Если менеджер временных таблиц не присвоен, то все временные таблицы удалятся сразу после выполнения запроса.
Для пакетных запросов доступен метод ВыполнитьПакет () , который выполняет все запросы и возвращает массив результатов. Временные таблицы в пакетном запросе будут представлены таблицей с одной строкой и одной колонкой «Количество», в которой хранится количество записей. Для отладки пакетных запросов можно использовать метод ВыполнитьПакетСПромежуточнымиДанными () : он возвращает реальное содержимое временных таблиц, а не количество записей.
// Пример работы с пакетным запросом
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| Валюты.Наименование
|ИЗ
| Справочник.Валюты КАК Валюты
|;
|ВЫБРАТЬ
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура» ;РезультатПакета = Запрос . ВыполнитьПакет ();
ТЗВалюты = РезультатПакета [ 0 ]. Выгрузить ();
ТЗНоменклатура = РезультатПакета [ 1 ]. Выгрузить ();// Пример использования временных таблиц в пакетном запросе
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| Товары.Ссылка КАК Товар
|ПОМЕСТИТЬ ВТТовары
|ИЗ
| Справочник.Номенклатура КАК Товары
|ГДЕ
| Товары.Производитель = &Производитель
|;
|ВЫБРАТЬ
| ВТТовары.Товар,
| ПТУ.Количество,
| ПТУ.Цена,
| ПТУ.Ссылка КАК ДокументПоступления
|ИЗ
| ВТТовары КАК ВТТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПТУ
| ПО ВТТовары.Товар = ПТУ.Номенклатура» ;Запрос . УстановитьПараметр ( «Производитель» , Производитель );
РезультатЗапроса = Запрос . Выполнить ();
Выборка = РезультатЗапроса . Выбрать ();Пока Выборка . Следующий () Цикл
КонецЦикла;
Виртуальные таблицы
Виртуальные таблицы — это таблицы, которые не хранятся в базе данных, а формируются платформой. По своей сути это вложенные запросы к одной или нескольким физическим таблицам, выполняемые платформой. Виртуальные таблицы получают информацию только из регистров и, в основном, предназначены для решения узкоспециализированных задач.
Существуют следующие виртуальные таблицы (в скобках указаны возможные параметры):
- Для регистров сведений:
- СрезПервых(<Период>, <Условие>) — наиболее ранние записи на указанную дату;
- СрезПоследних(<Период>, <Условие>) — наиболее поздние записи на указанную дату;
- Остатки(<Период>, <Условие>) — остатки на указанную дату;
- Обороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) — обороты за период;
- ОстаткиИОбороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) — остатки и обороты за период;
- Остатки(<Период>, <УсловиеСчета>, <Субконто>, <Условие>) — остатки на указанную дату в разрезе счета, измерений и субконто;
- Обороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) — обороты за период в разрезе счета, измерений, кор. счета, субконто, кор. субконто;
- ОстатковИОборотов(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) — остатки и оборотов в разрезе счета, измерений и субконто;
- ОборотыДтКт(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) — обороты за период в разрезе счета Дт, счета Кт, Субконто Дт, Субконто Кт;
- ДвиженияССубконто(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) — движения вместе со значениями субконто;
- База(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) — базовые данные регистра расчета;
- ДанныеГрафика(<Условие>) — данные графика;
- ФактическийПериодДействия(<Условие>) — фактический период действия.
При работе с виртуальными таблицами следует накладывать отборы в параметрах виртуальных таблиц, а не в условии ГДЕ. От этого сильно зависит время выполнения запроса.
Конструктор запроса
Для ускорения ввода текстов запросов платформа имеет специальные инструменты: Конструктор запроса и Конструктор запроса с обработкой результата. Для вызова конструкторов необходимо щелкнуть правой кнопкой мыши и выбрать требуемый пункт:
Также конструкторы можно вызвать из главного меню Текст.
При помощи конструктора запроса программист может интерактивно сконструировать текст запроса. Для этого мышкой выбираются нужные таблицы и поля, устанавливаются связи, группировки, итоги и т.д. Данный подход позволяет экономить время и избавиться от возможных ошибок. В результате своей работы конструктор запроса формирует текст запроса.
Конструктор запроса с обработкой результата кроме формирования текста запроса создает готовый фрагмент кода для получения и обработки данных.
Объект СхемаЗапроса
Платформа позволяет программно создавать и редактировать текст запроса при помощи объекта СхемаЗапроса. Объект имеет единственное свойство ПакетЗапросов, в котором объекта хранятся свойства всех запросов, редактируемых в данный момент. Объект СхемаЗапроса поддерживает следующие методы:
- УстановитьТекстЗапроса (< Текст >) — заполняет свойство ПакетЗапросов на основании переданного текста запроса;
- ПолучитьТекстЗапроса () — возвращает сформированный на основании свойства ПакетЗапросов текст запроса;
Рассмотрим пример работы с объектом СхемаЗапроса. Для программного формирования текста запроса
ВЫБРАТЬ
Валюты.Ссылка КАК Валюта,
Валюты.Код
ИЗ
Справочник.Валюты КАК Валюты
ГДЕ
НЕ Валюты.ПометкаУдаленияУПОРЯДОЧИТЬ ПО
Валюты.КодКод на встроенном языке может выглядеть так:
СхемаЗапроса = Новый СхемаЗапроса ;
Пакет1 = СхемаЗапроса . ПакетЗапросов [ 0 ];
Оператор1 = Пакет1 . Операторы [ 0 ];
// добавление источника
ТаблицаРегистра = Оператор1 . Источники . Добавить ( «Справочник.Валюты» , «Валюты» );
// добавление полей
ПолеСсылка = Оператор1 . ВыбираемыеПоля . Добавить ( «Валюты.Ссылка» , 0 );
ПолеКод = Оператор1 . ВыбираемыеПоля . Добавить ( «Валюты.Код» , 1 );
// указание псевдонимов полей
Пакет1 . Колонки [ 0 ]. Псевдоним = «Валюта» ;
Пакет1 . Колонки [ 1 ]. Псевдоним = «Код» ;
// добавление условия
Оператор1 . Отбор . Добавить ( «НЕ ПометкаУдаления» );
// добавление упорядочивания
Пакет1 . Порядок . Добавить ( ПолеКод );
ТекстЗапроса = СхемаЗапроса . ПолучитьТекстЗапроса ();