Отбор строк в табличной части

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

Синтаксис использования:

второй вариант:

Если в первом случае вопросов возникнуть не должно, то по второму распишу подробнее.

Предположим есть табличная часть «Товары» с колонками:

  • Наименование
  • Характеристика
  • Количество
  • Цена
  • Сумма

и нам требуется сделать отбор всех стульев в колонке «Наименование».

Наименование Характеристика Количество Цена Сумма
Стул Красный 5 100 500
Стол Стеклянный 1 200 200
Стул Зеленый 2 150 300

Отбор получится такой:

Строка

включает отбор по колонке «Наименование». Если установить значение «Ложь», то отбор будет снят. Если бы мы делали отбор не программно, а через фильтры, то установка галочки напротив названия колонки как раз аналогично этой строке кода:

отборстрок

Строка

отвечает за способ сравнения. Может принимать следующие значения:

  • Больше (Greater)
  • БольшеИлиРавно (GreaterOrEqual)
  • ВИерархии (InHierarchy)
  • ВСписке (InList)
  • ВСпискеПоИерархии (InListByHierarchy)
  • Интервал (Interval)
  • ИнтервалВключаяГраницы (IntervalIncludingBounds)
  • ИнтервалВключаяНачало (IntervalIncludingLowerBound)
  • ИнтервалВключаяОкончание (IntervalIncludingUpperBound)
  • Меньше (Less)
  • МеньшеИлиРавно (LessOrEqual)
  • НеВИерархии (NotInHierarchy)
  • НеВСписке (NotInList)
  • НеВСпискеПоИерархии (NotInListByHierarchy)
  • НеРавно (NotEqual)
  • НеСодержит (NotContains)
  • Равно (Equal)
  • Содержит (Contains)
Набор видов сравнения меняется в зависимости от типа поля, по которому выполняется отбор. Например в нашем поле «Наименование» с типом СправочникСсылка.Номенклатура можно использовать только «Равно», «Не равно», «В списке» и «Не в списке».
Строка

устанавливает значение по отбора. В нашем случае это товар из справочника номенклатура.

Если бы значений в табличной части было больше и потребовалось бы отобрать стулья и столы, то ВидСравнения был бы равен «В списке», а значение — список значений.

или

Второй вариант короче, но первый для меня более наглядный.

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

Если понадобилось перебрать строки, вошедшие в отбор, то это можно сделать, только заново перебрав все строки и проверив условие отбора для каждой строки. Перебрать строки табличного поля, которые сейчас на экране — невозможно.

 

7 комментариев

  1. «Перебрать строки табличного поля, которые сейчас на экране — невозможно.»

    Не совсем так. Именно те что уместились на экран можно с помощью ОформленияСтрок и события ПриПолученииДанных().
    https://its.1c.ru/db/metod8dev#content:2805:hdoc

    Это не спасает при решении задачи: «Получение выборки соответствующей отбору установленному в свойстве ОтборСтрок расширения табличного поля», но позволяет «Перебрать строки табличного поля, которые сейчас на экране». Ещё раз: есть доступ не ко всем строкам соответствующим отбору, а только к тем, что в данный момент уместились на экран!!!
    А вообще это БОЛЬ из серии: «Видит око, да зуб неймет.» =(

  2. Спасибо!
    Подскажите как отобрать по пустой номенклатуре.
    Пробовал:
    ЭлементыФормы.ТоварыКаталог.ОтборСтрок.Номенклатура.Значение = Справочники.Номенклатура.ПустаяСсылка();
    не работает.

  3. Здравствуйте. Такой отбор не работает на управляемых формах? Только на простых? На УФ нужно использовать ФиксированнаяСтруктура и, следовательно, отбор по списку значений одного столбца таким способом не сделать?

    1. Здравствуйте, Сергей. Да, этот отбор работает для простых форм. В случае с УФ и ФиксированнойСтруктурой вам нужно установить ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;

  4. А как в фикс структуру список значений то запихать? В нем-же должны быть пары «поле», значение (или перечень полей и перечень соотв значений) Т.е. «Артикул, Наименование»,»00001″, «Гайка». А для отбора по списку нужно «Артикул», «00001», «00002», «0003» — Это в фиксю структуру не засунешь. Вывод — Отбор по списку значений в табличной части на управляемых формах таким образом реализовать невозможно?!

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


      ДанныеОтбора = Новый СписокЗначений;
      ДанныеОтбора.Добавить("00001");
      ДанныеОтбора.Добавить("00002");
      ДанныеОтбора.Добавить("00003");

      ЭлементУО = УсловноеОформление.Элементы.Добавить();

      Для каждого ЭлементПоле Из Элементы.ИмяТаблицыНаФорме.ПодчиненныеЭлементы Цикл
      ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
      ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ЭлементПоле.Имя);
      КонецЦикла;

      ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
      ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
      ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИмяТаблицыЗначенийВРеквизитах.ИмяКолонкиПоКоторойНуженОтбор");
      ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
      ЭлементУсловия.ПравоеЗначение = ДанныеОтбора;

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *