Книга знаний

1С:Предприятие / Приемы программирования / Формы

Как получить строки, отобранные отбором

Как получить строки табличного поля, отобранные отбором.Автор статьи: Гений 1С | Редакторы: yegorka, mikeA
Последняя редакция №8 от 24.08.15 | История
URL: http://kb.mista.ru/article.php?id=131

Ключевые слова: отбор,табличное поле, упавляемая форма


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

Работает по идее не только для регистров, но и для прочих табличных полей.


   //Задача - удалить все строки из табличного поля ТаблицаРегистра, которые отобраны отбором
     //ТаблицаРегистра - табличное поле формы
     ТаблицаРегистра=ЭлементыФормы[ТаблицаРегистраИмя];
    //Т - данные элемента формы ТаблицаРегистра, имеют тип, например "РегистрНакопленияНаборЗаписей.ЗатратыБухгалтерскийУчет"
     Т=Неопределено; 
    Выполнить("Т="+ТаблицаРегистра.Данные);
    
    //Список строк, которые удаляем
     СтрокиКУдалению=Новый Массив();

    //Перебираем все строки источника данных
     Для Каждого Стр ИЗ Т Цикл
        //Пробуем у табличного поля поставить в качестве текущей строки текущую строку источника данных
         //Такое присваивание работает как ни странно даже для типа  РегистрНакопленияЗапись.ЗатратыБухгалтерскийУчет
         //Т.е. даже для записей из набора записей работает
         ТаблицаРегистра.ТекущаяСтрока=Стр;
        
        //Если строка попадает в отбор, то текущая строка устанавливается, иначе остается прежней
         Если ТаблицаРегистра.ТекущаяСтрока=Стр Тогда
            СтрокиКУдалению.Добавить(Стр); //Здесь логика алгоритма - то, что в отборе, нужно удалить
         КонецЕсли;
    КонецЦикла;
    //Перебираем 
     Для Каждого Стр ИЗ СтрокиКУдалению Цикл
        Т.Удалить(Стр); //Удаляем строку
     КонецЦикла;


Ход обсуждения, в результате которого я пришел к такому алгоритму здесь:
v8: Туплю - как получить список отобранных в таблице

Другой вариант, не мой, используется ПостроительЗапроса:

ОтборСтрок = <ТабличнаяЧастьИсточник.ОтборСтрок>; 
ПостроительЗапроса = Новый ПостроительЗапроса; 
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличнаяЧастьИсточник); 

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

ПостроительЗапроса.Выполнить ();

Результат = ПостроительЗапроса.Результат; // отобранные строки типа РезультатЗапроса 


mikeA



В управляемых формах всё проще, хотя местами не столь очевидно.

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

Идея в следующем: на клиенте формируем массив индексов строк, удовлетворяющих установленному отбору и передаём его на сервер, где снова формируем массив теперь уже самих строк, их выгружаем в таблицу значений, с которой и работем.

Все процедуры расположены в модуле управляемой формы. ТаблицаФормы - реквизит формы типа ТаблицаЗначений, на форме расположена одноимённая таблица, связанная с этим реквизитом


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

&НаСервере
Процедура ОбработатьСтрокиТаблицыНаСервере(ИдентификаторыВыбраныхСтрок)
    
    ВыбраныеСтроки= Новый Массив;
    
    Для Каждого ИдентификаторСтроки Из ИдентификаторыВыбраныхСтрок Цикл
        ВыбраныеСтроки.Добавить(ТаблицаФормы.НайтиПоИдентификатору(ИдентификаторСтроки));
    КонецЦикла;

    ТаблицаЗначенийСОтбором= ТаблицаФормы.Выгрузить(ВыбраныеСтроки);
    
КонецПроцедуры


P.S. Мне нужно было для управляемых форм в 8.3.6. Возможно будет работать и для обычных. Там у табличного поля тоже есть метод ПроверитьСтроку и не надо разносить клиент-сервер.


Другие ссылки по теме:
Книга знаний: Прочтение списка строк табличного поля
Закладка

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2011 | Mista.ru

Яндекс.Метрика