Как в запросе 1с выбрать по значению
1. Что такое перечисление в запросе 1С?
Для начала освежим в памяти, что такое перечисление в запросе .
Перечисление представляет собой служебный тип данных, который не используется самостоятельно, а применяется в основном в совокупности с другими типами данных. Определить перечисление можно еще как список возможных значений реквизита.
Перечисления используются при вводе значений реквизитов документов, справочников, при вводе значений констант, в тех случаях, когда необходимо исключить неоднозначный ввод информации.
Можно добавить, что перечисления – это предопределенные данные. То есть к значению перечисления можно обращаться через точку. В то же время конкретное значение перечисления не имеет ссылки. Все это определяет особенности использования перечислений в запросах 1С .
2. Основные параметры перечисления
· Имя – имя значения, созданное по правилам формирования имен 1С, которое используется при обращении к конкретному значению через точку в тексте программы;
· Синоним – произвольное название значения, которое несет смысловую нагрузку и отображается как результат обращения к перечислению, является представлением ссылки;
· Порядок – порядковый номер значения в списке (начиная с 0). Весьма полезный параметр.
Использование перечисления в запросе 1С рассмотрим на самом простом примере: Пол Физического Лица. В России насчитывается 2 значения: Мужской и Женский. При локализации 1С в некоторых странах мира возможно увеличение количества значений до 7. Количество значений в перечислении не принципиально – принцип один и тот же для любого количества значений.
3. Использование перечисления в блоке запроса ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол КАК Пол
Справочник.ФизическиеЛица КАК ФизическиеЛица
В результате выполнения этого запроса в поле «Пол» будет находиться объект метаданных «Перечисление» с тем значением, которое присвоено данному Физическому лицу.
ФизическиеЛица.Ссылка КАК Ссылка,
ПРЕДСТАВЛЕНИЕ(ФизическиеЛица.Пол) КАК Пол
Справочник.ФизическиеЛица КАК ФизическиеЛица
Использование в запросе ключевого слова ПРЕДСТАВЛЕНИЕ позволит получить в поле «Пол» строку, содержащую Синоним данного значения перечисления в 1С. Нужно иметь ввиду, что визуализация значения Перечисления всегда идет через Синоним. Сделаем прямой запрос к объекту Перечисление:
ПолФизическогоЛица.Ссылка КАК Ссылка,
ПолФизическогоЛица.Порядок КАК Порядок
Перечисление.ПолФизическогоЛица КАК ПолФизическогоЛица
Мы увидим только Синонимы в поле «Ссылка» и порядковый номер в поле «Порядок».
4. Использование перечисления в условиях запроса
В условиях запроса «впрямую» (не через параметр запроса) можно использовать ТОЛЬКО конкретное значение перечисления в 1С , обозначая его с ключевым словом «ЗНАЧЕНИЕ» или «Порядок значения». Любой другой способ использования даст ошибку при исполнении запроса.
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол КАК Пол
Справочник.ФизическиеЛица КАК ФизическиеЛица
ФизическиеЛица.Пол = ЗНАЧЕНИЕ (Перечисление.ПолФизическогоЛица.Женский)
Результатом выполнения этого запроса будет таблица со ссылками физ. лиц женского пола.
ВНИМАНИЕ! В тексте запроса после «ЗНАЧЕНИЕ» слово «Перечисление» используется в единственном числе, в отличие от использования в тексте программ. Это частая ошибка начинающих пользователей, которые копируют текст, сформированный конструктором, из программы в запрос.
Аналогичный результат получится, если известен Порядок нужного Значения и лень писать длинные тексты:
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол КАК Пол
Справочник.ФизическиеЛица КАК ФизическиеЛица
ФизическиеЛица.Пол.Порядок = 1
Также в условиях запроса может быть использован список значений Перечисления:
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол КАК Пол
Справочник.ФизическиеЛица КАК ФизическиеЛица
ФизическиеЛица.Пол В (ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.Женский), ЗНАЧЕНИЕ(Перечисление.ПолФизическогоЛица.Мужской))
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.Пол КАК Пол
Справочник.ФизическиеЛица КАК ФизическиеЛица
ФизическиеЛица.Пол.Порядок В (1,2)
Если учитывать особенности, то использование перечислений в запросе – это несложный и понятный процесс.
Структура кода запроса в 1С легко изучить. Начнем от простого запроса к более сложным вариантам.
Выбрать
Любой запрос имеет команду ВЫБРАТЬ, после которой могут идти дополнительные параметры выборки, которые позднее рассмотрим отдельно:
ПЕРВЫЕ <ЧИСЛОЗАПИСЕЙ>
РАЗЛИЧНЫЕ
РАЗРЕШЕННЫЕ
Далее идет список полей выборки.
Простейший запрос в 1С может иметь такой вид:
Данный запрос вернет таблицу, состоящую из одной строки и одной колонки, в которой будет числовое значение равное 1.
Усложняем запрос: добавим еще поля, разделив их запятой
ВЫБРАТЬ 1, 2, "3"
Этот запрос также вернет 1 строку, но уже с 3 колонками, две из которых содержат числа, а 3 строковое.
Поэтому в языке запросов существует специальный оператор именования КАК <ИмяПоля>, который идет после поля,
Предыдущий запрос можно представить в таком виде:
ВЫБРАТЬ 1 КАК Один, 2 КАК Два, "3" КАК ЦифраТриСтрокой
Имена полей задаются по правилам именования переменных: не могут начинаться со строки, содержать пробелы, не должны повторятся в одной выборке, а также отсутствовать (они поставятся автоматически).
Возможно опускать слово КАК, но лучше такой вариант не использовать, так как конструктор запросов это исправит:
ВЫБРАТЬ ссылка ссылка ИЗ Справочник.ФизическиеЛица
Такие простые запросы конечно имеют место в реальных условиях, как вспомогательные таблицы, но обычно требуется выборка из какого-то источника.
Для этого существует оператор ИЗ <ТаблицаДанных>, в которой источник данных может быть реальной таблицей из базы данных, а также виртуальными таблицами, которые существуют к некоторым таким таблицами или же к временным таблицам.
Пример простого запроса к реальной таблице справочника:
ВЫБРАТЬ ссылка ИЗ Справочник.Контрагенты
В таких запросах мы можем указать конкретные поля, которые нам нужны или указать *.
ВЫБРАТЬ * ИЗ Справочник.Контрагенты
Такой вариант универсальный, но избыточное количество полей замедляет и усложняет их разбор позднее.
Вложенные таблицы
Также возможно обращение к вложенной таблице:
ВЫБРАТЬ * ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтактнаяИнформация
Как видите, здесь мы впервые использовали именование таблицы, которое также упрощает работу при написании запроса, это дает возможность обращения по этому имени к полям:
ВЫБРАТЬ КИ.Ссылка ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ //так иногда будет короче
Особенностью запросов к вложенным таблицам является то, что возможно обращение к родительской таблице через поле ссылка через точку.
ВЫБРАТЬ Ссылка.Наименование ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтактнаяИнформация
Подобная возможность используется и при обращении к реквизитам ссылочных полей: система сама неявно соединит нужные таблицы, но использование такого обращения следует использовать реже (особенно при указании условий в виртуальных таблицах или условий соединения таблиц).
ВЫБРАТЬ Ссылка, ОсновнойДоговор.Наименование КАК НазваниеДоговора ИЗ Справочник.Контрагенты
В данном случае поле ОсновнойДоговор может быть пустым, тогда обращение к его наименованию не вызовет ошибку, но значение будет NULL, поэтому рекомендуется использовать ЕстьNULL.
Дополнительно
Вернемся к запросу
ВЫБРАТЬ КИ.Ссылка ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
В данном запросе, мы не выбираем поля из самой подтаблицы КонтактнаяИнформация, и в случае если в ней несколько строк, то в выборку попадут несколько строк с одинаковым содержимым.
Чтобы избежать этого можно воспользоваться служебным словом РАЗЛИЧНЫЕ: система устранит все дубли автоматически.
ВЫБРАТЬ РАЗЛИЧНЫЕ КИ.Ссылка ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
Если мы хотим ограничить результат выборки количеством записей (например сотней) используем ПЕРВЫЕ, но использовать ее необходимо с осторожностью (иногда эта команда срабатывает раньше, чем применяются условия запросов), следует тестировать запросы основательно.
ВЫБРАТЬ ПЕРВЫЕ 100 КИ.Ссылка ИЗ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ Справочник.Контрагенты) КАК ВложеннаяТаблица
Использование вложенных запросов имеет смысл в случае, если в нем данные как-либо предварительно обрабатываются, а не как в вышеуказанном примере, где это излишне.
В целом, использование временных таблиц и вложенных запросов замедляет выборку, но парадокс в том, что их использование может дать нужный сигнал оптимизатору запросов и эффект получается положительный.
При больших исходных данных, следует проверять оба варианта использования, на предмет скорости исполнения, для принятия окончательного варианта запроса.
Регистр команд, имен и полей запроса не имеет значение: Выбрать и ВыБРатЬ равносильны.
Реклама магазина самообслуживания: треска, стоящая в очереди за cобственной печенью.
— Владимир Колечицкий
При работе с языком запросов 1С, иногда возникает ситуация, когда требуется проверить выражение, является ли оно ЛОЖЬ или Истина. В случае положительного результата присвоить ему значение выражения для замены.
Конструкция оператора ВЫБОР
ВЫБОР
КОГДА <ПроверяемоеВыражение> ТОГДА <ВыражениеЗамены_1>
ИНАЧЕ < ВыражениеЗамены_2>
КОНЕЦ
Несколько примеров
Пример №1
Есть таблица «Таблица1», в которой перечислены все дни с понедельника по воскресенье.
ДеньНедели |
Понедельник |
Вторник |
Среда |
Четверг |
Пятница |
Суббота |
Воскресенье |
Необходимо, для строк со значениями «Суббота» и «Воскресенье» в отдельном поле указать, что это выходной. Во всех остальных случаях, рабочий день. Реализуем поставленную задачу в виде запроса к исходной таблице.
Текст запроса может выглядеть так:
ДеньНедели | ВидДня |
Понедельник | Рабочий день |
Вторник | Рабочий день |
Среда | Рабочий день |
Четверг | Рабочий день |
Пятница | Рабочий день |
Суббота | Выходной |
Воскресенье | Выходной |
В данном примере, используя оператор ВЫБОР, мы перебираем все строки из «Таблица1». Параллельно проверяя каждую на соответствие условию.
Если сработает одно из них, то в колонку «ВидДня» произойдёт запись выражения замены, расположенного после ключевого слова ТОГДА. Во всех остальных случаях будет записано выражение расположенное после слова ИНАЧЕ. Причём если убрать секцию ИНАЧЕ, программа примет такую конструкцию и не выдаст ошибку. Однако если проверяемое выражение вернёт ЛОЖЬ, тогда строки, в которые должно было подставится выражение замены, получать значение NULL. Рассмотрим подробнее подобную ситуацию.
Пример №2
Возьмём уже известную нам таблицу из первого примера.
ДеньНедели |
Понедельник |
Вторник |
Среда |
Четверг |
Пятница |
Суббота |
Воскресенье |
Получите понятные самоучители по 1С бесплатно:
Необходимо вывести в отдельную таблицу количество выходных дней. Причём информацию о количестве рабочих дней, будем считать излишней. Для наглядности решим задачу в несколько этапов. За основу возьмём запрос из примера №1. Уберём из него секцию ИНАЧЕ, а поле для вывода оставим только то, которое получаем конструкцией оператора ВЫБОР.
ВидДня |
<NULL> |
<NULL> |
<NULL> |
<NULL> |
<NULL> |
Выходной |
Выходной |
Из результата запроса видно, что все строки, не вошедшие в условие после ключевого слова КОГДА получили <NULL>. Как известно <NULL> это отсутствие значения. Таким образом, нам остаётся только сгруппировать полученную таблицу. Применив к группировке агрегатную функцию КОЛИЧЕСТВО ( <Выражение>).
Текст запроса может выглядеть так:
В заключении хочется сказать, что оператор ВЫБОР хоть и не часто находит свое применение при написании запросов в 1С, но в некоторых ситуациях является незаменимым инструментом для разработчика.
Чтобы в 1C 8 поместить таблицу значений в запрос и использовать ее в качестве источника данных нужно:
1. Передать ее в параметр запроса
Пусть у нас есть таблица значений с именем ТЗ и полями: Договор, Количество, Сумма.
2. В конструкторе запроса задать структуру таблицы
Для этого вызываем конструктор запросов 1С 8, создаем новый запрос и жмем кнопку Создать описание временной таблицы.
В имени таблицы указываем переданный параметр, в поля заносим имена полей таблицы. Создание структуры временной таблицы:
Далее на закладке Дополнительно нужно указать, что мы создаем временную таблицу.
3. Использование созданной временной таблицы в запросе
Получите понятные самоучители по 1С бесплатно:
После того, как мы передали таблицу в запрос, ее можно использовать. Создаем новый пакет запросов на соответствующей закладке, переходим в него и видим, что в таблицах и полях появилась ветка Временные таблицы. Теперь можно делать с созданной таблицей все, что угодно: ставить условия, группировать, соединять с другими таблицами и т.п.
Вот пример простенького запроса с группировкой и условием:
Следует заметить, что в запрос можно передавать только таблицы значений с типизированными полями.
Читайте также: