1с язык запросов в настройке прав
Оператор «ПОДОБНО», в языке запросов 1С 8.3, предназначен для сравнения строковых выражений с заданным шаблоном. Результатом такой проверки будет «Ложь» или «Истина». Отличие от оператора « = », заключается в возможности использования спецсимволов.
Синтаксис:
Следует понимать, что спецсимволы оператора ПОДОБНО несут служебный характер и их смысл (назначение) отличается от обычных символов.
Пояснение спецсимволов:
- « % » — любое количество обычных произвольных символов;
- « _ » — один любой обычный символ;
- « […] » — в таких скобках, возможно, указать последовательность обычных символов или диапазон (а-д, 0-5 и подобные);
- « [^…] » — с помощью знака « ^ » в квадратных скобках, можно исключить последовательность обычных символов или диапазон (а-д, 0-5 и подобные).
Рассмотрим работу такого оператора на примерах.
Оператор «ПОДОБНО» в полях выборки запроса
ВЫБРАТЬ
Номенклатура.Наименование ПОДОБНО «Мол%» КАК Молоко,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
Результат:
В данном примере проверяем каждую строку, начинается ли она на «Мол», для наглядности выводим такое же поле без применения оператора «ПОДОБНО».
Оператор «ПОДОБНО» в конструкции условного оператора «Где»
Получите понятные самоучители по 1С бесплатно:
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Наименование ПОДОБНО «_о%»
Результат:
Из результата запроса понятно, что были отобраны поля, у которых вторая буква « о », а после неё любые произвольные символы.
Оператор «ПОДОБНО» в конструкции условного оператора «ВЫБОР»
ВЫБРАТЬ
ВЫБОР
КОГДА Номенклатура.Наименование ПОДОБНО «%[л]%»
ТОГДА Номенклатура.Наименование
ИНАЧЕ «Не соответствует шаблону»
КОНЕЦ КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
Результат:
В таком примере помечаем поля, в которых не содержится буква « л ».
Как сравнивать текст по спецсимволу (%. )
Для реализации таких задач требуется пользоваться ключевым словом СПЕЦСИМВОЛ. Указав любой символ после такого ключевого слова, система, в шаблоне конструкции ПОДОБНО, будет воспринимать следующий символ за ним как обычный.
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Наименование ПОДОБНО «%/%» СПЕЦСИМВОЛ «/»
В таком примере были выбраны все поля содержащие знак « % » в конце.
Использование параметров в конструкции «ПОДОБНО»
Результат:
Установив параметр запроса в значение «М%», отбираем все поля, которые начинаются на символ « М ».
Возможные ошибки
Следует учитывать, что шаблон из конструкции оператора «ПОДОБНО» должен иметь исключительно строковый тип данных так же недопустимо формировать шаблон путём сложений строк.
Протестируйте качество нашей работы - получите первую консультацию в подарок.
Конструкцию «РАЗРЕШЕННЫЕ» можно часто увидеть в запросах в системах 1С, в которых используются ограничения доступа на уровне записей. Это достаточно полезный механизм, позволяющий тонко настроить права для пользователей в зависимости от их значений. К примеру, разные менеджеры по продажам должны видеть документы только своих контрагентов. И если они пользуются одним отчетом, то именно использование оператора «РАЗРЕШЕННЫЕ» в запросе поможет избежать ошибки.
Возникновение ошибки
Если по какой-то причине не использовалась конструкция «РАЗРЕШЕННЫЕ», а в запросе выбираются данные пользователями, у которых настроено RLS, возникнет ошибка. Система 1С сообщит нам о том, что у текущего пользователя не хватает прав, чтобы выполнить запрос. При обычной выборке 1С последовательно берет записи из таблицы базы данных и читает их с правами пользователя. Когда попадается строка с данными скрытыми от пользователя с помощью RLS, запрос останавливается с ошибкой.
Рис.1 ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросе 1С 8.3
При добавлении команды «РАЗРЕШЕННЫЕ» после ключевого слова «ВЫБРАТЬ» ошибка уйдет, и наш запрос успешно выполнится независимо от настроек RLS. Помните, что данный оператор добавляется только в выборку верхнего уровня и влияет на весь запрос целиком и вложенные алгоритмы. Многие программисты так и поступают практически в каждом случае, считая это идеальным решением. Конечно, добавить «РАЗРЕШЕННЫЕ» – простейшее действие, но оно имеет существенный недостаток.
Именно поэтому при написании запроса с использованием оператора «РАЗРЕШЕННЫЕ» необходимо помнить про его особенности. Грамотное его применение способно существенно облегчить работу пользователей и убрать лишнюю информацию из их интерфейса. Но и слишком частое его использование приведет к тому, что отдельным сотрудникам может подаваться недостоверная информация. Это означает, что необходимо найти пути отражения ограниченной информации без использования «РАЗРЕШЕННЫЕ» в запросе 1С.
Как можно обойтись без «РАЗРЕШЕННЫЕ»?
После решения о том, что для важных отчетов лучше обойтись без использования конструкции «РАЗРЕШЕННЫЕ», нужно решить, как избежать ошибок. Исходя из вышенаписанного, нам нужно, чтобы при выполнении запроса система выбирала только те записи, права на которые есть у пользователя. Существует два способа получить нужный результат.
Первый заключается в том, чтобы перенести данные с ограничениями во вложенный запрос. Некоторым СУБД вполне хватает этого, чтобы проверка доступа отработала без ошибок и выдала ограниченные записи. Успех зависит от варианта реализации ограничений доступа на этом уровне.
Второй метод заключается в том, чтобы в запросе задать отбор по настройкам для конкретного пользователя. Реализация этого может быть разной – можно использовать соединение с таблицей настроек прав доступа или же задать ограничение при помощи параметра.
Второй вариант наиболее предпочтителен при формировании отчетов, так как достаточно универсален. Пользователи с различными правами могут пользоваться одним отчетом, если правильно выберут контрагента, подразделение или любой другой отбор, фигурирующий в RLS. Если же этого не будет сделано, то выплывет ошибка, информирующая об отсутствии прав на просмотр данных.
Разграничение прав доступа на уровне записей – достаточно сложная и тонкая настройка, особенно в системах с множеством пользователей. Оператор «РАЗРЕШЕННЫЕ» существенно облегчает учет ограничений в запросах. Но подходить к его использованию нужно, предварительно продумав, не возникнет ли впоследствии недопонимания между пользователями. Иногда лучше обязать сотрудников настраивать лишний фильтр, чем выискивать источники несоответствия в будущем.
Одной из потенциальных проблем при изучении 1С является тот факт, что встроенный язык 1С и язык запросов отличаются друг от друга. Новичкам приходится не только запоминать всевозможные операторы, но и понимать, где их применять. Но в платформу 1С 8.3 встроен мощный инструмент, облегчающий работу с запросами на языке 1С – конструктор запросов. Не используя его, вы напрасно усложняете себе работу.
Применение конструктора запросов 1С
Перед тем как разбирать функции этого механизма, нам нужно понять, как и где можно открыть конструктор запросов 1С 8.3. Воспользоваться им вы сможете в конфигураторе или специальных обработках – консолях запросов, которые, являясь по сути инструментами доработки 1С 8, позволяют сохранить конфигурацию на поддержке. Чтобы открыть конструктор, необходимо щелкнуть правой кнопкой мыши в модулях или на поле для написания кода и выбрать нужный пункт.
Рис.1 Применение конструктора запросов 1С
В конфигураторе же придется зайти в один из модулей и через контекстное меню выбрать один из двух вариантов. Первый откроет конструктор запроса, и после работы с ним у вас останется лишь текст запроса. Нижний пункт позволит вам не просто написать запрос, но и создаст все необходимые операторы для его выполнения и обработки. Это очень удобно и ускоряет разработку бизнес – приложений, но в некоторых случаях это не нужно.
Рис.2 Применение конструктора запросов 1С
После вызова конструктора перед нами открывается форма этого механизма. Она разделена на несколько закладок, отличающихся по функционалу и назначению.
Таблицы и поля. Начальная вкладка, отражающая информацию о задействованных в запросе таблицах и выбранных полях. Слева отображается общее дерево конфигурации, в центре – источники данных для выборки, справа – конечные поля. Здесь закладывается основа запроса из секций «ВЫБРАТЬ … ИЗ …».
Рис.3 Таблицы и поля
Связи. В данном разделе указываются соединения выбранных таблиц и поля, по которым они соединяются. Зачастую 1С самостоятельно предлагает программистам свои варианты связей на основе схожих типов данных, но в большинстве случаев лучше их изменить. В тексте запроса данные с этой вкладки преобразуются в конструкцию «СОЕДИНЕНИЕ».
Группировка. Здесь устанавливается группировка строк по конкретным полям и простейшие арифметические операции с числовыми реквизитами. В тексте запроса эти данные можно найти в разделе «СГРУППИРОВАТЬ ПО».
Рис.5 Группировка
Условия. Раздел установки дополнительных условий на данные, попадающие в результат выборки. В тексте фигурирует после оператора «ГДЕ».
Дополнительно. Вкладка, содержащая различные стандартные ограничения или возможности выборки:
- Первые – позволяет выбрать определенное количество записей. В текстовом представлении запроса определяется оператором «ПЕРВЫЕ N»;
- Без повторяющихся – исключает попадание в конечную выборку повторяющихся строк. В тексте отражается, как «РАЗЛИЧНЫЕ»;
- Разрешенные – включает учет настроенных прав доступа при выполнении запроса (оператор «РАЗРЕШЕННЫЕ»);
- Определение типа запроса из трех вариантов – обыкновенной выборки, создания или уничтожения временной таблицы;
- Блокировка данных. Предназначена для автоматического режима блокировок, чтобы сохранить целостность данных на время от чтения до записи.
Рис.7 Дополнительно
Объединения/Псевдонимы. Слева представлен список запросов, а справа вы можете изменить имя реквизита или объединить данные из нескольких запросов. Эти настройки можно найти в текстовом виде по операторам «ОБЪЕДИНИТЬ» и «КАК».
Рис.8 Объединения/Псевдонимы
Порядок. На данной вкладке задается сортировка итоговых записей. За нее отвечает оператор «УПОРЯДОЧИТЬ ПО».
Мы рассмотрели основные возможности конструктора запросов. Если у вас возникли сложности при работе с ним или вам необходимо получить консультации по программе 1С, обращайтесь к нашим специалистам по телефону, а также оставляйте заявки на нашем сайте. Мы свяжемся с вами в кратчайшие сроки.
Дополнительные возможности конструктора запросов
Вышеперечисленные вкладки конструктора позволяют настроить запрос на выборку данных практически для любой задачи. Однако в некоторых случаях нам пригодятся дополнительные функции конструктора запросов. Самая распространенная из них – возможность создания пакетных запросов. Для этого нам пригодится последняя вкладка в конструкторе запросов.
Рис.10 Дополнительные возможности конструктора запросов
Пакет запросов нам необходим, когда нужно получить несколько выборок данных за 1 обращение к базе. Также этот механизм пригодится в случае работы с временными таблицами. Это особый тип таблиц с данными, которые может создать 1С на время выполнения запроса. Если их использовать, то они будут доступны во всех последующих запросах в дереве конфигурации на 1 вкладке конструктора.
Вы можете и сами создавать свои временные таблицы с помощью конструктора. На вкладке «Таблицы и поля» в среднем окне есть кнопка создания описания временной таблицы. Наиболее часто эту возможность используют для передачи таблиц в запрос извне. Рядом находится кнопка создания вложенного запроса – обращения к базе данных, результат которого можно использовать в дальнейшем.
Рис.11 Дополнительные возможности конструктора запросов
Еще одна возможность конструктора, которая не так часто используется – вывод итогов. На вкладке «Итоги» вы можете задать нужные вам арифметические операции с числовыми полями с учетом других полей. К примеру, на скриншоте показан подсчет суммы количества по каждой номенклатуре. В тексте мы увидим эту настройку в виде оператора «ИТОГИ … ПО…».
Рис.12 Дополнительные возможности конструктора запросов
Построитель – еще одна закладка конструктора запросов с интересными возможностями. Здесь собраны все настройки, позволяющие выполняться запросу, как интерактивно, так и без участия пользователей. Также есть возможность адаптировать текст запроса в зависимости от введенных начальных данных. В текстовом варианте сделанные настройки построителя выделяются фигурными скобками.
Иногда в процессе работы с конструктором запроса с обработкой результата 1С требуется взглянуть на текстовый вид запроса. Для этого в левом нижнем углу есть кнопка «Запрос». При нажатии на нее открывается новое окно с полным текстом обращения к базе. Присутствует возможность изменения – при нажатии на соответствующую кнопку вы сможете внести изменения, а при закрытии конструктор отразит их на вкладках.
Рис.13 Дополнительные возможности конструктора запросов
Мы ознакомились лишь с основными функциями конструктора запросов и научились им пользоваться. Глубокое знание функционала, понимание принципов работы и внутренних механизмов появится с опытом. Поэтому, чем больше вы будете работать с конструктором, тем более оптимальными будут ваши запросы. Для тех же, кто предпочитает писать код в текстовом виде – открытие конструктора поможет быстро проверить опечатки в операторах. В любом случае, если возникли вопросы, обращайтесь к специалистам технического сопровождения 1С, мы с радостью вам поможем.
РАЗРЕШЕННЫЕ — конструкция языка запросов 1С 8, которая используется при применении ограничения прав на уровне записей (RLS). Использование данного ключевого слова позволяет избежать ошибки при получении записей, прав на которых у пользователя нет.
Проблема: В некоторых случаях результат ограничений доступа к данным в 1С 8.3 может зависеть от плана запроса СУБД. В данной статье рассмотрены возможные ситуации и даны рекомендации, как этого избежать.
Условия возникновения проблемы
Проблема возможной зависимости результата ограничений доступа к данным от плана запроса СУБД может возникнуть при выполнении запроса к базе данных без ключевого слова РАЗРЕШЕННЫЕ, если для текущего пользователя имеются ограничения доступа к данным и при этом запрос содержит одно или несколько сравнений вида:
Причина различий
Возможная разница в поведении объясняется реализацией ограничений доступа к данным без ключевого слова РАЗРЕШЕННЫЕ в 1С Предприятии 8.3.
Запрос без ключевого слова РАЗРЕШЕННЫЕ будет выполнен успешно только в том случае, если в процессе его выполнения не происходит обращений к запрещенным данным. Для этого в выборке данных добавляется специальное сигнальное поле, которое принимает значение Истина для тех записей, в формировании которых участвовали только разрешенные данные, и значение Ложь для всех остальных записей. Если хотя бы в одной записи выборки имеется значение Ложь в сигнальном поле, то выполнение запроса завершается аварийно.
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Такое же сигнальное поле добавляется и к результатам запросов, вложенных в сравнение В/НЕ В. Причем проверка значения сигнальной колонки в этом случае выполняется средствами СУБД. Таким образом, если в процессе выполнения вложенного запроса происходило обращение к запрещенным данным, то выполнение запроса должно завершиться с ошибкой У пользователя недостаточно прав на исполнение операции над базой данных.
Однако при построении плана запроса СУБД может не получать полную выборку , а получать только те записи, которые фактически необходимы для проверки условия В/НЕ В. В этом случае выполнение запроса может оказаться успешным, даже если при выполнении как самостоятельного запроса могли произойти обращения к запрещенным данным.
Пример и рекомендации
Рассмотрим простой пример. Пусть на таблицу Справочник.ФизическиеЛица наложены ограничения доступа к данным. В этом случае запрос:
ВЫБРАТЬ
Таблица.ФизЛицо КАК ФизЛица
ИЗ
Справочник.ФизическиеЛица КАК Таблица
будет выполнен с ошибкой из-за попытки обращения к запрещенным данным. Если же этот запрос участвует в сравнении, например:
ВЫБРАТЬ
ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо
ИЗ
Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом
ГДЕ
ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо В (
ВЫБРАТЬ
Таблица.ФизЛицо КАК ФизЛица
ИЗ
Справочник.ФизическиеЛица КАК Таблица)
то в зависимости от выбранного СУБД плана запроса запрос может быть выполнен как успешно, так и с ошибкой. Такое поведение запроса не является ошибочным, поскольку обращение к запрещенным данным в процессе выполнения этого запроса может произойти, а может и не произойти. Для получения более предсказуемого результата необходимо построить запрос таким образом, чтобы вложенный запрос гарантированно не выполнял обращений к заведомо ненужным данным. В частности, если предыдущий запрос переписать так:
ВЫБРАТЬ
ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо
ИЗ
Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом
ГДЕ
ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо В (
ВЫБРАТЬ
Таблица.ФизЛицо КАК ФизЛица
ИЗ
Справочник.ФизическиеЛица КАК Таблица
ГДЕ
Таблица.ФизЛицо = ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо)
Данный запрос отличается от предыдущего тем, что вложенный запрос не выбирает записей, которые заведомо не требуются для выполнения сравнения В. Поэтому он завершится успешно, если ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо ссылается только на разрешенные записи таблицы Справочник.ФизическиеЛица, и аварийно, если среди ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо имеются ссылки на запрещенные записи.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
При работе с языком запросов 1С, иногда возникает ситуация, когда требуется проверить выражение, является ли оно ЛОЖЬ или Истина. В случае положительного результата присвоить ему значение выражения для замены.
Конструкция оператора ВЫБОР
Несколько примеров
Пример №1
Есть таблица «Таблица1», в которой перечислены все дни с понедельника по воскресенье.
ДеньНедели |
Понедельник |
Вторник |
Среда |
Четверг |
Пятница |
Суббота |
Воскресенье |
Необходимо, для строк со значениями «Суббота» и «Воскресенье» в отдельном поле указать, что это выходной. Во всех остальных случаях, рабочий день. Реализуем поставленную задачу в виде запроса к исходной таблице.
Текст запроса может выглядеть так:
ВЫБРАТЬ
ДеньНедели,
ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
ИНАЧЕ «Рабочий день»
КОНЕЦ КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
ДеньНедели | ВидДня |
Понедельник | Рабочий день |
Вторник | Рабочий день |
Среда | Рабочий день |
Четверг | Рабочий день |
Пятница | Рабочий день |
Суббота | Выходной |
Воскресенье | Выходной |
В данном примере, используя оператор ВЫБОР, мы перебираем все строки из «Таблица1». Параллельно проверяя каждую на соответствие условию.
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье «
Если сработает одно из них, то в колонку «ВидДня» произойдёт запись выражения замены, расположенного после ключевого слова ТОГДА. Во всех остальных случаях будет записано выражение расположенное после слова ИНАЧЕ. Причём если убрать секцию ИНАЧЕ, программа примет такую конструкцию и не выдаст ошибку. Однако если проверяемое выражение вернёт ЛОЖЬ, тогда строки, в которые должно было подставится выражение замены, получать значение NULL. Рассмотрим подробнее подобную ситуацию.
Пример №2
Возьмём уже известную нам таблицу из первого примера.
ДеньНедели |
Понедельник |
Вторник |
Среда |
Четверг |
Пятница |
Суббота |
Воскресенье |
Получите понятные самоучители по 1С бесплатно:
Необходимо вывести в отдельную таблицу количество выходных дней. Причём информацию о количестве рабочих дней, будем считать излишней. Для наглядности решим задачу в несколько этапов. За основу возьмём запрос из примера №1. Уберём из него секцию ИНАЧЕ, а поле для вывода оставим только то, которое получаем конструкцией оператора ВЫБОР.
ВЫБРАТЬ
ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
КОНЕЦ КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
Из результата запроса видно, что все строки, не вошедшие в условие после ключевого слова КОГДА получили . Как известно это отсутствие значения. Таким образом, нам остаётся только сгруппировать полученную таблицу. Применив к группировке агрегатную функцию КОЛИЧЕСТВО ( ).
Текст запроса может выглядеть так:
ВЫБРАТЬ
КОЛИЧЕСТВО(ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
КОНЕЦ) КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
В заключении хочется сказать, что оператор ВЫБОР хоть и не часто находит свое применение при написании запросов в 1С, но в некоторых ситуациях является незаменимым инструментом для разработчика.
Читайте также: