При разработке внешних обработок в 1С часто возникает ситуация, когда данные в ТабличнаяЧасть поступают не из базы данных 1С, а загружаются из сторонних систем через COM-соединение, HTTP-запросы или JSON/XML файлы. В таких случаях мы сталкиваемся с ограничением платформы: стандартные механизмы отбора, доступные для динамических списков, в обычной таблице не работают «из коробки» так, как нам бы хотелось.
Рассмотрим, почему возникает эта проблема и какие архитектурные подходы помогут нам реализовать гибкую фильтрацию данных, включая сложные операторы сравнения (больше, меньше, содержит).
В управляемых формах для элементов типа Таблица существует свойство ОтборСтрок. Мы можем использовать его для простой фильтрации, например:
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Статус", "Активен");
Элементы.ТвояТаблица.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураОтбора);
Однако, как мы выяснили в ходе анализа, это решение имеет критический недостаток: оно поддерживает только оператор «равно». Если вам нужно отобрать строки, где Сумма > 1000 или Наименование содержит «товар», ОтборСтрок окажется бесполезным. Давайте разберем, как обойти это ограничение.
Это самый гибкий и универсальный способ для небольших и средних объемов данных. Суть метода заключается в разделении «мастер-данных» (источника) и «отображаемых данных» (формы).
СписокВсехДанных типа ТаблицаЗначений), в который вы загружаете все данные из внешней базы сразу после получения.ТабличнаяЧасть на форме будет привязана к реквизиту, который мы будем очищать и перезаполнять в зависимости от условий поиска.СписокВсехДанных, применяет нужные проверки (Больше, Меньше, Сравнение строк) и добавляет подходящие строки в отображаемую таблицу.Пример логики фильтрации, которую вы можете использовать:
Процедура ПрименитьОтбор()
ОтображаемыеДанные.Очистить();
Для Каждого Строка ИЗ СписокВсехДанных Цикл
Если Строка.Сумма > ПараметрСуммаОтбора Тогда
ЗаполнитьЗначенияСвойств(ОтображаемыеДанные.Добавить(), Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если объем данных велик и вы не хотите перегружать оперативную память клиента постоянной перерисовкой таблиц, можно рассмотреть подход с сохранением данных в базе:
ВременнаяТаблица или запишите данные в РегистрСведений (непериодический, без записи в базу, если используете МенеджерВременныхТаблиц).ДинамическийСписок с произвольным запросом.ДинамическийСписок — это мощный инструмент платформы 1С, который поддерживает все виды сравнений, группировок и настроек отбора «из коробки».Этот метод предпочтителен, если пользователю требуется полноценная работа с отборами, доступными в обычном списке 1С (кнопка «Настроить список»).
Проанализируем ситуацию: какой метод выбрать именно вам?
Помните, что использование УсловноеОформление может дополнить любой из этих методов, позволяя визуально подсвечивать строки, соответствующие определенным критериям, не скрывая при этом сам список.
Надеемся, эти рекомендации помогут вам реализовать функциональный и удобный интерфейс в вашей обработке. Главное — правильно оценить объем данных и требования к скорости фильтрации!