Как добавить текстовое поле поиска в командную панель табличной части внешней обработки на платформе 8.3.13

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

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

Выясним причину ограничения

Проанализируем техническую составляющую проблемы. В платформе 1С свойство ДополнениеЭлементаФормы, которое отвечает за отображение строки поиска и состояния просмотра, изначально было доступно только для ДинамическихСписков. Возможность штатного включения поиска для обычных таблиц (связанных с реквизитами типа ТабличнаяЧасть или ТаблицаЗначений) появилась только начиная с версии платформы 8.3.14. Если ваш заказчик использует версию 8.3.13, вы столкнетесь с тем, что в конфигураторе просто отсутствует нужный пункт в свойствах элемента или программное расширение не инициализируется для данного типа данных. Рассмотрим подробнее, как мы можем обойти это ограничение, используя доступный инструментарий.

Решение 1: Эмуляция командной панели

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

  1. Откроем форму нашей обработки и выберем элемент формы Таблица.
  2. В свойствах таблицы найдем категорию «Использование» и установим значение свойства Положение командной панели в значение Нет. Это скроет стандартную панель, которую мы не можем редактировать.
  3. Добавим над таблицей новый элемент формы типа Группа - Командная панель. Назовем ее СвояКоманднаяПанель.
  4. В свойстве группы Источник команд выберем нашу таблицу.
  5. Внутри этой группы создадим обычное Поле ввода. Свяжем его с новым реквизитом формы СтрокаПоиска (тип Строка).
  6. Чтобы панель выглядела стандартно, добавим в нее необходимые кнопки (Добавить, Удалить, Переместить) вручную, перетащив соответствующие команды из состава команд таблицы.

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

Решение 2: Программная подсветка через Условное оформление

Если нам не требуется физически скрывать строки, а нужно лишь быстро найти глазами нужную информацию, мы можем использовать механизм УсловногоОформления. Проанализируем ситуацию: табличная часть не поддерживает метод Отбор, как динамический список, но мы можем динамически менять ее оформление. Для быстрого формирования нужного программного кода можно использовать конструктор кода условного оформления табличных частей.

Рассмотрим пример кода, который необходимо вызвать в событии ПриИзменении нашего поля поиска:


&НаСервере
Процедура ОбновитьПодсветкуПоискаНаСервере()
    
    // Очистим старое оформление, если оно было создано нами ранее
    ИмяЭлементаПоиска = "ПоискПоТЧ";
    Для Каждого Элемент Из УсловноеОформление.Элементы Цикл
        Если Элемент.Представление = ИмяЭлементаПоиска Тогда
            УсловноеОформление.Элементы.Удалить(Элемент);
        КонецЕсли;
    КонецЦикла;

    Если ПустаяСтрока(Объект.СтрокаПоиска) Тогда
        Возврат;
    КонецЕсли;

    // Создаем новое правило оформления
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    ЭлементОформления.Представление = ИмяЭлементаПоиска;
    
    // Укажем, что мы хотим изменить цвет фона
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаВыделения);
    
    // Настроим отбор: искать будем по колонке "Наименование"
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Наименование");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
    ЭлементОтбора.ПравоеЗначение = Объект.СтрокаПоиска;
    
    // Укажем поля таблицы, которые нужно подсветить
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыНаименование");

КонецПроцедуры

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

Решение 3: Фильтрация через вспомогательную коллекцию

В случаях, когда строк в табличной части очень много и пользователю критически важно видеть только подходящие строки, мы применим метод «двух коллекций». Суть заключается в том, что данные хранятся в скрытом реквизите объекта (основная ТЧ), а на форме отображается ТаблицаЗначений, которая фильтруется программно.

Разберем алгоритм действий:

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

&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
    ВыполнитьФильтрациюНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьФильтрациюНаСервере()
    
    // Сначала полностью очищаем видимую таблицу
    Объект.ВидимаяТаблица.Очистить();
    
    // Если поле поиска пустое - копируем все данные
    Если ПустаяСтрока(Объект.СтрокаПоиска) Тогда
        Для Каждого Стр Из Объект.Товары Цикл
            ЗаполнитьЗначенияСвойств(Объект.ВидимаяТаблица.Добавить(), Стр);
        КонецЦикла;
        Возврат;
    КонецЕсли;
    
    // Если поиск задан - фильтруем данные через поиск строк
    ПараметрыОтбора = Новый Структура("Наименование", Объект.СтрокаПоиска);
    // Внимание: НайтиСтроки ищет только по полному совпадению или через фиксированный массив.
    // Для частичного поиска лучше использовать обход цикла:
    
    Для Каждого Стр Из Объект.Товары Цикл
        Если СтрНайти(НРег(Стр.Наименование), НРег(Объект.СтрокаПоиска)) > 0 Тогда
            ЗаполнитьЗначенияСвойств(Объект.ВидимаяТаблица.Добавить(), Стр);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

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

Решение 4: Вызов стандартного диалога поиска

Если разработка собственной системы фильтрации кажется избыточной, мы можем воспользоваться встроенным методом платформы ПоказатьПоиск(). Это программный вызов того самого окна «Найти», которое открывается по Ctrl+F.

Посмотрим на пример вызова:


&НаКлиенте
Процедура КомандаОткрытьПоиск(Команда)
    // Передаем элемент формы "ТаблицаТовары"
    Элементы.Товары.ПоказатьПоиск();
КонецПроцедуры

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

Подводя итог, можно сказать: несмотря на то, что в версии 8.3.13 нет красивой «галочки» в свойствах элемента формы, у нас есть как минимум три надежных технических способа решить задачу. Выбор зависит от требований к интерфейсу и объема данных в таблице.

← На главную