Как сделать отбор в запросе 1с

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Параметры в запросах в языке 1С 8.3, 8.2 (в примерах)

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

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

Условия в запросах применяются, когда необходимо выбрать не все записи из таблицы информационной базы 1С, а только соответствующие одному или нескольким критериям отбора.

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

Ключевое слово ГДЕ используется в запросах 1С, когда условие применяется к записям, отбираемым из информационной базы. При этом фильтрация записей происходит на этапе их выбора из таблицы информационной базы.

Например, есть таблица Выплаты, содержащая перечень сотрудников и произведенные им выплаты.

Условия в запросах 1С

Если необходимо отобрать выплаты на сумму не менее 10 000, то запрос будет выглядеть следующим образом

Запрос . Текст = "ВЫБРАТЬ
| Выплаты.Сотрудник,
| Выплаты.Зарплата
|ИЗ
| Выплаты
|ГДЕ
| Выплаты.Зарплата >=10000"

Результатом выполнения запроса будет следующая таблица.

Условия в запросах 1С

Ключевое слово ИМЕЮЩИЕ в запросах 1С применяется, когда необходимо произвести отбор среди уже выбранных записей. Напрмиер, это ключевое слово применяется, когда нужно произвести фильтрацию сгруппированных записей в результате запроса.

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

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

Запрос . Текст = "ВЫБРАТЬ
| Выплаты.Сотрудник,
| СУММА(Выплаты.Зарплата) КАК Зарплата
|ИЗ
| Выплаты
|СГРУППИРОВАТЬ ПО
| Выплаты.Сотрудник
|ИМЕЮЩИЕ
| СУММА(Выплаты.Зарплата) > 20000"

Результат выполнения этого запроса будет таким.

Условия в запросах 1С

На этом примере наглядно видна разница между ключевыми словами ГДЕ и ИМЕЮЩИЕ. Если бы мы использовали слово ГДЕ вместо ИМЕЮЩИЕ, то сначала был бы произведен отбор записей с зарплатой больше 20000, а потом по ним подсчитана сумма по каждому сотруднику. В результате мы получили бы пустой результат запроса, т.к. ни один сотрудник не получал больше 20000 за одну выплату.

Условия отбора в вирутальных таблицах регистров

Виртуальные таблицы есть у всех регистров в системе 1С:Предприятие: регистров накопления, регистров сведений, регистров бухгалтерии. Задать условия к виртуальным таблицам можно двумя способами:

  1. через параметры виртуальной таблица;
  2. через секции запроса ГДЕ или ИМЕЮЩИЕ.

Различия между секциями ГДЕ и ИМЕЮЩИЕ мы уже рассматривали. Чтобы было понятно, чем условия в этих секциях запроса отличаются от условий в параметрах виртуальной таблицы, нужно понять, что же такое виртуальные таблицы регистров в 1С. Важной их особенностью является то, что они не существуют в информационной базе. Это инструмент, предоставляемый нам платформой 1С:предприятие для оптимизации работы конфигурации.

Таким образом, если условие прописано в параметрах виртуальной таблицы, то оно применяется на этапе ее формирования из записей реальной таблица регистра. А если в секциях ГДЕ или ИМЕЮЩИЕ, то — к записям уже сформированной виртуальной таблицы.

Рассмотрим пример. Дана таблица периодического регистра сведений КурсыВалют.

Условия в запросах 1С

Требуется выбрать на наименьшую дату валюты, курс которых меньше 30 р.

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

Запрос . Текст = "ВЫБРАТЬ
| КурсыВалютСрезПервых.Период,
| КурсыВалютСрезПервых.Валюта,
| КурсыВалютСрезПервых.Курс,
|ИЗ
| РегистрСведений.КурсыВалют.СрезПервых (, Курс

В этом случае мы получим одну запись: Доллар 28,3 от 01.02.2007. Это будет верное решение задачи.

Если же мы поместим условие в секцию ГДЕ, то результат запроса будет пустым, поскольку сначала будет сделан срез первых по каждой валюте (в результате получим две записи от 01.01.2007 Доллар 30,25 и Евро 40,5), а потом из них будут выбраны записи, удовлетворяющие условию. Но обе полученные записи условию Курс Раздел: Программирование Статьи по 1С Метки: язык запросов 1С

Добавить комментарий Отменить ответ

Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.

Запросы предназначены для извлечения и обработки информации из базы данных для предоставления пользователю в требуемом виде. Под обработкой здесь подразумевается группировка полей, сортировка строк, расчет итогов и т.д. Изменять данные с помощью запросов в 1С нельзя!

Запрос выполняется в соответствии с заданными инструкциями — текстом запроса. Текст запроса составляется в соответствии с синтаксисом и правилами языка запросов. Язык запросов 1С:Предприятие 8 основан на базе стандартного SQL, но имеет некоторые отличия и расширения.

Схема работы с запросом

Общая схема работы с запросом состоит из нескольких последовательных этапов:

  1. Создание объекта Запрос и установка текста запроса;
  2. Установка параметров запроса;
  3. Выполнение запроса и получение результата;
  4. Обход результата запроса и обработка полученных данных.

1. Объект Запрос имеет свойство Текст, которому необходимо присвоить текст запроса.

3. После присвоения текста и установки параметров запрос необходимо выполнить и получить результат выполнения. Выполнение производится методом Выполнить () , который возвращает объект РезультатЗапроса. Из результата запроса можно:

  • получить выборку с помощью метода Выбрать ( ТипОбхода >, Группировки >, ГруппировкиДляЗначенийГруппировок >) ;
  • выгрузить значения в таблицу значений или дерево значений с помощью метода Выгрузить ( ТипОбхода >) .

// Получение выборки
РезультатЗапроса = Запрос . Выполнить ();
Выборка = РезультатЗапроса . Выбрать ();

// Получение таблицы значений
РезультатЗапроса = Запрос . Выполнить ();
Таблица = РезультатЗапроса . Выгрузить ();

4. Обойти выборку результата запроса можно с помощью цикла:

Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Курс );
КонецЦикла;

Полный пример работы с запросом может выглядеть так:

Состав текста запроса

Текст запроса состоит из нескольких секций:

Обязательной является только первая секция.

Временные таблицы и пакетные запросы

Язык запросов 1С поддерживает использование временных таблиц — таблиц, полученных в результате выполнения запроса и сохраненных на временной основе.

Часто можно столкнуться с ситуацией, когда в качестве источника запроса нужно использовать не таблицы базы данных, а результат выполнения другого запроса. Эту задачу можно решить с помощью вложенных запросов или временных таблиц. Применение временных таблиц позволяет упростить текст сложного запроса, разделив его на составные части, а также, в некоторых случаях, ускорить выполнение запроса и уменьшить количество блокировок. Для работы с временными таблицами используется объект МенеджерВременныхТаблиц. Создание временной таблицы производится при помощи ключевого слова ПОМЕСТИТЬ, за которым следует наименование временной таблицы.

Для использования временной таблицы ВТВалюты в других запросах необходимо этим запросам присвоить общий менеджер временных таблиц — МенеджерВТ.

Виртуальные таблицы

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

Существуют следующие виртуальные таблицы (в скобках указаны возможные параметры):

  • Для регистров сведений:
    • СрезПервых( , ) — наиболее ранние записи на указанную дату;
    • СрезПоследних( , ) — наиболее поздние записи на указанную дату;
    • Остатки( , ) — остатки на указанную дату;
    • Обороты( , , , ) — обороты за период;
    • ОстаткиИОбороты( , , , , ) — остатки и обороты за период;
    • Остатки( , , , ) — остатки на указанную дату в разрезе счета, измерений и субконто;
    • Обороты( , , , , , , , ) — обороты за период в разрезе счета, измерений, кор. счета, субконто, кор. субконто;
    • ОстатковИОборотов( , , , , , , ) — остатки и оборотов в разрезе счета, измерений и субконто;
    • ОборотыДтКт( , , , , , , , ) — обороты за период в разрезе счета Дт, счета Кт, Субконто Дт, Субконто Кт;
    • ДвиженияССубконто( , , , , ) — движения вместе со значениями субконто;
    • База( , , , ) — базовые данные регистра расчета;
    • ДанныеГрафика( ) — данные графика;
    • ФактическийПериодДействия( ) — фактический период действия.

    При работе с виртуальными таблицами следует накладывать отборы в параметрах виртуальных таблиц, а не в условии ГДЕ. От этого сильно зависит время выполнения запроса.

    Конструктор запроса

    Для ускорения ввода текстов запросов платформа имеет специальные инструменты: Конструктор запроса и Конструктор запроса с обработкой результата. Для вызова конструкторов необходимо щелкнуть правой кнопкой мыши и выбрать требуемый пункт:

    Вызов конструктора запроса

    Также конструкторы можно вызвать из главного меню Текст.

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

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

    Конструктор запроса 1С

    Объект СхемаЗапроса

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

    • УстановитьТекстЗапроса ( Текст >) — заполняет свойство ПакетЗапросов на основании переданного текста запроса;
    • ПолучитьТекстЗапроса () — возвращает сформированный на основании свойства ПакетЗапросов текст запроса;

    Рассмотрим пример работы с объектом СхемаЗапроса. Для программного формирования текста запроса

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

    УПОРЯДОЧИТЬ ПО
    Валюты.Код

    Код на встроенном языке может выглядеть так:

    Остались вопросы?
    Спросите в комментариях к статье.

    Для расширения своих знаний рекомендую Вам прочитать следующие статьи.

    Отбор по регистратору в 1С СКД

    Как в 1С СКД сделать отбор по типу документа

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

    Отбор по регистратору в 1С СКД

    1С СКД как сделать отбор по типу документа (регистратору)

    Вот так достаточно просто можно настроить отбор в СКД по типу документа регистратору с возможностью выбора в пользовательском интерфейсе.

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