Страницы: 1
RSS
Удалить лишние строки из таблицы значений, Удалить лишние строки из таблицы значений
 
Здравствуйте.
Поделитесь опытом. Я в результате выгрузки данных из запроса и его пост обработки получаю таблицу значений, которую потом гружу в табличную часть.
Вопрос: Как мне лучше сделать, чтобы из таблицы значений не все данные грузились, а только часть по условию?
У меня сейчас сделано перебором.
Может есть еще какие то варианты?
 
Цитата
Вопрос: Как мне лучше сделать, чтобы из таблицы значений не все данные грузились, а только часть по условию?
У меня сейчас сделано перебором.
Я бы сделал перебор сначала таблицы значений, а потом загрузил в табличную часть
например:
Код
МаксимальныйИндекс =  ТаблицаЗначений.Количество()-1;
Для ИндексПеребора = 0 по МаксимальныйИндекс Цикл
   ИндексСтроки = МаксимальныйИндекс - ИндексПеребора;
   ТекущаяСтрока = ТаблицаЗначений[ИндексСтроки];
   Если ТекущаяСтрока.Колонка1 = Условие1 и ТекущиаяСтрока.Колонка2 <> Условие2 Тогда
      ТаблицаЗначений.Удалить(ИндексСтроки);
   КонецЕсли;   
КонецЦикла;   
Так обычно перебирают в типовых конфигурация.
Кратко: мы получаем общее количество строк в таблице значений и затем,  получая строку по индексу перебираем строки
от последней к первой. Делаю именно так, потому что, если использовать конструкцию,
Для каждого СтрокаТаблицыЗначений из ТаблицаЗначений Цикл , то если мы удаляем строку, то мы автоматически перепозиционируемся на
следующую строку, и при последовательном получении строк мы будем "перескакивать" через строку, которая идет в следующей после удаляемой.

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

Вариант когда надо удалить все кроме определенных значений.
Например все строки где сумма будет равна 1000.
Делается это в два этапа сначала мы создаем структуру с отбором, а затем копируем из исходной таблицы все строки подходящие под отбор.
Код
ОтборСтрок = Новый Структура("Сумма",1000); 
ТаблицаЗначенийСОтбором = ТаблицаЗначений.Скопировать(ОтборСтрок);
 
Есть еще один вариант, его обычно используют когда надо обработать большие таблицы значений.
Тогда создают запрос, в запрос передают таблицу значений как параметр, затем в запросе накладывают все необходимые ограничения и в результате запроса получают таблицу значений уже без лишних данных.
Пример:
Код
 Запрос = Новый Запрос;
 Запрос.УстановитьПараметр("ТаблицаЗначений",ТаблицаЗначений);
 Запрос.УстановитьПараметр("Условие1", Условие1);
 Запрос.УстановитьПараметр("Условие2", Условие2);
 Запрос.Текст = "ВЫБРАТЬ
             |   ТаблицаЗначений.Колонка1 КАК Колонка1,
             |   ТаблицаЗначений.Колонка2 КАК Колонка2
             |ПОМЕСТИТЬ ВТТаблицаЗначений
             |ИЗ
             |   &ТаблицаЗначений КАК ТаблицаЗначений
             |;
             |
             |////////////////////////////////////////////////////////////////////////////////
             |ВЫБРАТЬ
             |   ВТТаблицаЗначений.Колонка1 КАК Колонка1,
             |   ВТТаблицаЗначений.Колонка2 КАК Колонка2
             |ИЗ
             |   ВТТаблицаЗначений КАК ВТТаблицаЗначений
             |ГДЕ
             |   ВТТаблицаЗначений.Колонка1 = &Условие1
             |   И ВТТаблицаЗначений.Колонка2 <> &Условие2";
 
 ТаблицаЗначенийСОтборомПоУсловиям = Запрос.Выполнить().Выгрузить();
 
Цитата
Например надо удалить все строки где сумма равно нулю.
Решение: Создаем отбор, затем методом НайтиСтроки получаем массив строк, удовлетворяющий отбору, после перебирая массив удаляем эти строки из таблицы значений.
У меня простое условие, но не могу понять как написать отбор.
Мне надо из таблицы значений удалить все строки где у Номенклатуры не стоит галка Услуга.

Я пробовал писать
Код
Отбор = Новый Структура("Номенклатура.Услуга",Ложь);
но вываливается ошибка.  
 
Цитата
Мне надо из таблицы значений удалить все строки где у Номенклатуры не стоит галка Услуга.
Тут метод "НайтиСтроки" нам не поможет. Лучше всего сделать запросом.
Код
 Запрос = Новый Запрос;
 Запрос.УстановитьПараметр("ТаблицаЗначений",ТаблицаЗначений);
 Запрос.Текст = "ВЫБРАТЬ
             |   *
             |ПОМЕСТИТЬ ВТТаблицаЗначений
             |ИЗ
             |   &ТаблицаЗначений КАК ТаблицаЗначений
             |ГДЕ
             |   НЕ ТаблицаЗначений.Номенклатура.Услуга
             |;
             |
             |////////////////////////////////////////////////////////////////////////////////
             |ВЫБРАТЬ
             |   *
             |ИЗ
             |   ВТТаблицаЗначений КАК ВТТаблицаЗначений";
 
 ТаблицаЗначенийСОтборомПоУсловиям = Запрос.Выполнить().Выгрузить();
 
Цитата
Тут метод "НайтиСтроки" нам не поможет. Лучше всего сделать запросом
Спасибо. Так действительно работает.
И результат запроса я не стал грузить в таблицу значений, а сразу гружу в табличную часть.  
 
Цитата
Федоров Максим Михайлович написал:
Есть еще один вариант, его обычно используют когда надо обработать большие таблицы значений.
Тогда создают запрос, в запрос передают таблицу значений как параметр, затем в запросе накладывают все необходимые ограничения и в результате запроса получают таблицу значений уже без лишних данных.
Пример:
Код
  Запрос = Новый Запрос;
 Запрос.УстановитьПараметр("ТаблицаЗначений",ТаблицаЗначений);
 Запрос.УстановитьПараметр("Условие1", Условие1);
 Запрос.УстановитьПараметр("Условие2", Условие2);
 Запрос.Текст = "ВЫБРАТЬ
             |   ТаблицаЗначений.Колонка1 КАК Колонка1,
             |   ТаблицаЗначений.Колонка2 КАК Колонка2
             |ПОМЕСТИТЬ ВТТаблицаЗначений
             |ИЗ
             |   &ТаблицаЗначений КАК ТаблицаЗначений
             |;
             |
             |////////////////////////////////////////////////////////////////////////////////
             |ВЫБРАТЬ
             |   ВТТаблицаЗначений.Колонка1 КАК Колонка1,
             |   ВТТаблицаЗначений.Колонка2 КАК Колонка2
             |ИЗ
             |   ВТТаблицаЗначений КАК ВТТаблицаЗначений
             |ГДЕ
             |   ВТТаблицаЗначений.Колонка1 = &Условие1
             |   И ВТТаблицаЗначений.Колонка2 <> &Условие2";
 
 ТаблицаЗначенийСОтборомПоУсловиям = Запрос.Выполнить().Выгрузить();
 
Название параметра "ТаблицаЗначений" ужастно )
такое прочитаешь, перевернешься )
Изменено: Евгений Козодаев - 09.04.2024 16:36:43
 
Цитата
Евгений Козодаев написал:
Название параметра "ТаблицаЗначений" ужастно )такое прочитаешь, перевернешься )
Это пример использования. Важен механизм, а не название переменных.
Опять же имя параметра полностью характеризует его суть. Если бы я передавал туда массив, то назвал бы МассивЗначений, а так как это некая таблица значений, то так и назвал.
Страницы: 1