Несколько условий одновременно: от группы ИЛИ в отчёте до ВЫБОР КОГДА в запросе
Содержание
Чтобы в 1С выбрать данные по нескольким условиям сразу, условия собирают в группу: в настройках отчёта — через «Группа И» / «Группа ИЛИ» на вкладке «Отборы», в запросе — через И, ИЛИ и скобки в разделе ГДЕ, а для вычисляемого поля — через ВЫБОР КОГДА … ТОГДА … ИНАЧЕ … КОНЕЦ. Механизм общий для платформы 1С:Предприятие 8.3, поэтому работает одинаково в Бухгалтерии, ЗУП, УТ и любой другой конфигурации.
Частое заблуждение: «добавлю ещё одну строку отбора — и программа покажет больше данных». На деле всё наоборот. Строки отбора верхнего уровня объединяются через «И», и каждая новая строка только сужает выборку. Чтобы расширить её, нужна группа «ИЛИ».
Где именно нужно задать несколько условий
Условия выбора в 1С живут на трёх уровнях. От уровня зависит, кто их настраивает и где они сохраняются.
| Уровень | Кто настраивает | Где | Что сохраняется |
|---|---|---|---|
| Отчёт на СКД | Пользователь | Настройки отчёта, вкладка «Отборы» | Вариант отчёта или пользовательская настройка |
| Список документов, справочников | Пользователь | Меню «Ещё», настройка списка | Настройка формы у этого пользователя |
| Запрос | Разработчик | Текст запроса или конструктор | Код конфигурации, внешняя обработка |
| Программный отбор | Разработчик | Модуль формы или отчёта | Код, срабатывает при каждом открытии |
Отборы в отчёте: как собрать несколько условий в группу
Большинство отчётов в типовых конфигурациях построены на системе компоновки данных (СКД). У всех одинаковая логика отборов.
Пошагово
- Откройте отчёт и нажмите «Настройки».
- Переключите вид настроек с обычного на расширенный. В обычном виде показаны только быстрые отборы, а группы условий там не собрать.
- Перейдите на вкладку «Отборы».
- Добавьте поля, по которым нужен выбор: например, «Контрагент» и «Сумма».
- Выделите строки, которые должны работать через «ИЛИ», и сгруппируйте их. В типовых конфигурациях на базе БСП это команда «Сгруппировать условия» в командной панели вкладки.
- В строке группы выберите тип: «Группа ИЛИ», «Группа И» или «Группа НЕ».
- Проверьте флажки слева у каждой строки. Строка без флажка не участвует в отборе, хотя и видна.
- Нажмите «Закрыть и сформировать».
Пример. Нужно увидеть продажи покупателю «Альфа» или любые продажи больше 100 000 ₽, но только по организации «Север». Структура отбора:
- Организация Равно «Север»
- Группа ИЛИ
- Контрагент Равно «Альфа»
- Сумма Больше 100 000
Документ «Альфе» на 20 000 ₽ попадёт в отчёт. Документ «Бете» на 150 000 ₽ — тоже. Документ «Бете» на 30 000 ₽ — нет. Документ «Альфе» на 500 000 ₽ по организации «Юг» — тоже нет: он не прошёл условие верхнего уровня.
Если условия «ИЛИ» касаются одного и того же поля (три склада, пять контрагентов), группа не нужна. Поставьте вид сравнения «В списке» и выберите несколько значений. Это короче и надёжнее.
Сохранить, чтобы не собирать заново
Собранный отбор живёт до закрытия отчёта. Чтобы он остался, сохраните вариант отчёта (команда сохранения варианта в меню «Ещё» формы отчёта) или пользовательские настройки. Сохранённый вариант потом выбирается в один клик.
И, ИЛИ, НЕ: как 1С читает комбинацию условий
Логика одинакова в отборах и в запросах. Разница только в записи: в отборе — вложенные группы, в запросе — скобки.
| Оператор | Строка попадает в выборку, если | Аналог в отборе |
|---|---|---|
И | выполнены все условия | строки верхнего уровня, «Группа И» |
ИЛИ | выполнено хотя бы одно | «Группа ИЛИ» |
НЕ | условие не выполнено | «Группа НЕ», виды сравнения «Не равно», «Не в списке» |
Приоритет в языке запросов: сначала НЕ, затем И, затем ИЛИ. Поэтому запись
Склад = &Основной ИЛИ Склад = &Резервный И Сумма > 100000
платформа понимает как Склад = &Основной ИЛИ (Склад = &Резервный И Сумма > 100000). Все документы основного склада попадут в выборку при любой сумме. Если имелось в виду «любой из двух складов, и сумма больше 100 000», нужны скобки:
(Склад = &Основной ИЛИ Склад = &Резервный) И Сумма > 100000
Ставьте скобки всегда, когда в одном условии встречаются И и ИЛИ. Даже если порядок совпадает с приоритетом, скобки снимают вопрос у того, кто будет читать запрос через год.
«Группа НЕ» в отчёте инвертирует всё, что внутри. Группа НЕ с двумя условиями «Контрагент = Альфа» и «Сумма > 100 000» внутри исключит только те строки, где выполнены оба условия одновременно. Это правило де Моргана: НЕ (А И Б) равно НЕ А ИЛИ НЕ Б.
Несколько условий в запросе: ГДЕ, параметры и конструктор
Запись в тексте запроса
ВЫБРАТЬ
Реализация.Ссылка КАК Документ,
Реализация.Контрагент КАК Контрагент,
Реализация.СуммаДокумента КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И (Реализация.Склад В (&Склады)
ИЛИ Реализация.СуммаДокумента > &ПорогСуммы)
Параметры передаются перед выполнением:
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаОкончания));
Запрос.УстановитьПараметр("Склады", МассивСкладов);
Запрос.УстановитьПараметр("ПорогСуммы", 100000);
Три приёма, которые экономят код:
- 📋
В (&Список)вместо цепочкиИЛИпо одному полю. В параметр можно передать массив, список значений или таблицу. - 📅
МЕЖДУ … И …вместо пары условий>=и<=. Границы включаются. - 🔍
В ИЕРАРХИИ (&Группа)— выбор по группе справочника вместе со всеми вложенными элементами.
Если в параметр &Склады передать пустой массив, условие В (&Склады) не выполнится ни для одной строки. Когда пустой список означает «все склады», проверяйте это в коде и не добавляйте условие в запрос.
Через конструктор запроса
В конструкторе условия задаются на вкладке «Условия». Перетащите поле из левой части — появится строка с условием и параметром. Все строки этой вкладки объединяются через И.
Чтобы получить ИЛИ или скобки, отметьте у строки флажок «Произвольное» и напишите выражение целиком, например (Реализация.Склад В (&Склады) ИЛИ Реализация.СуммаДокумента > &ПорогСуммы). Конструктор вставит его в ГДЕ как есть.
ВЫБОР КОГДА ТОГДА: несколько условий в одном поле
Когда строки нужно не отсеять, а разметить, используют выражение ВЫБОР. Оно возвращает значение первой ветки, условие которой истинно. В каждой ветке КОГДА можно соединять сколько угодно условий через И / ИЛИ.
ВЫБРАТЬ
Реализация.Ссылка КАК Документ,
Реализация.СуммаДокумента КАК Сумма,
ВЫБОР
КОГДА Реализация.СуммаДокумента >= 1000000
ТОГДА "Крупная"
КОГДА Реализация.СуммаДокумента >= 100000
И Реализация.Дата >= &НачалоКвартала
ТОГДА "Средняя, текущий квартал"
КОГДА Реализация.СуммаДокумента >= 100000
ИЛИ Реализация.Контрагент В (&КлючевыеКлиенты)
ТОГДА "Средняя"
ИНАЧЕ "Мелкая"
КОНЕЦ КАК Категория
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Как отработают четыре документа:
| Документ | Сумма | Условия | Категория |
|---|---|---|---|
| Ключевому клиенту, текущий квартал | 1 200 000 | первая ветка истинна | Крупная |
| Обычному клиенту, текущий квартал | 150 000 | вторая ветка | Средняя, текущий квартал |
| Обычному клиенту, прошлый квартал | 150 000 | вторая ложна, третья истинна | Средняя |
| Ключевому клиенту | 50 000 | третья истинна по клиенту | Средняя |
Из таблицы видны два правила:
- 🔢 Порядок веток решает. Документ на 1 200 000 ₽ подходит и под вторую, и под третью ветку, но получит «Крупная», потому что первая сработала раньше. Ставьте самые узкие условия выше.
- ❓ Без
ИНАЧЕрезультат —NULL. Если ни одна ветка не подошла иИНАЧЕнет, поле будет пустым, и группировка по нему соберёт такие строки в отдельную строку без названия.
ВЫБОР допустим и в ГДЕ, но там его почти всегда можно заменить обычными И/ИЛИ — так запрос читается проще.
В конструкторе вычисляемое поле добавляют на вкладке «Таблицы и поля»: создайте новое поле и в редакторе выражения напишите ВЫБОР … КОНЕЦ. В схеме компоновки то же выражение пишут на вкладке «Вычисляемые поля», и в отчёте по новому полю можно ставить отбор, как по обычному.
Отбор по нескольким условиям в журналах и справочниках
Формы списков в 8.3 — динамические списки. Отбор в них настраивается почти так же, как в отчёте.
Быстро, без настроек
- ⌨️ Ctrl+F — поиск по строке: 1С ищет введённый текст по видимым колонкам.
- 🔎 Alt+F — расширенный поиск: выбираете поле, значение и способ сравнения. Удобно, чтобы найти документы конкретного контрагента.
- 🧭 Поля быстрого отбора в шапке. Во многих журналах Бухгалтерии 3.0 над списком есть поля для отбора по организации, контрагенту или складу. Заполненные поля работают через «И».
Через настройку списка
- В форме списка откройте меню «Ещё» и выберите команду настройки списка.
- На вкладке «Отбор» добавьте поля условий.
- Сгруппируйте нужные условия и выберите тип группы, как в отчёте: «Группа ИЛИ», «Группа И», «Группа НЕ».
- Нажмите «Завершить редактирование» — отбор применится к списку.
Отбор запоминается для этого пользователя и этой формы. Если через неделю журнал «потерял» документы, первым делом откройте настройку списка и посмотрите вкладку «Отбор».
В списке можно отбирать только по полям, которые есть в его наборе данных. Если нужного поля нет в настройке, разработчик добавляет его в запрос динамического списка — пользователь сам его не включит.
Установка нескольких условий отбора программно
В коде отбор собирается из тех же объектов, что и в интерфейсе: группы ГруппаЭлементовОтбораКомпоновкиДанных и элементы ЭлементОтбораКомпоновкиДанных. Пример для формы списка документов: показать проведённые документы, где контрагент из списка или сумма больше 100 000.
&НаСервере
Процедура УстановитьОтборСписка(СписокКонтрагентов)
Отбор = Список.Отбор;
Отбор.Элементы.Очистить();
// Условие верхнего уровня: соединяется с группой через И
Элемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Проведен");
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Элемент.ПравоеЗначение = Истина;
Элемент.Использование = Истина;
// Группа ИЛИ из двух условий
Группа = Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
Группа.Использование = Истина;
Элемент = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
Элемент.ПравоеЗначение = СписокКонтрагентов; // СписокЗначений
Элемент.Использование = Истина;
Элемент = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СуммаДокумента");
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Элемент.ПравоеЗначение = 100000;
Элемент.Использование = Истина;
КонецПроцедуры
Итоговое условие: Проведен И (Контрагент В списке ИЛИ СуммаДокумента > 100000).
Что учесть:
- 🧱
Использование = Истинаобязательно для каждого элемента и группы. Без него условие добавится, но не сработает. - 🧹
Очистить()удаляет все элементы программного отбора. Если отбор ставят несколько процедур, вместо очистки ищите и меняйте свои элементы. - 🧰 Хелпер БСП. Для одиночного условия в типовых конфигурациях есть
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка. Группы ИЛИ он не собирает — их проще написать вручную, как выше. - 📊 В отчёте те же объекты доступны через компоновщик:
КомпоновщикНастроек.Настройки.Отбор. Пользовательские отборы, заданные в форме отчёта, при этом тоже учитываются.
Имя поля в ПолеКомпоновкиДанных должно совпадать с именем поля в наборе данных списка или отчёта. Если поле написано с ошибкой, условие просто не будет применено.
Почему выборка по нескольким условиям возвращает не то
Подробнее о самой коварной ловушке — условии на левое соединение. Запрос «все контрагенты и их оплаты за месяц»:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
Оплаты.Сумма КАК Оплачено
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Оплаты КАК Оплаты
ПО Контрагенты.Ссылка = Оплаты.Контрагент
И Оплаты.Сумма > 0
Условие Оплаты.Сумма > 0 стоит в ПО — в результат попадут все контрагенты, у кого не было оплат, с пустой суммой. Перенесите его в ГДЕ, и левое соединение фактически станет внутренним: контрагенты без оплат исчезнут.