При переходе из Excel в систему 1С пользователи часто требуют сохранения привычного функционала, в частности — возможности быстрой фильтрации по любой колонке в огромных таблицах. Реализация такой задачи «в лоб» через загрузку всех данных в таблицу значений на форме приводит к катастрофическому падению производительности, особенно когда речь идет о массивах в 390 000 и более записей. В этой статье мы подробно разберем, как правильно организовать хранение и фильтрацию таких данных, используя мощные инструменты платформы 1С.
Рассмотрим ситуацию: разработчик пытается загрузить 390 000 строк в объект ТаблицаЗначений и вывести её на управляемую форму. Основная проблема здесь заключается в том, что 1С вынуждена передать весь этот объем данных с сервера на клиент. Это вызывает огромные задержки при открытии формы и потреблении оперативной памяти. Более того, ручная реализация каскадных фильтров (когда выбор в одном поле ограничивает список в другом) через запросы ВЫБРАТЬ РАЗЛИЧНЫЕ к справочнику при каждом изменении — это крайне ресурсоемкая операция.
Самый эффективный способ отображения больших массивов данных в 1С — это использование ДинамическийСписок. В отличие от таблицы значений, динамический список подгружает данные порциями, только для видимой области экрана. Это позволяет моментально открывать форму с любым количеством записей.
Разберем по шагам настройку динамического списка:
ДинамическийСписок.Для программной установки отбора, имитирующей поведение Excel, мы можем использовать следующий код:
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Покупатель");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ВыбранныйПокупатель;
ЭлементОтбора.Использование = Истина;
Использование динамического списка автоматически снимает проблему быстродействия при отрисовке интерфейса.
Часто разработчики отказываются от РегистрСведений, опасаясь ограничения длины строки в 255 символов. Однако в современных версиях 1С 8.3 для ресурсов и реквизитов можно устанавливать тип Строка неограниченной длины. Для реализации нашей задачи лучше использовать именно регистр сведений по следующим причинам:
Индексировать для наиболее часто используемых колонок («Покупатель», «Товар», «Город»). Это позволит базе данных мгновенно находить нужные строки.Важный нюанс: Если вам требуется полнотекстовый поиск или сложные отборы по строкам большой длины, убедитесь, что вы не используете строки неограниченной длины там, где достаточно 500-1000 символов, так как индексация очень длинных строк может быть ограничена СУБД.
Чтобы реализовать логику, при которой выбор «Покупателя» ограничивает список доступных «Товаров», проанализируем механизм СвязиПараметровВыбора. Если ваши данные нормализованы (т.е. «Покупатель» и «Товар» — это ссылки на соответствующие справочники), платформа сделает всё за вас.
Если же данные представлены в виде текста, нам придется реализовать логику в событии НачалоВыбора. Чтобы не перегружать сервер постоянными тяжелыми запросами, рассмотрим следующий алгоритм:
1. При выборе значения в первом поле сохраняем его в переменную. 2. В обработчике выбора второго поля формируем запрос к нашему регистру сведений с учетом уже установленных фильтров.
Пример кода для получения списка уникальных товаров по выбранному покупателю:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РегистрДанных.Товар КАК Товар
|ИЗ
| РегистрСведений.РегистрДанных КАК РегистрДанных
|ГДЕ
| РегистрДанных.Покупатель = &Покупатель";
Запрос.УстановитьПараметр("Покупатель", ВыбранныйПокупатель);
РезультатЗапроса = Запрос.Выполнить();
СписокТоваров = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Товар");
// Далее передаем СписокТоваров в список выбора элемента формы
Проанализируем ситуацию, когда количество колонок (43 штуки) делает ручное создание реквизитов на форме нецелесообразным. В этом случае мы можем воспользоваться мощью СКД. Мы можем вывести на форму стандартную таблицу настроек отбора СКД, которая позволит пользователю строить условия любой сложности (равно, в списке, содержит, не равно).
Преимущества работы через СКД:
Если данные в Excel-файле обновляются очень часто и процесс импорта в 1С занимает слишком много времени, рассмотрим использование механизма ВнешниеИсточникиДанных. 1С позволяет подключить файл Excel напрямую через ADO. В этом случае данные не копируются в базу 1С, но система видит их как обычную таблицу, по которой можно строить динамические списки и отчеты. Это идеальный вариант для временных или аналитических данных, которые не участвуют в основном документообороте.
Для создания качественного аналога Excel-фильтра на 390 000 строк придерживайтесь следующих правил:
ДинамическийСписок.Alt + F или строку поиска в списке) зачастую работает быстрее и удобнее, чем попытки воспроизвести интерфейс другой программы.Правильная архитектура данных — залог того, что система будет работать быстро и стабильно, а пользователи забудут об Excel как о пережитке прошлого.