Как программно очистить поле поиска в управляемой форме списка 1С

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

В процессе разработки на платформе 1С 8.3 (Управляемые формы) программисты часто сталкиваются с необходимостью управления стандартными элементами интерфейса. Одним из таких элементов является поле поиска в динамических списках (справочники, документы), которое активируется по нажатию Ctrl+F или располагается в командной панели. Стандартное поведение платформы не всегда предоставляет очевидные методы для «тихой» очистки этого поля, что вызывает вопросы на форумах. Рассмотрим подробно, как решить задачу программной очистки поля поиска, разберем причины, по которым простые методы не работают, и изучим современные подходы, появившиеся в последних версиях платформы.

Почему стандартная очистка отбора не помогает?

Разберем ситуацию, с которой столкнулся автор темы. Попытка использовать классический метод очистки элементов отбора динамического списка Список.Отбор.Элементы.Очистить() часто не приносит желаемого результата. Проанализируем причину: стандартное поле поиска (Search String) работает на уровне ядра платформы и не является обычным элементом коллекции Отбор. Это надстройка над динамическим списком, которая может использовать механизмы полнотекстового поиска или специализированную фильтрацию. Поэтому, даже если мы программно удалим все фильтры из компоновщика настроек, текст в строке поиска останется визуально, и список продолжит фильтроваться по этому значению при следующем обновлении.

Способ 1. Связывание поля поиска с реквизитом формы (Рекомендуемый)

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

  1. Откроем форму списка (например, справочника Номенклатура) в конфигураторе.
  2. Создадим новый реквизит формы, назовем его, например, ТекстПоискаРеквизит (тип: Строка).
  3. В дереве элементов формы найдем таблицу динамического списка (например, Список).
  4. В свойствах таблицы найдем группу Управление поиском.
  5. В поле Строка поиска (SearchString) выберем созданный нами реквизит ТекстПоискаРеквизит.

Теперь наше поле поиска на форме жестко связано с переменной. Рассмотрим пример кода, который позволит нам мгновенно очистить поле поиска при нажатии какой-либо кнопки или выполнении события:


&НаКлиенте
Процедура ОчиститьПоискВыполнить()
    // Простое присвоение пустой строки реквизиту формы
    ТекстПоискаРеквизит = "";
    
    // Платформа автоматически обновит визуальное поле поиска
    // и сбросит фильтрацию в динамическом списке.
КонецПроцедуры

Этот метод является наиболее правильным и стабильным, так как он заложен в логику работы управляемого интерфейса самой фирмой 1С.

Способ 2. Работа через пользовательские настройки компоновщика

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

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


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

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

Способ 3. Сброс настроек формы (Радикальный)

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


&НаКлиенте
Процедура СброситьВсеНастройкиФормы()
    // Метод возвращает форму к первоначальному виду, заданному в конфигураторе
    ЭтаФорма.СтандартныеНастройкиУпрФормы();
КонецПроцедуры

Важный нюанс: использование СтандартныеНастройкиУпрФормы() приведет к потере пользователем всех настроек (ширина колонок, видимость, порядок), что может вызвать раздражение. Используйте этот метод только в исключительных ситуациях.

Проблема фокуса и полнотекстового поиска в УНФ

Разберем специфику конфигурации «Управление нашей фирмой» (УНФ). В справочнике Номенклатура часто включен расширенный поиск, который работает через механизм полнотекстового индекса. Если мы программно очищаем поле (связанное с реквизитом), визуально текст исчезает, но фокус ввода может остаться в основной таблице списка.

К сожалению, в 1С нет штатного метода УстановитьФокус() именно для строки поиска. Но мы можем упростить жизнь пользователю, обеспечив хотя бы чистоту данных. Также проанализируем ситуацию: если после программной очистки список не обновился автоматически, можно инициировать принудительное обновление:


&НаКлиенте
Процедура ПринудительноеОбновлениеСписка()
    Элементы.Список.Обновить();
КонецПроцедуры

Итоги и рекомендации

Подведем итоги нашего исследования. Для эффективной очистки поля поиска в УНФ 1.6 или любой другой современной конфигурации на управляемых формах:

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

← На главную