Разработка и Конфигурация · 9 мин
Как установить отбор в табличной части в 1С
Как установить отбор в табличной части 1С: программные и интерактивные способы, примеры кода для обычных и управляемых форм, типичные ошибки и FAQ.
Отбор в табличной части — одна из базовых задач при доработке и настройке 1С. Он нужен, когда пользователь должен видеть не все строки документа или справочника, а только те, что соответствуют условию: например, товары конкретной группы, непроведённые позиции или строки с ненулевым количеством. Способ установки отбора зависит от того, где находится табличная часть: в обычной форме, в управляемой форме или это динамический список.
Важно различать два разных сценария. Первый — программный отбор через свойство ОтборСтрок табличного поля, который работает с уже загруженными данными объекта. Второй — отбор динамического списка, когда данные запрашиваются из базы и фильтруются на уровне запроса. Смешение этих подходов — самая частая причина, почему «отбор не срабатывает».
Ниже разобраны оба варианта с примерами кода, ограничениями платформы, типичными ошибками и способами проверки результата. Примеры ориентированы на управляемые формы, которые используются в большинстве современных конфигураций, но отдельно описан и вариант для обычных форм.
Отбор строк табличной части на управляемой форме
На управляемой форме табличная часть объекта отображается элементом формы типа «Таблица». У этого элемента есть свойство ОтборСтрок, которое принимает фиксированную структуру: ключ — имя колонки табличной части, значение — искомое значение. Отбор работает только по равенству, условия «больше», «содержит» или «не равно» через него задать нельзя.
Типичный пример: в документе «Перемещение товаров» нужно показать только строки, где склад-отправитель равен выбранному на форме. Код размещается в модуле формы:
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("СкладОтправитель", ВыбранныйСклад);
Чтобы снять отбор, присвойте свойству значение Неопределено или пустую фиксированную структуру. После сброса пользователь снова увидит все строки документа. Учтите, что отбор влияет только на отображение: данные объекта не изменяются и не удаляются, итоги по колонкам, настроенные вручную, могут считаться по всем строкам, если это не переопределено.
&НаКлиенте
Процедура ПоказатьТолькоВыбранныйСклад(Команда)
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Склад", ВыбранныйСклад);
КонецПроцедуры
&НаКлиенте
Процедура СброситьОтбор(Команда)
Элементы.Товары.ОтборСтрок = Неопределено;
КонецПроцедурыОтбор по нескольким условиям и его ограничения
В фиксированную структуру можно передать несколько пар «колонка–значение», и тогда строки будут отбираться по совпадению всех условий одновременно (логическое «И»). Это удобно, когда нужно показать, например, строки по конкретному складу и конкретной номенклатурной группе.
Ограничение принципиальное: ОтборСтрок поддерживает только сравнение на равенство. Если нужно условие «количество больше нуля» или «цена в диапазоне», придётся использовать другой подход — например, оформить табличную часть как динамический список с произвольным запросом или программно скрывать/показывать данные через пересчёт реквизита формы. Для большинства прикладных задач равенства достаточно.
Отбор в обычных формах
В обычных формах (толстый клиент, старые конфигурации) механизм другой. Табличное поле, связанное с табличной частью, имеет свойство ОтборСтрок, но работать с ним нужно через объект ОтборСтрок табличного поля: установить поле, вид сравнения и значение, а затем включить использование отбора.
ЭлементОтбора = ЭлементыФормы.Товары.ОтборСтрок.Склад;
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение = ВыбранныйСклад;
ЭлементОтбора.Использование = Истина;
Преимущество обычных форм — доступны разные виды сравнения, включая «в списке» и «не равно». Недостаток очевиден: обычные формы устарели, и новые доработки под них делать не стоит, если конфигурация переводится на управляемый интерфейс.
Отбор в динамическом списке
Если таблица на форме — это динамический список (например, список документов или табличная часть, построенная на произвольном запросе), отбор устанавливается через коллекцию элементов отбора в настройках списка. Это делается на сервере, потому что данные запрашиваются из базы.
&НаСервере
Процедура УстановитьОтборСписка()
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ВыбранныйСклад;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
Перед добавлением нового элемента полезно очищать ранее установленные программные отборы или искать существующий элемент по представлению, иначе при повторном вызове условия будут накапливаться и список «сузится» до пустого. Для отборов, которые пользователь настраивает сам, лучше задействовать пользовательские настройки динамического списка, а не программное добавление.
Как выбрать способ отбора
Интерактивный отбор без программирования
Пользователь может установить отбор самостоятельно, без доработки конфигурации. В большинстве таблиц управляемых форм доступны стандартные команды: сортировка и поиск по текущей колонке через меню «Ещё», а в динамических списках — кнопка «Настроить список», где добавляются условия отбора по любым доступным полям.
Для табличных частей документов интерактивный отбор ограничен: если разработчик не предусмотрел кнопки отбора, пользователь может воспользоваться только поиском по строке (Ctrl+F) или сортировкой. Это стоит учитывать при проектировании формы: если пользователям регулярно нужно фильтровать строки, добавьте на форму реквизит отбора и команду с готовым кодом.
- 1Добавьте на форму реквизит для значения отбора, например ВыбранныйСклад
- 2Создайте команду и кнопку «Показать по складу»
- 3В обработчике команды установите Элементы.Товары.ОтборСтрок через ФиксированнаяСтруктура
- 4Добавьте команду сброса, присваивающую ОтборСтрок значение Неопределено
- 5Проверьте: строки фильтруются, сброс возвращает все строки, данные объекта не меняются
Проверка результата и типичные ошибки
После установки отбора проверьте три вещи: строки действительно отфильтрованы по нужному условию, сброс отбора возвращает полный список, а запись и проведение документа проходят без изменений данных. Отбор — это только представление, но если в коде есть обход видимых строк таблицы формы, логика может неожиданно работать с частью данных.
Наиболее частые ошибки: несовпадение типов значения отбора и колонки, опечатка в имени колонки (платформа молча ничего не отберёт или выдаст ошибку в зависимости от контекста), установка отбора до того, как данные объекта загружены в форму, и попытка применить ОтборСтрок к динамическому списку, где этого свойства нет.
Как проверить результат
Показаны только строки, соответствующие условию
Таблица пустая при заведомо подходящих данных — проверьте типы значений
После присвоения Неопределено видны все строки
Часть строк не возвращается — отбор установлен в нескольких местах
Количество строк объекта не изменилось
Строки пропали из данных — где-то выполняется удаление, а не отбор
FAQ
Почему ОтборСтрок не срабатывает и таблица остаётся полной?
Чаще всего отбор установлен не для того элемента формы или до загрузки данных объекта. Убедитесь, что обращаетесь к элементу формы (Элементы.ИмяТаблицы), а не к данным объекта, и что код выполняется после открытия формы или по команде пользователя.
Можно ли отобрать строки, где количество больше нуля?
Через ОтборСтрок — нет, он поддерживает только равенство. Варианты: перевести таблицу на динамический список с произвольным запросом, где доступны любые виды сравнения, или добавить служебный признак в строки и отбирать по нему.
Как снять отбор программно?
Присвойте свойству ОтборСтрок значение Неопределено. Для динамического списка найдите добавленный элемент отбора и установите ему Использование = Ложь или удалите его из коллекции элементов отбора.
Влияет ли отбор на итоги и проведение документа?
Нет, отбор меняет только отображение. Данные объекта, итоги по документу и движения при проведении остаются неизменными. Риск возникает только если ваш код обходит видимые строки таблицы формы вместо табличной части объекта.
Как дать пользователю возможность отбора без доработки кода?
В динамических списках пользователь может сам добавить условия через «Настроить список». Для табличной части объекта потребуется минимальная доработка: реквизит формы для значения и команда с установкой ОтборСтрок.
Что важно запомнить
Для табличной части объекта на управляемой форме используйте ОтборСтрок с фиксированной структурой — только равенство, только отображение. Для сложных условий нужен динамический список с отбором компоновки данных. Следите за типами значений и всегда предусматривайте сброс отбора.