К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как установить отбор в табличной части в 1С

Как установить отбор в табличной части 1С: программные и интерактивные способы, примеры кода для обычных и управляемых форм, типичные ошибки и FAQ.

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

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

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

Отбор строк табличной части на управляемой форме

На управляемой форме табличная часть объекта отображается элементом формы типа «Таблица». У этого элемента есть свойство ОтборСтрок, которое принимает фиксированную структуру: ключ — имя колонки табличной части, значение — искомое значение. Отбор работает только по равенству, условия «больше», «содержит» или «не равно» через него задать нельзя.

Типичный пример: в документе «Перемещение товаров» нужно показать только строки, где склад-отправитель равен выбранному на форме. Код размещается в модуле формы:

Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("СкладОтправитель", ВыбранныйСклад);

Чтобы снять отбор, присвойте свойству значение Неопределено или пустую фиксированную структуру. После сброса пользователь снова увидит все строки документа. Учтите, что отбор влияет только на отображение: данные объекта не изменяются и не удаляются, итоги по колонкам, настроенные вручную, могут считаться по всем строкам, если это не переопределено.

bsl
&НаКлиенте
Процедура ПоказатьТолькоВыбранныйСклад(Команда)
    Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Склад", ВыбранныйСклад);
КонецПроцедуры

&НаКлиенте
Процедура СброситьОтбор(Команда)
    Элементы.Товары.ОтборСтрок = Неопределено;
КонецПроцедуры

Отбор по нескольким условиям и его ограничения

В фиксированную структуру можно передать несколько пар «колонка–значение», и тогда строки будут отбираться по совпадению всех условий одновременно (логическое «И»). Это удобно, когда нужно показать, например, строки по конкретному складу и конкретной номенклатурной группе.

Ограничение принципиальное: ОтборСтрок поддерживает только сравнение на равенство. Если нужно условие «количество больше нуля» или «цена в диапазоне», придётся использовать другой подход — например, оформить табличную часть как динамический список с произвольным запросом или программно скрывать/показывать данные через пересчёт реквизита формы. Для большинства прикладных задач равенства достаточно.

Отбор в обычных формах

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

ЭлементОтбора = ЭлементыФормы.Товары.ОтборСтрок.Склад;

ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;

ЭлементОтбора.Значение = ВыбранныйСклад;

ЭлементОтбора.Использование = Истина;

Преимущество обычных форм — доступны разные виды сравнения, включая «в списке» и «не равно». Недостаток очевиден: обычные формы устарели, и новые доработки под них делать не стоит, если конфигурация переводится на управляемый интерфейс.

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

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

&НаСервере

Процедура УстановитьОтборСписка()

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

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

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

ЭлементОтбора.ПравоеЗначение = ВыбранныйСклад;

ЭлементОтбора.Использование = Истина;

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

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

Маршрут решения

Как выбрать способ отбора

Таблица показывает табличную часть объекта на управляемой формеИспользуйте Элементы.ИмяТаблицы.ОтборСтрок с фиксированной структурой
Нужны условия «больше», «в списке», «содержит»Переведите таблицу на динамический список с произвольным запросом и отбором компоновки
Форма обычная (толстый клиент)Работайте через ОтборСтрок табличного поля с ВидСравнения
Отбор должен настраиваться пользователем без доработокИспользуйте пользовательские настройки динамического списка

Интерактивный отбор без программирования

Пользователь может установить отбор самостоятельно, без доработки конфигурации. В большинстве таблиц управляемых форм доступны стандартные команды: сортировка и поиск по текущей колонке через меню «Ещё», а в динамических списках — кнопка «Настроить список», где добавляются условия отбора по любым доступным полям.

Для табличных частей документов интерактивный отбор ограничен: если разработчик не предусмотрел кнопки отбора, пользователь может воспользоваться только поиском по строке (Ctrl+F) или сортировкой. Это стоит учитывать при проектировании формы: если пользователям регулярно нужно фильтровать строки, добавьте на форму реквизит отбора и команду с готовым кодом.

Порядок добавления отбора на форму
  1. 1
    Добавьте на форму реквизит для значения отбора, например ВыбранныйСклад
  2. 2
    Создайте команду и кнопку «Показать по складу»
  3. 3
    В обработчике команды установите Элементы.Товары.ОтборСтрок через ФиксированнаяСтруктура
  4. 4
    Добавьте команду сброса, присваивающую ОтборСтрок значение Неопределено
  5. 5
    Проверьте: строки фильтруются, сброс возвращает все строки, данные объекта не меняются

Проверка результата и типичные ошибки

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

Наиболее частые ошибки: несовпадение типов значения отбора и колонки, опечатка в имени колонки (платформа молча ничего не отберёт или выдаст ошибку в зависимости от контекста), установка отбора до того, как данные объекта загружены в форму, и попытка применить ОтборСтрок к динамическому списку, где этого свойства нет.

Типичные ошибки
01
Передача строки вместо ссылки — отбор молча возвращает пустой результат
02
Опечатка в имени колонки в структуре — условие не применяется или возникает ошибка
03
Повторное добавление элемента отбора в динамический список без очистки — условия накапливаются
04
Ожидание, что ОтборСтрок поддерживает «больше/меньше» — поддерживается только равенство
05
Обход строк таблицы формы вместо данных объекта — в обработку попадают только видимые строки
Контрольные точки

Как проверить результат

Видимые строки после установки отбора
Норма

Показаны только строки, соответствующие условию

Тревожный признак

Таблица пустая при заведомо подходящих данных — проверьте типы значений

Сброс отбора
Норма

После присвоения Неопределено видны все строки

Тревожный признак

Часть строк не возвращается — отбор установлен в нескольких местах

Запись документа
Норма

Количество строк объекта не изменилось

Тревожный признак

Строки пропали из данных — где-то выполняется удаление, а не отбор

FAQ

Почему ОтборСтрок не срабатывает и таблица остаётся полной?

Чаще всего отбор установлен не для того элемента формы или до загрузки данных объекта. Убедитесь, что обращаетесь к элементу формы (Элементы.ИмяТаблицы), а не к данным объекта, и что код выполняется после открытия формы или по команде пользователя.

Можно ли отобрать строки, где количество больше нуля?

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

Как снять отбор программно?

Присвойте свойству ОтборСтрок значение Неопределено. Для динамического списка найдите добавленный элемент отбора и установите ему Использование = Ложь или удалите его из коллекции элементов отбора.

Влияет ли отбор на итоги и проведение документа?

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

Как дать пользователю возможность отбора без доработки кода?

В динамических списках пользователь может сам добавить условия через «Настроить список». Для табличной части объекта потребуется минимальная доработка: реквизит формы для значения и команда с установкой ОтборСтрок.

Итог

Что важно запомнить

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