Фильтр в 1С 8.3: от быстрого отбора в списке до условий в коде
Содержание
Нужно увидеть в списке только документы одного контрагента или в отчёте только один склад. В 1С 8.3 для этого есть три уровня: быстрый поиск и отбор прямо в списке, настройка отбора в отчёте и условие в коде. Начните с самого простого и переходите к следующему, только если не хватило.
Ниже — по порядку: как сделать фильтр руками в списке и отчёте, чем простой отбор отличается от сложных условий, как собрать группы И/ИЛИ, как задать отбор программно и почему на больших таблицах он тормозит. Описан интерфейс «Такси» платформы 8.3.2x. Список и отчёт работают одинаково в Бухгалтерии, ЗУП и Управлении торговлей, различаются только названия полей.
1. Быстрый отбор в списках: поиск, значение колонки, расширенный поиск
В любом списке (контрагенты, номенклатура, поступления) над таблицей есть строка поиска. Введите часть названия или номера и нажмите Enter: платформа оставит только подходящие строки. Это самый быстрый «фильтр», и его хватает в большинстве случаев.
Три способа отфильтровать список, не открывая настроек:
- Поиск по строке. Вводите слово или фрагмент. Поиск идёт по основным реквизитам, а не по всем полям.
- Расширенный поиск. Открывается рядом со строкой поиска (сочетание
Alt+F). Здесь можно выбрать конкретное поле, вид сравнения и значение. - Отбор по значению в текущей ячейке. Встаньте на нужную ячейку (например, на контрагента в списке документов), откройте контекстное меню правой кнопкой и выберите команду отбора по текущему значению. Останутся только строки с тем же значением. Снять отбор можно там же или крестиком в строке поиска.
💡 В списках документов часто есть и готовые отборы сверху: период, организация, ответственный. Они работают быстрее самописных, потому что привязаны к индексированным полям.
Если список вдруг «пустой», сначала проверьте, не остался ли включённым чужой отбор: по периоду, организации или статусу. Это частая причина жалоб «пропали документы».
2. Простой отбор и сложные условия: в чём разница
Простой отбор — одно условие вида «поле равно значению». Сложное условие включает несколько полей, разные виды сравнения и логику между ними. В отчётах и динамических списках используется одна и та же механика — отбор компоновки данных, поэтому виды сравнения везде одинаковые.
| Вид сравнения | Что делает | Пример |
|---|---|---|
| Равно / Не равно | Точное совпадение или исключение | Склад равно «Основной» |
| В списке / Не в списке | Одно из нескольких значений | Организация в списке из двух юрлиц |
| В группе | Элемент внутри выбранной группы справочника | Номенклатура в группе «Канцелярия» |
| Содержит / Не содержит | Часть строки в любом месте | Наименование содержит «бумага» |
| Начинается с | Строка начинается с символов | Номер начинается с «ДП-» |
| Больше / Меньше (и «или равно») | Числа и даты | Сумма больше 100 000 |
| Заполнено / Не заполнено | Поле пустое или нет | Не заполнен договор |
Для строк виды «Содержит» и «Начинается с» удобны, но на больших объёмах медленнее точного «Равно». Об этом — в разделе про скорость.
3. Как сделать отбор в отчёте пошагово
Порядок одинаков для стандартных отчётов (Оборотно-сальдовая ведомость, Карточка счёта, Остатки товаров и т. п.):
- Откройте отчёт и нажмите кнопку Настройки в командной панели отчёта.
- Перейдите на вкладку Отбор. Если вкладок нет, переключите форму настроек из упрощённого вида в расширенный: в окне настроек есть соответствующая команда.
- Нажмите «Добавить отбор» (или перетащите поле из списка доступных полей в область отбора).
- Выберите поле, вид сравнения и значение. Чтобы сравнить с набором значений, выберите «В списке» и добавьте элементы.
- Убедитесь, что слева от условия стоит флажок — он включает отбор. Снятый флажок отключает условие, не удаляя его.
- Закройте настройки и нажмите Сформировать.
Часть отчётов показывает самые ходовые отборы прямо над таблицей: период, организация, счёт. Их задают без захода в настройки.
💡 Настроенный отбор можно сохранить как вариант отчёта и открывать одним щелчком. Так вы не собираете одно и то же условие каждый раз.
Отбор на разных уровнях
Отбор можно положить не только на весь отчёт, но и на отдельную группировку или таблицу внутри отчёта. Условие на уровне отчёта ограничит все данные, а условие на группировке — только её. Если цифры «не сходятся с соседним отчётом», посмотрите, на каком уровне стоит условие.
4. Сложные условия: группы И, ИЛИ, НЕ
Несколько условий в одном списке по умолчанию объединяются через И: строка должна подходить всем. Чтобы получить «или», нужна группа.
- В настройках отбора выберите команду добавления группы.
- Задайте тип группы: И, ИЛИ или НЕ.
- Перетащите или добавьте внутрь группы нужные условия.
Пример. Нужны документы за квартал, где сумма больше 100 000 или контрагент — «Ромашка». Период и сумма-или-контрагент — это разные логики:
- верхний уровень (И): период — с 1 июля по 30 сентября;
- вложенная группа (ИЛИ): сумма больше 100 000, контрагент равен «Ромашка».
Если собрать всё в одну группу И, получите только документы, у которых одновременно большая сумма и нужный контрагент. Это самая частая ошибка новичков, подробнее — в разделе про ошибки.
Группа НЕ инвертирует вложенные условия. Полезна, когда проще описать, что исключить: «не (контрагент в списке и договор не заполнен)».
5. Отбор в запросе: ГДЕ и параметры
В запросе на языке 1С фильтр — это секция ГДЕ. Значения лучше передавать параметрами, а не склеивать строкой: так нет ошибок с форматом дат и кавычками, и платформа кэширует план.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Документ,
| Док.Сумма КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Контрагент = &Контрагент
| И Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И Док.Проведен";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Сообщить(Результат.Документ);
КонецЦикла;
Что важно в этом примере:
- ✅ контрагент и даты переданы параметрами;
- ✅ конец периода округлён до конца дня функцией
КонецДня(), иначе документы последнего дня с временем после 00:00 выпадут из выборки; - ✅ условие по проведённости стоит в
ГДЕ.
Для необязательного условия («если контрагент не выбран, показать всех») есть приём: (&Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ИЛИ Док.Контрагент = &Контрагент). Но на больших таблицах такое условие может ухудшить план запроса. Надёжнее собирать текст запроса по частям: добавлять строку условия только при заполненном значении.
Отбор в виртуальных таблицах регистров
Для регистров накопления и сведений условие по измерениям лучше передавать в параметры виртуальной таблицы, а не писать в ГДЕ. Платформа применит его до расчёта итогов:
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки
Отбор в параметрах виртуальной таблицы заметно быстрее, чем получение остатков по всем складам с последующим ГДЕ.
6. Программная настройка отбора: динамический список и отчёт на СКД
Если в управляемой форме есть динамический список, отбор на него накладывают через коллекцию элементов отбора. Пример для списка, у которого есть поле Контрагент:
&НаКлиенте
Процедура ОтобратьПоКонтрагенту(Контрагент)
Список.Отбор.Элементы.Очистить();
ЭлементОтбора = Список.Отбор.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Контрагент;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
Три момента, на которых спотыкаются:
- Без
Использование = Истинаэлемент добавится, но отбор не сработает. Очистить()сбрасывает и отборы, которые пользователь поставил вручную. Если их нужно сохранить, удаляйте только свой элемент, найдя его по полю.- Имя в
ПолеКомпоновкиДанныхдолжно совпадать с именем поля в запросе динамического списка, а не с заголовком колонки на экране.
Для группы ИЛИ создают элемент ГруппаЭлементовОтбораКомпоновкиДанных, задают ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли и добавляют условия уже в неё.
В отчёте на системе компоновки данных (СКД) принцип тот же: отбор лежит в настройках компоновщика (КомпоновщикНастроек.Настройки.Отбор). Для типовых отчётов разработчики обычно не лезут в код, а используют параметры и пользовательские настройки, которые видит пользователь.
Правку типовых модулей и запросов делайте в расширении конфигурации, а не в самой конфигурации на поддержке. Иначе при обновлении изменения придётся переносить вручную.
7. Практические примеры для бухгалтерии, торговли и зарплаты
Готовые условия, которые собирают чаще всего. Названия полей зависят от конфигурации, смысл одинаков.
Бухгалтерия. Карточка счёта 60 по одному контрагенту: отбор «Контрагент равно …». Чтобы увидеть только операции без договора: поле «Договор» — «Не заполнено». Для проверки закрытия месяца полезен отбор по проведённости и по периоду, в который попадает последний день месяца.
Торговля. Остатки по группе товаров: «Номенклатура в группе …» плюс отбор по складу. Чтобы найти товары без розничной цены, используйте условие «Не заполнено» по цене в отчёте или списке с этим полем.
Зарплата и кадры. Сотрудники подразделения: отбор «Подразделение в группе …». Для выбора сотрудников с определённым видом начислений используйте отбор по этому полю в расчётной ведомости или отчёте по начислениям.
Три сценария, которые экономят больше всего времени:
- ✅ Документы за период у одного контрагента — период сверху плюс отбор по контрагенту.
- ✅ Все документы, кроме проведённых, — отбор по проведённости «Равно Нет» (черновики и непроведённые).
- ✅ Сумма больше порога — вид сравнения «Больше» для числового поля.
8. Типичные ошибки при работе с отбором
- Отбор «не работает
». Проверьте флажок использования у условия. В коде —
Использование = Истина. - Результат пустой, хотя данные есть. Скорее всего, условия объединены через И там, где нужно ИЛИ, либо включён чужой отбор по периоду или организации.
- Документы последнего дня периода не попали. Вы задали конец периода датой без времени. Берите конец дня:
КонецДня()в коде или поле периода с учётом времени в отчёте. - Отбор по строке с лишним пробелом или регистром. «Равно» сравнивает точно. Для нестрогого поиска применяйте «Содержит».
- Отбор по ссылочному полю не находит нужный элемент. Возможно, в базе несколько элементов-дублей с одним названием. Отбор идёт по конкретной ссылке, а не по тексту.
- Динамический список сбросил отбор при перезапуске формы. Отбор из кода живёт, пока открыта форма. Чтобы он сохранялся, пользователям предлагают сохранённые настройки списка или задают отбор при открытии формы.
9. Как ускорить отбор на больших объёмах данных
Фильтр на таблице в десять тысяч строк работает мгновенно, на десятках миллионов — заметно думает. Что помогает:
- Условие по индексируемым полям. Документы быстро ищутся по дате, номеру и типичным реквизитам, по которым есть индексы. Условие по неиндексируемому реквизиту заставляет читать всё.
- Точное сравнение вместо «Содержит». Поиск подстроки в середине строки индекс не использует. «Начинается с» и «Равно» работают заметно лучше.
- Период в каждом отчёте. Не формируйте отчёт «за всё время», если не нужно.
- Условия в параметры виртуальных таблиц (раздел 5), а не в
ГДЕповерх выборки. - Не использовать функции над полем в условии. Условие вида «ГОД(Дата) = 2025» не позволит использовать индекс по дате, вместо него задайте диапазон «Дата между началом и концом года».
- Лишние поля в отборе динамического списка замедляют открытие формы. Оставляйте только нужные.
Если список открывается долго даже без отбора, дело уже не в фильтре: смотрите объём данных, блокировки и состояние базы, а не условия.