1с что значит выбрать различные

Обновлено: 07.07.2024

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: основы синтаксиса

Автор уроков и преподаватель школы: Владимир Милькин

Начиная с этого урока мы начинаем изучать синтаксис языка запросов.

Я настоятельно вам советую выполнять все запросы у себя на компьютере по ходу чтения уроков и ответственно относиться к выполнению домашних заданий - какими бы простыми они не казались на первый взгляд.

Основы синтаксиса

В двух словах синтаксис языка запросов можно описать так:

ВЫБРАТЬ
СЮДА ПИШЕМ ЧТО БУДЕМ ВЫБИРАТЬ
ИЗ
СЮДА ПИШЕМ ОТКУДА БУДЕМ ВЫБИРАТЬ

Таким образом, если мы хотим написать запрос, который вернёт нам имена всех элементов справочника Еда, то рассуждение будет примерно таким:

  1. У справочника Еда есть реквизит с именем Наименование.
  2. Элементы справочника Еда хранятся в базе данных в таблице Справочник.Еда.
  3. А значит запрос будет таким:

Попробуйте написать этот запрос в консоли запросов, как мы это делали на первом уроке (ссылка):

03

И затем выполнить его (кнопка Выполнить):

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

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

Выборка нескольких свойств

Если мы хотим запросить несколько свойств (к примеру, Наименование и Цвет), то их нужно перечислить через запятую:

05

Выборка всех свойств

Если мы хотим запросить все свойства объекта и не хотим перечислять каждое из них по имени - воспользуемся символом звёздочка :

06

Вся результатирующая таблица, которую вернул нам в запрос не поместилась на картинке - столбцов на самом деле больше - по одному на каждый реквизит объекта (включая стандартные).

Выборка первых N строк

Теперь давайте решим такую задачу: "Запросить названия первых 3 элементов справочника Еда". Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Чтобы ограничить количество строк, которое вернёт нам запрос используем ключевое слово ПЕРВЫЕ 3:

Выборка различных строк

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

В этом случае нам пригодилось бы ключевое слово РАЗЛИЧНЫЕ:

Дополнительные пояснения

Как выглядит таблица справочника еда? Какие в ней столбцы?

Во-первых, её полное название Справочник.Еда.

Во-вторых, её столбцы как следует из конфигуратора следующие:

Плюс стандартные для всех справочников:

  • Код
  • Наименование
  • И ещё ряд реквизитов, которые нам пока не интересны.

Таким образом, чтобы обратиться к любому из этих столбцов (свойств, реквизитов) мы прямо так и напишем:

Отвлечёмся не надолго.

А как выглядит таблица справочника цвета?

Судя по конфигуратору у него есть только стандартные реквизиты. Таким образом в его таблице будут только следующие столбцы:

  • Код
  • Наименование
  • И так далее.

А теперь такой момент.

Судя по конфигуратору столбец из таблицы Справочник.Еда с именем Цвет является ссылкой на справочник Цвета (а вернее на его таблицу). Каким образом мы можем имея эту ссылку обратиться к реквизитам (столбцам, свойствам) самого цвета?

Конечно же через точку:

02

Теперь о документах.

Рассмотрим документ ЗаказКлиента. У него также есть своя таблица со следующими столбцами (см. конфигуратор и предыдущие уроки):

И чтобы обратиться к любому из них мы напишем:

Обратите внимание на столбец Клиент. Он также не простой и является ссылкой на другую таблицу (справочника Клиенты). Соответственно, чтобы обращаться к свойствам клиентов через эту ссылку мы также используем точку:

Но это не все данные, которые есть у документа. Как следует из конфигуратора у него есть табличная часть с именем Продукты. Это как бы ещё одна таблица, привязанная к этому документу. У этой таблицы есть свои столбцы (см. конфигуратор):

И чтобы обратиться к ним из запроса мы сначала добираемся до самой таблицы - Документ.ЗаказКлиента.Продукты, а уже затем указываем конкретные реквизиты:

разрешенные в запросе 1с 8.3 и 8.2

Проблема: В некоторых случаях результат ограничений доступа к данным в 1С 8.3 может зависеть от плана запроса СУБД. В данной статье рассмотрены возможные ситуации и даны рекомендации, как этого избежать.

Условия возникновения проблемы

Проблема возможной зависимости результата ограничений доступа к данным от плана запроса СУБД может возникнуть при выполнении запроса к базе данных без ключевого слова РАЗРЕШЕННЫЕ, если для текущего пользователя имеются ограничения доступа к данным и при этом запрос содержит одно или несколько сравнений вида:

Причина различий

Возможная разница в поведении объясняется реализацией ограничений доступа к данным без ключевого слова РАЗРЕШЕННЫЕ в 1С Предприятии 8.3.

Запрос без ключевого слова РАЗРЕШЕННЫЕ будет выполнен успешно только в том случае, если в процессе его выполнения не происходит обращений к запрещенным данным. Для этого в выборке данных добавляется специальное сигнальное поле, которое принимает значение Истина для тех записей, в формировании которых участвовали только разрешенные данные, и значение Ложь для всех остальных записей. Если хотя бы в одной записи выборки имеется значение Ложь в сигнальном поле, то выполнение запроса завершается аварийно.

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

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

Однако при построении плана запроса СУБД может не получать полную выборку <Вложенным запросом>, а получать только те записи, которые фактически необходимы для проверки условия В/НЕ В. В этом случае выполнение запроса может оказаться успешным, даже если при выполнении <Вложенного запроса> как самостоятельного запроса могли произойти обращения к запрещенным данным.

Пример и рекомендации

Рассмотрим простой пример. Пусть на таблицу Справочник.ФизическиеЛица наложены ограничения доступа к данным. В этом случае запрос:

ВЫБРАТЬ

Таблица.ФизЛицо КАК ФизЛица

ИЗ

Справочник.ФизическиеЛица КАК Таблица

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

ВЫБРАТЬ

ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо

ИЗ

Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом

ГДЕ

ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо В (

ВЫБРАТЬ

Таблица.ФизЛицо КАК ФизЛица

ИЗ

Справочник.ФизическиеЛица КАК Таблица)

то в зависимости от выбранного СУБД плана запроса запрос может быть выполнен как успешно, так и с ошибкой. Такое поведение запроса не является ошибочным, поскольку обращение к запрещенным данным в процессе выполнения этого запроса может произойти, а может и не произойти. Для получения более предсказуемого результата необходимо построить запрос таким образом, чтобы вложенный запрос гарантированно не выполнял обращений к заведомо ненужным данным. В частности, если предыдущий запрос переписать так:

ВЫБРАТЬ

ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо

ИЗ

Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом

ГДЕ

ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо В (

ВЫБРАТЬ

Таблица.ФизЛицо КАК ФизЛица

ИЗ

Справочник.ФизическиеЛица КАК Таблица

ГДЕ

Таблица.ФизЛицо = ДоговорНаВыполнениеРаботСФизЛицом.Сотрудник.Физлицо)

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

В этой статье мы хотим обсудить с Вами все функции языка запросов 1с, а также конструкции языка запросов. Чем же отличается функция от конструкции? Функция вызывается со скобками и возможными параметрами в них, а конструкция пишется без скобок. Безусловно все конструкции и функции языка запросов 1с делают процесс получения данных гибким и многофункциональным. Данные функции и конструкции применимы к полям запроса, а некоторые также применимы в условиях.

Функции языка запросов 1с

Поскольку понятное описание функций языка запросов 1с встречается намного реже, чем описание конструкций, мы решили начать рассматривать именно функции. Теперь давайте разберем каждую по отдельности, описав ее назначение, синтаксис и пример использования, итак:

1. Функция ДАТАВРЕМЯ - данная функция создает константное поле с типом "Дата".

2. Функция РАЗНОСТЬДАТ - возвращает разность двух дат в одном из измерений (год, месяц, день, час, минута, секунда). Измерение передается в параметре.

Синтаксис: РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>)

3. Функция ЗНАЧЕНИЕ - задает константное поле с предопределенной записью из базы данных, также можно получить пустую ссылку любого типа.

4. Функция ВЫБОР - перед нами аналог конструкции ЕСЛИ который используется в коде, только эта используется в запросах 1С.

Синтаксис: ВЫБОР КОГДА <Выражение> ТОГДА <Выражение> ИНАЧЕ <Выражение> КОНЕЦ

5. Функция ВЫРАЗИТЬ - позволяет выразить константное поле определенным типом.

Синтаксис: ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)

Еще есть вариант использования функции ВЫРАЗИТЬ в полях смешанных типах, где такие встречаются? Самый простой пример это "Регистратор" у любого регистра. Так зачем нам может понадобиться уточнять тип в регистраторе? Давайте рассмотрим ситуацию когда мы из регистратора выбираем поле "Номер", из какой таблицы будет выбран номер? Правильный ответ из всех! Поэтому чтобы наш запрос работал быстро следует указывать явный тип с помощью функции ВЫРАЗИТЬ

6. Функция ISNULL (альтернативное написание ЕСТЬNULL) - если поле имеет тип NULL, то оно заменяется на второй параметр функции.

Синтаксис: ЕСТЬNULL(<Поле>, <ПодставляемоеЗначение>)

Также отметим что тип NULL желательно ВСЕГДА заменять на какое-то значение, т.к. сравнение с типом NULL всегда дает ЛОЖЬ даже если вы сравниваете NULL с NULL. Чаще всего значения NULL образуются в результате соединения таблиц (все виды соединений кроме внутреннего).

7. Функция ПРЕДСТАВЛЕНИЕ - позволяет получить представление поля запроса.

Конструкции в языке запросов 1с

Выше мы рассмотрели с Вами функции языка запросов 1с, теперь пришло время рассмотреть конструкции в языке запросов 1с, они не менее важны и полезны, приступаем.

1. Конструкция ССЫЛКА - представляет из себя логический оператор проверки ссылочного типа. Наиболее часто встречается при проверки поля составного типа на конкретный тип. Синтаксис: ССЫЛКА <Имя таблицы>

2. Конструкция МЕЖДУ - данный оператор проверяет входит ли значение в указанный диапазон.

Синтаксис: МЕЖДУ <Выражение> И <Выражение>

3. Конструкция В и В ИЕРАРХИИ - проверяют находится ли значение в передаваемом списке (в качестве списка могут передаваться массивы, таблицы значений и т.д.). Оператор В ИЕРАРХИИ позволяет просматривать иерархию (пример использования ПланСчетов).

Синтаксис: В(<СписокЗначений>), В ИЕРАРХИИ(<СписокЗначений>)

4. Конструкция ПОДОБНО - эта функция позволяет нам сравнивать строку с шаблоном строки.

Синтаксис: ПОДОБНО "<ТекстШаблона>"

Варианты шаблона строки:

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

_ - один произвольный символ.

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

[^. ] - любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок кроме тех, которые перечислены следом за значком отрицания.

5. Конструкция РАЗРЕШЕННЫЕ - этот оператор позволяет выбрать только те записи из БД, на которые вызывающий имеет право чтения. Данные права настраиваются на уровне записей (RLS).

Синтаксис: РАЗРЕШЕННЫЕ пишется после ключевого слова ВЫБРАТЬ

6. Конструкция РАЗЛИЧНЫЕ - позволяет выбрать записи в которых отсутствуют повторные записи.

Синтаксис: РАЗЛИЧНЫЕ пишется после ключевого слова ВЫБРАТЬ

Также Конструкция РАЗЛИЧНЫЕ может использоваться с оператором РАЗРЕШЕННЫЕ и другими операторами.

7. Конструкция ПЕРВЫЕ - выбирает указанное в параметре число записей из результата запроса.

Синтаксис: ПЕРВЫЕ <число>

8. Конструкция ДЛЯ ИЗМЕНЕНИЯ - позволяет заблокировать таблицу, работает только в транзакциях (актуально только для автоматических блокировок).

Синтаксис: ДЛЯ ИЗМЕНЕНИЯ <НаименованиеТаблицы>

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

Синтаксис: УПОРЯДОЧИТЬ ПО <НаименованиеПоля> АВТОУПОРЯДОЧИВАНИЕ

10. Конструкция СГРУППИРОВАТЬ ПО - используется для группировки строк запроса по определенным полям. Числовые поля должны использоваться с любой агрегатной функцией.

Синтаксис: СГРУППИРОВАТЬ ПО <НаименованиеПоля1>, . , <НаименованиеПоляN>

11. Конструкция ИМЕЮЩИЕ - позволяет применить агрегатную функцию к условию выборки данных, похожа на конструкцию ГДЕ.

Синтаксис: ИМЕЮЩИЕ <агрегатная функция с условием>

12. Конструкция ИНДЕКСИРОВАТЬ ПО - используется для индексации поле запроса. Запрос с индексацией дольше выполняется, но ускоряет поиск по индексированным полям. Можно использовать только в виртуальных таблицах.

Синтаксис: ИНДЕКСИРОВАТЬ ПО <Поле1, . , ПолеN>

13. Конструкция ГДЕ - позволяет наложить условие на любые поля выборки. В результат попадут записи только удовлетворяющие условию.

Синтаксис: ГДЕ <Условие1 ОператорЛогСоединения УсловиеN>

14. Конструкция ИТОГИ . ПО ОБЩИЕ - применяется для подсчета итогов, в конструкции указываются поля по которым будут считаться итоги и агрегатные функции применяемые к итоговым полям. При использовании итогов на каждое поле следующее после конструкции ИТОГИ производится группировка данных. Есть необязательная конструкция ОБЩИЕ, ее использование также обеспечивает дополнительную группировку. Пример результата запроса вы увидите ниже.

Синтаксис: ИТОГИ <АгрегатнаяФункция1, . , АгрегатнаяФункцияN> ПО <ОБЩИЕ> <Поле1, . , ПолеN>

Результат запроса с конструкцией ИТОГИ

На рисунке обведены группировки которые образовались в ходе выполнения запроса, самая верхняя относится к секции ОБЩИЕ, а вторая к полю ДоговорКонтрагентаВидДоговора.

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: группировка

Автор уроков и преподаватель школы: Владимир Милькин

Группировка в запросах

Давайте запросим из таблицы Справочник.Еда следующие реквизиты: Наименование, Цвет и Калорийность:

01

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

Алгоритм для жёлтого цвета будет такой:

  1. Находим все строчки у которых в поле Цвет стоит Жёлтый.
  2. Это будут строчки №1, 6, 8 и 9.
  3. Суммируем поле Калорийность для каждой из этих строк: 89 + 31 + 340 + 536
  4. Получаем, что для жёлтого цвета суммарная калорийность равна 996.

И так для каждого цвета.

Описанный выше процесс называется группировкой . Таким образом, группировка - это "схлопывание" (свёртка) строчек таблицы по определенному признаку.

При группировке все поля делятся на две группы:

  • Группировочные - это как раз те поля, по которым идёт свёртка. В нашем случае таким полем является Цвет.
  • Группируемые - это те поля, которые сворачиваются (схлопываются, объединяются). В нашем случае таким полем является Калорийность.

01

Группируемые поля не могут быть сами по себе. К ним обязательно применяется одна из агрегатных функций: СУММА, СРЕДНЕЕ, МИНИМУМ, МАКСИМУМ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫЕ:

02

Агрегатная функция СУММА

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

сумма

Агрегатная функция СРЕДНЕЕ

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится среднее значение:

среднее

Агрегатная функция МИНИМУМ

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится минимальное значение:

минимум

Агрегатная функция МАКСИМУМ

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится максимальное значение:

максимум

Агрегатная функция КОЛИЧЕСТВО

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится их количество :

количество

Агрегатная функция КОЛИЧЕСТВО РАЗЛИЧНЫЕ

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится количество элементов с различными значениями:

количество различные

Функция КОЛИЧЕСТВО РАЗЛИЧНЫЕ требует пояснения, потому что на выбранном примере её результат совпадает с функцией КОЛИЧЕСТВО. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Вот более показательный пример, который всё объясняет:

03

Группировка без группируемых полей и агрегатных функций

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

06

К примеру, сделаем выборку всех вкусов, которые встречаются среди еды:

Как видите вкусы повторяются - давайте их сгруппируем:

Таким образом, мы сделали группировку только по группировочным полям (Вкус). Группируемые поля, а следовательно и агрегатные функции нам не понадобились.

Группировка без группировочных полей

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

12

К примеру, получим результаты агрегатных функций применительно к полю Калорийность без группировочных полей (то есть по всей таблице):

13

Группировка по нескольким полям

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

Читайте также: