Переход с платформы 1С:Предприятие 8.2 на 8.3 часто сопровождается вопросами об изменении привычных механизмов. Одним из таких вопросов является поиск данных в табличной части (ТЧ) обработки. В обычных формах (8.2) поиск по колонкам работал «из коробки» иначе, а в управляемых формах (8.3) разработчикам часто приходится настраивать этот процесс вручную или использовать новые свойства платформы. В данной статье мы подробно разберем, как обеспечить быстрый и удобный поиск номенклатуры или других данных в табличных частях.
Проанализируем ситуацию: почему в конфигураторе нельзя просто поставить галочку Индексировать у реквизита табличной части обработки? Дело в том, что данные табличных частей обработок (в отличие от регистров сведений) не хранятся в базе данных постоянно. Они существуют в оперативной памяти в момент работы с объектом. Платформа 1С не предоставляет механизма автоматического создания индексов СУБД для временных данных объектов типа Обработка. Поэтому нам необходимо рассмотреть программные способы ускорения поиска.
Если ваша табличная часть содержит десятки тысяч строк (например, прайс-лист или большой список остатков), стандартный метод НайтиСтроки() может работать медленно, так как он выполняет линейный перебор данных. Чтобы ускорить процесс, мы можем использовать объект ТаблицаЗначений, который поддерживает ручное индексирование в оперативной памяти.
Рассмотрим по шагам, как это реализовать:
Номенклатура).Пример программного кода:
// Выгружаем ТЧ в таблицу значений
ТЗ = Объект.Товары.Выгрузить();
// Добавляем индекс для ускорения поиска
ТЗ.Индексы.Добавить("Номенклатура");
// Подготавливаем структуру поиска
ПараметрыПоиска = Новый Структура("Номенклатура", ИскомаяНоменклатура);
// Поиск по индексу работает мгновенно
НайденныеСтроки = ТЗ.НайтиСтроки(ПараметрыПоиска);
Если НайденныеСтроки.Количество() > 0 Тогда
// Обработка результатов
КонецЕсли;
Важно: Индексация в ТаблицаЗначений создает в памяти хэш-таблицу. Это требует дополнительной оперативной памяти, но сокращает время поиска с линейного до практически мгновенного.
Зачастую «капризность» пользователей связана не со скоростью поиска, а с удобством интерфейса. В платформе 8.3, начиная с версии 8.3.5, у элемента формы типа Таблица появились замечательные свойства, которые позволяют сделать поиск «как в браузере».
Разберем, как включить этот механизм без написания кода:
Положение строки поиска в значение Авто или Верх.Положение состояния поиска в значение Низу или Авто.После этого над таблицей появится поле ввода. При наборе текста платформа автоматически будет фильтровать строки ТЧ, оставляя только те, где встречается введенная подстрока. Это штатный механизм ПоискПриВводе, который работает очень эффективно.
Если данных очень много (близко к лимиту в 100 000 строк) или требуется сложный поиск по нескольким условиям, проанализируем вариант с использованием Запроса. Платформа позволяет передать табличную часть в запрос в качестве параметра.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ *
|ПОМЕСТИТЬ ВТ_Данные
|ИЗ &ТЧ КАК ТЧ
|;
|ВЫБРАТЬ *
|ИЗ ВТ_Данные
|ГДЕ Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("ТЧ", Объект.Товары.Выгрузить());
Запрос.УстановитьПараметр("Номенклатура", ИскомаяНоменклатура);
Результат = Запрос.Выполнить();
Этот метод хорош тем, что позволяет использовать всю мощь языка запросов 1С (соединения, условия ПОДОБНО, агрегатные функции), однако он требует передачи данных на сервер, что создает накладные расходы на сетевой трафик.
В некоторых случаях, как советуют опытные разработчики, логику работы обработки можно пересмотреть. Если данные в табличной части — это просто отображение данных из базы (например, справочника), то вместо заполнения Табличной части лучше использовать Динамический список (ДС).
Преимущества динамического списка:
Однако помните: Динамический список нельзя использовать для редактирования данных, которые еще не записаны в базу данных. Если ваша обработка предполагает ручной ввод новых строк, которые не являются объектами БД, этот метод не подойдет.
Если пользователю нужно не фильтровать таблицу, а просто быстро перейти к нужной строке, можно добавить на форму отдельное текстовое поле (строку). В событии ПриИзменении этого поля мы будем программно искать строку и активировать её в элементе формы Таблица.
&НаКлиенте
Процедура ПоискПриИзменении(Элемент)
ПараметрыОтбора = Новый Структура("Артикул", Объект.ПолеПоиска);
НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
// Устанавливаем текущую строку в таблице на форме
Элементы.Товары.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
КонецЕсли;
КонецПроцедуры
Метод ПолучитьИдентификатор() позволяет точно спозиционировать курсор на найденном объекте, что максимально приближает поведение интерфейса к старым версиям 8.2, к которым привыкли бухгалтеры.
Подведем итог нашему анализу:
ТаблицуЗначений с методом Индексы.Добавить().Положение строки поиска в свойствах таблицы на форме.Динамического списка с произвольным запросом.Ctrl + F, которая в управляемых формах работает эффективнее, чем в обычных.Выбор метода зависит от конкретной бизнес-задачи и объема данных в вашей обработке. Сочетание интерфейсных настроек и грамотного программного поиска позволит сделать работу пользователя комфортной и быстрой.