Язык запросов 1с если тогда
«ВЫБОР КОГДА … ТОГДА …» в запросе 1С 8.3
При работе с языком запросов 1С, иногда возникает ситуация, когда требуется проверить выражение, является ли оно ЛОЖЬ или Истина. В случае положительного результата присвоить ему значение выражения для замены.
Конструкция оператора ВЫБОР
Несколько примеров
Пример №1
Есть таблица «Таблица1», в которой перечислены все дни с понедельника по воскресенье.
ДеньНедели |
Понедельник |
Вторник |
Среда |
Четверг |
Пятница |
Суббота |
Воскресенье |
Необходимо, для строк со значениями «Суббота» и «Воскресенье» в отдельном поле указать, что это выходной. Во всех остальных случаях, рабочий день. Реализуем поставленную задачу в виде запроса к исходной таблице.
Текст запроса может выглядеть так:
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ИНАЧЕ «Рабочий день»
Таблица1. ДеньНедели КАК ДеньНедели
ДеньНедели | ВидДня |
Понедельник | Рабочий день |
Вторник | Рабочий день |
Среда | Рабочий день |
Четверг | Рабочий день |
Пятница | Рабочий день |
Суббота | Выходной |
Воскресенье | Выходной |
В данном примере, используя оператор ВЫБОР, мы перебираем все строки из «Таблица1». Параллельно проверяя каждую на соответствие условию.
ИЛИ ДеньНедели = «Воскресенье «
Если сработает одно из них, то в колонку «ВидДня» произойдёт запись выражения замены, расположенного после ключевого слова ТОГДА. Во всех остальных случаях будет записано выражение расположенное после слова ИНАЧЕ. Причём если убрать секцию ИНАЧЕ, программа примет такую конструкцию и не выдаст ошибку. Однако если проверяемое выражение вернёт ЛОЖЬ, тогда строки, в которые должно было подставится выражение замены, получать значение NULL. Рассмотрим подробнее подобную ситуацию.
Пример №2
Возьмём уже известную нам таблицу из первого примера.
ДеньНедели |
Понедельник |
Вторник |
Среда |
Четверг |
Пятница |
Суббота |
Воскресенье |
Необходимо вывести в отдельную таблицу количество выходных дней. Причём информацию о количестве рабочих дней, будем считать излишней. Для наглядности решим задачу в несколько этапов. За основу возьмём запрос из примера №1. Уберём из него секцию ИНАЧЕ, а поле для вывода оставим только то, которое получаем конструкцией оператора ВЫБОР.
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
Таблица1. ДеньНедели КАК ДеньНедели
Текст запроса может выглядеть так:
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
Таблица1. ДеньНедели КАК ДеньНедели
В заключении хочется сказать, что оператор ВЫБОР хоть и не часто находит свое применение при написании запросов в 1С, но в некоторых ситуациях является незаменимым инструментом для разработчика.
Язык запросов 1с если тогда
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: условный оператор
Автор уроков и преподаватель школы: Владимир Милькин
Условный оператор в запросе
Давайте напишем запрос, который получает названия и калорийность еды:
А теперь добавим в результат запроса колонку, в которую будем выводить жирность еды по следующим правилам:
Как этого можно добиться, ведь в таблице Справочник.Еда нет колонки Жирность?
Оказывается, эту колонку мы можем добавить сами, используя условный оператор внутри запроса:
Давайте внимательнее присмотримся к тексту запроса:
В секции ВЫБРАТЬ идёт перечисление полей выборки: Наименование, Калорийность, а затем вместо третьего поля идёт конструкция условного оператора, результат которого и попадает в третью колонку.
Поэтому новый запрос вернёт такую таблицу:
Отступление
Обратите внимание, что третья колонка в таблице, которую вернул запрос, называется Поле1. Это имя было сгенерировано системой автоматически, потому что третьей колонке не соответствует никакого реального поля в таблице Справочник.Еда, откуда можно было бы это имя получить.
Псевдонимы можно присваивать любым полям, в том числе тем, у которых уже есть имя. Давайте сделаем псевдоним Еда для поля Наименование:
Но вернёмся к условному оператору в запросах.
Более сложные логические выражения в условиях оператора
В логических условиях оператора выбора можно использовать и более сложные выражения.
Пример использования логического оператора ПОДОБНО:
Пример использования функции ПОДСТРОКА:
Более сложные результаты условного оператора
Конечно, результатом условного оператора может быть не только константная строка, но и любое другое выражение, допустимое в запросе.
Условия в запросе
Условия в запросе
Условия в запросе могут быть расположены в 4 местах:
Особенности использования условных операторов:
Эти операторы возможно использовать во всех 4 ситуациях, но контекст (окружаемые переменные у них отличаются).
В первых двух случаях условия накладываются на поля выборки, например:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК СпрКонтрагенты ГДЕ СпрКонтрагенты.ИНН<>«»
Обращение идет через имя таблицы (в простых запросах может опускаться, но в сложных может вызывать неоднозначность поля).
Данное условие вызывает ограничение выборки (обычно уменьшает ее)
В конструкторе запроса находятся на вкладке условия:
В произвольном варианте пишется текстом, в обычном выбирается поле, оператор сравнения и значение:
ВЫБОР КОГДА
Этот условный оператор используется для преобразования значения, ограничивает же выборку только когда расположен после служебного слова ГДЕ.
Допустимо несколько подчиненных условий. Может находится в полях выборки, полях условий ГДЕ, группировок, итогов (универсальный оператор для сложных условий)
Например, так выглядит вариант преобразования:
ВЫБРАТЬ
ВЫБОР
КОГДА 1 = 2
ТОГДА «Никогда не будет истиной»
КОГДА 1 = 1
ТОГДА «Всегда будет истиной»
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК ПолеПредставленияЗначения
Вариант использования в условии ГДЕ, результат выборки должен возвращать булево значение либо сравниваться с чем-то еще
Пример № 1
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = «» ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ
Пример № 2:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = «» ТОГДА «» ИНАЧЕ «Заполнено» КОНЕЦ = «Заполнено»
Параметры виртуальных таблиц
В данном случае оперирование идет с полями таблиц, например ресурсами, измерениями, реквизитами. В этих условиях обращение идет без точки (контекст этого не требует).
ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Код = «RUR»)
В конструкторе запроса они находятся вот здесь:
Стоит отметить, что обычно используется ограничение над измерениями, так как иначе условие отнесется к выборке для получения, а не на сам результат (на ресурсы ограничения следует наложить в операторе ГДЕ, чтобы получить ожидаемый результат).
Накладывание условия в запросе на измерения, если нет обращения через точку (как в примере выше), ускоряет выборку: на больших таблицах, это будет визуально заметно; на небольших можно использовать как удобно.
ИМЕЮЩИЕ
Для наложения отбора для результата «группировочных» функции
ВЫБРАТЬ
Контрагенты.ИНН,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) > 1 И
Контрагенты.ИНН <> «»
В данную выборку попадут дубли ИНН, когда оно вообще заполнено.
В конструкторе запроса также находится на вкладке условия
Сущность хорошей рекламы не в том, чтобы возбуждать надежду, а в том, чтобы распалять жадность.
Функции и конструкции языка запросов 1С 8.2 и 1С 8.3
Функции языка запросов 1с.
ДАТАВРЕМЯ
Эта функция создает константное поле с типом “Дата”.
РАЗНОСТЬДАТ
Возвращает разность двух дат в одном из измерений (год, месяц, день, час, минута, секунда). Измерение передается в параметре.
ЗНАЧЕНИЕ
Задает константное поле с предопределенной записью из базы данных, также можно получить пустую ссылку любого типа.
Синтаксис: ЗНАЧЕНИЕ( )
ВЫБОР
Синтаксис: ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ
Более сложный пример, с использованием ПОДОБНО :
ВЫРАЗИТЬ
Позволяет выразить константное поле определенным типом.
Синтаксис: ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)
Можно использовать функцию ВЫРАЗИТЬ в полях смешанных типах. Обычный и распространённый пример, где встречаются такие поля, это “Регистратор” у любого регистра. По какой причине мы будем уточнять тип в регистраторе? К примеру, если мы из регистратора выбираем поле “Номер”, то из всех таблиц этот номер будет выбран. Для увеличения скорости обработки нашего запроса, укажем явный тип, с помощью функции ВЫРАЗИТЬ.
ISNULL, ЕСТЬNULL
Нужно отметить, что тип NULL необходимо ВСЕГДА заменять на какое-либо значение, так как сравнение с ним, всегда будет ЛОЖЬ. Прикол в том, что ЛОЖЬ будет, если сравнить NULL с NULL. Обычно NULL возникает при соединениях таблиц (во всех видах, кроме внутреннего).
ПРЕДСТАВЛЕНИЕ
Получает представление поля запроса
Синтаксис: ПРЕДСТАВЛЕНИЕ( )
Конструкции в языке запросов 1с.
ССЫЛКА
Проверяет поля ссылочного типа. Обычно применяется для проверки поля составного типа на конкретный тип.
Синтаксис: ССЫЛКА
МЕЖДУ
Проверяет, входит ли значение в указанный диапазон.
Синтаксис: МЕЖДУ И
В и В ИЕРАРХИИ
Проверяют находится ли значение в передаваемом списке (в качестве списка могут передаваться массивы, таблицы значений и т.д.). Оператор В ИЕРАРХИИ позволяет просматривать иерархию (пример использования ПланСчетов).
Синтаксис: В( ), В ИЕРАРХИИ( )
ПОДОБНО
Сравнивает строку с шаблоном строки.
Синтаксис: ПОДОБНО “ ”
Варианты шаблона строки:
% – последовательность, содержащая любое количество произвольных символов
_ – один произвольный символ.
[…] – любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок. В перечислении могут задаваться диапазоны, например а-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
[^…] – любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок кроме тех, которые перечислены следом за значком отрицания.
Все функции и конструкции языка запросов 1С 8.2 и 1с 8.3
В этой статье мы хотим обсудить с Вами все функции языка запросов 1с, а также конструкции языка запросов. Чем же отличается функция от конструкции? Функция вызывается со скобками и возможными параметрами в них, а конструкция пишется без скобок. Безусловно все конструкции и функции языка запросов 1с делают процесс получения данных гибким и многофункциональным. Данные функции и конструкции применимы к полям запроса, а некоторые также применимы в условиях.
Функции языка запросов 1с
Поскольку понятное описание функций языка запросов 1с встречается намного реже, чем описание конструкций, мы решили начать рассматривать именно функции. Теперь давайте разберем каждую по отдельности, описав ее назначение, синтаксис и пример использования, итак:
Синтаксис: ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ
Синтаксис: ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)
Еще есть вариант использования функции ВЫРАЗИТЬ в полях смешанных типах, где такие встречаются? Самый простой пример это «Регистратор» у любого регистра. Так зачем нам может понадобиться уточнять тип в регистраторе? Давайте рассмотрим ситуацию когда мы из регистратора выбираем поле «Номер», из какой таблицы будет выбран номер? Правильный ответ из всех! Поэтому чтобы наш запрос работал быстро следует указывать явный тип с помощью функции ВЫРАЗИТЬ
Также отметим что тип NULL желательно ВСЕГДА заменять на какое-то значение, т.к. сравнение с типом NULL всегда дает ЛОЖЬ даже если вы сравниваете NULL с NULL. Чаще всего значения NULL образуются в результате соединения таблиц (все виды соединений кроме внутреннего).
Конструкции в языке запросов 1с
Выше мы рассмотрели с Вами функции языка запросов 1с, теперь пришло время рассмотреть конструкции в языке запросов 1с, они не менее важны и полезны, приступаем.
Синтаксис: В( ), В ИЕРАРХИИ( )
Варианты шаблона строки:
Синтаксис: РАЗРЕШЕННЫЕ пишется после ключевого слова ВЫБРАТЬ
Синтаксис: РАЗЛИЧНЫЕ пишется после ключевого слова ВЫБРАТЬ
Также Конструкция РАЗЛИЧНЫЕ может использоваться с оператором РАЗРЕШЕННЫЕ и другими операторами.
Синтаксис: ДЛЯ ИЗМЕНЕНИЯ
Синтаксис: УПОРЯДОЧИТЬ ПО АВТОУПОРЯДОЧИВАНИЕ
Синтаксис: ИНДЕКСИРОВАТЬ ПО
Синтаксис: ИТОГИ ПО
На рисунке обведены группировки которые образовались в ходе выполнения запроса, самая верхняя относится к секции ОБЩИЕ, а вторая к полю ДоговорКонтрагентаВидДоговора.