Примеры фильтрации таблицы значений по условию

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

Фильтрация с помощью метода Найти

// Простой поиск строки по значению в колонке
Процедура ФильтрПоНаименованию()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Товар");
    Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Товар = "Ноутбук"; Таблица[0].Цена = 50000;
    Таблица.Добавить().Товар = "Монитор"; Таблица[1].Цена = 15000;
    Таблица.Добавить().Товар = "Клавиатура"; Таблица[2].Цена = 2000;
    Таблица.Добавить().Товар = "Ноутбук"; Таблица[3].Цена = 60000;
    Таблица.Добавить().Товар = "Мышь"; Таблица[4].Цена = 1000;
    
    // Поиск первой строки с товаром "Ноутбук"
    НайденнаяСтрока = Таблица.Найти("Ноутбук", "Товар");
    
    Если НайденнаяСтрока <> Неопределено Тогда
        Сообщить("Найден товар: " + НайденнаяСтрока.Товар + ", цена: " + НайденнаяСтрока.Цена);
    Иначе
        Сообщить("Товар не найден");
    КонецЕсли;
    
    // Поиск всех строк с товаром "Ноутбук"
    Сообщить("Все товары 'Ноутбук':");
    Строка = Таблица.НайтиСтроки(Новый Структура("Товар", "Ноутбук"));
    Для Каждого Найденная Из Строка Цикл
        Сообщить(Найденная.Товар + ": " + Найденная.Цена);
    КонецЦикла;
    
КонецПроцедуры

Фильтрация с использованием отбора (Отбор.Установить)

// Использование стандартного механизма отбора таблицы значений
Процедура ФильтрСПомощьюОтбора()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Контрагент");
    Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
    
    Таблица.Добавить().Контрагент = "ООО Альфа"; Таблица[0].Сумма = 100000; Таблица[0].Дата = '20240115';
    Таблица.Добавить().Контрагент = "ООО Бета"; Таблица[1].Сумма = 50000; Таблица[1].Дата = '20240210';
    Таблица.Добавить().Контрагент = "ООО Альфа"; Таблица[2].Сумма = 75000; Таблица[2].Дата = '20240305';
    Таблица.Добавить().Контрагент = "ООО Гамма"; Таблица[3].Сумма = 120000; Таблица[3].Дата = '20240120';
    
    // Создаем отбор
    Отбор = Новый Структура;
    Отбор.Вставить("Контрагент", "ООО Альфа");
    
    // Получаем отфильтрованные строки
    ОтфильтрованныеСтроки = Таблица.НайтиСтроки(Отбор);
    
    Сообщить("Записи по контрагенту ООО Альфа:");
    Для Каждого Строка Из ОтфильтрованныеСтроки Цикл
        Сообщить(Строка.Контрагент + " | Сумма: " + Строка.Сумма + " | Дата: " + Формат(Строка.Дата, "ДФ=dd.MM.yyyy"));
    КонецЦикла;
    
    // Сложный отбор по нескольким условиям
    Отбор2 = Новый Структура;
    Отбор2.Вставить("Контрагент", "ООО Альфа");
    Отбор2.Вставить("Сумма", 100000);
    
    ОтфильтрованныеСтроки2 = Таблица.НайтиСтроки(Отбор2);
    Сообщить("Записи с контрагентом ООО Альфа и суммой 100000: " + Строка(ОтфильтрованныеСтроки2.Количество()));
    
КонецПроцедуры

Фильтрация с условием больше/меньше

// Фильтрация строк по числовым условиям (больше, меньше, равно)
Процедура ФильтрПоЧисловымУсловиям()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Товар");
    Таблица.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Товар = "Ноутбук"; Таблица[0].Остаток = 15; Таблица[0].Цена = 50000;
    Таблица.Добавить().Товар = "Монитор"; Таблица[1].Остаток = 8; Таблица[1].Цена = 15000;
    Таблица.Добавить().Товар = "Клавиатура"; Таблица[2].Остаток = 25; Таблица[2].Цена = 2000;
    Таблица.Добавить().Товар = "Мышь"; Таблица[3].Остаток = 3; Таблица[3].Цена = 1000;
    Таблица.Добавить().Товар = "Принтер"; Таблица[4].Остаток = 0; Таблица[4].Цена = 25000;
    
    // Фильтр: остаток больше 10
    Результат = Новый ТаблицаЗначений;
    Результат.Колонки.Добавить("Товар");
    Результат.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
    Результат.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    
    Для Каждого Строка Из Таблица Цикл
        Если Строка.Остаток > 10 Тогда
            НоваяСтрока = Результат.Добавить();
            НоваяСтрока.Товар = Строка.Товар;
            НоваяСтрока.Остаток = Строка.Остаток;
            НоваяСтрока.Цена = Строка.Цена;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Товары с остатком более 10:");
    Для Каждого Строка Из Результат Цикл
        Сообщить(Строка.Товар + ": " + Строка.Остаток + " шт.");
    КонецЦикла;
    
    // Фильтр: остаток между 5 и 20
    Результат2 = Новый ТаблицаЗначений;
    Результат2.Колонки.Добавить("Товар");
    Результат2.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
    
    Для Каждого Строка Из Таблица Цикл
        Если Строка.Остаток >= 5 И Строка.Остаток <= 20 Тогда
            НоваяСтрока = Результат2.Добавить();
            НоваяСтрока.Товар = Строка.Товар;
            НоваяСтрока.Остаток = Строка.Остаток;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Товары с остатком от 5 до 20:");
    Для Каждого Строка Из Результат2 Цикл
        Сообщить(Строка.Товар + ": " + Строка.Остаток + " шт.");
    КонецЦикла;
    
КонецПроцедуры

Фильтрация по строковым условиям (содержит, начинается с)

// Фильтрация строк по частичному совпадению в тексте
Процедура ФильтрПоСтроковымУсловиям()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Наименование");
    Таблица.Колонки.Добавить("Артикул");
    
    Таблица.Добавить().Наименование = "Ноутбук Lenovo"; Таблица[0].Артикул = "NB-LNV-001";
    Таблица.Добавить().Наименование = "Ноутбук Asus"; Таблица[1].Артикул = "NB-ASU-002";
    Таблица.Добавить().Наименование = "Монитор Samsung"; Таблица[2].Артикул = "MON-SAM-003";
    Таблица.Добавить().Наименование = "Клавиатура Logitech"; Таблица[3].Артикул = "KEY-LOG-004";
    Таблица.Добавить().Наименование = "Мышь Logitech"; Таблица[4].Артикул = "MOU-LOG-005";
    
    // Фильтр: содержит "Ноутбук"
    Результат = Новый ТаблицаЗначений;
    Результат.Колонки.Добавить("Наименование");
    Результат.Колонки.Добавить("Артикул");
    
    Для Каждого Строка Из Таблица Цикл
        Если СтрНайти(Строка.Наименование, "Ноутбук") > 0 Тогда
            НоваяСтрока = Результат.Добавить();
            НоваяСтрока.Наименование = Строка.Наименование;
            НоваяСтрока.Артикул = Строка.Артикул;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Товары, содержащие 'Ноутбук':");
    Для Каждого Строка Из Результат Цикл
        Сообщить(Строка.Наименование + " | " + Строка.Артикул);
    КонецЦикла;
    
    // Фильтр: начинается с "MOU"
    Результат2 = Новый ТаблицаЗначений;
    Для Каждого Строка Из Таблица Цикл
        Если СтрНачинаетсяС(Строка.Артикул, "MOU") Тогда
            НоваяСтрока = Результат2.Добавить();
            НоваяСтрока.Наименование = Строка.Наименование;
            НоваяСтрока.Артикул = Строка.Артикул;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Товары с артикулом, начинающимся на 'MOU':");
    Для Каждого Строка Из Результат2 Цикл
        Сообщить(Строка.Наименование + " | " + Строка.Артикул);
    КонецЦикла;
    
КонецПроцедуры

Фильтрация по датам (диапазон дат)

// Фильтрация строк по датам в заданном периоде
Процедура ФильтрПоДатам()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Документ");
    Таблица.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
    Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Документ = "Счет-001"; Таблица[0].Дата = '20240110'; Таблица[0].Сумма = 10000;
    Таблица.Добавить().Документ = "Счет-002"; Таблица[1].Дата = '20240120'; Таблица[1].Сумма = 15000;
    Таблица.Добавить().Документ = "Счет-003"; Таблица[2].Дата = '20240205'; Таблица[2].Сумма = 20000;
    Таблица.Добавить().Документ = "Счет-004"; Таблица[3].Дата = '20240215'; Таблица[3].Сумма = 25000;
    Таблица.Добавить().Документ = "Счет-005"; Таблица[4].Дата = '20240301'; Таблица[4].Сумма = 30000;
    
    ДатаНачала = '20240115';
    ДатаОкончания = '20240210';
    
    // Фильтрация по диапазону дат
    Результат = Новый ТаблицаЗначений;
    Результат.Колонки.Добавить("Документ");
    Результат.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
    Результат.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    
    Для Каждого Строка Из Таблица Цикл
        Если Строка.Дата >= ДатаНачала И Строка.Дата <= ДатаОкончания Тогда
            НоваяСтрока = Результат.Добавить();
            НоваяСтрока.Документ = Строка.Документ;
            НоваяСтрока.Дата = Строка.Дата;
            НоваяСтрока.Сумма = Строка.Сумма;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Документы за период с " + Формат(ДатаНачала, "ДФ=dd.MM.yyyy") + 
             " по " + Формат(ДатаОкончания, "ДФ=dd.MM.yyyy") + ":");
    
    Для Каждого Строка Из Результат Цикл
        Сообщить(Строка.Документ + " | " + Формат(Строка.Дата, "ДФ=dd.MM.yyyy") + 
                 " | Сумма: " + Строка.Сумма);
    КонецЦикла;
    
КонецПроцедуры

Фильтрация по нескольким условиям (И, ИЛИ)

// Сложная фильтрация с комбинацией условий И и ИЛИ
Процедура ФильтрПоНесколькимУсловиям()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Товар");
    Таблица.Колонки.Добавить("Категория");
    Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Склад", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Товар = "Ноутбук"; Таблица[0].Категория = "Электроника"; Таблица[0].Цена = 50000; Таблица[0].Склад = 10;
    Таблица.Добавить().Товар = "Телефон"; Таблица[1].Категория = "Электроника"; Таблица[1].Цена = 30000; Таблица[1].Склад = 5;
    Таблица.Добавить().Товар = "Стол"; Таблица[2].Категория = "Мебель"; Таблица[2].Цена = 10000; Таблица[2].Склад = 3;
    Таблица.Добавить().Товар = "Стул"; Таблица[3].Категория = "Мебель"; Таблица[3].Цена = 3000; Таблица[3].Склад = 20;
    Таблица.Добавить().Товар = "Куртка"; Таблица[4].Категория = "Одежда"; Таблица[4].Цена = 5000; Таблица[4].Склад = 15;
    
    // Условие: (Категория = "Электроника" И Цена > 40000) ИЛИ (Категория = "Мебель" И Склад > 5)
    Результат = Новый ТаблицаЗначений;
    Результат.Колонки.Добавить("Товар");
    Результат.Колонки.Добавить("Категория");
    Результат.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    Результат.Колонки.Добавить("Склад", Новый ОписаниеТипов("Число"));
    
    Для Каждого Строка Из Таблица Цикл
        Условие1 = (Строка.Категория = "Электроника" И Строка.Цена > 40000);
        Условие2 = (Строка.Категория = "Мебель" И Строка.Склад > 5);
        
        Если Условие1 ИЛИ Условие2 Тогда
            НоваяСтрока = Результат.Добавить();
            НоваяСтрока.Товар = Строка.Товар;
            НоваяСтрока.Категория = Строка.Категория;
            НоваяСтрока.Цена = Строка.Цена;
            НоваяСтрока.Склад = Строка.Склад;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Товары по сложному условию:");
    Для Каждого Строка Из Результат Цикл
        Сообщить(Строка.Товар + " | " + Строка.Категория + 
                 " | Цена: " + Строка.Цена + " | Склад: " + Строка.Склад);
    КонецЦикла;
    
    // Условие: Категория в списке
    СписокКатегорий = Новый Массив;
    СписокКатегорий.Добавить("Электроника");
    СписокКатегорий.Добавить("Мебель");
    
    Результат2 = Новый ТаблицаЗначений;
    Для Каждого Строка Из Таблица Цикл
        Если СписокКатегорий.Найти(Строка.Категория) <> Неопределено Тогда
            НоваяСтрока = Результат2.Добавить();
            НоваяСтрока.Товар = Строка.Товар;
            НоваяСтрока.Категория = Строка.Категория;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Товары из категорий Электроника и Мебель:");
    Для Каждого Строка Из Результат2 Цикл
        Сообщить(Строка.Товар + " (" + Строка.Категория + ")");
    КонецЦикла;
    
КонецПроцедуры

Фильтрация с использованием функции НайтиСтрокиС

// Использование метода НайтиСтрокиС для сложных отборов
Процедура ФильтрСПомощьюНайтиСтрокиС()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Код");
    Таблица.Колонки.Добавить("Наименование");
    Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Код = "001"; Таблица[0].Наименование = "Ноутбук"; Таблица[0].Цена = 50000;
    Таблица.Добавить().Код = "002"; Таблица[1].Наименование = "Монитор"; Таблица[1].Цена = 15000;
    Таблица.Добавить().Код = "003"; Таблица[2].Наименование = "Клавиатура"; Таблица[2].Цена = 2000;
    Таблица.Добавить().Код = "004"; Таблица[3].Наименование = "Мышь"; Таблица[3].Цена = 1000;
    Таблица.Добавить().Код = "005"; Таблица[4].Наименование = "Ноутбук Pro"; Таблица[4].Цена = 80000;
    
    // Поиск строк, где цена больше 10000
    Отбор = Новый Структура("Цена", 10000);
    Найденные = Таблица.НайтиСтрокиС(Отбор, Ложь, Истина);
    
    Сообщить("Товары с ценой больше 10000 (НайтиСтрокиС):");
    Для Каждого Строка Из Найденные Цикл
        Сообщить(Строка.Код + " | " + Строка.Наименование + " | " + Строка.Цена);
    КонецЦикла;
    
    // Поиск строк, где наименование содержит "Ноут"
    Отбор2 = Новый Структура("Наименование", "Ноут");
    Найденные2 = Таблица.НайтиСтрокиС(Отбор2, Ложь, Истина);
    
    Сообщить("Товары, содержащие 'Ноут' в наименовании:");
    Для Каждого Строка Из Найденные2 Цикл
        Сообщить(Строка.Наименование + " (" + Строка.Цена + ")");
    КонецЦикла;
    
КонецПроцедуры

Фильтрация с проверкой на пустые значения

// Фильтрация строк с учетом неопределенных и пустых значений
Процедура ФильтрПоПустымЗначениям()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Контрагент");
    Таблица.Колонки.Добавить("ИНН");
    Таблица.Колонки.Добавить("Телефон");
    
    Таблица.Добавить().Контрагент = "ООО Альфа"; Таблица[0].ИНН = "7700000001"; Таблица[0].Телефон = "8-800-123-45-67";
    Таблица.Добавить().Контрагент = "ООО Бета"; Таблица[1].ИНН = "7700000002"; Таблица[1].Телефон = "";
    Таблица.Добавить().Контрагент = "Иванов И.И."; Таблица[2].ИНН = ""; Таблица[2].Телефон = "8-912-345-67-89";
    Таблица.Добавить().Контрагент = "ООО Гамма"; Таблица[3].ИНН = "7700000003"; Таблица[3].Телефон = "";
    Таблица.Добавить().Контрагент = "Петров П.П."; Таблица[4].ИНН = Неопределено; Таблица[4].Телефон = "8-923-456-78-90";
    
    // Фильтр: контрагенты без ИНН (пустая строка или Неопределено)
    Результат = Новый ТаблицаЗначений;
    Результат.Колонки.Добавить("Контрагент");
    Результат.Колонки.Добавить("ИНН");
    
    Для Каждого Строка Из Таблица Цикл
        ПустойИНН = (Строка.ИНН = Неопределено) ИЛИ ПустаяСтрока(Строка.ИНН);
        Если ПустойИНН Тогда
            НоваяСтрока = Результат.Добавить();
            НоваяСтрока.Контрагент = Строка.Контрагент;
            НоваяСтрока.ИНН = Строка.ИНН;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Контрагенты без ИНН:");
    Для Каждого Строка Из Результат Цикл
        Сообщить(Строка.Контрагент);
    КонецЦикла;
    
    // Фильтр: контрагенты с заполненным телефоном
    Результат2 = Новый ТаблицаЗначений;
    Для Каждого Строка Из Таблица Цикл
        Если НЕ ПустаяСтрока(Строка.Телефон) Тогда
            НоваяСтрока = Результат2.Добавить();
            НоваяСтрока.Контрагент = Строка.Контрагент;
            НоваяСтрока.Телефон = Строка.Телефон;
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Контрагенты с заполненным телефоном:");
    Для Каждого Строка Из Результат2 Цикл
        Сообщить(Строка.Контрагент + ": " + Строка.Телефон);
    КонецЦикла;
    
КонецПроцедуры

Фильтрация с использованием запроса к таблице значений

// Использование запроса для фильтрации таблицы значений (эффективно для больших таблиц)
Процедура ФильтрЧерезЗапрос()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Товар");
    Таблица.Колонки.Добавить("Категория");
    Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    
    // Заполняем тестовыми данными (100 строк для примера)
    Для Инд = 1 По 100 Цикл
        Строка = Таблица.Добавить();
        Строка.Товар = "Товар " + Строка(Инд);
        Строка.Категория = "Категория " + Строка(Инд % 5 + 1);
        Строка.Цена = Инд * 100;
        Строка.Количество = Инд % 20;
    КонецЦикла;
    
    // Создаем запрос к таблице значений
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |   Товары.Товар,
    |   Товары.Категория,
    |   Товары.Цена,
    |   Товары.Количество,
    |   Товары.Цена * Товары.Количество КАК Сумма
    |ИЗ
    |   &Таблица КАК Товары
    |ГДЕ
    |   Товары.Цена > 5000
    |   И Товары.Количество > 5
    |   И Товары.Категория = &Категория
    |УПОРЯДОЧИТЬ ПО
    |   Товары.Цена УБЫВ";
    
    Запрос.УстановитьПараметр("Таблица", Таблица);
    Запрос.УстановитьПараметр("Категория", "Категория 1");
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    Сообщить("Результат фильтрации через запрос (найдено: " + Строка(Результат.Количество()) + " товаров):");
    
    Для Инд = 0 По Мин(4, Результат.Количество() - 1) Цикл
        Строка = Результат[Инд];
        Сообщить(Строка.Товар + " | " + Строка.Категория + 
                 " | Цена: " + Строка.Цена + 
                 " | Кол-во: " + Строка.Количество +
                 " | Сумма: " + Строка.Сумма);
    КонецЦикла;
    
    Если Результат.Количество() > 5 Тогда
        Сообщить("... и еще " + Строка(Результат.Количество() - 5) + " товаров");
    КонецЕсли;
    
КонецПроцедуры

Фильтрация с использованием функции eval

// Динамическая фильтрация с помощью вычисления выражения
Функция ОтфильтроватьТаблицу(Таблица, УсловиеВыражение)

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

Процедура ТестДинамическойФильтрации()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Имя");
    Таблица.Колонки.Добавить("Возраст", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Зарплата", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Имя = "Иванов"; Таблица[0].Возраст = 25; Таблица[0].Зарплата = 50000;
    Таблица.Добавить().Имя = "Петров"; Таблица[1].Возраст = 35; Таблица[1].Зарплата = 70000;
    Таблица.Добавить().Имя = "Сидоров"; Таблица[2].Возраст = 30; Таблица[2].Зарплата = 60000;
    Таблица.Добавить().Имя = "Кузнецов"; Таблица[3].Возраст = 40; Таблица[3].Зарплата = 80000;
    Таблица.Добавить().Имя = "Смирнов"; Таблица[4].Возраст = 28; Таблица[4].Зарплата = 55000;
    
    // Фильтр: возраст больше 30 И зарплата больше 60000
    Условие = "Возраст > 30 И Зарплата > 60000";
    Результат = ОтфильтроватьТаблицу(Таблица, Условие);
    
    Сообщить("Результат динамической фильтрации: " + Условие);
    Для Каждого Строка Из Результат Цикл
        Сообщить(Строка.Имя + ", " + Строка.Возраст + " лет, зарплата: " + Строка.Зарплата);
    КонецЦикла;
    
КонецПроцедуры

Функция ВычислитьВыражение(Выражение, Контекст)
    // Простая функция для вычисления выражения (в реальном коде можно использовать Вычислить)
    // Здесь приведен упрощенный вариант
    Возврат Вычислить(Выражение);
КонецФункции

Фильтрация с удалением строк (фильтрация на месте)

// Фильтрация таблицы с удалением строк, не удовлетворяющих условию
Процедура ФильтрацияСУдалениемСтрок()

    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Товар");
    Таблица.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Товар = "Ноутбук"; Таблица[0].Остаток = 5;
    Таблица.Добавить().Товар = "Монитор"; Таблица[1].Остаток = 0;
    Таблица.Добавить().Товар = "Клавиатура"; Таблица[2].Остаток = 10;
    Таблица.Добавить().Товар = "Мышь"; Таблица[3].Остаток = 0;
    Таблица.Добавить().Товар = "Принтер"; Таблица[4].Остаток = 3;
    
    Сообщить("Исходная таблица:");
    Для Каждого Строка Из Таблица Цикл
        Сообщить(Строка.Товар + ": " + Строка.Остаток);
    КонецЦикла;
    
    // Удаляем строки с нулевым остатком
    Для Инд = Таблица.Количество() - 1 По 0 Шаг -1 Цикл
        Если Таблица[Инд].Остаток = 0 Тогда
            Таблица.Удалить(Инд);
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("После удаления товаров с нулевым остатком:");
    Для Каждого Строка Из Таблица Цикл
        Сообщить(Строка.Товар + ": " + Строка.Остаток);
    КонецЦикла;
    
    // Создаем копию и фильтруем более сложным условием
    Таблица2 = Таблица.Скопировать();
    
    // Удаляем строки, где остаток меньше 5
    Для Инд = Таблица2.Количество() - 1 По 0 Шаг -1 Цикл
        Если Таблица2[Инд].Остаток < 5 Тогда
            Таблица2.Удалить(Инд);
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("После удаления товаров с остатком менее 5:");
    Для Каждого Строка Из Таблица2 Цикл
        Сообщить(Строка.Товар + ": " + Строка.Остаток);
    КонецЦикла;
    
КонецПроцедуры

Примечания

// Важные особенности фильтрации таблицы значений:
// 1. НайтиСтроки(Отбор) - возвращает строки, где значения совпадают с отбором
// 2. НайтиСтрокиС(Отбор) - позволяет сравнивать с использованием > < и частичного совпадения
// 3. При удалении строк всегда обходите таблицу с конца (шаг -1), чтобы избежать смещения индексов
// 4. Для больших таблиц (10к+ строк) используйте запрос к таблице значений
// 5. Для сложных условий с несколькими колонками используйте перебор строк с И/ИЛИ
// 6. Метод Найти возвращает только первую найденную строку
// 7. При фильтрации по датам учитывайте время, используйте НачалоДня() и КонецДня() при необходимости
// 8. Для проверки пустых строк используйте ПустаяСтрока(), для Неопределено - прямое сравнение
// 9. При фильтрации по нескольким значениям одной колонки используйте массив и проверку вхождения
// 10. Копируйте таблицу перед фильтрацией, если исходная нужна без изменений
// 11. Для динамических условий используйте Вычислить() или создавайте запрос с параметрами
// 12. При частой фильтрации одной таблицы создавайте индексы (массивы ключей) для ускорения

Поделиться с друзьями
Smirnov code
Добавить комментарий