Как реализовать быстрый механизм фильтрации больших массивов данных в 1С по аналогии с Excel

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

При переходе из Excel в систему 1С пользователи часто требуют сохранения привычного функционала, в частности — возможности быстрой фильтрации по любой колонке в огромных таблицах. Реализация такой задачи «в лоб» через загрузку всех данных в таблицу значений на форме приводит к катастрофическому падению производительности, особенно когда речь идет о массивах в 390 000 и более записей. В этой статье мы подробно разберем, как правильно организовать хранение и фильтрацию таких данных, используя мощные инструменты платформы 1С.

Проблема использования таблиц значений для больших данных

Рассмотрим ситуацию: разработчик пытается загрузить 390 000 строк в объект ТаблицаЗначений и вывести её на управляемую форму. Основная проблема здесь заключается в том, что 1С вынуждена передать весь этот объем данных с сервера на клиент. Это вызывает огромные задержки при открытии формы и потреблении оперативной памяти. Более того, ручная реализация каскадных фильтров (когда выбор в одном поле ограничивает список в другом) через запросы ВЫБРАТЬ РАЗЛИЧНЫЕ к справочнику при каждом изменении — это крайне ресурсоемкая операция.

Решение 1: Переход на Динамические списки

Самый эффективный способ отображения больших массивов данных в 1С — это использование ДинамическийСписок. В отличие от таблицы значений, динамический список подгружает данные порциями, только для видимой области экрана. Это позволяет моментально открывать форму с любым количеством записей.

Разберем по шагам настройку динамического списка:

  1. Разместим на форме основной реквизит с типом ДинамическийСписок.
  2. В настройках списка установим флаг "Произвольный запрос".
  3. В тексте запроса выберем необходимые поля из нашего источника данных (например, регистра сведений).

Для программной установки отбора, имитирующей поведение Excel, мы можем использовать следующий код:


ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Покупатель");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ВыбранныйПокупатель;
ЭлементОтбора.Использование = Истина;

Использование динамического списка автоматически снимает проблему быстродействия при отрисовке интерфейса.

Решение 2: Оптимизация хранения данных в Регистре сведений

Часто разработчики отказываются от РегистрСведений, опасаясь ограничения длины строки в 255 символов. Однако в современных версиях 1С 8.3 для ресурсов и реквизитов можно устанавливать тип Строка неограниченной длины. Для реализации нашей задачи лучше использовать именно регистр сведений по следующим причинам:

  1. Индексация: Мы можем установить свойство Индексировать для наиболее часто используемых колонок («Покупатель», «Товар», «Город»). Это позволит базе данных мгновенно находить нужные строки.
  2. Плоская структура: В отличие от табличных частей справочников, регистры оптимизированы для быстрых выборок по наборам измерений.

Важный нюанс: Если вам требуется полнотекстовый поиск или сложные отборы по строкам большой длины, убедитесь, что вы не используете строки неограниченной длины там, где достаточно 500-1000 символов, так как индексация очень длинных строк может быть ограничена СУБД.

Решение 3: Реализация зависимых (каскадных) фильтров

Чтобы реализовать логику, при которой выбор «Покупателя» ограничивает список доступных «Товаров», проанализируем механизм СвязиПараметровВыбора. Если ваши данные нормализованы (т.е. «Покупатель» и «Товар» — это ссылки на соответствующие справочники), платформа сделает всё за вас.

Если же данные представлены в виде текста, нам придется реализовать логику в событии НачалоВыбора. Чтобы не перегружать сервер постоянными тяжелыми запросами, рассмотрим следующий алгоритм:

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

Пример кода для получения списка уникальных товаров по выбранному покупателю:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   РегистрДанных.Товар КАК Товар
    |ИЗ
    |   РегистрСведений.РегистрДанных КАК РегистрДанных
    |ГДЕ
    |   РегистрДанных.Покупатель = &Покупатель";

Запрос.УстановитьПараметр("Покупатель", ВыбранныйПокупатель);
РезультатЗапроса = Запрос.Выполнить();
СписокТоваров = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Товар");
// Далее передаем СписокТоваров в список выбора элемента формы

Решение 4: Использование Системы компоновки данных (СКД)

Проанализируем ситуацию, когда количество колонок (43 штуки) делает ручное создание реквизитов на форме нецелесообразным. В этом случае мы можем воспользоваться мощью СКД. Мы можем вывести на форму стандартную таблицу настроек отбора СКД, которая позволит пользователю строить условия любой сложности (равно, в списке, содержит, не равно).

Преимущества работы через СКД:

Решение 5: Внешние источники данных

Если данные в Excel-файле обновляются очень часто и процесс импорта в 1С занимает слишком много времени, рассмотрим использование механизма ВнешниеИсточникиДанных. 1С позволяет подключить файл Excel напрямую через ADO. В этом случае данные не копируются в базу 1С, но система видит их как обычную таблицу, по которой можно строить динамические списки и отчеты. Это идеальный вариант для временных или аналитических данных, которые не участвуют в основном документообороте.

Резюме и рекомендации

Для создания качественного аналога Excel-фильтра на 390 000 строк придерживайтесь следующих правил:

  1. Никогда не используйте таблицу значений для отображения такого объема данных на форме. Используйте ДинамическийСписок.
  2. Индексируйте поля в базе данных, по которым предполагается фильтрация. Без индексов любой поиск превратится в полное сканирование таблицы, что недопустимо для 400к записей.
  3. Обучайте пользователей. Стандартный поиск 1С (через Alt + F или строку поиска в списке) зачастую работает быстрее и удобнее, чем попытки воспроизвести интерфейс другой программы.
  4. Используйте фоновые задания. Если вам все же необходимо провести первичный анализ данных при открытии формы, делайте это в фоновом режиме, чтобы интерфейс не «зависал» для пользователя.

Правильная архитектура данных — залог того, что система будет работать быстро и стабильно, а пользователи забудут об Excel как о пережитке прошлого.

← На главную