Выбрать разрешенные в запросе 1с как работает

от admin

Разрешенные в запросе — зачем нужно?

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

Не проще ли оставить одну «выбрать», но подразумевать, что выборка будет содержать разрешенные значения для пользователя?

Умолчание выбрано таким образом, чтобы ошибка разработчика приводила к сообщению об ошибке (если он забыл указать РАЗРЕШЕННЫЕ там, где это нужно).

В противном случае, если разработчик забыл бы указать опцию в запросе, то ошибка бы не выдавалась пользователю, а нарушала бы бизнес-логику. Это очень опасные и трудно диагностируемые ошибки. Например, когда результат проведения документа зависел бы от того, кто его проводит.

Язык запросов 1с — оператор Выбрать

Язык запросов 1С 8 — незаменимый инструмент для программиста 1С, он позволяет писать более лаконичный, простой, понятный код, использовать меньшее количество ресурсов системы при работе с данными. Данная статья открывает серию уроков, посвященных языку запросов 1С 8. На первом уроке мы рассмотри структуру главного оператора данного языка — ВЫБРАТЬ. При помощи этого оператора можно создавать выборки из таблиц базы данных. Выбранные данные таблиц можно сортировать, накладывать на них условия, связывать и объединять с данными других таблиц, группировать по различным полям и много другое.

Язык запросов 1с предприятия 8 — Структура оператора ВЫБРАТЬ

Рассмотрим структуру оператора ВЫБРАТЬ (в квадратных скобках указаны необязательные части оператора). Язык запросов 1С предоставляет широкий набор инструментов для создания выборок данных.

Ключевые слова и блоки работы с полями

  • ВЫБРАТЬ — ключевое слово обозначающее начало оператора;
  • РАЗРЕШЕННЫЕ указывает, что в выборку должны попадать записи таблиц, доступ на чтение к которым разрешен для данного пользователя;
  • РАЗЛИЧНЫЕ указывает, что в выборку должны попадать только различные (по всем полям) стоки. Иными словами, из выборки будут исключены повторяющиеся строки;
  • ПЕРВЫЕ A если указать данное ключевое слово, то в выборку попадут только первые A из выбранных запросом строк, где A — натуральное число;
  • Блок полей — в данном блоке указываются поля, которые необходимо включить в выборку. Эти поля будут случить столбцами выборки. В самом простом случае поле выглядит следующим образом:

Ключевые слова и блоки работы с таблицами

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

    Ключевые слова и блоки преобразования данных

    • Блок группировок — данный блок служит для группировки строк таблицы. Строки объединяются в одну, если значения полей указанных после ключевого слова СГРУППИРОВАТЬ ПО оказываются одинаковыми. При этом все остальные поля суммируются, усредняются, максимизируются, либо минимизируются при помощи агрегатных функций. Агрегатные функции используют в блоке полей. Пример:
    • Блок условий — в данном блоке после ключевого слова ГДЕ указываются условные выражения разделенные логическими операторами И, ИЛИ, для того чтобы любая из выбранных строк попала в выборку, необходимо, чтобы все условия в совокупности имели значение Истина.
    • ОБЪЕДИНИТЬ ВСЕ — данное ключевое слово используется для объединения запросов (операторов ВЫБРАТЬ). Язык запросов 1С позволяет объединять несколько запросов в один. Для того, чтобы запросы можно было объединить у них должен быть одинаковый набор полей;
    • «;» — точка с запятой используется для разделения не зависимых друг от друга операторов ВЫБРАТЬ;
    • ИНДЕКСИРОВАТЬ ПО — ключевое слово используется для индексации полей указанных после него;
    • Блок итогов — используется для построения древовидных выборок. По каждому из группировочных полей, указанных после ключевого слова ПО, будет создана отдельная строка в выборке. В этой строке при помощи агрегатных функций будут посчитаны итоговые значения полей указанных после ключевого слова ИТОГИ.

    Хотите продолжить изучать язык запросов 1с 8? Тогда прочтите следующую статью: Программная работа с запросом в 1С 8

    Научитесь пользоваться конструктором запросов: Конструктор запросов 1С — обучение на примерах

    Полезные сведения о языке запросов 1С 8.х

    В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для кого-то могут быть полезны.

    Итак, начнем. Запрос — это специальный объект в 1С 8.2, который используется для формирования и выполнения запросов к таблицам базы данных в системе. Для выполнения запроса необходимо составить текст запроса, в котором описывается какие таблицы будут использоваться в качестве источников данных запроса, какие нужно выбрать поля, какие применить сортировки и группировки и т.д. Подробнее о запросах можно прочитать в книге "1С 8.2 Руководстве разработчика". Язык запросов 1С 8.2 очень похож синтаксисом на другие SQL языки запросов баз данных, но есть и отличия. Из основных преимуществ встроенного языка запросов стоит отметить разыменование полей, наличие виртуальных таблиц, удобная работа с итогами и нетипизированные поля в запросах. Из недостатков – в качестве выходного поля нельзя использовать запрос, нельзя использовать хранимые процедуры, нельзя преобразовать строку в число.

    Приведу сведения и рекомендации по языку запросов по пунктам:
    1.Для повышения читабельности запроса и уменьшения количества параметров запроса можно в запросе применять обращение к предопределенным данным конфигурации с помощью литерала ЗНАЧЕНИЕ (ПРЕДСТАВЛЕНИЕЗНАЧЕНИЯ). В качестве представления значений могут использоваться значение перечислений, предопределенные данные справочников, планов видов расчета, планов видов характеристик, планов счетов, пустые ссылки, значения точек маршрута, значения системных перечислений (например, ВидДвиженияНакопления, ВидСчета).
    Примеры:

    ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.Москва)
    ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.ПустаяСсылка)
    ГДЕ ТипТовара = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
    ГДЕ ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    ГДЕ ТочкаМаршрута =
    ЗНАЧЕНИЕ(БизнесПроцесс.Согласование.ТочкаМаршрута.Согласие)

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

    2.Автоупорядочивание в запросе может сильно тормозить процесс. Если сортировка не нужна, лучше вообще ее не использовать. Во многих случаях эффективнее записать сортировку через ключевое слово УПОРЯДОЧИТЬ ПО.

    3.Нужно следить, чтобы при использовании псевдонимов не появилось неоднозначное поле. Иначе система не поймет к какому объекту надо обращаться.
    Пример запроса с неоднозначным полем:
    ВЫБРАТЬ
    Номенклатура.Ссылка,
    ОстаткиТоваровОстатки.КоличествоОстаток
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ПО ОстаткиТоваровОстатки.Номенклатура = Номенклатура.Ссылка
    Нужно исправить псевдоним таблицы, например, так: «Справочник.Номенклатура КАК Номенклатура1», а «Номенклатура.Ссылка» соответственно исправить на «Номенклатура1.Ссылка».

    4.Иногда полезно получать представление ссылочных полей с помощью ключевого слова ПРЕДСТАВЛЕНИЕ наряду со ссылкой для того, чтобы не было повторного обращения к базе данных. Это бывает полезно при выводе результата запроса в таблицу.
    Пример:
    ВЫБРАТЬ
    ПРЕДСТАВЛЕНИЕ(Документ.Контрагент) КАК Получатель,
    ПРЕДСТАВЛЕНИЕ(Документ.Основание)
    ИЗ
    Документ.РасходнаяНакладная КАК Документ

    5.Использование в запросе ВЫРАЗИТЬ(Поле КАК Тип) позволяет убрать лишние таблицы из соединения с полем составного типа данных. Тем самым ускорить выполнение запроса.
    Пример (регистратор — поле с составным типом для физической таблицы регистранакопления ОстаткиТоваров, в запросе выбираются Дата и Номер документов ПоступлениеТоваров, при этом при обращении к реквизитам документа Дата и Номер через Регистратор не происходит множественного соединения таблицы регистра с таблицами документов, являющихся регистраторами для регистра ОстаткиТоваров):
    ВЫБРАТЬ РАЗЛИЧНЫЕ [b] ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров).Номер КАК НОМЕРПОСТУПЛЕНИЯ,[/b]
    [b]ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров).Дата КАК ДАТАПОСТУПЛЕНИЯ[/b]
    [b]ИЗ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров ГДЕ (ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров) ЕСТЬ НЕ NULL)[/b]

    6.Когда в конфигурации 1С есть пользователи, у которых права ограничены на определенные объекты конфигурации, в запросе к таким объектам необходимо использовать ключевое слово РАЗРЕШЕННЫЕ, чтобы запрос выполнился без ошибки (Выбрать Разрешенные . )

    7.При объединении таблиц, содержащих вложенные таблицы (например, Документ с табличной частью) бывает полезно ключевое слово ПУСТАЯТАБЛИЦА, когда, например, в одном из документов нет табличной части.
    Пример:
    ВЫБРАТЬ Ссылка.Номер, ПУСТАЯТАБЛИЦА.(Ном, Тов, Кол) КАК Состав
    ИЗ Документ.РасходнаяНакладная
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ Ссылка.Номер, Состав.(НомерСтроки, Номенклатура, Количество)
    ИЗ Документ.РасходнаяНакладная

    8.При работе с соединениями таблиц, содержащих по одной строке, бывает нужно склеить строки таблиц (при этом в обеих таблицах нет такого поля, по которому их можно было соединить). Этого можно добиться, применив конструкцию «ПОЛНОЕ СОЕДИНЕНИЕ Таблица По ИСТИНА». Если в таблицах больше, чем одна строка, то в результате будет количество строк, равное произведению количества строк обеих таблиц. Если в одной таблице О строк, то в результирующей таблице количество строк будет равно количеству строк второй таблицы. Также для соединения таких таблиц можно применять декартово произведение таблиц , при котором в результирующей таблице будут встречаться все комбинации строк из обеих таблиц. Надо помнить, что если в одной из таблиц 0 строк, тогда и декартово произведение будет 0, поэтому полное соединение будет лучше. Вообще вместо полного соединения ПО ИСТИНА можно использовать и любой другой тип соединения, но в таком случае тоже возможна ситуация, когда в результирующей таблице будет 0 строк, даже если в одной из таблиц будет ненулевое количество строк. В случае полного соединения такая ситуация будет только в одном случае, если количество строк в обеих таблицах равно 0. Если знать, что в таблице есть точно хотя бы одна строка, тогда можно использовать и ЛЕВОЕ СОЕДИНЕНИЕ с другой таблицей с условием ПО ИСТИНА.
    Пример (правда надуманный, для Полного соединения):
    ВЫБРАТЬ
    Первые 1
    Пол.Ссылка,
    К.Контрагент
    ИЗ
    Перечисление.Пол КАК Пол
    ПОЛНОЕ СОЕДИНЕНИЕ (Выбрать Первые 1 Д.Контрагент ИЗ Документ.РеализацияТоваров КАК Д Упорядочить По Д.МоментВремени ) КАК К
    ПО (ИСТИНА)

    9. Для того чтобы получить уникальные записи по какому-то полю, правильней вместо группировки пользоваться ключевым словом РАЗЛИЧНЫЕ в запросе, потому что такая конструкция намного наглядней и ключевое слово СГРУППИРОВАТЬ ПО имеет более широкое применение и часто используется, если дополнительно надо рассчитать агрегатные функции по группировкам. В некоторых случаях необходимо вывести ограниченное количество строк. Для этого в описании запроса в описании запроса следует указать ключевое слово ПЕРВЫЕ и после него – требуемое количество строк.
    Пример для ПЕРВЫЕ:
    Выбрать Первые 5
    Справочник.Номенклатура.Наименование,
    Справочник.Номенклатура.ЗакупочнаяЦена
    Упорядочить По
    Справочник.Номенклатура.ЗакупочнаяЦена Убыв
    Пример для РАЗЛИЧНЫЕ:
    Выбрать Различные
    Документ.Расходная.Контрагент

    10.Агрегатные функции в запросе можно использовать без ключевого слова СГРУППИРОВАТЬ. В таком случае все результаты будут сгруппированы в одну строку.
    Пример:
    Выбрать
    Сумма(Накладная.Сумма) Как Сумма
    Из
    Документ.РасходнаяНакладная.Состав Как Накладная

    11.В запросах в полях выборки можно свободно обращаться к реквизитам полей выборки. Эта возможность называется разыменованием полей выборки. Если источник данных — вложенная таблица (табличная часть документа), то в полях выборки можно обращаться также к полям основной таблицы (например, через поле Ссылка обратиться к полю основной таблицы Контрагент)
    Пример:
    ВЫБРАТЬ [b] ПоступлениеТоваровИУслугТовары.Номенклатура, ПоступлениеТоваровИУслугТовары.Номенклатура.Код, ПоступлениеТоваровИУслугТовары.Количество КАК Количество, ПоступлениеТоваровИУслугТовары.Ссылка.Контрагент ИЗ Документ.ПоступлениеТоваровИУслуг.Товары КАК ПоступлениеТоваровИУслугТовары ГДЕ ПоступлениеТоваровИУслугТовары.Ссылка = &Ссылка[/b]
    Есть одна особенность использования разыменования полей, если в запросе есть группировки. В любых запросах с группировками в списках полей запроса можно свободно обращаться к реквизитам группировочных полей.
    Пример:
    ВЫБРАТЬ
    ПоступлениеТоваровИУслугТовары.Номенклатура,
    ПоступлениеТоваровИУслугТовары.Номенклатура.Код,
    СУММА(ПоступлениеТоваровИУслугТовары.Количество) КАК Количество,
    ПоступлениеТоваровИУслугТовары.Ссылка.Контрагент,
    ПоступлениеТоваровИУслугТовары.Ссылка.Дата
    ИЗ
    Документ.ПоступлениеТоваровИУслуг.Товары КАК ПоступлениеТоваровИУслугТовары
    ГДЕ
    ПоступлениеТоваровИУслугТовары.Ссылка = &Ссылка
    СГРУППИРОВАТЬ ПО
    ПоступлениеТоваровИУслугТовары.Номенклатура,
    ПоступлениеТоваровИУслугТовары.Ссылка
    В справке 1С написано, что при наличии группировки, в полях выборки запроса могут участвовать только группировочные поля и агрегатные функции по полям выборки. Есть один исключительный случай, когда агрегатные функции применены к полям вложенной таблицы. В этом случае в списке полей выборки возможны обращения к полям таблицы верхнего уровня, без группировки результатов по этим полям.
    Пример:
    ВЫБРАТЬ
    ПоступлениеТоваровИУслуг.Товары.(СУММА(Количество),Номенклатура),
    ПоступлениеТоваровИУслуг.Ссылка,
    ПоступлениеТоваровИУслуг.Контрагент
    ИЗ
    Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
    СГРУППИРОВАТЬ ПО
    ПоступлениеТоваровИУслуг.Товары.(Номенклатура)

    12. Иногда вместо указания какого-либо поля в группировке полезно в поля выборки запроса включить параметр:
    ВЫБРАТЬ ДокТовары.Номенклатура, &Контрагент, &Период, СУММА(ДокТовары.Количество * ДокТовары.К) КАК Количество, СУММА(ДокТовары.Сумма) КАК Сумма ИЗ Документ.Приходная.Товары КАК ДокТовары ГДЕ ДокТовары.Ссылка = &Ссылка
    СГРУППИРОВАТЬ ПО ДокТовары.Номенклатура
    А затем установить параметр в тексте запроса:
    Запрос.УстановитьПараметр(«&Контрагент», ВыбКонтрагент);
    Запрос.УстановитьПараметр(«&Период», Дата);

    13. В универсальных запросах параметры можно использовать в описании источников данных запроса, в условиях ГДЕ, в условиях соединения таблиц и параметрах виртуальных таблиц. Существует два приема для создания универсальных запросов:
    А) с помощью механизма конкатенации строк, добавляя в текст запроса переменные;
    Пример1:

    ТипУпорядочивания = ?(НЕКАЯПЕРЕМЕННАЯ,"","УБЫВ");
    Запрос.Текст= "Выбрать . Упорядочить ПО Поле1 " + ТипУпорядочивания + ". ";
    Пример2:
    Запрос.Текст = "Выбрать Поле1. ";

    Если НЕКАЯПЕРЕМЕННАЯ = 1 Тогда
    Запрос.Текст = Запрос.Текст + ",Поле2 . ";
    КонецЕсли;
    Б)использовать параметры в различных частях запроса (например, в секции источников данных запроса), а затем метод встроенного языка — СТРЗАМЕНИТЬ(). При проектировании универсальных запросов полезно обращение к свойству объектов МЕТАДАННЫЕ(), с помощью которого можно определить название таблицы для какой-то ссылки (например, для документа будет примерно так — Ссылка.МЕТАДАННЫЕ().ИМЯ), переданной через параметр в некую универсальную процедуру.
    Пример:
    Выбрать
    ДокТЧ.Номенклатура,
    .
    ИЗ
    &НекийДокТЧ КАК ДокТЧ
    А затем установить параметр в тексте запроса
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "&НекийДокТЧ", "Документ."+Ссылка.Метаданные().Имя+".Товары");

    Параметры можно использовать в условиях запроса, чтобы включить опциональное условие &Параметр ИЛИ НЕ КакоеТоСвойство:
    Запрос.УстановитьПараметр(“&Параметр”, “Контрагент.Наименование=””Иванов”””);
    С помощью литерала ИСТИНА можно убирать определенные фильтры в запросе
    Запрос.УстановитьПараметр(«&Параметр»,Истина);

    14.Очень полезными в конструкторе запросов является команда контекстного меню таблицы — "Переименовать таблицу. ", с помощью которого можно придумать некоторое обобщенное имя для источника данных. Для создания запросов к однотипным таблицам, похожим по структуре, бывает полезным для второй таблицы скопировать текст запроса первой таблицы, зайти в окно конструктора запросов и в контекстном меню таблицы выбрать пункт — Заменить таблицу. и выбрать вторую талицу.

    15.При работе с созданием вложенных запросов в секциях условий или параметров виртуальных таблиц конструктора запросов используется прием выделения пробела в скобках, тогда появляется в контекстном меню пункт «Конструктор запроса», а при редактировании вложенного запроса в условии выделяют весь запрос в скобках .
    Пример вложенного запроса:
    Товар В ( Выбрать Номенклатура . )

    16. При проектировании отчетов СКД в запросах к регистрам остатков — в качестве параметра Период удобнее и правильнее использовать выражение ДобавитьКДате(КонецПериода(Период,ДЕНЬ),СЕКУДА,1), так как остатки в виртуальных получаются на начало периода, не включая последнюю секунду. Прием +1 секунда не может быть применен с документами: по новой методике проведения документов остатки по регистру надо получать на Период, заданный объектом Граница с моментом времени документа включая (а не на дату документа +1 секунда!), а по старой методике проведения — на момент времени документа (а не на дату документа !). При анализе оборотов или данных за период удобно добавлять параметр с типом СтандартныйПериод (в этом случае не надо приводить последнюю дату интервала на конец дня). У стандартного поля «НачалоПериода» в поле «Выражение» надо прописать «&Период.ДатаНачала». А у стандартного поля «КонецПериода» в поле «Выражение» прописать «&Период.ДатаОкончания». Очень много полезной информации по языку запросов можно найти не в синтакс-помощнике, а в полной справке конфигуратора 1С 8.2 (кнопка F1)

    17.Функция запроса ЕстьNull (удобнее писать англоязычный вариант IsNull) обычно используется для избавления от значений типа Null для числовых полей запроса. В ряде случаев, например полного соединения двух таблиц функция IsNull (Параметр1,Параметр2) может с успехом заменить конструкцию ВЫБОР КОГДА . ТОГДА ..ИНАЧЕ ….КОНЕЦ, когда для какого-либо поля значения NULL могут быть как в первой таблице, так и во второй (такая конструкция позволяет получать не Null значение для поля). Но надо помнить, что в отличие от условного оператора ВЫБОР функция ЕстьNull приводит тип второго аргумента к типу первого аргумента, что нужно учитывать, если типы аргументов отличаются!
    Пример:
    IsNull(Рег.Остаток,0)
    IsNull(Док.Товар,Док1.Номенклатура)

    18. У условной конструкции ВЫБОР есть альтернативный синтаксис для простого случая проверки равенства определенному значению, но, правда, он недокументированный:
    Выбор Выражение Когда 1 Тогда «Высший» Когда 2 Тогда «Средний» Иначе «Низший» Конец

    19.Оператор проверки значения на NULL Eсть Null (Можно рекомендовать использовать англоязычный вариант Is Null). Такая конструкция появилась потому, что любая операция сравнения двух величин, хотя бы одно из которых Null, всегда ложь. Написать Где Наименование = Null неправильно. Интересна также форма отрицания данного оператора Не Есть Null — неправильно, а правильно Есть Не Null или форма Не (Поле1 Есть Null) — это существенное отличие от всех операторов, использующихся совместно с оператором Не.

    20. Иногда полезна форма оператора В для проверки совпадения с одним из перечисленных значений.
    Пример:
    . Где Товар.Наименование В ("Бытовая техника","Компьютеры")
    Для справочников может быть полезна форма оператора В проверки принадлежности по иерархии.
    Пример:
    . Где Номенклатура В ИЕРАРХИИ (&Группа)
    Оператор В часто используется для проверки вхождения значения в результат вложенного запроса.
    Пример:
    . Где Номенклатура.Ссылка В (Выбрать Номенклатура.Ссылка . ).
    Во вложенном запросе можно обращаться к полям внешнего запроса в условии.
    Пример:
    // Выбрать названия товаров, которые присутствовали
    // в расходных накладных
    ВЫБРАТЬ
    Товары.Наименование
    ИЗ
    Справочник.Номенклатура КАК Товары
    ГДЕ
    Товары.Ссылка В
    (ВЫБРАТЬ
    РасходнаяНакладнаяСостав.Номенклатура
    ИЗ
    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
    ГДЕ
    РасходнаяНакладнаяСостав.Номенклатура = Товары.Ссылка)
    Операция В может использоваться с массивами, списками значений, таблицами значений, вложенными запросами. При этом возможно сокращение условий
    Синтаксис для вложенного запроса
    (выражение1, выражение2. выражениеN) В (Выбрать выражение1, выражение2. выражениеN . )
    Синтаксис для таблицы значений
    (выражение1, выражение2. выражениеN) В (&ТЗ), где в таблице значений ТЗ используются N первых колонок

    20. В интернете есть шутка по поводу того, как конструктор запроса постоянно делает ЛЕВОЕ соединение таблиц (и меняет их местами), как бы мы не указывали ПРАВОЕ:
    1С:Предприятие любит «налево».

    21. Сложные запросы удобно отлаживать в консоли запросов. Существует их в интернете много. После отладки запроса его можно скопировать и в конструкторе запроса есть замечательная кнопка «Запрос», куда можно вставить его в том же виде и сохранить (раньше была только возможность скопировать в конфигураторе и сделать форматирование запроса посредством символа переноса строки). В окне, которое открывается при нажатии кнопки «Запрос», можно редактировать запрос и смотреть результат выполнения, что довольно удобно.

    22.При проектировании отчетов СКД нужно помнить, что если нужно обеспечить фильтрацию по некоторому полю, необязательно добавлять параметр в текст запроса. У конструктора запросов есть вкладка «Компоновка данных», где можно добавлять параметры в условия. Кроме того, на уровне отчета СКД есть закладка условия, где можно добавлять произвольные условия и сохранять в быстрых настройках. В таком случае условия будут универсальными (равенство, неравенство, принадлежность, вхождение в список и т.д.).

    23. При работе с документами бывает нужно добавить сортировку по виртуальному полю таблицы МОМЕНТВРЕМЕНИ, но вот незадача — во вложенных запросах сортировка по этому полю правильно не работает. Помогают танцы с бубнами: сортировка по виртуальному полю МОМЕНТВРЕМЕНИ заменяется на две сортировки: по дате и по ссылке. Также решить проблему можно через временную таблицу переносом вложенного запроса в отдельный запрос. На протяжении уже многих релизов данная фича или баг не исправлена.
    Пример неправильно работающего запроса, получающего последний проведенный документ по указанному контрагенту (вернее, табличную часть документа):

    ВЫБРАТЬ
    РасходнаяТовары.Ссылка,
    РасходнаяТовары.НомерСтроки,
    РасходнаяТовары.Товар,
    РасходнаяТовары.Количество,
    РасходнаяТовары.Цена,
    РасходнаяТовары.Сумма
    ИЗ
    Документ.Расходная.Товары КАК РасходнаяТовары
    ГДЕ
    РасходнаяТовары.Ссылка В
    (ВЫБРАТЬ ПЕРВЫЕ 1
    Д.Ссылка
    ИЗ
    Документ.Расходная КАК Д
    ГДЕ
    Д.Ссылка.Проведен
    И Д.Контрагент = &Контрагент
    УПОРЯДОЧИТЬ ПО Д.Ссылка.МоментВремени УБЫВ)

    Возможные решения:
    A) Заменить на УПОРЯДОЧИТЬ ПО на
    УПОРЯДОЧИТЬ ПО Д.Дата УБЫВ
    УПОРЯДОЧИТЬ ПО Д.Ссылка УБЫВ

    Б) Можно перенести вложенный запрос во временную таблицу:
    ВЫБРАТЬ ПЕРВЫЕ 1
    Д.Ссылка
    ПОМЕСТИТЬ ТЗСсылка
    ИЗ
    Документ.Расходная КАК Д
    ГДЕ
    Д.Ссылка.Проведен
    И Д.Контрагент = &Контрагент

    УПОРЯДОЧИТЬ ПО
    Д.Ссылка.МоментВремени УБЫВ
    ;

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

    УПОРЯДОЧИТЬ ПО
    Расходная.МоментВремени УБЫВ

    24. При обращении к главной таблице документа(справочника) можно в условии обратиться к данным подчиненной таблицы (табличной части). Такая возможность называется разыменование полей табличной части. В качестве примера задачи можно привести задачу поиска документов, содержащих в табличной части определенный товар.
    Пример:
    Выбрать Приходная.Ссылка ИЗ Документ.Приходная Где Приходная.Товары.Номенклатура = &Номенклатура.

    Преимущество этого запроса перед запросом ко вложенной таблице Приходная.Товары в том, что если есть дубли в документах , результат запроса вернет только уникальные документы без использования ключевого слова РАЗЛИЧНЫЕ.
    Сравните:
    Выбрать Различные Товары.Ссылка ИЗ Документ.Приходная.Товары как Товары Где Товары.Номенклатура = &Номенклатура.
    На этом месте, пожалуй, всё. Понятно, что в языке запросов ещё много неосвещенных мной вопросов. Для написания статьи была использована информация, полученная мной после прохождения базового курса 1С 8.2 spec8.ru, а также из книги «1С 8.2 Руководство разработчика» и просторов интернета.
    Всем спасибо!
    Автор: fpat

    Ограничение доступа к данным

    Механизм ограничений доступа к данным (также известный как RLS, Row Level Security) позволяет управлять правами доступа не только на уровне объектов метаданных, но и на уровне объектов базы данных «1С:Предприятия». Для ограничения доступа к данным могут быть использованы следующие объекты «1С:Предприятия»:
    ● роли,
    ● параметры сеанса,
    ● функциональные опции,
    ● привилегированные общие модули,
    ● ключевое слово РАЗРЕШЕННЫЕ в языке запросов.
    Совместное использование перечисленных объектов позволяет обеспечить максимальную гибкость при необходимости разграничения прав доступа к данным между пользователями, выполняющими различные функции.
    Ограничения доступа к данным могут накладываться на следующие операции с данными (права доступа): чтение (право Чтение ), добавление (право Добавление ), изменение (право Изменение) и удаление (право Удаление ). Текущий пользователь будет иметь возможность выполнить требуемую операцию в следующих случаях:
    ● Для операций чтения и удаления объект, находящийся в базе данных, должен соответствовать ограничению доступа к данным.
    ● Для операции добавления ограничению доступа к данным должен соответствовать объект, который планируется записать в базу данных.
    ● Для операции изменения ограничению доступа к данным должен соответствовать объект как до изменения (чтобы объект был прочитан), так и после изменения (чтобы объект был записан).
    При наложении ограничений доступа к данным следует помнить, что для операций изменения, добавления и удаления можно задать только одно условие, а для операции чтения можно задать более одного ограничения доступа к данным. Это означает, что для чтения разных полей объекта могут быть заданы разные условия, причем при задании условия можно указать как имя конкретного поля, так и специальное поле Прочие поля. В первом случае условие будет накладываться только в том случае, если в выборке (которой выполняется чтение данных) будет присутствовать поле, для которого задано ограничение, а во втором – ограничение будет накладываться для всех полей объекта, кроме полей, для которых ограничения заданы явным образом.
    При задании ограничения на конкретное поле, это поле будет читано в том случае, если ограничение выполняется, а при задании ограничения на Прочие поля, данные объекта будут прочитаны только в том случае, если ограничение выполняется для всех полей объекта, попавших в запрос чтения данных.
    Для объектов базы данных следующих видов могут быть наложены различные ограничения на разные виды изменений (добавление, модификацию, удаление):
    ● Планы обмена,
    ● Справочники,
    ● Документы,
    ● Планы видов характеристик,
    ● Планы счетов,
    ● Планы видов расчета,
    ● Бизнес-процессы,
    ● Задачи.
    Для следующих видов объектов базы данных возможно наложение ограничений на чтение не только всего объекта целиком, но и отдельных его полей:
    ● Планы обмена,
    ● Справочники,
    ● Документы,
    ● Журналы документов,
    ● Планы видов характеристик,
    ● Планы счетов,
    ● Планы видов расчета,
    ● Регистры сведений,
    ● Бизнес-процессы,
    ● Задачи.
    ВНИМАНИЕ! При обращении к полям объектов базы данных посредством свойств прикладных объектов из встроенного языка «1С:Предприятия» выполняется чтение всего объекта целиком, а не только значения используемого поля. Исключением является получение представления, когда будут прочитаны только значения полей, участвующих в формировании представления.
    Ограничения доступа содержатся в ролях, они могут быть указаны для большинства объектов метаданных и записываются на специальном языке, являющимся подмножеством языка запросов.

    Язык ограничения доступа к данным

    Ограничения доступа к данным описываются на специальном языке, являющимся подмножеством языка запросов (подробное описание языка запросов . Язык ограничения доступа к данным имеет следующие изменения относительно языка запросов:
    ● В запросе ограничения доступа к данным всегда присутствует одна таблица в качестве источника данных – это таблица объекта, на который накладывается ограничение (основной объект ограничения).
    ● Сокращено описание запроса. Язык ограничения доступа к данным использует только секции ИЗ и ГДЕ языка запросов. Так, описание языка запросов выглядит следующим образом:
    ВЫБРАТЬ [ РАЗРЕШЕННЫЕ ] [ РАЗЛИЧНЫЕ ] [ ПЕРВЫЕ <Количество> ]
    < Список полей выборки >
    [ ИЗ <Список источников> ]
    [ ГДЕ <Условие отбора> ]
    [ СГРУППИРОВАТЬ ПО <Поля группировки> ]
    [ ИМЕЮЩИЕ <Условие отбора> ]
    [ ДЛЯ ИЗМЕНЕНИЯ [ <Список таблиц верхнего уровня> ]]
    В то время как описание языка запросов ограничения доступа к данным выглядит следующим образом:
    [ Псевдоним таблицы основного объекта ограничения ]
    [ ИЗ <Список источников> ]
    [ ГДЕ <Условие отбора> ]

    Во вложенных запросах, используемых в языке ограничения доступа к данным, ограничен набор допустимых возможностей ;
    ● В качестве элементов условий можно указывать параметры сеанса и функциональные опции ;
    ● В любом месте запроса ограничения доступа к данным допустимо использование шаблонов, упрощающих написание ограничений.
    Главной частью ограничения является условие, которое вычисляется для каждой записи таблицы базы данных, на которую накладывается ограничение доступа к данным. Запись считается доступной в том случае, если в результате работы условия для одной записи таблицы основного объекта ограничения получена не пустая таблица (т.е. таблица, в которой 1 или более записей). Если в результате работы условия получается пустая таблица – запись, для которой условие исполнилось таким образом, считается недоступной. Причем изменение записи таблицы основного объекта ограничения
    считается допустимым, если запись не противоречит ограничению, указанному для права, как до выполнения операции изменения, так и после выполнения этой операции.

    Поля таблиц

    В ограничениях доступа к данным можно использовать:
    ● Поля таблиц объекта, для которого описывается ограничение доступа к данным.
    Например, если ограничение накладывается на чтение элементов справочника Контрагенты, то в ограничении могут использоваться поля справочника Контрагенты и его табличных частей. В частности, наиболее простые ограничения на чтение элементов справочника Контрагенты могут выглядеть так:

    ГДЕ Наименование = “Кирпичный завод”
    Или так:

    ГДЕ Продукция.Наименование = “Кирпич красный”
    Где Продукция – это табличная часть справочника Контрагенты.
    ● Поля таблиц объектов, доступных по ссылкам в основном объекте ограничения.
    Например, если реквизит ОсновнойМенеджер справочника Контрагенты имеет тип ссылки на справочник Пользователи, то ограничение доступа может иметь, например, следующий вид:

    ГДЕ ОсновнойМенеджер.Код = “Иванов”
    Или:

    ГДЕ ОсновнойМенеджер.ФизическоеЛицо.Наименование = “Петровский”
    ● Поля таблиц объектов, связанных с основным объектом ограничения некоторыми условиями и выражения над ними.
    Например, на чтение элементов справочника Контрагенты может быть наложено следующее ограничение:

    Контрагенты
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
    ПО Контрагенты.ОсновнойМенеджер.Наименование = Пользователи.Наименование
    ГДЕ Пользователи.ФизическоеЛицо.Наименование = “Петровский”
    В этом ограничении используются поля элементов справочника Пользователи, связанных с данным элементом справочника Контрагенты по значению полей Наименование.

    Вложенные запросы

    Вложенные запросы используются для формирования наборов записей, которые могут использоваться:
    ● для связывания с таблицей основного объекта ограничения;
    ● для использования в качестве операнда операций сравнения В или НЕ В .
    Во вложенных запросах могут использоваться любые средства языка запросов, кроме:
    ● оператора В ИЕРАРХИИ ;
    ● предложения ИТОГИ ;
    ● результаты вложенных запросов не должны содержать табличные части;
    ● некоторых виртуальных таблиц, в частности ОстаткиИОбороты .
    В следующем примере ограничения на чтение из справочника Контрагенты, вложенный запрос используется в качестве набора записей для связывания с основным объектом ограничения:

    Контрагенты
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ЛЕВОЕ СОЕДИНЕНИЕ
    ( ВЫБРАТЬ
    Пользователи.Наименование, Пользователи.ФизическоеЛицо
    ИЗ
    Справочник.Пользователи КАК Пользователи
    ГДЕ
    Пользователи.Код > “Петечкин”) КАК Пользователи
    ПО Контрагенты.ОсновнойМенеджер.Наименование = Пользователи.Наименование
    ГДЕ Пользователи.ФизическоеЛицо.Наименование = “Петровский”
    В следующем примере приведено ограничение на чтение из справочника ПаспортныеДанныеФизЛиц, в котором вложенный запрос используется в
    качестве операнда операции сравнения В:

    ГДЕ
    ПаспортныеДанныеФизЛиц.ФизЛицо В
    ( ВЫБРАТЬ РАЗЛИЧНЫЕ
    Работники.ФизЛицо КАК ФизЛицо
    ИЗ
    РегистрСведений.Работники КАК Работники )
    Если во вложенном запросе необходимо получить данные из табличной части, то в разделе ИЗ вложенного запроса необходимо обращаться непосредственно к табличной части. Например, вместо:

    ВЫБРАТЬ Ссылка КАК Ссылка ,
    Продукция.Наименование КАК НаименованиеПродукции
    ИЗ Справочник.Контрагенты
    в качестве запроса, вложенного в ограничение, следует использовать:

    ВЫБРАТЬ Ссылка КАК Ссылка,
    Наименование КАК НаименованиеПродукции
    ИЗ Справочник.Контрагенты.Продукция

    Параметры сеанса

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

    ГДЕ Владелец.ДоступКУчетнойЗаписи.Пользователь = &ТекущийПользователь
    И Владелец.ДоступКУчетнойЗаписи.Администрирование = ИСТИНА

    ТекущийПользователь – это параметр сеанса

    Функциональные опции

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

    ГДЕ &УчетПоСкладам = ИСТИНА

    Где УчетПоСкладам – это функциональная опция

    Особенности использования

    В ограничениях на объекты базы данных следующих типов могут быть использованы не все поля основного объекта данных ограничения:
    ● в регистрах накопления ограничения доступа могут содержать только измерения основного объекта ограничения;
    ● в регистрах бухгалтерии в ограничениях можно использовать только балансовые измерения основного объекта ограничения.
    ПРИМЕЧАНИЕ. Если в условиях ограничения доступа к данным оборотного регистра накопления используются измерения, не входящие в итоги, то
    при обращении к виртуальной таблице оборотов не используются хранимые итоги и запрос выполняется полностью по таблице движений.

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

    Ограничения доступа проверяются при любом выполнении соответствующих операций над объектами базы данных (из диалогов, из встроенного языка, посредством запросов) и могут действовать одним из двух способов:
    ● Все . Способ «все» подразумевает, что некоторая операция над данными (из диалогов, из встроенного языка или посредством запросов) должна быть выполнена над всеми подразумеваемыми данной операцией объектами базы данных. Если при выполнении такой операции должны быть прочитаны или изменены объекты базы данных, для которых не выполняются соответствующие ограничения доступа, то операция завершается
    аварийно из-за нарушения прав доступа.
    ● Разрешенные . Способ «разрешенные» подразумевает, что при выполнении операции над данными должны быть прочитаны только те объекты базы данных, которые удовлетворяют соответствующим ограничениям доступа. Объекты базы данных, не удовлетворяющие ограничениям доступа, при выполнении такой операции считаются отсутствующими и на результат операции не влияют.
    Ограничения доступа к данным накладываются на объекты базы данных в момент обращения «1С:Предприятия» к базе данных. В клиент-серверном варианте «1С:Предприятия» наложение ограничений выполняется на сервере «1С:Предприятия».
    Способ действия ограничений, выбираемый для выполнения каждой операции над данными, определяется назначением этой операции и степенью ответственности ее результатов. В частности, способ «разрешенные» используется при отображении динамических списков и некоторых других интерактивных действиях. Способ «все» используется при выполнении любых операций с прикладными объектами из встроенного языка «1С:Предприятия», в том числе при любых изменениях объектов базы данных. Поэтому, например, могут возникнуть затруднения при построении отбора для метода Выбрать( ) менеджеров справочников, документов и других с последующим обходом результата в том случае, если на соответствующий объект установлено достаточно сложное ограничение, поскольку не всякое условие в ограничении прав доступа может быть адекватно представлено в виде отбора для метода Выбрать() .
    В запросах способом действия ограничений доступа к данным можно управлять. Для этого в языке запросов предусмотрено ключевое слово РАЗРЕШЕННЫЕ . Если в запросе не указано РАЗРЕШЕННЫЕ , то ограничения действуют способом « все» . Если слово РАЗРЕШЕННЫЕ указано, то выбирается способ «разрешенные ».
    Важно, что если в запросе не указано ключевое слово РАЗРЕШЕННЫЕ, то все отборы, заданные в этом запросе, не должны противоречить ни одному из ограничений на чтение объектов базы данных, используемых в запросе. При этом если в запросе используются виртуальные таблицы, то соответствующие отборы должны быть наложены и на сами виртуальные таблицы.
    Пример:

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

    Механизм наложения ограничений

    Любая операция над данными, хранимыми в базе данных, в «1С:Предприятии» в конечном счете приводит к обращению к базе данных с некоторым
    запросом на чтение или изменение данных. В процессе исполнения запросов к базе данных внутренние механизмы «1С:Предприятия» выполняют наложение ограничений доступа. При этом:
    ● Формируется список прав (чтение, добавление, изменение, удаление), список таблиц базы данных и список полей, используемых этим запросом.
    ● Из всех ролей текущего пользователя выбираются ограничения доступа к данным для всех прав, таблиц и полей, задействованных в запросе. При этом если какая-нибудь роль не содержит ограничений доступа к данным какой-нибудь таблицы или поля, то это значит, что в данной таблице доступны значения требуемых полей из любой записи. Иначе говоря, отсутствие ограничения доступа к данным означает наличие ограничения
    ГДЕ Истина.
    ● Получаются текущие значения всех параметров сеанса и функциональных опций, участвующих в выбранных ограничениях.
    Для получения значения параметра сеанса от текущего пользователя не требуется наличие права на получение этого значения. Однако если значение некоторого параметра сеанса не было установлено, то произойдет ошибка и запрос к базе данных выполнен не будет.
    На получение функциональных опций оказывает влияние свойство функциональной опции Привилегированный режим при получении .
    Если это свойство сброшено, то текущий пользователь должен обладать правами на чтение объекта, в котором хранится функциональная опция.
    ● Ограничения, полученные из одной роли, объединяются операцией И .
    ● Ограничения, полученные из разных ролей, объединяются операцией ИЛИ.
    ● Построенные условия добавляются к SQL-запросам, с которыми «1С:Предприятие» обращается к СУБД. При обращении к данным со стороны условий ограничения доступа проверка прав не выполняется (ни к объектам метаданных, ни к объектам базы данных). Причем механизм добавления условий зависит от выбранного способа действия ограничений «все» или «разрешенные» .
    Способ «все»
    При наложении ограничений способом «все» к SQL-запросам добавляются условия и поля так, чтобы «1С:Предприятие» могло получить информацию о том, были ли в процессе исполнения запроса к базе данных использованы данные, запрещенные для данного пользователя или нет. Если запрещенные данные были использованы, то инициируется аварийное завершение запроса. Наложение ограничений доступа способом «все» схематически представлено на рис. 1:

    Рис. 1. Способ «все»

    Способ «разрешенные»
    При наложении ограничений способом «разрешенные» к SQL-запросам добавляются такие условия, чтобы запрещенные текущему пользователю записи не оказывали влияния на результат запроса. Иначе говоря, при наложении ограничений в режиме «разрешенные» запрещенные данному пользователю записи считаются отсутствующими,что схематически представлено на рис 3

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

    При разработке конфигураций с использованием ограничений доступа к данным могут оказаться полезными такие объекты метаданных, как параметры сеанса, функциональные опции и общие модули с флажком Привилегированный.
    Параметры сеанса
    Параметры сеанса могут использоваться в ограничениях доступа к данным аналогично тому, как в запросе могут использоваться параметры запроса.
    Функциональные опции
    Не зависящие от параметров функциональные опции могут использоваться в ограничениях доступа к данным аналогично тому, как в запросе могут использоваться параметры запроса.
    Привилегированные общие модули

    Если для общего модуля установлен флажок Привилегированный, то исполнение процедур и функций этого модуля приобретает важную специфику:
    ● В клиент-серверном варианте «1С:Предприятия» привилегированным может быть только тот модуль, который исполняется на сервере.
    ● Исполнение процедур и функций привилегированного модуля и всего, что из них вызвано, выполняется при выключенной системе ограничения
    прав, как к объектам метаданных, так и к данным. Таким образом, из привилегированного модуля может быть выполнена любая операция над
    любыми объектами даже в том случае, если текущий пользователь не имеет соответствующих прав.
    Привилегированные модули предназначены для начальной установки значений параметров сеанса, используемых в ограничениях доступа к данным.
    Еще общие модули могут быть использованы для некоторых целостных действий над данными со стороны пользователя с ограниченными правами.
    Например, если в функции пользователя входит ввод и проведение документов, но пользователь не должен иметь доступа к данным, на которые влияет проведение документа, то выполнение операции проведения может быть вынесено в привилегированный модуль. Это позволит пользователю проводить документы без предоставления ему прав на другую информацию (регистры, например).
    Привилегированный режим
    Имеется возможность программной установки привилегированного режима при работе с данными. Программная установка привилегированного режима
    может потребоваться в случае массированных операций с данными информационной базы, и при этом нет смысла проверять права доступа к данным.
    Описание привилегированного режима см. здесь.

    Использование препроцессора

    При редактировании текста ограничения доступа к данным возможно использование инструкций препроцессора. Доступны следующие инструкции:

    #ЕСЛИ <Выражение> #ТОГДА
    #ИНАЧЕЕСЛИ <Выражение> #ТОГДА
    #ИНАЧЕ
    #КОНЕЦЕСЛИ
    <Выражение> – произвольное логическое выражение на встроенном языке, результат которого имеет тип Булево. Выражение может содержать:
    ● операции сравнения <, >, <=, >= , =, <> ;
    ● логические операции И, ИЛИ, НЕ ;
    ● параметры сеанса – используется синтаксис &Параметр , где Параметр – имя параметра сеанса.
    Если результатом выражения инструкции #ЕСЛИ или #ИНАЧЕЕСЛИ является значение Истина, то в результирующий текст инструкции ограничения доступа помещается текст, расположенный после ключевого слова #ТОГДА . Если же результатом выражения является значение Ложь, то текст, расположенный после ключевого слова #ТОГДА , не помещается в текст инструкции ограничения доступа. Текст, расположенный после инструкции #ИНАЧЕ, будет помещен в результирующий текст ограничения доступа, если ни одно из ранних условий не было выполнено.
    ПРИМЕЧАНИЕ . Если текст ограничения доступа к данным содержит инструкции препроцессора, то такое ограничение не проходит проверку синтаксиса при редактировании и не может быть изменено при помощи конструктора.
    Пример:

    #ЕСЛИ &ТекущийПользователь <> “Климова” #ТОГДА
    <текст ограничения доступа>
    #КОНЕЦЕСЛИ
    Здесь ТекущийПользователь – параметр сеанса типа СправочникСсылка.Пользователи.
    Такая конструкция означает, что условие для установки ограничения доступа будет проверяться для всех пользователей из справочника, кроме пользователя Климовой.

    Шаблоны текста ограничения доступа

    Роль может содержать список шаблонов ограничения доступа, которые описываются на закладке Шаблоны ограничений формы роли. Также шаблоны ограничения доступа можно редактировать в редакторе группового редактирования ограничений доступа и шаблонов .
    Каждый шаблон ограничения доступа имеет имя и текст. Имя шаблона подчиняется обычным правилам для имен, принятых в системе «1С:Предприятие».
    Текст шаблона содержит часть текста на языке ограничения доступа к данным и может содержать параметры, которые выделяются при помощи символа
    “#”.
    После символа “#” могут следовать:
    ● Одно из ключевых слов:
    ● Параметр, после которого в скобках указывается номер параметра в шаблоне;
    ● ТекущаяТаблица – обозначает вставку в текст полного имени таблицы, для которой строится ограничение;
    ● ИмяТекущейТаблицы – обозначает вставку в текст полного имени таблицы (как строковое значение, в кавычках), к которой применяется инструкция, на текущем варианте встроенного языка;
    ● ИмяТекущегоПраваДоступа – содержит имя права, для которого выполняется текущее ограничение: ЧТЕНИЕ/READ, ДОБАВЛЕНИЕ/INSERT, ИЗМЕНЕНИЕ/
    UPDATE, УДАЛЕНИЕ/DELETE ;
    ● имя параметра шаблона – означает вставку в текст ограничения соответствующего параметра шаблона;
    ● символ “#” – обозначает вставку в текст одного символа “#”.

    В выражении ограничения доступа могут содержаться:

    ● Шаблон ограничения доступа, который указывается в формате
    #ИмяШаблона(“Значение параметра шаблона 1”, “Значение параметра шаблона 2”, …). Каждый параметр шаблона заключается в двойные кавычки. При необходимости указания в тексте параметра символа двойной кавычки следует использовать две двойные кавычки.
    ● Функция СтрСодержит(ГдеИщем, ЧтоИщем) . Функция предназначена для поиска вхождения строки ЧтоИщем в строке ГдеИщем. Возвращает Истина в случае, если вхождение обнаружено и Ложь – в противном случае.

    ● Оператор + для конкатенации строк.
    Для удобства редактирования текста шаблона на закладке Шаблоны ограничений в форме роли нужно нажать кнопку Установить текст шаблона. В открывшемся диалоге ввести текст шаблона и нажать кнопку ОК.
    Система «1С:Предприятие» выполняет проверку синтаксиса текстов шаблонов, проверку синтаксиса использования шаблонов и макроподстановку текстов шаблонов ограничения доступа роли в текст запроса.
    Макроподстановка шаблона заключается:
    ● в замене вхождений параметров в тексте шаблона на значения параметров из выражения использования шаблона в тексте ограничения;
    ● в замене выражения использования шаблона в тексте запроса на получившийся текст шаблона.
    При вызове конструктора запроса для условия, содержащего шаблоны ограничения доступа, выдается предупреждение о замене всех шаблонов.
    Далее приведены примеры шаблонов ограничений:

    Общие рекомендации по ограничению прав

    Чтобы гибко управлять доступом пользователей к данным в соответствии с функциями при установке ограничений доступа к данным, рекомендуется
    придерживаться следующих принципов:
    ● Нужно выбрать совокупность информации (может быть зависимой от текущего пользователя), для которой целесообразна предварительная подготовка. Выбранная информация должна, с одной стороны, максимально упростить ограничения доступа к данным, а с другой стороны, не должна иметь слишком большой объем. Распределить ее по параметрам сеанса.
    ● Установить значения параметров сеанса в обработчике УстановкаПараметровСеанса() модуля сеанса.
    ● Задать ограничения доступа к тем данным, для которых это оправданно (данные являются секретными или наиболее важными для сохранения целостности системы). Необходимо иметь в виду, что установка ограничения доступа может привести к замедлению любого обращения к этим данным. Излишняя сложность ограничений также может привести к замедлению.
    ● При необходимости обеспечить выполнение некоторого ограниченного количества операций над данными со стороны пользователя, которому полный доступ к этим данным давать нецелесообразно, вынести эти действия в привилегированные модули или явно включать и выключать привилегированный режим в соответствующих местах программного кода.
    ● Доступ к данным при различных проверках, выполняемых системой при записи объектов, выполняется в привилегированном режиме.

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

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

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

    ● Если для объектной таблицы заданы ограничения доступа к данным и в запросе к данным используется объединение с такой таблицей, то в условии соединения (секция запроса ПО) не допускается использование табличной части объекта с заданным ограничением доступа.
    ● Если в запросе указана таблица, у которой в запросе не используется ни одного поля, то на эту таблицу накладываются все ограничения доступа к данным. Например, запрос ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Контрагенты будет исполнен с учетом всех ограничений доступа, заданными для справочника Тест. Ограничения накладываются «по ИЛИ». Это значит, что будут доступны все записи, доступные хотя бы по одному условию. Если для каких-то полей не задано условий, то запрос будет выполнен для всех записей таблицы.
    Если в запросе используется таблица верхнего уровня, то ограничения, заданные для колонок вложенных таблиц, не накладываются.
    Если в запросе используется вложенная таблица, то накладываются ограничения как для вложенной таблицы, так и для таблицы верхнего уровня.
    Например, запрос ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Контрагенты.Договора будет исполнен с учетом всех ограничений для справочника Контрагенты, а также с учетом ограничений, относящихся к табличной части Договора.

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

    Конструктор ограничения доступа к данным

    Для вызова конструктора в табличном поле Ограничения доступа к данным в колонке Ограничение доступа нужно перейти в режим редактирования и
    нажать кнопку выбора, а в открывшейся форме нажать кнопку Конструктор запроса….
    На экран выводится форма конструктора:

    Рис. 3. Закладка «Таблицы и поля» конструктора ограничений

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

    Рис. 4. Закладка «Связи» конструктора ограничений

    На закладке Связи формируются условия, которые накладываются на связи между полями таблиц. Для ввода нового условия нужно нажать кнопку Добавить и в колонке Таблица1 выбрать одну из таблиц. В колонке Таблица2 выбрать таблицу, поля которой связаны с полями первой. Ниже списка условий расположены элементы управления, с помощью которых формируется условие связи таблиц.
    Если выбран простой тип условия, то в Поле1 и Поле2 выбираются связанные поля указанных таблиц и задается условие сравнения. Если выбраны поля, сравнение которых не производится, то в строке списка условий в колонке Условие связи выводится текст: Неверно заполненное условие.
    На закладке Условия , если требуется, нужно указать условия, по которым будет выполняться отбор исходных данных.

    Рис. 5. Закладка «Условия» конструктора ограничений

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

    Групповое редактирование ограничений прав доступа и шаблонов

    Режим группового редактирования ограничений прав доступа и шаблонов вызывается командой Все ограничения доступа контекстного меню ветки Роли . В открывшейся форме присутствуют две закладки: Ограничения доступа и Шаблоны ограничений.

    Рис. 6 Все ограничения прав доступа и шаблоны

    На закладке Ограничения доступа можно просматривать все введенные ограничения доступа в общем списке (по всем ролям, объектам, правам,комбинациям полей).
    Существует возможность добавлять ограничение доступа сразу для нескольких ролей, объектов, прав и комбинаций ролей.
    Можно фильтровать список по различным критериям.

    Рис. 7. Отбор ограничений доступа

    Режим группового редактирования позволяет удалять выделенные в списке ограничения.
    Существует возможность редактировать выделенные ограничения. При этом можно заменять состав полей и/или ограничение доступа.
    Режим группового редактирования позволяет также копировать выделенные ограничения в другие роли.

    На закладке Шаблоны ограничений можно видеть все шаблоны ограничения доступа, присутствующие в прикладном решении, при этом из собственно текста шаблона в таблице отображаются только первые 10 строк, которые завершаются символом “…”, если текст шаблона более 10 строк. В окне редактирования шаблона будет отображаться полный текст шаблона.

    Рис 8. Все шаблоны ограничения доступа

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

    Рис. 9. Отбор шаблонов ограничения доступа

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

    Читать:
    Помыла микроволновку внутри а она искрится что делать

Похожие статьи