Отборы в 1С 8.3: от фильтра в списке до условий в запросе и коде
Содержание
Чтобы сделать отбор в списке 1С:Предприятия 8.3, откройте список, нажмите Ещё → Настроить список, перейдите на вкладку «Отбор», перетащите нужное поле в правую часть и задайте условие и значение. Для разовой задачи хватит быстрого поиска Ctrl+F или расширенного поиска Alt+F по конкретной колонке.
Частое заблуждение — что отбор и поиск одно и то же. Поиск просто подсвечивает или сужает строки по тексту. Отбор задаёт условие на поле: «Контрагент равно ООО Ромашка», «Сумма больше 100 000», «Дата в интервале». Условие сохраняется в настройках списка и продолжает работать при следующем открытии. Отсюда же и самая частая жалоба: «список пустой, документы пропали».
Что такое отбор в 1С и где он встречается
Отбор — это условие, по которому программа оставляет только нужные записи. Один и тот же принцип работает на разных уровнях:
- 📋 Списки и формы — пользовательский фильтр документов, справочников, регистров.
- 📊 Отчёты — отборы в настройках отчёта на системе компоновки данных (СКД).
- 🔍 Запросы — секция
ГДЕ, параметры виртуальных таблиц,ИМЕЮЩИЕ. - ⚙️ Программный код — отбор динамического списка, наборов записей регистров, таблиц значений.
- 🔄 Обмены — какие объекты попадут в выгрузку в другую базу.
Пользователю нужны первые два уровня. Разработчику — все пять. Ниже они идут в этом порядке: от кнопок к коду.
| Где отбор | Кто настраивает | Где хранится условие |
|---|---|---|
| Список, форма | Пользователь | Пользовательские настройки формы |
| Отчёт СКД | Пользователь или разработчик | Вариант отчёта / настройки пользователя |
| Запрос | Разработчик | Текст запроса и параметры |
| Код формы | Разработчик | Компоновщик настроек динамического списка |
| Обмен | Администратор | Настройки синхронизации, правила обмена |
Как настроить отбор в списке 1С: инструкция для пользователя
Быстрый поиск по строке
- Откройте список, например,
Продажи → Реализация (акты, накладные)в Бухгалтерии 3.0. - Нажмите
Ctrl+Fили начните набирать текст в поле поиска справа над списком. - Программа оставит строки, где текст встречается в любой видимой колонке.
Способ быстрый, но грубый: по слову «Ромашка» найдутся и контрагент, и комментарий, где это слово упомянуто.
Расширенный поиск по колонке
- Встаньте на ячейку колонки, по которой нужен фильтр.
- Нажмите
Alt+F. - В окне выберите поле, значение и способ сравнения: по началу строки, по любой части или точное совпадение.
- Нажмите «Найти».
Над списком появится плашка с условием. Крестик на ней снимает отбор.
Полноценный отбор через настройку списка
Этот способ нужен, когда условий несколько или нужно сравнение «больше/меньше».
- В списке нажмите
Ещё → Настроить список. - Откройте вкладку «Отбор».
- В левой части найдите поле, например «Контрагент», и перетащите его вправо или дважды щёлкните по нему.
- В колонке «Вид сравнения» выберите условие: «Равно», «Не равно», «В списке», «В группе», «Больше», «Заполнено» и т.д.
- Укажите значение и нажмите «Завершить редактирование».
Поля можно раскрывать через «плюс»: например, «Контрагент → ИНН» или «Контрагент → Основной договор». Так строят отбор по реквизиту реквизита без всякого кода.
Нужен отбор «или»: документы одного контрагента ИЛИ на сумму больше 500 000? В окне отбора добавьте группу «Группа ИЛИ» и перетащите оба условия внутрь неё. Без группы условия соединяются через «И».
Отбор в табличной части документа
В длинной табличной части (сотни строк номенклатуры) удобно искать через ту же строку поиска над таблицей или через контекстное меню колонки. Отбор строк здесь работает только на экране: на проведение и печать он не влияет.
Отборы в запросах 1С: синтаксис и примеры
В запросе отбор задают в секции ГДЕ. Значения всегда передавайте параметрами, а не склеивайте в текст: это защищает от ошибок с кавычками и форматами дат.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка,
| Реализация.Дата,
| Реализация.СуммаДокумента
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Контрагент = &Контрагент
| И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И Реализация.Проведен";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();
Основные операторы для условий:
| Оператор | Пример | Что делает |
|---|---|---|
=, <>, >, < | Сумма > 100000 | Простое сравнение |
МЕЖДУ … И … | Дата МЕЖДУ &Н И &К | Интервал, границы включаются |
В (&Список) | Склад В (&Склады) | Значение из списка или массива |
В ИЕРАРХИИ | Номенклатура В ИЕРАРХИИ (&Группа) | Элемент и все вложенные группы |
ПОДОБНО | Наименование ПОДОБНО "%болт%" | Поиск по шаблону строки |
ЕСТЬ NULL | Остатки.КоличествоОстаток ЕСТЬ NULL | Нет связанной записи |
ССЫЛКА | Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг | Тип составного поля |
Отбор в параметрах виртуальной таблицы
Для регистров накопления и сведений условие лучше ставить прямо в параметры виртуальной таблицы:
"ВЫБРАТЬ
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки"
Платформа применяет такое условие до расчёта остатков, а не после. На больших базах разница в скорости заметна.
Для среза последних условие в параметрах и условие в ГДЕ дают разный результат. СрезПоследних(&Дата, Цена > 0) сначала отберёт записи с ценой, а потом возьмёт последнюю. ГДЕ Цена > 0 возьмёт последнюю запись и выбросит её, если цена в ней нулевая. Для измерений результат совпадает, для ресурсов и реквизитов — нет.
Отбор по итогам: ИМЕЮЩИЕ
Условие на агрегат (СУММА, КОЛИЧЕСТВО) в ГДЕ писать нельзя. Для него есть ИМЕЮЩИЕ после СГРУППИРОВАТЬ ПО:
"ВЫБРАТЬ
| Продажи.Контрагент,
| СУММА(Продажи.Сумма) КАК Сумма
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Контрагент
|ИМЕЮЩИЕ
| СУММА(Продажи.Сумма) > 1000000"
Динамические отборы: фильтр, который меняется по ходу работы
«Динамический» отбор — это когда пользователь не лезет в настройки, а выбирает значение прямо на форме. Типовой пример: поле «Контрагент» над списком документов. Выбрал — список сузился. Очистил — отбор снялся.
Делается так:
- В форме списка создайте реквизит формы
ОтборКонтрагентс типомСправочникСсылка.Контрагенты. - Выведите его в шапку формы.
- В обработчике
ПриИзмененииустановите или снимите отбор.
&НаКлиенте
Процедура ОтборКонтрагентПриИзменении(Элемент)
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список, "Контрагент", ОтборКонтрагент,
ВидСравненияКомпоновкиДанных.Равно, ,
ЗначениеЗаполнено(ОтборКонтрагент));
КонецПроцедуры
Процедура из Библиотеки стандартных подсистем (БСП). Последний параметр включает отбор, только если значение выбрано. Пустое поле — отбор выключен, список полный.
Второй способ — параметр в запросе динамического списка. Если в списке задан произвольный запрос с ГДЕ Документы.Дата >= &ДатаНачала, значение передают так:
Список.Параметры.УстановитьЗначениеПараметра("ДатаНачала", НачалоГода(ТекущаяДата()));
Параметр в запросе динамического списка обязателен к заполнению. Не установили значение — список выдаст ошибку или окажется пустым. Задайте значение по умолчанию в ПриСозданииНаСервере.
Программные отборы: динамический список, регистры, коллекции
Отбор динамического списка без БСП
Если БСП в конфигурации нет, элемент отбора добавляют напрямую через компоновщик настроек:
&НаСервере
Процедура УстановитьОтборПоОрганизации(Организация)
Отбор = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;
Отбор.Элементы.Очистить();
Элемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Элемент.ПравоеЗначение = Организация;
Элемент.Использование = Истина;
КонецПроцедуры
Отбор в ФиксированныеНастройки пользователь не увидит и не снимет. Это удобно, когда форма открыта «для конкретной организации» и показывать чужие данные в ней не нужно.
Отбор — не замена правам доступа. Пользователь может открыть тот же список из другого места или построить отчёт. Закрывать данные нужно ролями и ограничением доступа на уровне записей.
Открытие формы с отбором
Чтобы открыть список уже отфильтрованным, отбор передают в параметрах:
ПараметрыФормы = Новый Структура("Отбор", Новый Структура("Контрагент", Контрагент));
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы);
Наборы записей регистров
У набора записей отбор задаёт, какие записи читать и перезаписывать. Классика — движения документа:
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Прочитать();
Если записать набор без установленного отбора, платформа перезапишет все записи регистра, попадающие под пустой отбор. Для регистра сведений без регистратора это означает потерю данных. Отбор ставят до Записать() всегда.
Таблицы значений и табличные части
Для коллекций в памяти отбор делают методами:
// Строки с нужным складом
Строки = ТаблицаТоваров.НайтиСтроки(Новый Структура("Склад", Склад));
// Новая таблица только с этими строками
ТаблицаСклада = ТаблицаТоваров.Скопировать(Новый Структура("Склад", Склад));
В форме можно скрыть строки табличной части, не удаляя их:
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Склад", Склад);
Сброс — Элементы.Товары.ОтборСтрок = Неопределено.
Отборы в отчётах 1С: стандартные и на СКД
Как отфильтровать отчёт пользователю
В стандартных бухгалтерских отчётах Бухгалтерии 3.0 (оборотно-сальдовая ведомость, анализ счёта, карточка счёта) нажмите «Показать настройки» и откройте вкладку «Отбор». В отчётах на СКД кнопка обычно называется «Настройки», вкладка — «Отборы».
- Добавьте поле отбора, например «Контрагент» или «Организация».
- Выберите вид сравнения. Для нескольких контрагентов — «В списке».
- Нажмите «Сформировать» или «Закрыть и сформировать».
Удачный набор отборов сохраняют как вариант отчёта: Ещё → Сохранить вариант отчёта или через кнопку выбора варианта в шапке. В следующий раз не придётся собирать условия заново.
Быстрые отборы в шапке отчёта
Разработчик может вывести отбор прямо в шапку формы отчёта. В схеме компоновки, на вкладке «Настройки», у элемента отбора задают режим «Быстрый доступ». Поле появится над отчётом, и пользователь будет менять его без похода в настройки.
Отбор в СКД через параметры
В СКД есть два механизма, их часто путают:
| Механизм | Где задают | Когда применять |
|---|---|---|
| Параметр | &Параметр в запросе набора данных | Условие должно попасть внутрь запроса: период, параметры виртуальной таблицы |
| Отбор | Вкладка «Настройки» → «Отбор» | Пользователь сам выбирает поле и условие |
Отбор СКД платформа старается перенести в запрос сама. Но в сложных запросах с вложенными таблицами он может сработать уже на готовых данных. Если отчёт тормозит, вынесите ключевое условие в параметр виртуальной таблицы.
Отборы в обменах данными и интеграциях
Синхронизация между базами 1С
В типовых обменах (Бухгалтерия ↔ Управление торговлей, ЗУП ↔ Бухгалтерия) отборы задают в настройках синхронизации: Администрирование → Синхронизация данных. Обычно доступны:
- 🏢 отбор по организациям — в базу-приёмник уйдут документы только выбранных организаций;
- 📅 дата начала выгрузки — документы до неё не передаются;
- 📄 состав документов — какие виды документов участвуют в обмене.
Изменили отбор — первая следующая синхронизация может передать заметный объём данных. Её лучше запускать вне рабочего времени.
Программный отбор в обмене
На уровне разработки отбор в обмене — это правила регистрации изменений. Объект попадает в выгрузку, только если записан в план обмена для нужного узла. В событиях записи список узлов можно скорректировать через Объект.ОбменДанными.Получатели. В правилах Конвертации данных у правила выгрузки есть свой отбор и обработчики, где решают, выгружать объект или нет.
Внешние системы через OData
Если базу опубликовали на веб-сервере и включили стандартный интерфейс OData, внешняя система фильтрует данные параметром $filter:
/odata/standard.odata/Catalog_Контрагенты?$filter=ИНН eq '7700000000'&$format=json
Отбор выполняется на стороне 1С, по сети уходят только нужные записи. Это быстрее, чем выгружать весь справочник и фильтровать у себя.
Почему отбор работает не так: частые ошибки
Ещё одна ловушка — отбор по реквизиту, которого нет у части объектов. Например, отбор по полю составного типа «Регистратор»: у документов разных видов реквизиты разные, и условие по несуществующему реквизиту вернёт NULL. В запросе сначала проверьте тип через ССЫЛКА, потом обращайтесь к реквизиту.
Частые вопросы об отборах в 1С
Можно ли сохранить отбор списка, чтобы он открывался сам?
Чем отбор отличается от условного оформления?
Как отобрать документы за период по нескольким контрагентам сразу?
Почему отбор не переносится другому пользователю?
Администрирование.