Как получить строки, отобранные отбором Ключевые слова: отбор,табличное поле, упавляемая форма
Как то мне понадобилось получить список строк табличного поля, которые отобраны пользователем с помощью отбора, чтобы потом их удалить. Мне предлагали построить эквивалентный запрос, но я посчитал это слишком сложным.
В итоге родилось простое решение. Оно основано на том, чтобы перебрать все строки источника данных табличного поля и по очереди текущей строкой устанавливать текущую строку источника данных. Если строка в отборе, то она установится как текущая, иначе не установится. Вот и все. Смотрите код.
Работает по идее не только для регистров, но и для прочих табличных полей.
//Задача - удалить все строки из табличного поля ТаблицаРегистра, которые отобраны отбором
//ТаблицаРегистра - табличное поле формы
ТаблицаРегистра=ЭлементыФормы[ТаблицаРегистраИмя];
//Т - данные элемента формы ТаблицаРегистра, имеют тип, например "РегистрНакопленияНаборЗаписей.ЗатратыБухгалтерскийУчет"
Т=Неопределено;
Выполнить("Т="+ТаблицаРегистра.Данные);
//Список строк, которые удаляем
СтрокиКУдалению=Новый Массив();
//Перебираем все строки источника данных
Для Каждого Стр ИЗ Т Цикл
//Пробуем у табличного поля поставить в качестве текущей строки текущую строку источника данных
//Такое присваивание работает как ни странно даже для типа РегистрНакопленияЗапись.ЗатратыБухгалтерскийУчет
//Т.е. даже для записей из набора записей работает
ТаблицаРегистра.ТекущаяСтрока=Стр;
//Если строка попадает в отбор, то текущая строка устанавливается, иначе остается прежней
Если ТаблицаРегистра.ТекущаяСтрока=Стр Тогда
СтрокиКУдалению.Добавить(Стр); //Здесь логика алгоритма - то, что в отборе, нужно удалить
КонецЕсли;
КонецЦикла;
//Перебираем
Для Каждого Стр ИЗ СтрокиКУдалению Цикл
Т.Удалить(Стр); //Удаляем строку
КонецЦикла;
Ход обсуждения, в результате которого я пришел к такому алгоритму здесь:
v8: Туплю - как получить список отобранных в таблице
Другой вариант, не мой, используется ПостроительЗапроса:
ОтборСтрок = <ТабличнаяЧастьИсточник.ОтборСтрок>;
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличнаяЧастьИсточник);
// Добавляются необходимые отборы, такие же как в отборы в табличной части.
Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
Если ЭлементОтбора.Использование Тогда
НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(ЭлементОтбора.Имя);
НовыйОтбор.Использование = Истина;
НовыйОтбор.ВидСравнения = ЭлементОтбора.ВидСравнения; // нужный вид сравнения
НовыйОтбор.ЗначениеС = ЭлементОтбора.ЗначениеС;
НовыйОтбор.ЗначениеПо = ЭлементОтбора.ЗначениеПо;
НовыйОтбор.Значение = ЭлементОтбора.Значение;
КонецЕсли;
КонецЦикла;
ПостроительЗапроса.Выполнить ();
Результат = ПостроительЗапроса.Результат; // отобранные строки типа РезультатЗапроса
mikeA
В управляемых формах всё проще, хотя местами не столь очевидно.
Существует метод таблицы формы ПроверитьСтроку, который возвращает истину для строки, удовлетворяющей условиям отбора, установленным в форме. Неочевидность здесь в том, что в параметрах этого метода нужно передавать идентификатор строки хотя в СП сказано передавать строку. Ну и существует это метод на клиенте, а обработка строк выполняется как правило на сервере.
Идея в следующем: на клиенте формируем массив индексов строк, удовлетворяющих установленному отбору и передаём его на сервер, где снова формируем массив теперь уже самих строк, их выгружаем в таблицу значений, с которой и работем.
Все процедуры расположены в модуле управляемой формы. ТаблицаФормы - реквизит формы типа ТаблицаЗначений, на форме расположена одноимённая таблица, связанная с этим реквизитом
&НаКлиенте
Процедура ОбработатьСтрокиТаблицы(Команда)
ИдентификаторыВыбраныхСтрок= Новый Массив;
Для Каждого СтрокаТаблицыФормы Из ТаблицаФормы Цикл
ИдентификаторСтроки= СтрокаТаблицыФормы.ПолучитьИдентификатор();
Если Элементы.ТаблицаФормы.ПроверитьСтроку(ИдентификаторСтроки) Тогда
ИдентификаторыВыбраныхСтрок.Добавить(ИдентификаторСтроки);
КонецЕсли;
КонецЦикла;
ОбработатьСтрокиТаблицыНаСервере(ИдентификаторыВыбраныхСтрок);
КонецПроцедуры
&НаСервере
Процедура ОбработатьСтрокиТаблицыНаСервере(ИдентификаторыВыбраныхСтрок)
ВыбраныеСтроки= Новый Массив;
Для Каждого ИдентификаторСтроки Из ИдентификаторыВыбраныхСтрок Цикл
ВыбраныеСтроки.Добавить(ТаблицаФормы.НайтиПоИдентификатору(ИдентификаторСтроки));
КонецЦикла;
ТаблицаЗначенийСОтбором= ТаблицаФормы.Выгрузить(ВыбраныеСтроки);
КонецПроцедуры
P.S. Мне нужно было для управляемых форм в 8.3.6. Возможно будет работать и для обычных. Там у табличного поля тоже есть метод ПроверитьСтроку и не надо разносить клиент-сервер.
Другие ссылки по теме:
Книга знаний: Прочтение списка строк табличного поля |