Виртуальная таблица
Виртуальная таблица не имеет физического табличного представления в базе данных. Ее данные формируются в момент выполнения запроса на основе других реальных таблиц базы данных.
Виртуальные таблицы позволяют использовать произвольные запросы в отчетах. Вы создаете виртуальную таблицу с запросом, и эта таблица служит источником данных для отчета. С помощью ключевых полей записей, которые позволяют обращаться к записям виртуальной таблицы, вы можете использовать виртуальную таблицу в динамических списках.
За счет того, что в виртуальные таблицы выносится часть логики запросов, разработка приложения упрощается.
- создадим виртуальную таблицу МояВиртуальнаяТаблица;
- добавим для нее параметр Должность и ключевое поле Наименование;
- напишем запрос, который выбирает поля Наименование, Пользователь, Регион и Роль из справочника Сотрудники, при этом Роль задается параметром Должность;
- покажем, как обращаться к виртуальным таблицам в языке запросов;
- создадим отчет МойОтчет с виртуальной таблицей в качестве источника данных.
Элемент проекта «Виртуальная Таблица»
Чтобы создать виртуальную таблицу в среде разработки, в представлении 1C щелкните правой кнопкой мыши по имени подсистемы и нажмите Виртуальная Таблица и укажите имя виртуальной таблицы.
в контекстном меню, выберите элементПодробнее о добавлении элемента проекта
- ИмяВиртуальнойТаблицы.yaml с описанием свойств виртуальной таблицы;
- ИмяВиртуальнойТаблицы.xbql с запросом виртуальной таблицы (создается пустой файл).
Новая виртуальная таблица в Навигаторе проекта будет выделена красным из-за пустого файла запроса.
Если выбрать виртуальную таблицу в Навигаторе проекта, справа отобразится панель Свойства, в которой можно задать область видимости виртуальной таблицы, отметить импортируемые подсистемы, а также добавить ключевые поля.Параметры
В виртуальную таблицу можно передавать параметры. Свойство Параметры имеет тип Массив<ПараметрВиртуальнойТаблицы> и является необязательным, т. е. может быть пустым.
Параметры описываются в файле ИмяВиртуальнойТаблицы.yaml. В нем должны быть объявлены все параметры, использованные в запросе виртуальной таблицы. Параметры, отсутствующие в тексте запроса, указывать нельзя.
Если виртуальная таблица является источником данных в отчете, для параметра должно быть установлено значение по умолчанию.
Наименование | Тип | Описание |
---|---|---|
Имя | Строка | Имя параметра виртуальной таблицы. Должно быть корректным идентификатором с точки зрения языка запросов. |
Тип | Множество<Тип> | Тип параметра. Не может быть пустым. Допускаются только типы, поддерживаемые в языке запросов, или коллекция таких типов. Если используется коллекция, то это должен быть единственный тип. Тип Байты не поддерживается. Для некоторых типов необходимо указать ограничения: Строка — МаксимальнаяДлина, Число — ДлинаЦелойЧасти и ДлинаДробнойЧасти. Другие ограничения не поддерживаются. |
ЗначениеПоУмолчанию | Объект? | Значение параметра по умолчанию. Если значение по умолчанию не указано, параметр обязателен для заполнения. |
Чтобы добавить параметр в среде разработки, в представлении 1C выберите виртуальную таблицу и ее компонент Параметры. Щелкните правой кнопкой мыши и нажмите .
Укажите имя нового параметра.
В навигаторе проекта выберите новый параметр и укажите его тип и значение по умолчанию в панели Свойства справа.
Теперь свойства параметра будут отображаться в yaml-файле виртуальной таблицы.
Пример
Содержимое yaml-файла виртуальной таблицы МояВиртуальнаяТаблица с параметром Должность типа РольСотрудника:ВидЭлемента: ВиртуальнаяТаблица
Ид: 602fb35c-955f-43d8-b7d6-700b184c93db
Имя: МояВиртуальнаяТаблица
ОбластьВидимости: ВПроекте
Параметры:
-
Имя: Должность
Тип: РольСотрудника
ЗначениеПоУмолчанию: Менеджер
Запрос виртуальной таблицы
Текст запроса виртуальной таблицы располагается в отдельном файле с именем ИмяВиртуальнойТаблицы.xbql. Запрос не может быть пустым, поэтому наличие файла и запроса в нем обязательно.
Ограничения и особенности запроса
- Запрос должен соответствовать ограничениям для подзапросов:
- это должен быть запрос на выборку данных (а не создание временной таблицы);
- нельзя использовать
ПЕРВЫЕ
иПОЛУЧИТЬ
/СО СМЕЩЕНИЕМ
безУПОРЯДОЧИТЬ ПО
.
- В запросе запрещено использовать конструкцию
ВЫБРАТЬ *
. - Для всех выражений в списке выборки должны быть указаны псевдонимы или это должны быть просто выражения выборки поля. При этом использовать два и более выражения выборки поля с одинаковым именем поля (не важно из одной таблицы или разных) без псевдонима не допускается.
- В запросе используется синтаксис параметров аналогично произвольным запросам (&ИмяПараметра). Все параметры должны быть указаны в свойстве Параметры.
- Не поддерживается использование источников данных на основе коллекций.
Пример
ВЫБРАТЬ
Наименование КАК Наименование,
Пользователь КАК Пользователь,
Регион КАК Регион,
Роль КАК Роль
ИЗ
Сотрудники
ГДЕ
Роль == &Должность
Ключевые поля записей
Ключевые поля записей используются для адресации записей виртуальной таблицы. Другими
словами, с их помощью можно указать на какую-либо конкретную запись. Свойство
КлючевыеПоля имеет тип Массив<Строка>
и является необязательным.
Если ключевые поля заполнены:
- на основе элемента проекта дополнительно порождается ссылочный структурный тип ИмяВиртуальнойТаблицы.КлючЗаписи;
- в таблице неявно появляется поле с именем КлючЗаписи, типом ИмяВиртуальнойТаблицы.КлючЗаписи и значением ключевых полей;
- виртуальная таблица считается ссылочной (т. е. может использоваться в динамическом списке).
Тип ИмяВиртуальнойТаблицы.КлючЗаписи доступен на сервере и клиенте. Тип является хранимым, то есть его можно использовать в языке запросов, но его нельзя использовать в типах реквизитов хранимых объектов (например, справочников и регистров). Значение ключевого поля записи получается из поля с именем КлючЗаписи.
Ключевые поля добавляются в среде разработки. Для этого в представлении 1C выберите виртуальную таблицу. В открывшейся панели Свойства добавьте элемент КлючевыеПоля.
Пример использования ключевых полей в языке запросов
В виртуальную таблицу МояВиртуальнаяТаблица добавлено ключевое поле Наименование. Запрос в методе ПримерПоискаПоКлючевомуПолю возвращает запись с соответствующим значением ключевого поля Наименование, которое в данном примере задано константой.
метод ПримерПоискаПоКлючевомуПолю()
пер Ключ = новый МояВиртуальнаяТаблица.КлючЗаписи(Наименование="Иванов И. И.")
пер Запрос = Запрос{
ВЫБРАТЬ Наименование, Роль ИЗ МояВиртуальнаяТаблица ГДЕ КлючЗаписи == %Ключ
}
для Запись из Запрос.Выполнить()
// какие-то действия
;
;
Виртуальные таблицы в отчетах
В отчетах, для которых источником данных является виртуальная таблица с параметрами, значения параметров устанавливаются через соответствующие свойства отчета. Если для параметра не указано значение по умолчанию, виртуальную таблицу использовать в отчете нельзя.
Подробнее о создании и отображении отчетов
Чтобы добавить виртуальную таблицу в отчет, выполните следующие действия:
- Создайте элемент проекта Отчет, в качестве источника данных укажите свою виртуальную таблицу.
- В конструкторе добавьте поля виртуальной таблицы, которые нужно отобразить в
отчете (Наименование,
Пользователь, Регион,
Роль). Для этого выберите нужные поля на панели
слева, и они отобразятся на панели отчета справа.
В редакторе можно менять свойства отображения полей. Например, если оставить поле Пользователь без изменений, в нем будет отображаться идентификатор пользователя:
Отредактируем свойства отображения поля Пользователь, чтобы в нем отображалось читаемое представление пользователя. Для этого выберите .
Замените Пользователь на Пользователь.Представление.
Нажмите на стрелку справа от поля <Без названия> и выберите Переименовать. Измените название поля на Пользователь и нажмите Готово.
Выбранные поля автоматически добавятся в yaml-файл отчета.
Пример yaml-файла отчета «МойОтчет»ВидЭлемента: Отчет Ид: a4baf1f6-fdc6-4f04-b168-2b74d0f9584d Имя: МойОтчет ОбластьВидимости: ВПроекте Представление: МойОтчет Интерфейс: Форма: ФормаМоегоОтчета ИсточникДанных: TestDev::TestDemoProject::Основное::МояВиртуальнаяТаблица Макет: ВидОтображения: СводнаяТаблица Поля: - Ид: ac051dacd95d40bab0fc0f2cbaecbb9a Выражение: Наименование Вид: Измерение ВизуальныеРоли: - Строки Активность: Истина - Ид: 8d91d22056c3499cb7962a5590087ab0 Выражение: Пользователь.Presentation Вид: Измерение ВизуальныеРоли: - Строки Активность: Истина Представление: Пользователь - Ид: 199f85ba5a274f0a8e84c9f0d359053a Выражение: Регион Вид: Измерение ВизуальныеРоли: - Строки Активность: Истина - Ид: 96a46bb80ff64ff791af130721956ee7 Выражение: Роль Вид: Измерение ВизуальныеРоли: - Строки Активность: Истина
- Добавьте форму отчета и в ее модуле опишите установку значения параметра.
В нашем примере для отчета МойОтчет мы создали форму ФормаМоегоОтчета, куда добавили поле для ввода значения параметра — должности сотрудника. При изменении значения в этом поле вызывается метод ПриИзмененииДолжности.
Пример yaml-файла формы отчета
ВидЭлемента: КомпонентИнтерфейса Ид: 43abdbc5-e0d6-4ffd-84a3-f380aa849f07 Имя: ФормаМоегоОтчета ОбластьВидимости: ВПроекте Наследует: Тип: ФормаОтчета Заголовок: Мой отчет с виртуальной таблицей Содержимое: Тип: ПроизвольныйШаблонФормы Содержимое: Тип: ФиксированнаяГруппа Содержимое: - Тип: АвтоматическаяГруппа Содержимое: - Тип: ПолеВвода<РольСотрудника> Имя: Должность Заголовок: Должность Значение: Тип: РольСотрудника Значение: Неопределено ПриИзменении: ПриИзмененииДолжности - Тип: ПросмотрОтчета Имя: ПросмотрОтчета РастягиватьПоВертикали: Тип: Булево Значение: Истина РастягиватьПоГоризонтали: Тип: Булево Значение: Истина Отчет: Тип: МойОтчет
Пример xbsl-файла формы отчета// В форме имеется поле ввода для параметра Должность. // Метод вызывается при изменении значения в этом поле. метод ПриИзмененииДолжности(Источник: ПолеВвода<РольСотрудника>, Событие: СобытиеПриИзменении<РольСотрудника>) знч Отчет = Компоненты.ПросмотрОтчета.Отчет как МойОтчет // Установка значения параметра. Отчет.Должность = Компоненты.Должность.Значение // Отображение отчета с новым значением параметра. Компоненты.ПросмотрОтчета.Обновить() ;
-
Включите в интерфейс команду открытия формы отчета. Нажмите на элемент проекта ПанельНавигации и перейдите к секции Сервис. После команды открытия консоли запросов добавьте экземпляр навигационной команды, которая открывает форму ФормаМоегоОтчета.
Фрагмент файла ПанельНавигации.yaml# Элементы панели навигации Элементы: # Прочие элементы... # Элементы секции Сервис - Тип: ГруппаКомандногоИнтерфейса<Команда> Представление: $ЛокализованныеСтроки.Сервис Изображение: РазделСервис.svg Видимость: =ПользователиКлиентИСервер.ЭтоАдминистраторПриложения() Элементы: - Тип: НавигационнаяКоманда Представление: $ЛокализованныеСтроки.КонсольЗапросов ТипФормы: QueryConsoleForm - Тип: НавигационнаяКоманда Представление: $ЛокализованныеСтроки.ВиртуальнаяТаблица ТипФормы: ФормаМоегоОтчета
Пример отчета с виртуальной таблицей