Виртуальная таблица

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

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

За счет того, что в виртуальные таблицы выносится часть логики запросов, разработка приложения упрощается.

В этой статье приводится пример создания простой виртуальной таблицы в демонстрационном приложении. В рамках примера:
  • создадим виртуальную таблицу МояВиртуальнаяТаблица;
  • добавим для нее параметр Должность и ключевое поле Наименование;
  • напишем запрос, который выбирает поля Наименование, Пользователь, Регион и Роль из справочника Сотрудники, при этом Роль задается параметром Должность;
  • покажем, как обращаться к виртуальным таблицам в языке запросов;
  • создадим отчет МойОтчет с виртуальной таблицей в качестве источника данных.

Элемент проекта «Виртуальная Таблица»

Чтобы создать виртуальную таблицу в среде разработки, в представлении 1C щелкните правой кнопкой мыши по имени подсистемы и нажмите Новый > Элемент проекта в контекстном меню, выберите элемент Виртуальная Таблица и укажите имя виртуальной таблицы.

Подробнее о добавлении элемента проекта

Автоматически генерируются два файла:
  • ИмяВиртуальнойТаблицы.yaml с описанием свойств виртуальной таблицы;
  • ИмяВиртуальнойТаблицы.xbql с запросом виртуальной таблицы (создается пустой файл).

Новая виртуальная таблица в Навигаторе проекта будет выделена красным из-за пустого файла запроса.

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

Параметры

В виртуальную таблицу можно передавать параметры. Свойство Параметры имеет тип Массив<ПараметрВиртуальнойТаблицы> и является необязательным, т. е. может быть пустым.

Параметры описываются в файле ИмяВиртуальнойТаблицы.yaml. В нем должны быть объявлены все параметры, использованные в запросе виртуальной таблицы. Параметры, отсутствующие в тексте запроса, указывать нельзя.

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

Табл. 1. Свойства параметров виртуальной таблицы
Наименование Тип Описание
Имя Строка Имя параметра виртуальной таблицы. Должно быть корректным идентификатором с точки зрения языка запросов.
Тип Множество<Тип> Тип параметра. Не может быть пустым.

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

Для некоторых типов необходимо указать ограничения:

Строка — МаксимальнаяДлина,

Число — ДлинаЦелойЧасти и ДлинаДробнойЧасти.

Другие ограничения не поддерживаются.

ЗначениеПоУмолчанию Объект? Значение параметра по умолчанию. Если значение по умолчанию не указано, параметр обязателен для заполнения.

Чтобы добавить параметр в среде разработки, в представлении 1C выберите виртуальную таблицу и ее компонент Параметры. Щелкните правой кнопкой мыши и нажмите Новый > Параметр.

Укажите имя нового параметра.

В навигаторе проекта выберите новый параметр и укажите его тип и значение по умолчанию в панели Свойства справа.

Теперь свойства параметра будут отображаться в yaml-файле виртуальной таблицы.

Пример

Содержимое yaml-файла виртуальной таблицы МояВиртуальнаяТаблица с параметром Должность типа РольСотрудника:
ВидЭлемента: ВиртуальнаяТаблица
Ид: 602fb35c-955f-43d8-b7d6-700b184c93db
Имя: МояВиртуальнаяТаблица
ОбластьВидимости: ВПроекте
Параметры:
    -
        Имя: Должность
        Тип: РольСотрудника
        ЗначениеПоУмолчанию: Менеджер

Запрос виртуальной таблицы

Текст запроса виртуальной таблицы располагается в отдельном файле с именем ИмяВиртуальнойТаблицы.xbql. Запрос не может быть пустым, поэтому наличие файла и запроса в нем обязательно.

Ограничения и особенности запроса

  • Запрос должен соответствовать ограничениям для подзапросов:
    • это должен быть запрос на выборку данных (а не создание временной таблицы);
    • нельзя использовать ПЕРВЫЕ и ПОЛУЧИТЬ/СО СМЕЩЕНИЕМ без УПОРЯДОЧИТЬ ПО.
  • В запросе запрещено использовать конструкцию ВЫБРАТЬ *.
  • Для всех выражений в списке выборки должны быть указаны псевдонимы или это должны быть просто выражения выборки поля. При этом использовать два и более выражения выборки поля с одинаковым именем поля (не важно из одной таблицы или разных) без псевдонима не допускается.
  • В запросе используется синтаксис параметров аналогично произвольным запросам (&ИмяПараметра). Все параметры должны быть указаны в свойстве Параметры.
  • Не поддерживается использование источников данных на основе коллекций.

Пример

Содержимое xbql-файла виртуальной таблицы МояВиртуальнаяТаблица с запросом, который возвращает поля Наименование, Пользователь, Регион и Роль сотрудников, для которых Роль соответствует значению параметра Должность.
ВЫБРАТЬ
    Наименование КАК Наименование,
    Пользователь КАК Пользователь,
    Регион КАК Регион,
    Роль КАК Роль
ИЗ
    Сотрудники
ГДЕ
    Роль == &Должность

Ключевые поля записей

Ключевые поля записей используются для адресации записей виртуальной таблицы. Другими словами, с их помощью можно указать на какую-либо конкретную запись. Свойство КлючевыеПоля имеет тип Массив<Строка> и является необязательным.

Если ключевые поля заполнены:

  • на основе элемента проекта дополнительно порождается ссылочный структурный тип ИмяВиртуальнойТаблицы.КлючЗаписи;
  • в таблице неявно появляется поле с именем КлючЗаписи, типом ИмяВиртуальнойТаблицы.КлючЗаписи и значением ключевых полей;
  • виртуальная таблица считается ссылочной (т. е. может использоваться в динамическом списке).

Тип ИмяВиртуальнойТаблицы.КлючЗаписи доступен на сервере и клиенте. Тип является хранимым, то есть его можно использовать в языке запросов, но его нельзя использовать в типах реквизитов хранимых объектов (например, справочников и регистров). Значение ключевого поля записи получается из поля с именем КлючЗаписи.

Ключевые поля добавляются в среде разработки. Для этого в представлении 1C выберите виртуальную таблицу. В открывшейся панели Свойства добавьте элемент КлючевыеПоля.

Пример использования ключевых полей в языке запросов

В виртуальную таблицу МояВиртуальнаяТаблица добавлено ключевое поле Наименование. Запрос в методе ПримерПоискаПоКлючевомуПолю возвращает запись с соответствующим значением ключевого поля Наименование, которое в данном примере задано константой.

метод ПримерПоискаПоКлючевомуПолю()
    пер Ключ = новый МояВиртуальнаяТаблица.КлючЗаписи(Наименование="Иванов И. И.")

    пер Запрос = Запрос{
        ВЫБРАТЬ Наименование, Роль ИЗ МояВиртуальнаяТаблица ГДЕ КлючЗаписи == %Ключ
    }

    для Запись из Запрос.Выполнить()
        // какие-то действия
    ;
;

Виртуальные таблицы в отчетах

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

Подробнее о создании и отображении отчетов

Чтобы добавить виртуальную таблицу в отчет, выполните следующие действия:

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

  2. В конструкторе добавьте поля виртуальной таблицы, которые нужно отобразить в отчете (Наименование, Пользователь, Регион, Роль). Для этого выберите нужные поля на панели слева, и они отобразятся на панели отчета справа.

    В редакторе можно менять свойства отображения полей. Например, если оставить поле Пользователь без изменений, в нем будет отображаться идентификатор пользователя:

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

    Замените Пользователь на Пользователь.Представление.

    Нажмите на стрелку справа от поля <Без названия> и выберите Переименовать. Измените название поля на Пользователь и нажмите Готово.

    Выбранные поля автоматически добавятся в yaml-файл отчета.

    Пример yaml-файла отчета «МойОтчет»
    ВидЭлемента: Отчет
    Ид: a4baf1f6-fdc6-4f04-b168-2b74d0f9584d
    Имя: МойОтчет
    ОбластьВидимости: ВПроекте
    Представление: МойОтчет
    Интерфейс:
        Форма: ФормаМоегоОтчета
    ИсточникДанных: TestDev::TestDemoProject::Основное::МояВиртуальнаяТаблица
    Макет:
        ВидОтображения: СводнаяТаблица
        Поля:
            -
                Ид: ac051dacd95d40bab0fc0f2cbaecbb9a
                Выражение: Наименование
                Вид: Измерение
                ВизуальныеРоли:
                    - Строки
                Активность: Истина
            -
                Ид: 8d91d22056c3499cb7962a5590087ab0
                Выражение: Пользователь.Presentation
                Вид: Измерение
                ВизуальныеРоли:
                    - Строки
                Активность: Истина
                Представление: Пользователь
            -
                Ид: 199f85ba5a274f0a8e84c9f0d359053a
                Выражение: Регион
                Вид: Измерение
                ВизуальныеРоли:
                    - Строки
                Активность: Истина
            -
                Ид: 96a46bb80ff64ff791af130721956ee7
                Выражение: Роль
                Вид: Измерение
                ВизуальныеРоли:
                    - Строки
                Активность: Истина
  3. Добавьте форму отчета и в ее модуле опишите установку значения параметра.

    В нашем примере для отчета МойОтчет мы создали форму ФормаМоегоОтчета, куда добавили поле для ввода значения параметра — должности сотрудника. При изменении значения в этом поле вызывается метод ПриИзмененииДолжности.

    Пример yaml-файла формы отчета

    ВидЭлемента: КомпонентИнтерфейса
    Ид: 43abdbc5-e0d6-4ffd-84a3-f380aa849f07
    Имя: ФормаМоегоОтчета
    ОбластьВидимости: ВПроекте
    Наследует:
        Тип: ФормаОтчета
        Заголовок: Мой отчет с виртуальной таблицей
        Содержимое:
            Тип: ПроизвольныйШаблонФормы
            Содержимое:
                Тип: ФиксированнаяГруппа
                Содержимое:
                    -
                        Тип: АвтоматическаяГруппа
                        Содержимое:
                            -
                                Тип: ПолеВвода<РольСотрудника>
                                Имя: Должность
                                Заголовок: Должность
                                Значение:
                                    Тип: РольСотрудника
                                    Значение: Неопределено
                                ПриИзменении: ПриИзмененииДолжности
                    -
                        Тип: ПросмотрОтчета
                        Имя: ПросмотрОтчета
                        РастягиватьПоВертикали:
                            Тип: Булево
                            Значение: Истина
                        РастягиватьПоГоризонтали:
                            Тип: Булево
                            Значение: Истина
                        Отчет:
                            Тип: МойОтчет
    Пример xbsl-файла формы отчета
    // В форме имеется поле ввода для параметра Должность.
    // Метод вызывается при изменении значения в этом поле.
    метод ПриИзмененииДолжности(Источник: ПолеВвода<РольСотрудника>,
                                Событие: СобытиеПриИзменении<РольСотрудника>)
    
        знч Отчет = Компоненты.ПросмотрОтчета.Отчет как МойОтчет
    
        // Установка значения параметра.
        Отчет.Должность = Компоненты.Должность.Значение
    
        // Отображение отчета с новым значением параметра.
        Компоненты.ПросмотрОтчета.Обновить()
    ;
  4. Включите в интерфейс команду открытия формы отчета. Нажмите на элемент проекта ПанельНавигации и перейдите к секции Сервис. После команды открытия консоли запросов добавьте экземпляр навигационной команды, которая открывает форму ФормаМоегоОтчета.

    Фрагмент файла ПанельНавигации.yaml
    # Элементы панели навигации
    Элементы:
    
    # Прочие элементы...
    
    # Элементы секции Сервис
        -
            Тип: ГруппаКомандногоИнтерфейса<Команда>
            Представление: $ЛокализованныеСтроки.Сервис
            Изображение: РазделСервис.svg
            Видимость: =ПользователиКлиентИСервер.ЭтоАдминистраторПриложения()
            Элементы:
                -
                    Тип: НавигационнаяКоманда
                    Представление: $ЛокализованныеСтроки.КонсольЗапросов
                    ТипФормы: QueryConsoleForm
                -
                    Тип: НавигационнаяКоманда
                    Представление: $ЛокализованныеСтроки.ВиртуальнаяТаблица
                    ТипФормы: ФормаМоегоОтчета

    Подробнее о том, где находится командный интерфейс

Пример отчета с виртуальной таблицей