Как реализовать поиск по реквизиту табличной части в 1С 8.3 (Управляемые формы)

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

Переход с платформы 1С:Предприятие 8.2 на 8.3 часто сопровождается вопросами об изменении привычных механизмов. Одним из таких вопросов является поиск данных в табличной части (ТЧ) обработки. В обычных формах (8.2) поиск по колонкам работал «из коробки» иначе, а в управляемых формах (8.3) разработчикам часто приходится настраивать этот процесс вручную или использовать новые свойства платформы. В данной статье мы подробно разберем, как обеспечить быстрый и удобный поиск номенклатуры или других данных в табличных частях.

Причина отсутствия индексации в метаданных

Проанализируем ситуацию: почему в конфигураторе нельзя просто поставить галочку Индексировать у реквизита табличной части обработки? Дело в том, что данные табличных частей обработок (в отличие от регистров сведений) не хранятся в базе данных постоянно. Они существуют в оперативной памяти в момент работы с объектом. Платформа 1С не предоставляет механизма автоматического создания индексов СУБД для временных данных объектов типа Обработка. Поэтому нам необходимо рассмотреть программные способы ускорения поиска.

Способ 1: Использование индексированной Таблицы Значений

Если ваша табличная часть содержит десятки тысяч строк (например, прайс-лист или большой список остатков), стандартный метод НайтиСтроки() может работать медленно, так как он выполняет линейный перебор данных. Чтобы ускорить процесс, мы можем использовать объект ТаблицаЗначений, который поддерживает ручное индексирование в оперативной памяти.

Рассмотрим по шагам, как это реализовать:

  1. Выгрузим данные из табличной части в таблицу значений.
  2. Добавим индекс по нужной колонке (например, Номенклатура).
  3. Выполним поиск по индексу.

Пример программного кода:


// Выгружаем ТЧ в таблицу значений
ТЗ = Объект.Товары.Выгрузить();

// Добавляем индекс для ускорения поиска
ТЗ.Индексы.Добавить("Номенклатура");

// Подготавливаем структуру поиска
ПараметрыПоиска = Новый Структура("Номенклатура", ИскомаяНоменклатура);

// Поиск по индексу работает мгновенно
НайденныеСтроки = ТЗ.НайтиСтроки(ПараметрыПоиска);

Если НайденныеСтроки.Количество() > 0 Тогда
    // Обработка результатов
КонецЕсли;

Важно: Индексация в ТаблицаЗначений создает в памяти хэш-таблицу. Это требует дополнительной оперативной памяти, но сокращает время поиска с линейного до практически мгновенного.

Способ 2: Штатный механизм «Строка поиска» в управляемых формах

Зачастую «капризность» пользователей связана не со скоростью поиска, а с удобством интерфейса. В платформе 8.3, начиная с версии 8.3.5, у элемента формы типа Таблица появились замечательные свойства, которые позволяют сделать поиск «как в браузере».

Разберем, как включить этот механизм без написания кода:

  1. Откройте форму обработки в конфигураторе.
  2. Выберите элемент формы, который отображает вашу табличную часть.
  3. В окне свойств найдите группу Использование.
  4. Установите свойство Положение строки поиска в значение Авто или Верх.
  5. Установите свойство Положение состояния поиска в значение Низу или Авто.

После этого над таблицей появится поле ввода. При наборе текста платформа автоматически будет фильтровать строки ТЧ, оставляя только те, где встречается введенная подстрока. Это штатный механизм ПоискПриВводе, который работает очень эффективно.

Способ 3: Поиск через запрос и временные таблицы

Если данных очень много (близко к лимиту в 100 000 строк) или требуется сложный поиск по нескольким условиям, проанализируем вариант с использованием Запроса. Платформа позволяет передать табличную часть в запрос в качестве параметра.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ *
    |ПОМЕСТИТЬ ВТ_Данные
    |ИЗ &ТЧ КАК ТЧ
    |;
    |ВЫБРАТЬ *
    |ИЗ ВТ_Данные
    |ГДЕ Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("ТЧ", Объект.Товары.Выгрузить());
Запрос.УстановитьПараметр("Номенклатура", ИскомаяНоменклатура);

Результат = Запрос.Выполнить();

Этот метод хорош тем, что позволяет использовать всю мощь языка запросов 1С (соединения, условия ПОДОБНО, агрегатные функции), однако он требует передачи данных на сервер, что создает накладные расходы на сетевой трафик.

Способ 4: Использование Динамического списка

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

Преимущества динамического списка:

Однако помните: Динамический список нельзя использовать для редактирования данных, которые еще не записаны в базу данных. Если ваша обработка предполагает ручной ввод новых строк, которые не являются объектами БД, этот метод не подойдет.

Способ 5: Программная активация строки при вводе

Если пользователю нужно не фильтровать таблицу, а просто быстро перейти к нужной строке, можно добавить на форму отдельное текстовое поле (строку). В событии ПриИзменении этого поля мы будем программно искать строку и активировать её в элементе формы Таблица.


&НаКлиенте
Процедура ПоискПриИзменении(Элемент)
    ПараметрыОтбора = Новый Структура("Артикул", Объект.ПолеПоиска);
    НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        // Устанавливаем текущую строку в таблице на форме
        Элементы.Товары.ТекущаяСтрока = НайденныеСтроки[0].ПолучитьИдентификатор();
    КонецЕсли;
КонецПроцедуры

Метод ПолучитьИдентификатор() позволяет точно спозиционировать курсор на найденном объекте, что максимально приближает поведение интерфейса к старым версиям 8.2, к которым привыкли бухгалтеры.

Выводы и рекомендации

Подведем итог нашему анализу:

Выбор метода зависит от конкретной бизнес-задачи и объема данных в вашей обработке. Сочетание интерфейсных настроек и грамотного программного поиска позволит сделать работу пользователя комфортной и быстрой.

← На главную