Часто требуется в табличной части установить отбор по нужному значению.
Ниже приведены 2 примера:
Код 1C v 8.3 // В ТЧ "Товары" отображать только те строки, у которых в колонке "КолВо" содержится значение 10
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("КолВо", 10);
// При позиционировании на строке ТЧ "Контрагенты" в событии ПриАктивизацииСтроки()
// накладывать отбор на ТЧ "Договоры": отображать только договоры по текущему контрагенту
&НаКлиенте
Процедура КонтрагентыПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Контрагенты.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
// ТЧ Контрагенты пустая
Элементы.Договоры.ОтборСтрок = Неопределено;
Иначе
// Для ТЧ Договоры устанавливаем отбор по текущему контрагенту
ТекущийКонтрагент = ТекущиеДанные.Контрагент;
Элементы.Договоры.ОтборСтрок = Новый ФиксированнаяСтруктура("Контрагент", ТекущийКонтрагент);
КонецЕсли;
КонецПроцедуры
Посмотрите более подробную статью Табличная часть ~ Как настроить отбор строк?
Для УП:
Код 1C v 8.3
// Отбор на форме
&НаКлиенте
....
ФМ=Новый ФиксированнаяСтруктура("КлючСвязи",Элементы.ДанныеБезКоррекции.ТекущиеДанные.КлючСвязи);
Элементы.СписокПодразделений.ОтборСтрок=ФМ;
Код 1C v 8.3 //Функция получает записи табличной части согласно установленному отбору
Функция ПолучитьЗаписиСогласноОтбору(ТабличноеПолеИсточник)
ОтборСтрок = ТабличноеПолеИсточник.ОтборСтрок;
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличноеПолеИсточник.Значение);
Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
Если ЭлементОтбора.Использование Тогда
НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(ЭлементОтбора.Имя);
НовыйОтбор.Использование = Истина;
НовыйОтбор.ВидСравнения = ЭлементОтбора.ВидСравнения;
НовыйОтбор.ЗначениеС = ЭлементОтбора.ЗначениеС;
НовыйОтбор.ЗначениеПо = ЭлементОтбора.ЗначениеПо;
НовыйОтбор.Значение = ЭлементОтбора.Значение;
КонецЕсли;
КонецЦикла;
Таблица = ПостроительЗапроса.Результат.Выгрузить();
МассивСтрок = Новый Массив;
Для Каждого Стр ИЗ Таблица Цикл
СтруктураПоиска = Новый Структура;
Для Каждого Колонка Из Таблица.Колонки Цикл
СтруктураПоиска.Вставить(Колонка.Имя, Стр[Колонка.Имя]);
КонецЦикла;
НайденыеСтроки = ТабличноеПолеИсточник.Значение.НайтиСтроки(СтруктураПоиска);
Если НайденыеСтроки.Количество() > 0 Тогда
МассивСтрок.Добавить(НайденыеСтроки[0]);
КонецЕсли;
КонецЦикла;
Возврат МассивСтрок;
КонецФункции
Для Обычных форм:
Код 1C v 8.х ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ДокСсылка", ДанныеПоШК.Объект);
НайденныеСтроки = ПакетДокументов.НайтиСтроки(ПараметрыОтбора);
// Подробнее
СтруктураОтбора = Новый Структура("ВидДокумента, Контрагент", ПФ, ?(Контр = Неопределено, Справочники.Контрагенты.ПустаяСсылка(), Контр));
ПакетДокументов = ЗадачаОбъект.ПакетДокументов;
МассивСтрок = ПакетДокументов.НайтиСтроки(СтруктураОтбора);
Если МассивСтрок.Количество() Тогда
Для Каждого СтрокаМассива Из МассивСтрок Цикл
СтрокаМассива.ДобавленоПользователем = Истина;
СтрокаМассива.Пользователь = ПараметрыСеанса.ТекущийПользователь;
СтрокаМассива.ДатаВремя = ТекущаяДата();
КонецЦикла;
КонецЕсли;
//или
ТЧ = ПромежуточнаяНакладная.Выгрузить();
ТЧ.Свернуть("СхемаПродажи");
СтрокаСПустойСП = ТЧ.НайтиСтроки(Новый Структура("СхемаПродажи", Справочники.СхемыПродаж.ПустаяСсылка()));
Если ТЧ.Количество() - СтрокаСПустойСП.Количество() > 1 Тогда
Если Вопрос("Сбросить все схемы в строках?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
НесколькоСхем = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Для каждого СтрокаПН из ПромежуточнаяНакладная Цикл
Если СтрокаПН.Номенклатура.ВидНоменклатуры.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга Тогда
СтрокаПН.СхемаПродажи = СхемаПродажи;
КонецЕсли;
КонецЦикла;
Часто возникает задача показать только нужные строки в табличной части документа или справочника (или другого объекта). Для этого можно использовать замечательное свойство:
в обычном приложении параметр для ОтборСтрок - Отбор...
в управляемом приложении - ФиксированнаяСтруктура
ОтборСтрок , которое входит в расширение табличного поля, связанного с табличной частью.
Управляемые формы Код 1C v 8.3 СписокЗаказовНаФорме.ОтборСтрок = Новый ФиксированнаяСтруктура("Клиент", СписокЗаказовНаФорме.ТекущиеДанные.Клиент);
пример:
Код 1C v 8.3 СписокЗаказовНаФорме = ЭтаФорма.Элементы.СписокЗаказов;
ТекНомер = Неопределено;
Для НомерСтроки = 0 По СписокЗаказов.Количество()-1 Цикл
Сообщение = Новый СообщениеПользователю;
Если СписокЗаказовНаФорме.ПроверитьСтроку(НомерСтроки) Тогда
СписокЗаказовНаФорме.ТекущаяСтрока = НомерСтроки;
Если ТекНомер = Неопределено Тогда
Если ЗначениеЗаполнено(СписокЗаказовНаФорме.ТекущиеДанные.Машина) Тогда
ТекНомер = СписокЗаказовНаФорме.ТекущиеДанные.Машина;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Установите нужный номер автомобиля в первой строке списка";
Сообщение.Поле = "СписокЗаказов[" + НомерСтроки + "].Машина";
Сообщение.Сообщить();
СписокЗаказовНаФорме.ОтборСтрок = Новый ФиксированнаяСтруктура("Клиент", СписокЗаказовНаФорме.ТекущиеДанные.Клиент);
Возврат;
КонецЕсли;
Иначе
СписокЗаказовНаФорме.ТекущиеДанные.Машина = ТекНомер;
КонецЕсли;
КонецЕсли;
КонецЦикла;
или такой динамический отбор
Код 1C v 8.3 ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИмяПоляОтбора");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ЭлементОтбора.ПравоеЗначение = ЗначениеПоляОтбора;
//очистка отбора (подставьте свои элементы)
&НаКлиенте
Процедура ОчиститьОтбор(Команда)
этаформа.Список.Отбор.Элементы.Очистить();
КонецПроцедуры
Обычные формы Использовать его очень просто:
Код 1C v 8.х //установить отбор
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(ЗначениеОтбора);
//отключить отбор
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Установить(,Ложь);
или 2-й вариант:
Код 1C v 8.х ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Использование = Истина;
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.ВидСравнения = ВидСравнения.Равно;
ЭлементыФормы.ИмяТабПоля.ОтборСтрок.Колонка1.Значение = ЗначениеОтбора;
А теперь конкретные примеры:
Код 1C v 8.х //выбрать строки с ценой = 100
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Установить(100);
--------
//выбрать строки с ценой 100 и опр. валютой
ЭлементыФормы.тпТовары.ОтборСтрок.Валюта.Установить(ВалютаУпр);
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Установить(200);
--------
//выбрать строки с ценой >= 100 (неравенство)
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Использование = Истина;
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.ВидСравнения = ВидСравнения.БольшеИлиРавно;
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Значение = 100;
--------
//выбрать строки с ценой от 100 до 200 (интервал)
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.Использование = Истина;
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.ВидСравнения = ВидСравнения.Интервал;
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.ЗначениеС = 100;
ЭлементыФормы.тпТовары.ОтборСтрок.Цена.ЗначениеПо = 200;
--------
//выбрать строки с определенными товарами по списку
ЭлементыФормы.тпТовары.ОтборСтрок.Товар.Использование = Истина;
ЭлементыФормы.тпТовары.ОтборСтрок.Товар.ВидСравнения = ВидСравнения.ВСписке;
ЭлементыФормы.тпТовары.ОтборСтрок.Товар.Значение.Добавить(Товар1);
ЭлементыФормы.тпТовары.ОтборСтрок.Товар.Значение.Добавить(Товар2);
Подчиненные табличные части в 8.х
С помощью свойства ОтборСтрок можно реализовать подчиненные (связанные) табличные части. При смене текущей строки в первой табличной части вторая табличная часть показывает только связанную информаци. Например, таким образом можно реализовать работу с комплектами: 1-я таб. часть - комплекты, вторая - состав комплекта.
Во второй табличной части должна быть колонка - идентификационный признак, связывающий ее с первой табличной частью. Таких колонок может быть несколько (составной ключ);
В событии ПриАктивизацииСтроки для первого табличного поля пишем:
Код 1C v 8.х ЭлементыФормы.СоставКомплекта.ОтборСтрок.Комплект.Установить(Комплект);
При добавлении новой строки во вторую табличную часть, нужно следить за тем, чтобы идентификационная колонка была установлена.
Обращаю ваше внимание, что при таком отборе не используются индексы и для больших табличных частей возможно замедление работы.
Еще раз напомню, что ОтборСтрок входит в расширение табличного поля табличной части, т.е. табличное поле должно быть связано с табличной частью. Если же оно связано с динамическим списком типа СправочникСписок, то здесь нужно использовать свойство Отбор для объекта типа СправочникСписок.
Если понадобилось перебрать строки, вошедшие в отбор, то это можно сделать, только заново перебрав все строки и проверив условие отбора для каждой строки. Перебрать строки табличного поля, которые сейчас на экране - невозможно.