Несколько условий одновременно: от группы ИЛИ в отчёте до ВЫБОР КОГДА в запросе

· 10 мин

Содержание

Чтобы в 1С выбрать данные по нескольким условиям сразу, условия собирают в группу: в настройках отчёта — через «Группа И» / «Группа ИЛИ» на вкладке «Отборы», в запросе — через И, ИЛИ и скобки в разделе ГДЕ, а для вычисляемого поля — через ВЫБОР КОГДА … ТОГДА … ИНАЧЕ … КОНЕЦ. Механизм общий для платформы 1С:Предприятие 8.3, поэтому работает одинаково в Бухгалтерии, ЗУП, УТ и любой другой конфигурации.

Частое заблуждение: «добавлю ещё одну строку отбора — и программа покажет больше данных». На деле всё наоборот. Строки отбора верхнего уровня объединяются через «И», и каждая новая строка только сужает выборку. Чтобы расширить её, нужна группа «ИЛИ».

Где именно нужно задать несколько условий

Условия выбора в 1С живут на трёх уровнях. От уровня зависит, кто их настраивает и где они сохраняются.

УровеньКто настраиваетГдеЧто сохраняется
Отчёт на СКДПользовательНастройки отчёта, вкладка «Отборы»Вариант отчёта или пользовательская настройка
Список документов, справочниковПользовательМеню «Ещё», настройка спискаНастройка формы у этого пользователя
ЗапросРазработчикТекст запроса или конструкторКод конфигурации, внешняя обработка
Программный отборРазработчикМодуль формы или отчётаКод, срабатывает при каждом открытии
Где вам нужно выбрать данные по нескольким условиям?

Отборы в отчёте: как собрать несколько условий в группу

Большинство отчётов в типовых конфигурациях построены на системе компоновки данных (СКД). У всех одинаковая логика отборов.

Пошагово

  1. Откройте отчёт и нажмите «Настройки».
  2. Переключите вид настроек с обычного на расширенный. В обычном виде показаны только быстрые отборы, а группы условий там не собрать.
  3. Перейдите на вкладку «Отборы».
  4. Добавьте поля, по которым нужен выбор: например, «Контрагент» и «Сумма».
  5. Выделите строки, которые должны работать через «ИЛИ», и сгруппируйте их. В типовых конфигурациях на базе БСП это команда «Сгруппировать условия» в командной панели вкладки.
  6. В строке группы выберите тип: «Группа ИЛИ», «Группа И» или «Группа НЕ».
  7. Проверьте флажки слева у каждой строки. Строка без флажка не участвует в отборе, хотя и видна.
  8. Нажмите «Закрыть и сформировать».

Пример. Нужно увидеть продажи покупателю «Альфа» или любые продажи больше 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 над списком есть поля для отбора по организации, контрагенту или складу. Заполненные поля работают через «И».

Через настройку списка

  1. В форме списка откройте меню «Ещё» и выберите команду настройки списка.
  2. На вкладке «Отбор» добавьте поля условий.
  3. Сгруппируйте нужные условия и выберите тип группы, как в отчёте: «Группа ИЛИ», «Группа И», «Группа НЕ».
  4. Нажмите «Завершить редактирование» — отбор применится к списку.

Отбор запоминается для этого пользователя и этой формы. Если через неделю журнал «потерял» документы, первым делом откройте настройку списка и посмотрите вкладку «Отбор».

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

Установка нескольких условий отбора программно

В коде отбор собирается из тех же объектов, что и в интерфейсе: группы ГруппаЭлементовОтбораКомпоновкиДанных и элементы ЭлементОтбораКомпоновкиДанных. Пример для формы списка документов: показать проведённые документы, где контрагент из списка или сумма больше 100 000.

&НаСервере
Процедура УстановитьОтборСписка(СписокКонтрагентов)

	Отбор = Список.Отбор;
	Отбор.Элементы.Очистить();

	// Условие верхнего уровня: соединяется с группой через И
	Элемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Элемент.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Проведен");
	Элемент.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
	Элемент.ПравоеЗначение = Истина;
	Элемент.Использование  = Истина;

	// Группа ИЛИ из двух условий
	Группа = Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	Группа.ТипГруппы     = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
	Группа.Использование = Истина;

	Элемент = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Элемент.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Контрагент");
	Элемент.ВидСравнения   = ВидСравненияКомпоновкиДанных.ВСписке;
	Элемент.ПравоеЗначение = СписокКонтрагентов; // СписокЗначений
	Элемент.Использование  = Истина;

	Элемент = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Элемент.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("СуммаДокумента");
	Элемент.ВидСравнения   = ВидСравненияКомпоновкиДанных.Больше;
	Элемент.ПравоеЗначение = 100000;
	Элемент.Использование  = Истина;

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

Итоговое условие: Проведен И (Контрагент В списке ИЛИ СуммаДокумента > 100000).

Что учесть:

  • 🧱 Использование = Истина обязательно для каждого элемента и группы. Без него условие добавится, но не сработает.
  • 🧹 Очистить() удаляет все элементы программного отбора. Если отбор ставят несколько процедур, вместо очистки ищите и меняйте свои элементы.
  • 🧰 Хелпер БСП. Для одиночного условия в типовых конфигурациях есть ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка. Группы ИЛИ он не собирает — их проще написать вручную, как выше.
  • 📊 В отчёте те же объекты доступны через компоновщик: КомпоновщикНастроек.Настройки.Отбор. Пользовательские отборы, заданные в форме отчёта, при этом тоже учитываются.

Имя поля в ПолеКомпоновкиДанных должно совпадать с именем поля в наборе данных списка или отчёта. Если поле написано с ошибкой, условие просто не будет применено.

Почему выборка по нескольким условиям возвращает не то

Диагностика: выберите симптом

Подробнее о самой коварной ловушке — условии на левое соединение. Запрос «все контрагенты и их оплаты за месяц»:

ВЫБРАТЬ
	Контрагенты.Ссылка КАК Контрагент,
	Оплаты.Сумма КАК Оплачено
ИЗ
	Справочник.Контрагенты КАК Контрагенты
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Оплаты КАК Оплаты
		ПО Контрагенты.Ссылка = Оплаты.Контрагент
			И Оплаты.Сумма > 0

Условие Оплаты.Сумма > 0 стоит в ПО — в результат попадут все контрагенты, у кого не было оплат, с пустой суммой. Перенесите его в ГДЕ, и левое соединение фактически станет внутренним: контрагенты без оплат исчезнут.

Частые вопросы

Сколько условий можно задать в одном отборе?
Жёсткого предела для пользователя нет. Практическое ограничение — читаемость: если условий больше десяти, лучше сохранить их в отдельном варианте отчёта с понятным именем.
Можно ли вложить группу ИЛИ внутрь группы И?
Да. Группы вкладываются друг в друга на любую глубину, как скобки в выражении. Например, «Группа И» с двумя «Группами ИЛИ» внутри равна выражению (А ИЛИ Б) И (В ИЛИ Г).
Чем «В списке» отличается от группы ИЛИ?
Результат одинаков, если все условия про одно поле. «В списке» короче и быстрее в настройке. Группа ИЛИ нужна, когда условия про разные поля: контрагент или сумма.
Почему в отчёте нет поля, по которому нужен отбор?
Отбор доступен только по полям набора данных отчёта. Иногда нужное поле есть как реквизит другого поля: раскройте «Контрагент» плюсиком и выберите, например, его ИНН.
Работает ли ВЫБОР КОГДА в отборе отчёта?
Напрямую — нет: в отборе нет выражений. Сначала создают вычисляемое поле с ВЫБОР в схеме компоновки, а затем ставят отбор по этому полю.