Разбор с профессионалом (Раздел 7, 1-10)

delight

Здравствуйте! Сегодня разберем первые 10 вопросов раздела — "Табличная модель прикладного решения".

Вопрос 7.1 При настройке ограничения  доступа к данным допускается установка нескольких (по числу полей) ограничений:

1. Для права "Чтение"

2. Для права "Изменение"

3. Для права "Добавление"

4. Для права "Удаление"

5. Для всех вышеперечисленных прав

6. Для всех возможных прав

Здесь речь идет о достаточно большой теме – механизм RLS (role level security). Говоря простым языком, механизм RLS – это механизм, который позволяет ограничить доступ на уровне записей.

Например, есть продавцы, работающие в разных магазинах. С помощью механизма RLS мы можем настроить систему прав таким образом, чтобы продавцы могли видеть документы «Продажи» только по своим магазинам.

Т.е. получается, что для продавца таблица «Продажи» доступна, но не целиком, а только ее часть, ограниченная по условию магазина.

Как все это реализовано на уровне чтения данных? Все очень просто.  Система к исходному запросу добавляет секцию WHERE (ГДЕ) и вставляет условие Магазин = &Магазин. Таким образом, на СУБД отправляется запрос с ограничением доступа к данным по условию.

А теперь пару слов о том, как все это настраиваетсяsmiley.

RLS можно настраивать для следующих видов доступа: Чтение, Добавление, Изменение, Удаление. Именно для данных видов доступа будет возможность добавить RLS.

Например, у нас есть документы «Продажи».

pro_7_1_1

Настроим следующее ограничение: пользователю должны быть доступны только те документы, у которых СуммаДокумента больше 150.

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

pro_7_1_2

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

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

pro_7_1_3

В форме списка документа будут отображены только те продажи, у которых СуммаДокумента больше 150.

pro_7_1_4

Если галочку видимости убрать у Контрагента, то ограничение срабатывать в форме списка не будет. Убедитесь в этом сами.

<Прочие поля> означает, что ограничение будет работать всегда для всех полей.

pro_7_1_5

Для Чтения таких ограничений может быть несколько.

pro_7_1_6

Для Добавления, Изменения, Удаления может быть только одно условие ограничения по всем полям (<Прочие поля>). После добавления одного условия кнопка Добавить будет недоступна.

pro_7_1_7


Вопрос 7.2 При  настройке ограничения доступа к данным в качестве значений, по которым производится ограничения доступа к данным, могут использоваться:
1. Только значения параметров сеанса
2. Только данные из таблиц (запросов)
3. Значения параметров сеанса и данные из таблиц (запросов)
4. Только значения имеющие типы: Число, Строка, Булево, Дата

Описание ограничения доступа к данным возможно при помощи Конструктора ограничений доступа к данным.

pro_7_2_1

По-сути, Конструктор ограничений доступа к данным представляет собой ограниченный функционал Конструктора запроса. Очевидно, что условия строятся из полей выбранных таблиц на закладке Таблицы и поля.

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

Здесь все просто. В условиях можно использовать имя параметра сеанс. Например, в конфигурации есть параметр сеанса ТестПараметрСеанса. Описывая ограничение доступа к данным можно использовать параметр сеанса ТестПараметрСеанса.

pro_7_1_8

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


Вопрос 7.3 Каким из вышеперечисленных способов можно воспользоваться, чтобы в разделе "Поля" конструктора запросов появились код и наименование справочника?
1. Сначала заполнить раздел "Таблицы", а потом, выбирая нужные объекты из этого раздела, перенести их в раздел "Поля", используя двойной клик левой клавиши мыши
2. Не заполняя раздел "Таблицы", сразу выбирать нужные объекты из таблиц-источников данных раздела "База данных", перенося их в раздел "Поля", используя технологию Drag & Drop. Раздел "Таблицы" заполняется автоматически
3. Сначала заполнить раздел "Таблицы", а потом, выбирая нужные объекты из этого раздела, перенести их в раздел "Поля", используя кнопки на форме
4. Верны ответы 1 и 3
5. Верны ответы 1, 2 и 3

Ничего интересного. Достаточно открыть Конструтор запроса и "поиграться", проверив все три варианта ответа. Если кто не знал, то Drag & Drop означает буквально тащи и бросай. Т.е. можно зажать левую кнопку мыши на поле в секции База данных и перетащить выделанное поле в секцию Поля.


Вопрос 7.4 Для повышения скорости выполнения запроса необходимо:
1. Задавать параметры большинства реальных таблиц
2. Задавать параметры большинства виртуальных таблиц
3. Вместо задания параметров у реальной или виртуальной таблицы использовать отбор, заданный конструкцией языка запросов "ГДЕ"
4. Верны ответы 1 и 2

Представим, что у нас есть регистр накопления Продажи с видом регистра Остатки.

pro_7_4_1

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

Неправильно:

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

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

Намного логичнее сразу получать остатки по конкретному складу.

Правильно:

ВЫБРАТЬ
    ПродажиОстатки.Склад КАК Склад,
    ПродажиОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    РегистрНакопления.Продажи.Остатки(, Склад = &Склад) КАК ПродажиОстатки

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


Вопрос 7.5 Можно ли при выборе таблицы-источника в раздел "Таблицы" конструктора запросов задавать для нее новое имя (псевдоним)?
1. Да, можно
2. Да, можно, но только если в качестве источника данных выступает вложенный запрос
3. Да, можно, но только если в качестве источника данных выступает виртуальная таблица
4. Верны ответы 1 и 2
5. Верны ответы 1 и 3

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

pro_7_5_1


Вопрос 7.6 Вложенный запрос может использоваться:
1. В качестве таблицы-источника данных
2. В качестве операнда операций сравнения "В" или "НЕ В" при задании параметров виртуальной таблицы
3. В качестве операнда операций  сравнения "В" или "НЕ В" при задании конструкции языка запросов "ГДЕ"
4. Верны ответы 1, 2 и 3

Пару слов о вложенном запросе.

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

Пример использования вложенного запроса в качестве таблицы-источника данных:

ВЫБРАТЬ
    ВложенныйЗапрос.Ссылка
ИЗ
    (ВЫБРАТЬ
        РеализацияТоваровУслуг.Ссылка КАК Ссылка
    ИЗ
        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        ПоступлениеТоваровУслуг.Ссылка
    ИЗ
        Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг) КАК ВложенныйЗапрос

Пример использования вложенного запроса в качестве операнда операций сравнения "В" или "НЕ В" при задании параметров виртуальной таблицы:

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

Пример использования в качестве операнда операций  сравнения "В" или "НЕ В" при задании конструкции языка запросов "ГДЕ":

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


Вопрос 7.7 Можно ли, используя конструктор запроса, получить итоги по иерархии?
1. Можно, если для группировочного  поля указать тип итогов "Элементы и иерархия"
2. Можно, если для группировочного поля указать тип итогов "Только иерархия"
3. Верны ответы 1 и 2
4. Нельзя

Можно. Более подробно про итоги тут.

pro_7_7_1


Вопрос 7.8 На закладке "Условия" конструктора запросов отдельная строка списка условий может быть сформирована:
1. С помощью двойного клика левой клавишей мыши на нужном поле в списке доступных полей
2. Путем переноса нужного поля в список, используя технологию Drag & Drop
3. Нажать кнопку "Добавить". Если условие произвольное, то текст условия можно ввести "вручную"
4. Вызвав контекстное меню, выбрать в нем пункт "Добавить". Возможно использование произвольного выражения
5. Верны все вышеперечисленные ответы

Ничего интересного. Поехали дальшеlaugh.


Вопрос 7.9 При соединении таблиц-источников данных в конструкторе  запросов можно:
1. Назначить соединение без указания условия связи
2. Назначить соединение с указанием условия связи, причем это условие может быть только одно
3. Назначить соединение с указанием условия связи, причем это условие может быть только простое
4. Назначить необходимое количество соединений с указанием необходимого количества условий связи, причем эти условия могут быть как простые, так и  произвольные

Например, у нас есть два источника данных: ПоступлениеТовароуУслуг и РеализацияТоваровУслуг.

pro_7_9_1

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

pro_7_9_1

Упс, ошибочка.

pro_7_9_2

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

Естественно, количество условий связи может быть произвольным.

Под простым условием связи подразумевается простая связь по полямsmiley.

pro_7_9_3

Под произвольным условием связи подразумевается, например, связь с использованием вложенных запросов.

pro_7_9_4


Вопрос 7.10 На закладке "Связи" конструктора запросов можно определить:
1. Соединение таблиц-источников данных и связи между ними
2. Объединение таблиц-источников данных и связи между ними
3. Связи между полями таблицы, получаемой в результате выполнения запроса
4. Связи между полями таблицы-источника данных и таблицы, получаемой в результате выполнения запроса

Не вдаваясь в подробности, в целом, существует два вида соединения: вертикальное и горизонтальное.

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

pro_7_10_2

pro_7_10_1

Смотря на данные примеры уже можно ответить на вопрос. Второй вариант не подходит т.к. объединение (вертикальное соединение) настраивается на закладке Объединения/Псевдонимы. Третий и четвертый вариант тоже не подходят т.к. связь настраивается всегда между источниками данных, а не между источниками данных и результатом выполнения запросаsmiley.

На этом все. Надеюсь, Вам было интересноwink.

Понравилось? Не забудь поддержать сайт!

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *