1С 8.3 Условия в запросе - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

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

Данные > Примеры кода 1С > 1С 8.3 Запросы
Условия в запросе 1С 8.3 необходимо грамотно располагать в коде и оптимально использовать, чтобы избежать падение производительности выполнения запроса. Условия в основном располагаются после служебного слова ГДЕ (до группировки). Но могут быть расположены и после служебного слова ИМЕЮЩИЕ (после группировки) и в параметрах виртуальных таблиц (свойство Условие) и в конструкции кода ВЫБОР КОГДА.

Для реализации различных условий, используются различные операторы:
  • сравнения: больше >, меньше <, равно =,  не равно <>
  • отрицания: НЕ ставится в начале выражения через пробел, например: НЕ 5 = 10
  • группировки: И, ИЛИ, () Например: (7 = 7) И (5<>10)
  • булево: ИСТИНА, ЛОЖЬ, например: (5 = 10) = ЛОЖЬ
  • ПОДОБНО <шаблон> для сравнения строковых значений
  • ССЫЛКА <тип> проверка на совпадение ссылочным типом
  • В() во вложенном запросе, массиве, параметре
  • В ИЕРАРХИИ()  в группе справочника, переданных в скобках, плана видов характеристик
Условия в запросе на выбранные строки до группировки в 1С 8.3:
&НаСервере
Процедура УсловияВЗапросеНаВыбранныеСтрокиДоГруппировки()

   
// Выборка материалов с весом от 250 до 5000
   
Запрос = Новый Запрос("ВЫБРАТЬ
    |   Наименование,
    |   Вес
    | ИЗ
    |   Справочник.Материалы
    | ГДЕ
    |   Вес > 250 И Вес < 5000"
);

   
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

КонецПроцедуры
Условия в запросе на выбранные строки после группировки в 1С 8.3:
&НаСервере
Процедура УсловияВЗапросеНаВыбранныеСтрокиПослеГруппировки()

   
// Выборка  материалов с весом до 50
   
Запрос = Новый Запрос("ВЫБРАТЬ
    |   СрокИспользования,
    |   МАКСИМУМ(Вес)
    | ИЗ
    |   Справочник.Материалы
    | СГРУППИРОВАТЬ ПО
    |   СрокИспользования
    | ИМЕЮЩИЕ
    |   МАКСИМУМ(Вес) < 50"
);

   
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
    Пока
Записи.Следующий() Цикл
       
// Обход результата запроса по каждой записи в полученной выборке
   
КонецЦикла;

КонецПроцедуры
Условия в запросе если параметр не заполнен в 1С 8.3:
// Пример 1. Самый правильный. Это отбор в виртуальной таблице
Процедура КнопкаСформироватьНажатие1(Кнопка)

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

   Запрос.УстановитьПараметр("Поддон", Поддон);
   Запрос.УстановитьПараметр("Организация", Организация);

   РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
   Пока Записи.Следующий() Цикл
       // Обход результата запроса по каждой записи в полученной выборке
   КонецЦикла;

КонецПроцедуры

// Пример 2. Альтернативный

// На замену куску:
// ВЫБОР
// КОГДА &ВыбФирма <> Значение(Справочник.Фирмы.ПустаяСсылка)
// ТОГДА ВыбФирма = &ВыбФирма
// ИНАЧЕ Истина
// КОНЕЦ

Процедура КнопкаСформироватьНажатие2(Кнопка)

   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
    |    ЦеныПриходаИмпортера.Регистратор,
    |    ЦеныПриходаИмпортера.ВыбМатериал КАК ВыбМатериал,
    |    ЦеныПриходаИмпортера.ВыбФирма КАК ВыбФирма,
    |    ЦеныПриходаИмпортера.ЦенаПриходаВал,
    |    ЦеныПриходаИмпортера.ЦенаПрихода
    |ИЗ
    |    РегистрСведений.ЦеныПриходаИмпортера КАК ЦеныПриходаИмпортера
    |ГДЕ
    |    (ЦеныПриходаИмпортера.ВыбМатериал = &ВыбМатериал
    |            ИЛИ НЕ &ОтборПоВыбМатериал)
    |    И (ЦеныПриходаИмпортера.ВыбФирма = &ВыбФирма
    |            ИЛИ НЕ &ОтборПоФирме)
    |
    |УПОРЯДОЧИТЬ ПО
    |    ВыбМатериал,
    |    ВыбФирма
    |АВТОУПОРЯДОЧИВАНИЕ";

   Запрос.УстановитьПараметр("ВыбМатериал", ВыбМатериал);
   Запрос.УстановитьПараметр("ВыбФирма", ВыбФирма);
   Запрос.УстановитьПараметр("ОтборПоВыбМатериал", ЗначениеЗаполнено(ВыбМатериал));
   Запрос.УстановитьПараметр("ОтборПоФирме", ЗначениеЗаполнено(ВыбФирма));

   РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
   Пока Записи.Следующий() Цикл
       // Обход результата запроса по каждой записи в полученной выборке
   КонецЦикла;

КонецПроцедуры

// Пример 3. Альтернативный
Процедура КнопкаСформироватьНажатие3(Кнопка)

   Запрос = Новый Запрос;
   Запрос.Текст  = "ВЫБРАТЬ
    |    ОстаткиТоваров.Поддон КАК Поддон,
    |    ОстаткиТоваров.Номенклатура КАК Номенклатура,
    |    ОстаткиТоваров.КоличествоОстаток КАК КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ОстаткиТоваровНаПоддонах.Остатки(&НаДату, ) КАК ОстаткиТоваров
    |ГДЕ
    |    &СтрокаЗаменыПараметров";

   Запрос.УстановитьПараметр("НаДату",Отчет.НаДату);

   Если ЗначениеЗаполнено(Поддон) Тогда
       Запрос.Текст = СтрЗаменить(Запрос.Текст,"&СтрокаЗаменыПараметров",
      " ОстаткиТоваров.Поддон = &Поддон");
       Запрос.УстановитьПараметр("Поддон",Поддон);
   Иначе
       Запрос.Текст = СтрЗаменить(Запрос.Текст,"&СтрокаЗаменыПараметров",
      "Истина = Истина");
   КонецЕсли;


   РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
   Пока Записи.Следующий() Цикл
       // Обход результата запроса по каждой записи в полученной выборке
   КонецЦикла;

КонецПроцедуры
Пример c поста: https://t.me/by_1cnik/438
Пример от подписчика. Ссылка на пост: https://t.me/by_1cnik/438?comment=8758
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 14.06.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Назад к содержимому