Как реализовать полноценный отбор в табличной части обработки при работе с внешними данными?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних обработок в 1С часто возникает ситуация, когда данные в ТабличнаяЧасть поступают не из базы данных 1С, а загружаются из сторонних систем через COM-соединение, HTTP-запросы или JSON/XML файлы. В таких случаях мы сталкиваемся с ограничением платформы: стандартные механизмы отбора, доступные для динамических списков, в обычной таблице не работают «из коробки» так, как нам бы хотелось.

Рассмотрим, почему возникает эта проблема и какие архитектурные подходы помогут нам реализовать гибкую фильтрацию данных, включая сложные операторы сравнения (больше, меньше, содержит).

Ограничения свойства «ОтборСтрок»

В управляемых формах для элементов типа Таблица существует свойство ОтборСтрок. Мы можем использовать его для простой фильтрации, например:


СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Статус", "Активен");
Элементы.ТвояТаблица.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураОтбора);

Однако, как мы выяснили в ходе анализа, это решение имеет критический недостаток: оно поддерживает только оператор «равно». Если вам нужно отобрать строки, где Сумма > 1000 или Наименование содержит «товар», ОтборСтрок окажется бесполезным. Давайте разберем, как обойти это ограничение.

Метод №1: Программная фильтрация через вспомогательную таблицу

Это самый гибкий и универсальный способ для небольших и средних объемов данных. Суть метода заключается в разделении «мастер-данных» (источника) и «отображаемых данных» (формы).

  1. Создание хранилища данных. Создайте на форме реквизит (например, СписокВсехДанных типа ТаблицаЗначений), в который вы загружаете все данные из внешней базы сразу после получения.
  2. Создание отображаемой таблицы. Основная ТабличнаяЧасть на форме будет привязана к реквизиту, который мы будем очищать и перезаполнять в зависимости от условий поиска.
  3. Реализация алгоритма фильтрации. При изменении пользователем любого поля отбора на форме вызывайте процедуру, которая обходит СписокВсехДанных, применяет нужные проверки (Больше, Меньше, Сравнение строк) и добавляет подходящие строки в отображаемую таблицу.

Пример логики фильтрации, которую вы можете использовать:


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

Метод №2: Использование временных таблиц в базе данных

Если объем данных велик и вы не хотите перегружать оперативную память клиента постоянной перерисовкой таблиц, можно рассмотреть подход с сохранением данных в базе:

  1. При получении данных из внешней системы создайте ВременнаяТаблица или запишите данные в РегистрСведений (непериодический, без записи в базу, если используете МенеджерВременныхТаблиц).
  2. Подключите к этой таблице ДинамическийСписок с произвольным запросом.
  3. ДинамическийСписок — это мощный инструмент платформы 1С, который поддерживает все виды сравнений, группировок и настроек отбора «из коробки».

Этот метод предпочтителен, если пользователю требуется полноценная работа с отборами, доступными в обычном списке 1С (кнопка «Настроить список»).

Рекомендации по выбору решения

Проанализируем ситуацию: какой метод выбрать именно вам?

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

Надеемся, эти рекомендации помогут вам реализовать функциональный и удобный интерфейс в вашей обработке. Главное — правильно оценить объем данных и требования к скорости фильтрации!

← На главную