Настройка критериев отбора в 1С:Предприятие — это основа эффективной работы с данными. Без правильно настроенных фильтров пользователи тонут в море ненужной информации, а отчеты превращаются в бессмысленные таблицы. Но как сделать так, чтобы система показывала именно те данные, которые нужны сейчас — без лишнего шума и с учетом всех бизнес-процессов?

Эта статья не про стандартные фильтры в формах списков (хотя и о них поговорим). Мы разберем скрытые возможности платформы 1С 8.3/8.2 для создания динамических критериев отбора — от простых условий до программных конструкций с использованием языка запросов и встроенного языка. Вы узнаете, как настроить отбор по датам с учетом рабочих дней, фильтровать данные по нескольким связанным справочникам одновременно, и даже как создать пользовательские критерии, которые будут автоматически подставляться в отчеты.

Особое внимание уделим типичным ошибкам, из-за которых критерии работают неправильно (например, когда отбор по пустой ссылке возвращает все записи вместо пустого результата). А для программистов 1С приготовили готовые кодовые сниппеты для самых распространенных сценариев — от отбора по реквизитам до фильтрации по произвольным выражениям.

1. Базовые принципы критериев отбора в 1С

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

  • 📋 Статические фильтры — задаются один раз в форме списка или отчета (например, "Показать только активные номенклатуры")
  • 🔄 Динамические фильтры — меняются в зависимости от действий пользователя или текущей даты
  • 💻 Программные фильтры — создаются через встроенный язык или язык запросов для сложной логики

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

  • ❌ Нельзя задать сложные условия типа "ИЛИ"
  • ❌ Нет возможности фильтровать по вычисляемым полям
  • ❌ Не поддерживаются динамические параметры (например, "последние 30 дней")

Для таких случаев потребуется более глубокая настройка. А теперь давайте посмотрим, как работают критерии отбора на уровне платформы.

📊 Какой тип фильтров вы используете чаще?
Статические в формах
Динамические через код
Запросы с условиями WHERE
Не использую фильтры

2. Настройка критериев в формах списков и отчетов

Начнем с самого видимого уровня — интерфейса пользователя. В большинстве форм 1С есть кнопка "Еще" или "Все действия", где скрывается пункт "Настройка списка" или "Настройка отчета". Здесь можно:

  1. Добавить/удалить колонки
  2. Изменить порядок сортировки
  3. Настроить условия отбора (самый важный для нас пункт)

Рассмотрим на примере отчета "Ведомость по товарам". Чтобы настроить критерии:

  1. Откройте отчет через меню Отчеты → Ведомость по товарам
  2. Нажмите "Показать настройки" (или аналогичную кнопку)
  3. Перейдите на вкладку "Отбор"
  4. Добавьте новое условие, выбрав поле (например, "Группа номенклатуры")
  5. Задайте оператор (=, ≠, IN и т.д.) и значение

Важный нюанс: в некоторых конфигурациях (например, 1С:ERP или 1С:УТ) отборы могут сохраняться индивидуально для каждого пользователя. Это означает, что настройки, которые сделал бухгалтер, не увидят менеджеры отдела продаж.

Убедиться, что поле существует в источнике данных|

Проверить регистрозависимость (для строковых полей)|

Тестировать отбор на пустых значениях|

Сохранить настройки как пользовательский вариант (если нужно)-->

Для сложных отчетов (например, "Анализ продаж") может потребоваться настройка многоуровневых критериев. Например, сначала отфильтровать по периоду, затем по контрагенту, а потом по типу операции. В таких случаях порядок применения фильтров имеет значение — неправильная последовательность может привести к неожиданным результатам.

⚠️ Внимание: В конфигурациях на базе БСП (Библиотека стандартных подсистем) некоторые отчеты используют механизм "вариантов отчетов". Если ваши критерии не сохраняются между сеансами — проверьте, не включен ли режим "Использовать общие настройки" в параметрах отчета.

3. Работа с языком запросов: FROM и WHERE

Когда стандартных средств недостаточно, на помощь приходит язык запросов 1С. Он позволяет создавать сложные критерии отбора, которые невозможно реализовать через интерфейс. Основные элементы для фильтрации:

  • 📌 WHERE — основное условие отбора
  • 📌 И (AND) и ИЛИ (OR) — логические операторы
  • 📌 В() (IN) — проверка принадлежности множеству
  • 📌 ЗНАЧЕНИЕ() — сравнение со значением перечисления

Пример запроса с несколькими критериями:

ВЫБРАТЬ

Номенклатура.Наименование,

Номенклатура.Артикул,

ОстаткиТоваров.Количество

ИЗ

Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров

ПО Номенклатура.Ссылка = ОстаткиТоваров.Номенклатура

ГДЕ

Номенклатура.ЭтоГруппа = ЛОЖЬ

И Номенклатура.ПометкаУдаления = ЛОЖЬ

И ОстаткиТоваров.Количество > 0

И Номенклатура.Группа В (

ВЫБРАТЬ Ссылка

ИЗ Справочник.ГруппыНоменклатуры

ГДЕ Наименование ПОДОБНО "Электроника%"

)

Обратите внимание на несколько ключевых моментов:

  • 🔹 Условие Номенклатура.ЭтоГруппа = ЛОЖЬ исключает группы из результата
  • 🔹 ПометкаУдаления = ЛОЖЬ фильтрует только актуальные записи
  • 🔹 Подзапрос В () позволяет динамически формировать список групп

Для дат в 1С есть специальные функции. Например, чтобы получить документы за текущий месяц:

ГДЕ Документ.Дата МЕЖДУ

НАЧАЛОПЕРИОДА(ТЕКУЩАЯДАТА(), "МЕСЯЦ")

И КОНЕЦПЕРИОДА(ТЕКУЩАЯДАТА(), "МЕСЯЦ")

💡

Для ускорения работы сложных запросов с отборами используйте индексированные поля. В конфигураторе проверьте, какие реквизиты помечены как индексируемые (свойство "Индексировать").

4. Программная настройка критериев через встроенный язык

Когда нужно динамически менять критерии в зависимости от действий пользователя или других условий, приходит время для встроенного языка. Рассмотрим основные методы:

4.1. Установка отбора для динамического списка

Для формы списка (например, справочника или документа) можно программно установить отбор:

// Получаем форму текущего списка

Форма = ПолучаемФорму("Справочник.Контрагенты.ФормаСписка");

// Создаем структуру отбора

Отбор = Новый Структура();

Отбор.Вставить("ПометкаУдаления", Ложь);

Отбор.Вставить("ЮрФизЛицо", Перечисления.ВидыКонтрагентов.ЮридическоеЛицо);

// Устанавливаем отбор

Форма.Отбор.Установить(Отбор);

Форма.ПрименитьОтбор();

4.2. Динамическое формирование условий

Часто требуется создавать критерии на основе пользовательского ввода. Например, фильтр по диапазону дат:

Процедура УстановитьОтборПоДатам(НачалоПериода, КонецПериода)

Отбор = Новый Структура();

Отбор.Вставить("Дата", Новый ДиапазонДаты(НачалоПериода, КонецПериода));

ТекущаяФорма = ПолучаемФорму("Документ.РеализацияТоваровУслуг.ФормаСписка");

ТекущаяФорма.Отбор.Установить(Отбор);

ТекущаяФорма.ПрименитьОтбор();

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

4.3. Работа с объектами "ОтборКомпоновкиДанных"

Для отчетов, построенных на системе компоновки данных (СКД), используется специальный объект ОтборКомпоновкиДанных:

// Получаем настройки отчета

Настройки = Отчет.ПолучитьНастройки();

// Создаем элемент отбора

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

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

// Применяем настройки

Отчет.УстановитьНастройки(Настройки);

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

⚠️ Внимание: При программной установке отбора в формах обязательно вызывайте метод ПрименитьОтбор(). Без него изменения не вступят в силу, но ошибки выявлено не будет — пользователь просто увидит старые данные.

5. Сложные сценарии: связанные справочники и вычисляемые поля

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

Рассмотрим практический пример: нужно показать только те реализации, где продавались товары определенной марки (которая хранится в справочнике "Характеристики номенклатуры").

ВЫБРАТЬ РАЗЛИЧНЫЕ

РеализацияТоваровУслуг.Ссылка КАК Ссылка

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары

ПО РеализацияТоваровУслуг.Ссылка = Товары.Ссылка

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

ПО Товары.Номенклатура = Номенклатура.Ссылка

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК Характеристики

ПО Номенклатура.Ссылка = Характеристики.Номенклатура

ГДЕ

Характеристики.Марка = &Марка

И РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Для вычисляемых полей (которые не хранятся в базе, а рассчитываются на лету) потребуется использовать ВЫРАЗИТЬ или ВЫБРАТЬ...ПОМЕСТИТЬ. Например, чтобы отфильтровать номенклатуру по рентабельности (которая рассчитывается как отношение прибыли к себестоимости):

ВЫБРАТЬ

Номенклатура.Наименование,

(Продажи.Сумма - Продажи.Себестоимость) / Продажи.Себестоимость * 100 КАК Рентабельность

ИЗ

Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ (

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

СУММА(Товары.Сумма) КАК Сумма,

СУММА(Товары.Себестоимость) КАК Себестоимость

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

ГДЕ

Товары.Ссылка В (

ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг

ГДЕ Дата МЕЖДУ &НачалоПериода И &КонецПериода

)

СГРУППИРОВАТЬ ПО Товары.Номенклатура

) КАК Продажи

ПО Номенклатура.Ссылка = Продажи.Номенклатура

ГДЕ

Рентабельность > 15 // Только товары с рентабельностью выше 15%

Такие запросы требуют значительных ресурсов, поэтому их лучше использовать в фоне или для формирования отчетов, а не для интерактивной работы.

Как ускорить сложные запросы с вычисляемыми полями

1. Используйте временные таблицы (ПОМЕСТИТЬ...ВО ВРЕМЕННУЮ ТАБЛИЦУ)

2. Разбивайте один большой запрос на несколько маленьких

3. Применяйте индексы для часто используемых полей отбора

4. Для исторических данных используйте виртуальные таблицы регистров срезом последних

6. Типичные ошибки и как их избежать

Даже опытные разработчики 1С иногда сталкиваются с неожиданным поведением критериев отбора. Рассмотрим наиболее распространенные проблемы и их решения:

Ошибка Причина Решение
Отбор по пустой ссылке возвращает все записи В языке 1С пустая ссылка не равна NULL в SQL-подобных запросах Используйте ЗНАЧЕНИЕ(Ссылка) = ЗНАЧЕНИЕ(Справочник.ПустаяСсылка())
Не работает отбор по регистрозависимому полю Сравнение строк с учетом регистра Используйте ВРЕГ() для приведения к верхнему регистру
Отбор по дате не учитывает время В 1С дата с временем хранится как DateTime Используйте НАЧАЛОДНЯ() и КОНЕЦДНЯ()
Медленная работа отбора по связанным справочникам Отсутствие индексов на полях связи Проверьте индексы в конфигураторе или используйте временные таблицы

Еще одна распространенная проблема — некорректная работа отборов в отчетах СКД. Часто это связано с тем, что:

  • 🔸 Поле отбора не включено в набор данных
  • 🔸 Неправильно указан тип сравнения (например, "Равно" вместо "В списке")
  • 🔸 Используется неверный синтаксис для параметров (нужно &Параметр вместо просто Параметр)

Для диагностики таких проблем полезно использовать ПояснитьЗапрос() — это покажет конечный SQL-код, который выполняется на сервере.

⚠️ Внимание: В последних версиях платформы 1С (8.3.20+) изменился механизм обработки пустых значений в отборах. Теперь сравнение с пустой ссылкой может работать иначе, чем в предыдущих версиях. Всегда тестируйте критерии отбора на актуальной версии платформы.

7. Автоматизация и сохранение пользовательских критериев

Когда критерии отбора используются регулярно, их можно сохранять и применять автоматически. В 1С для этого есть несколько механизмов:

7.1. Сохранение вариантов отчетов

В большинстве типовых конфигураций реализована возможность сохранения пользовательских вариантов отчетов с заданными критериями. Например, в 1С:Бухгалтерия можно:

  1. Настроить все необходимые отборы в отчете
  2. Нажать "Сохранить вариант"
  3. Указать название (например, "Продажи по VIP-клиентам")
  4. Выбрать, будет ли вариант общим или личным

После этого вариант будет доступен в списке отчетов и его можно будет применить в один клик.

7.2. Программное сохранение и загрузка настроек

Для более гибкой автоматизации можно сохранять настройки отборов в информационную базу:

// Сохранение текущих настроек отбора

Процедура СохранитьНастройкиОтбора(ИмяНастройки)

Настройки = ПолучаемФорму("Документ.ЗаказыПокупателей.ФормаСписка").Отбор.Получить();

ХранилищеНастроек = ПолучаемХранилищеНастроек();

ХранилищеНастроек.Сохранить(ИмяНастройки, Настройки);

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

// Загрузка сохраненных настроек

Процедура ЗагрузитьНастройкиОтбора(ИмяНастройки)

ХранилищеНастроек = ПолучаемХранилищеНастроек();

Настройки = ХранилищеНастроек.Загрузить(ИмяНастройки);

Если Настройки <> Неопределено Тогда

ПолучаемФорму("Документ.ЗаказыПокупателей.ФормаСписка").Отбор.Установить(Настройки);

ПолучаемФорму("Документ.ЗаказыПокупателей.ФормаСписка").ПрименитьОтбор();

КонецЕсли;

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

7.3. Динамические критерии на основе ролей

В некоторых конфигурациях (например, 1С:ERP) можно настраивать отборы в зависимости от роли пользователя. Например, менеджеры видят только свои заказы, а руководители — все. Это реализуется через:

  • 🔹 Настройку прав доступа в конфигураторе
  • 🔹 Использование параметров сеанса
  • 🔹 Программную установку отборов при открытии формы

Пример кода для ограничения данных по текущему пользователю:

Процедура ПриОткрытии()

ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

Отбор = Новый Структура();

Отбор.Вставить("Ответственный", ТекущийПользователь);

ЭтаФорма.Отбор.Установить(Отбор);

ЭтаФорма.ПрименитьОтбор();

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

💡

Автоматизация критериев отбора экономит до 30% времени на рутинные операции, особенно в отделах с высокой нагрузкой (например, в службе поддержки или логистике).

8. Продвинутые техники: регулярные выражения и полнотекстовый поиск

Для действительно сложных сценариев фильтрации в 1С предусмотрены механизмы регулярных выражений и полнотекстового поиска.

8.1. Отбор с использованием регулярных выражений

Регулярные выражения позволяют реализовать гибкий поиск по шаблонам. Например, найти все артикулы, соответствующие определенному формату:

ВЫБРАТЬ

Номенклатура.Наименование,

Номенклатура.Артикул

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

РЕГВЫР(Номенклатура.Артикул, "АРТ-\d{5}-[A-Z]{2}") = ИСТИНА

Этот запрос найдет все артикулы, которые соответствуют шаблону "АРТ-12345-AB" (5 цифр и 2 буквы после тире).

8.2. Полнотекстовый поиск

Для поиска по текстовому содержимому (например, в описаниях номенклатуры или комментариях к документам) удобно использовать полнотекстовый поиск:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка,

Номенклатура.Наименование КАК Наименование,

Номенклатура.Описание КАК Описание

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

ПОЛНЫЙТЕКСТОВЫЙПОИСК(Номенклатура.Описание, &ТекстДляПоиска)

Важно помнить, что:

  • 📌 Полнотекстовый поиск требует специальной настройки на уровне СУБД
  • 📌 В файловом варианте 1С он работает медленнее, чем в клиент-серверном
  • 📌 Для русского языка нужно учитывать морфологию (поиск по основным формам слов)

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

⚠️ Внимание: Использование регулярных выражений и полнотекстового поиска может значительно увеличивать нагрузку на сервер. Всегда тестируйте производительность таких запросов на объемах данных, сопоставимых с рабочими.

FAQ: Частые вопросы по критериям отбора в 1С

Как сделать отбор по нескольким значениям в одном поле (аналог IN в SQL)?

В языке запросов 1С для этого используется оператор В(). Пример:

ГДЕ Номенклатура.Группа В (

ВЫБРАТЬ Ссылка

ИЗ Справочник.ГруппыНоменклатуры

ГДЕ Наименование В ("Электроника", "Бытовая техника")

)

В программном коде можно использовать массив значений:

МассивЗначений = Новый Массив();

МассивЗначений.Добавить(Справочники.ГруппыНоменклатуры.Электроника);

МассивЗначений.Добавить(Справочники.ГруппыНоменклатуры.БытоваяТехника);

Отбор = Новый Структура();

Отбор.Вставить("Группа", МассивЗначений);

Почему при отборе по дате не попадают документы за текущий день?

Это связано с тем, что поле даты в 1С часто имеет тип DateTime (дата+время). Когда вы указываете дату "01.01.2023", фактически подразумевается "01.01.2023 00:00:00". Чтобы включить весь день, используйте:

ГДЕ Документ.Дата МЕЖДУ

НАЧАЛОДНЯ(&ТекущаяДата)

И КОНЕЦДНЯ(&ТекущаяДата)

Или для диапазона:

ГДЕ Документ.Дата >= НАЧАЛОДНЯ(&ДатаНачала)

И Документ.Дата <= КОНЕЦДНЯ(&ДатаОкончания)

Можно ли сделать отбор по цвету ячейки в отчете?

Прямого механизма отбора по цвету в 1С нет, но можно реализовать это косвенно:

  1. Создать вычисляемое поле, которое будет содержать информацию о цвете
  2. В настройках условного оформления привязать цвет к значению этого поля
  3. Затем фильтровать уже по этому полю

Пример для СКД:

// В настройках отчета добавляем вычисляемое поле

Поле = Настройки.Поля.Добавить(Тип("ПолеКомпоновкиДанных"));

Поле.Выражение = Новый ВыражениеКомпоновкиДанных("ВЫБОР КОГДА ОстаткиТоваров.Количество < 10 ТОГДА ""Красный"" ИНАЧЕ ""Зеленый"" КОНЕЦ");

Поле.Имя = "ЦветИндикатора";

// Затем можно отфильтровать по этому полю

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЦветИндикатора");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = "Красный";

Как сохранить часто используемые отборы, чтобы не настраивать их каждый раз?

Есть несколько способов:

  1. Варианты отчетов — сохраняются в базе и доступны всем пользователям (если настроено)
  2. Пользовательские настройки — сохраняются индивидуально для каждого пользователя в его профиле
  3. Программное сохранение — можно реализовать собственное хранилище часто используемых фильтров
  4. Внешние обработки — создать обработку с предопределенными фильтрами и подключать ее по мере необходимости

Для программного сохранения:

// Сохранение в хранилище значений

Хранилище = Новый ХранилищеЗначения();

Хранилище.Установить(Новый Структура("Отбор,НазваниеВарианта", Отбор, "Мои активные клиенты"));

ПользовательскиеНастройки.СохранитьЗначение("МоиОтборы", Хранилище);

// Загрузка сохраненного отбора

Хранилище = ПользовательскиеНастройки.ВосстановитьЗначение("МоиОтборы");

Если Хранилище <> Неопределено Тогда

Данные = Хранили