Работа с большими объемами данных в 1С:Предприятие часто требует гибкой фильтрации — без этого поиск нужных документов превращается в мучение. Отбор в форме списка позволяет быстро находить записи по заданным критериям: дате, контрагенту, сумме или любому другому реквизиту. Но как правильно настроить этот инструмент, если стандартные фильтры не покрывают ваши задачи?
В этой статье мы разберём все способы установки отбора — от базовых настроек через интерфейс до программного создания сложных условий с использованием языка 1С:Запрос. Вы узнаете, как сохранять часто используемые фильтры, работать с динамическими отборами и избегать типичных ошибок при настройке. Материал актуален для конфигураций на платформе 1С 8.3 (включая последние релизы) и частично применим к 1С 8.2.
Особое внимание уделим практическим примерам: настроим отбор по периоду, свяжем его с реквизитами справочников и покажем, как автоматизировать процесс через УправляемыеФормы. Если вы администратор, разработчик или опытный пользователь — здесь найдёте решения для задач любой сложности.
1. Базовые способы установки отбора через интерфейс
Начнём с самого простого — встроенных инструментов платформы, которые доступны без программирования. Эти методы подойдут пользователям, не знакомым с конфигурированием, но нуждающимся в быстрой фильтрации данных.
Чтобы открыть панель отбора в стандартной форме списка документа (например, РеализацияТоваровУслуг), выполните следующие действия:
- Откройте нужный журнал документов через меню
Документы → [ТипДокумента]. - Нажмите кнопку "Ещё" (три точки) в правом верхнем углу формы.
- Выберите пункт "Отбор и сортировка" (в некоторых конфигурациях может называться "Настройка списка").
- В открывшемся окне перейдите на вкладку "Отбор".
Здесь вы увидите список доступных полей (реквизитов документа). Например, для документа "Поступление товаров" это могут быть:
- 📅 Дата — фильтрация по периоду
- 🏢 Контрагент — выбор по поставщику или покупателю
- 💰 Сумма документа — отбор по диапазону сумм
- 📦 Склад — фильтрация по месту хранения
Для добавления условия:
- Выберите поле из списка (например, "Дата").
- Укажите тип сравнения:
=,>,<,В спискеи т.д. - Задайте значение (например, диапазон дат с
01.01.2026по31.01.2026). - Нажмите "Добавить" и "ОК" для применения.
Если нужного поля нет в списке, проверьте, не скрыто ли оно в настройках формы. Для этого нажмите Ещё → Настроить список и добавьте требуемый реквизит в видимые колонки.
2. Сохранение и загрузка пользовательских отборов
Если вы регулярно используете одни и те же фильтры, их можно сохранять как пользовательские настройки. Это избавит от необходимости каждый раз заново настраивать условия.
Для сохранения текущего отбора:
- Настройте нужные условия отбора (как описано в предыдущем разделе).
- В окне "Отбор и сортировка" нажмите кнопку "Сохранить настройку".
- Задайте имя настройки (например,
"Поступления от ООО Ромашка за 2026"). - Выберите область видимости:
- 👤 "Личная" — будет доступна только вам.
- 👥 "Общая" — станет доступна всем пользователям (требуются права).
Чтобы загрузить сохранённую настройку:
- Откройте окно "Отбор и сортировка".
- Нажмите "Загрузить настройку".
- Выберите нужную настройку из списка и примените её.
- 📊 Ежемесячных отчётов по продажам.
- 🔍 Проверки документов конкретного контрагента.
- 📅 Анализа просроченных платежей.
- 📅
НачалоМесяцаиКонецМесяца— встроенные функции для работы с датами. - 🔢
ДиапазонЗначенийпозволяет задать интервал (например, от 100 000 до бесконечности). - 🔗
ЭлементыФормы.СписокДокументов— ссылка на таблицу формы, где применяется отбор.
Это особенно удобно для бухгалтеров и менеджеров, которые работают с типовыми отчётами. Например, можно сохранить отдельные настройки для:
Как удалить сохранённую настройку отбора?
Чтобы удалить ненужную настройку, откройте окно Отбор и сортировка → Загрузить настройку, выделите её в списке и нажмите кнопку Удалить (значок корзины). Для общих настроек потребуются права администратора.
3. Программная установка отбора через 1С:Запрос
Когда стандартных инструментов недостаточно (например, нужно фильтровать по сложным условиям или связывать данные из нескольких таблиц), на помощь приходит язык запросов 1С. Этот метод требует знаний программирования, но открывает широкие возможности.
Рассмотрим пример установки отбора для формы списка документа "РеализацияТоваровУслуг" с условием: показать только документы за текущий месяц, где сумма превышает 100 000 рублей.
Код для обработчика события ПриОткрытии формы:
&НаСервере
Процедура ПриОткрытии(Отказ)
// Получаем текущую дату и формируем начало/конец месяца
ТекущаяДата = ТекущаяДата;
НачалоМесяца = НачалоМесяца(ТекущаяДата);
КонецМесяца = КонецМесяца(ТекущаяДата);
// Создаём объект отбора
Отбор = Новый Структура;
Отбор.Вставить("Дата", Новый ДиапазонЗначений(НачалоМесяца, КонецМесяца));
Отбор.Вставить("СуммаДокумента", Новый ДиапазонЗначений(100000, Null));
// Применяем отбор к форме
ЭлементыФормы.СписокДокументов.Отбор = Отбор;
КонецПроцедуры
Разберём ключевые моменты:
Важно: если отбор не применяется, проверьте имя элемента формы (в примере — СписокДокументов). Оно должно совпадать с именем табличного поля в вашей конфигурации.
4. Динамический отбор с параметрами
Статичные отборы удобны, но часто требуется гибкость — например, чтобы пользователь мог сам указывать период или контрагента. Для этого используют динамические отборы с параметрами.
Рассмотрим пример, где отбор настраивается через реквизиты формы:
- Добавьте на форму элементы ввода:
- Поле
ПериодНачало(типДата). - Поле
ПериодКонец(типДата). - Поле
Контрагент(типСправочникСсылка.Контрагенты).
- Поле
ПриИзменении этих полей обновляйте отбор:&НаКлиенте
Процедура ПериодНачалоПриИзменении(Элемент)
ОбновитьОтбор;
КонецПроцедуры
&НаСервере
Процедура ОбновитьОтбор
Отбор = Новый Структура;
// Отбор по периоду (если даты заполнены)
Если ЗначениеЗаполнено(ПериодНачало) И ЗначениеЗаполнено(ПериодКонец) Тогда
Отбор.Вставить("Дата", Новый ДиапазонЗначений(ПериодНачало, ПериодКонец));
КонецЕсли;
// Отбор по контрагенту (если выбран)
Если ЗначениеЗаполнено(Контрагент) Тогда
Отбор.Вставить("Контрагент", Контрагент);
КонецЕсли;
// Применяем отбор
ЭлементыФормы.СписокДокументов.Отбор = Отбор;
КонецПроцедуры
Преимущества такого подхода:
- 🔄 Пользователь может менять условия без переоткрытия формы.
- 🎯 Отбор автоматически обновляется при изменении параметров.
- 🔧 Легко добавлять новые условия (например, фильтр по складу или менеджеру).
Поле формы имеет правильный тип данных (Дата для дат, СправочникСсылка для справочников)
Обработчик ПриИзменении подключен ко всем элементам, влияющим на отбор
Отбор обновляется на сервере (директива &НаСервере)
Имя табличного поля в форме совпадает с используемым в коде-->
5. Сложные отборы с использованием запросов
Для задач повышенной сложности (например, фильтрация по связанным таблицам или агрегатным функциям) стандартный отбор через структуру не подходит. В таких случаях используют внешний запрос, результаты которого загружаются в форму.
Пример: нужно показать документы "ЗаказПокупателя", где сумма товаров с определённой номенклатурной группой превышает 50 000 рублей.
&НаСервере
Процедура ПриОткрытии(Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказПокупателя.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Товары КАК Товары
| ПО ЗаказПокупателя.Ссылка = Товары.Ссылка
|ГДЕ
| Товары.Номенклатура.ГруппаНоменклатуры = &Группа
| И СУММА(Товары.Сумма) > 50000
|
|СГРУППИРОВАТЬ ПО
| ЗаказПокупателя.Ссылка";
Запрос.УстановитьПараметр("Группа", Справочники.ГруппыНоменклатуры.Электроника);
РезультатЗапроса = Запрос.Выполнить;
// Загружаем результаты в таблицу формы
Выборка = РезультатЗапроса.Выбрать;
СписокДокументов = ЭлементыФормы.СписокДокументов;
СписокДокументов.Очистить;
Пока Выборка.Следующий Цикл
СписокДокументов.Добавить(Выборка.Ссылка);
КонецЦикла;
КонецПроцедуры
Особенности этого метода:
| Преимущество | Недостаток |
|---|---|
| 🔍 Можно использовать любые условия, включая подзапросы и агрегатные функции. | ⚠️ Требует знаний языка запросов 1С. |
| 📊 Подходит для сложной аналитики (например, фильтрация по остаткам на складе). | ⏳ Может замедлять работу при больших объёмах данных. |
| 🔗 Позволяет связывать данные из разных регистров и документов. | 🛠️ Требует доработки формы для отображения результатов. |
Для оптимизации производительности:
- 📉 Используйте индексированные поля в условиях
ГДЕ. - 🗑️ Ограничивайте выборку только необходимыми полями.
- 🔄 Применяйте
РАЗЛИЧНЫЕ, если не нужны дубли.
Внешний запрос — единственный способ реализовать отбор по данным, которые не хранятся непосредственно в документе (например, по остаткам на складе или оборотом по счёту).
6. Типичные ошибки и их решение
Даже опытные разработчики сталкиваются с проблемами при настройке отборов. Рассмотрим самые распространённые ошибки и способы их исправления.
⚠️ Внимание: Если отбор не применяется, проверьте, что имя табличного поля в коде совпадает с именем элемента формы. В управляемых формах оно указывается в свойствеИмя(например,СписокДокументов), а не в заголовке.
Ошибка 1: Отбор не работает после обновления конфигурации
Причина: после обновления могли измениться имена реквизитов или структура данных.
Решение:
- Проверьте актуальные имена полей в метаданных (
Конфигуратор → Объекты → [ВашДокумент]). - Обновите код отбора с учётом новых имён.
Ошибка 2: Медленная работа формы при сложном отборе
Причина: запрос выполняется слишком долго из-за отсутствия индексов или избыточных соединений.
Решение:
- Добавьте индексы на поля, используемые в условиях
ГДЕ. - Разбейте сложный запрос на несколько простых.
- Используйте
ПЛАН ЗАПРОСАдля анализа производительности.
Ошибка 3: Отбор сбрасывается при переоткрытии формы
Причина: настройки отбора не сохраняются в пользовательских данных.
Решение:
- Сохраняйте параметры отбора в
ПользовательскиеНастройки:
ПользовательскиеНастройки = ПользовательскиеНастройкиФормы;
ПользовательскиеНастройки.Отбор = Отбор;
Ошибка 4: Нельзя установить отбор по виртуальному полю
Причина: виртуальные поля (вычисляемые) не хранятся в базе и недоступны для стандартного отбора.
Решение:
- Используйте внешний запрос с вычислением нужного поля.
- Добавьте физическое поле в документ (если это допустимо).
⚠️ Внимание: При работе с большими базами (100 000+ документов) избегайте отборов по неиндексированным полям типаСтрока(например,Комментарий). Это может привести к полной переборке таблицы и зависанию формы.
7. Продвинутые техники: отбор по связанным данным
Иногда требуется фильтровать документы по данным, которые не хранятся в них, а связаны через справочники или регистры. Например:
- Отбор "Реализации" по региону контрагента (который хранится в справочнике
Контрагенты). - Фильтрация "Заказов покупателей" по остаткам товаров на складе.
- Отбор документов по признаку ВИП-клиента (хранится в дополнительном реквизите справочника).
Для этого используют вложенные запросы или соединение таблиц. Пример отбора реализаций по региону контрагента:
&НаСервере
Процедура ПриОткрытии(Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО РеализацияТоваровУслуг.Контрагент = Контрагенты.Ссылка
|ГДЕ
| Контрагенты.Регион = &Регион";
Запрос.УстановитьПараметр("Регион", Справочники.Регионы.Москва);
Результат = Запрос.Выполнить;
// Загрузка результатов в форму
Выборка = Результат.Выбрать;
Пока Выборка.Следующий Цикл
ЭлементыФормы.СписокДокументов.Добавить(Выборка.Ссылка);
КонецЦикла;
КонецПроцедуры
Для отбора по остаткам товаров потребуется соединение с регистром ТоварыНаСкладах:
ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказПокупателя.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Товары КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
|, Товары.Номенклатура КАК Номенклатура
| ) КАК Остатки
| ПО Товары.Номенклатура = Остатки.Номенклатура
|ГДЕ
| Остатки.КоличествоОстаток > 0
Для ускорения таких запросов:
- 📌 Используйте
ВНУТРЕННЕЕ СОЕДИНЕНИЕвместоЛЕВОЕ, если не нужны записи без связей. - 🔍 Ограничивайте период в виртуальных таблицах регистров (например,
Остатки(, Номенклатура)). - 🗃️ Создавайте индексы на поля соединения (например,
Номенклатурав регистре).
FAQ: Ответы на частые вопросы
Как сделать отбор по нескольким значениям одного поля (например, по списку контрагентов)?
Используйте тип сравнения "В списке" и передавайте массив значений:
Отбор = Новый Структура;
Отбор.Вставить("Контрагент",
Новый Массив(Справочники.Контрагенты.ОООРомашка,
Справочники.Контрагенты.ИПИванов));
Либо в запросе:
ГДЕ Контрагент В (&СписокКонтрагентов)
Можно ли настроить отбор по цвету или другому оформлению строк в списке?
Да, для этого используйте условное оформление в управляемых формах:
- Откройте форму в конфигураторе.
- Выделите табличное поле (например,
СписокДокументов). - В палитре свойств найдите коллекцию
УсловноеОформление. - Добавьте новое правило, укажите условие (например,
"СуммаДокумента > 100000") и настройте цвет.
Пример кода для динамического оформления:
&НаСервере
Процедура СписокДокументовПриСозданииНаСервере(Элемент)
УсловноеОформление = Элемент.УсловноеОформление;
Правило = УсловноеОформление.Добавить;
Правило.Условие = Новый Условие("СуммаДокумента > 100000");
Правило.Оформление.ЦветФона = ВебЦвета.Красный;
КонецПроцедуры
Как сделать отбор по дате"за последние 30 дней" без жёсткой привязки к календарю?
Используйте функцию ТекущаяДата с вычитанием дней:
Отбор = Новый Структура;
Отбор.Вставить("Дата",
Новый ДиапазонЗначений(ТекущаяДата - 30, ТекущаяДата));
Для запроса:
ГДЕ Дата >= ДОБАВИТЬКДАТЕ(ТЕКУЩАЯДАТА, ДЕНЬ, -30)
Почему при отборе по справочнику не показываются документы с пустыми значениями?
По умолчанию сравнение Контрагент = Значение исключает пустые ссылки. Чтобы включить их, используйте:
ГДЕ (Контрагент = &Контрагент ИЛИ Контрагент ЕСТЬ NULL)
Или в структуре отбора:
Отбор.Вставить("Контрагент",
Новый Граница(Значение, ТипГраницы.Включая, Истина));
Можно ли экспортировать/импортировать настройки отбора между базами?
Да, для этого:
- Экспортируйте настройки через
Файл → Сохранить данные формы как...(в пользовательском режиме). - Импортируйте в другой базе через
Файл → Загрузить данные формы....
Для программного переноса используйте объекты ПользовательскиеНастройкиФормы и ХранилищеНастроек.