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

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

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

// установить отбор 
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(ЗначениеОтбора); 

// отключить отбор 
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(,Ложь);

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

ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Использование = Истина; 
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.ВидСравнения  = ВидСравнения.Равно; 
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Значение      = ЗначениеОтбора;

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

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

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

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

Наименование Характеристика Количество Цена Сумма
Стул Красный 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 не будет опубликован. Обязательные поля помечены *