Отбор в СКД 1С задаётся в настройках схемы компоновки на вкладке «Отбор» — для всего отчёта или для отдельной группировки. Элемент отбора состоит из поля (левое значение), вида сравнения и значения (правое значение); несколько элементов по умолчанию объединяются через «И», а для «ИЛИ» и «НЕ» используются группы отбора. Чтобы пользователь мог менять отбор сам, элемент включают в пользовательские настройки с режимом «Быстрый доступ».

Ниже разберу все уровни, на которых живут отборы: фиксированный отбор варианта, отбор на группировке (фильтр по итогам), пользовательские отборы и установку отбора программно — в отчёте и в динамическом списке формы.

Как устроен элемент отбора в СКД

В конструкторе схемы откройте «Настройки», выделите в структуре корневой элемент «Отчёт» или нужную группировку и перейдите на вкладку «Отбор». Добавить поле можно двойным щелчком из списка доступных полей, перетаскиванием или кнопкой «Добавить» на командной панели. Только через командную панель добавляется группа отбора — «Группа И», «Группа ИЛИ», «Группа НЕ».

Набор доступных видов сравнения зависит от типа поля:

Тип поляОсновные виды сравнения
Число, датаРавно, Не равно, Больше, Больше или равно, Меньше, Меньше или равно, В списке, Заполнено
СтрокаВсё для чисел плюс Содержит, Начинается с, Подобно (соответствует шаблону) и их отрицания
СсылкаРавно, Не равно, В списке, В группе, В группе из списка, Заполнено и их отрицания

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

Отбор в СКД 1С: элементы отбора как последовательные фильтры
Отбор в СКД 1С: элементы отбора как последовательные фильтры

Группы «И» и «ИЛИ»

Элементы верхнего уровня всегда соединяются через «И». Если нужно условие «склад Основной ИЛИ количество больше 100», создайте «Группу ИЛИ» и перетащите оба элемента внутрь. Группы можно вкладывать друг в друга, собирая выражения любой сложности.

Фиксированный отбор: когда его лучше перенести в запрос

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

Правило, которым пользуюсь на проектах:

  • в запрос — то, что пользователь не должен менять никогда;
  • в параметры — то, что задаёт рамки выборки (период, организация) и обязательно к заполнению;
  • в отбор — то, что пользователь включает и выключает по ситуации.

Параметры СКД — отдельная тема, о ней у меня есть подробная статья; здесь сосредоточимся на отборах.

Отбор на группировке: фильтр по итогам

Главное преимущество отборов СКД перед условиями запроса — их можно наложить на конкретную группировку. Такой отбор применяется после расчёта итогов этой группировки.

Пример: отчёт по продажам с группировкой «Номенклатура» и ресурсом «Количество». Нужно скрыть позиции, у которых итоговое количество за период меньше 15. В запросе это условие поставить нельзя: на уровне детальных записей итога ещё нет (можно было бы через ИМЕЮЩИЕ, но тогда теряется гибкость). Решение:

  1. В структуре настроек выделите группировку «Номенклатура».
  2. На вкладке «Отбор» переключатель с «Отчёт» поставьте на эту группировку.
  3. Добавьте элемент: поле «Количество», вид сравнения «Больше или равно», значение 15.

Строки, не прошедшие отбор, исчезнут вместе с вложенными записями, а общие итоги отчёта пересчитаются по оставшимся.

Убираем строку начального остатка в ведомости

Типичная задача в оборотных ведомостях с группировкой по регистратору. Если дата начала периода не совпадает с самой ранней датой движений, СКД выводит служебную строку с пустым регистратором — в ней сидит начальный остаток. Чтобы её убрать:

  1. На группировке «Регистратор» добавьте отбор «Регистратор» — «Заполнено».
  2. На вкладке «Другие настройки» этой же группировки установите параметр «Выводить отбор» в значение «Не выводить», иначе в шапке группировки появится текст условия.

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

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

Порядок для отбора по группе номенклатуры:

  1. На уровне «Отчёт» добавьте элемент отбора «Номенклатура», вид сравнения «В группе».
  2. Снимите флажок использования — по умолчанию отбор выключен.
  3. Откройте свойства элемента пользовательской настройки (кнопка на командной панели отбора) и включите «Включать в пользовательские настройки».
  4. Режим редактирования — «Быстрый доступ», если поле должно быть прямо на форме отчёта, или «Обычный», если достаточно окна «Настройки».
Пользовательские отборы СКД: панель управления, через которую пользователь меняет выборку
Пользовательские отборы СКД: панель управления, через которую пользователь меняет выборку

В режиме «Предприятие» пользователь увидит флажок, вид сравнения и поле значения.

Отбор-флажок с фиксированным условием

Иногда нужно, чтобы условие было жёстким, а пользователь лишь включал или выключал его: «Только просроченные», «Без услуг». Для этого заполните у элемента поле «Представление пользовательской настройки». Тогда на форму выводится только флажок с этим текстом, а вид сравнения и значение остаются скрытыми.

Если нужно лишь переименовать поле в отборе (например, «Номенклатура» → «Товар»), используйте свойство «Представление» самого элемента — условие при этом останется редактируемым.

Все отборы — в пользовательские настройки

Можно отдать пользователю не отдельные элементы, а весь отбор целиком: через «Свойства элемента пользовательских настроек» на уровне отчёта или группировки включите сам отбор. Тогда пользователь сможет добавлять собственные условия по любым доступным полям. Это удобно для аналитиков, но в отчётах для массовых пользователей я ограничиваюсь двумя-тремя заранее подготовленными отборами в быстром доступе.

Установка отбора программно в отчёте

Чтобы подставить отбор перед формированием (например, по текущей организации или по значению из внешней обработки), работайте с настройками компоновщика. В БСП для этого есть готовые функции модуля ОбщегоНазначенияКлиентСервер.

1С
// Модуль объекта отчёта
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

	Настройки = КомпоновщикНастроек.ПолучитьНастройки();

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

	КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

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

Обратите внимание на порядок параметров в БСП: сначала область отбора, имя поля, затем правое значение, и только потом вид сравнения. Функция ищет существующий элемент по полю, обновляет его, а если не нашла — добавляет новый.

Без БСП код выглядит так — заодно видно, как собрать группу «ИЛИ»:

1С
// Добавляет в отбор условие: Склад = Склад ИЛИ Количество > МинимальноеКоличество.
Процедура ДобавитьОтборСкладИлиКоличество(Отбор, Склад, МинимальноеКоличество)

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

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

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

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

Отбор на группировке программно ставится так же, только областью служит свойство Отбор элемента структуры, например Настройки.Структура[0].Отбор (если первый элемент — ГруппировкаКомпоновкиДанных). Надёжнее искать группировку по имени, а не по индексу: пользователь может поменять структуру варианта.

Отборы в динамических списках

Динамический список тоже построен на СКД, и у него есть свойство Отбор типа ОтборКомпоновкиДанных. Задать отбор можно двумя способами.

Через параметр формы «Отбор». При открытии формы списка передаётся структура: ключ — имя поля, значение — правая часть условия. Для одиночного значения вид сравнения будет «Равно», для массива или списка значений — «В списке».

1С
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Контрагент", ВыбранныйКонтрагент));
ОткрытьФорму("Документ.РеализацияТоваров.ФормаСписка", ПараметрыФормы);

Такой отбор попадает в фиксированные настройки компоновщика: пользователь его не видит и снять не может. Ограничение — только «Равно» и «В списке», без групп «ИЛИ».

Через свойство списка в модуле формы. Здесь доступны все виды сравнения:

1С
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

Режим отображения Недоступный скрывает отбор от пользователя, БыстрыйДоступ выводит его в панель пользовательских настроек.

Пользовательский отбор на форме списка

Чтобы у списка появилась панель с отборами, как в отчёте:

  1. В свойствах реквизита динамического списка откройте «Настроить список», добавьте элемент отбора и включите его в пользовательские настройки с режимом «Быстрый доступ».
  2. На форме создайте обычную группу для настроек.
  3. У элемента формы, связанного со списком, укажите эту группу в свойстве «Группа пользовательских настроек».

Типичные ошибки

  • Отбор по полю, которого нет в наборе. В списке доступных полей видны только поля наборов и вычисляемые поля. Если поле добавлено в запрос, но схема не пересохранилась с автозаполнением, отбор по нему недоступен.
  • Отбор вместо параметра по периоду. Отбор по полю «Период» накладывается на уже выбранные данные; виртуальная таблица остатков всё равно посчитается на дату параметра. Период задавайте параметрами.
  • Неверный порядок аргументов БСП. В УстановитьЭлементОтбора третий параметр — значение, четвёртый — вид сравнения. Перепутать легко, ошибки при этом не будет — просто отбор не сработает.
  • Изменение настроек без загрузки обратно. ПолучитьНастройки() возвращает копию; изменения нужно вернуть через ЗагрузитьНастройки().
  • Привязка к индексу группировки. Структура[0] ломается, как только пользователь добавит группировку выше.

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

Коротко

  • Отбор в СКД 1С задаётся на уровне отчёта или конкретной группировки; элементы верхнего уровня объединяются через «И», для «ИЛИ» нужны группы.
  • Отбор на группировке работает по рассчитанным итогам — так отсекают строки с маленькими суммами или служебную строку начального остатка.
  • Пользователю отдавайте отборы через пользовательские настройки в режиме «Быстрый доступ», а не через изменение варианта.
  • Программно отбор удобно ставить функциями БСП УстановитьЭлементОтбора и УстановитьЭлементОтбораДинамическогоСписка, помня о порядке параметров.
  • То, что нельзя менять никогда, пишите в текст запроса.