Почему не работает поиск в форме списка после открытия с отбором и как это исправить

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

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

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

Анализ механизма: почему стандартный поиск не находит данные

Рассмотрим типовой фрагмент кода, приводящий к возникновению проблемы:


ЗначениеОтбора  = Новый Структура("Номер", Объект.НомерСчт);
ПараметрыВыбора = Новый Структура("Отбор", ЗначениеОтбора);

ОткрытьФорму("Документ.СчетНаОплатуПокупателю.ФормаСписка", ПараметрыВыбора);

Выясним причину такого поведения динамического списка:

  1. Назначение параметра «Отбор». Когда мы передаем в метод ОткрытьФорму структуру с ключом Отбор, платформа 1С автоматически переносит указанные условия в коллекцию Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор основного реквизита формы.
  2. Изоляция фиксированных настроек. Условия, попавшие в фиксированные настройки, жестко вшиваются в запрос динамического списка на уровне платформы. Они намеренно скрыты от пользователя: их нельзя увидеть через команду «Еще — Настроить список», они не выводятся на стандартную панель быстрых отборов и не могут быть сброшены кнопкой отмены поиска (крестиком в поле ввода или сочетанием клавиш Ctrl + Q).
  3. Логика наложения условий. Когда пользователь в открывшейся форме вводит в строку поиска новое значение (например, другой номер документа), платформа накладывает поисковое выражение поверх действующих фиксированных настроек через логическое «И». В результате формируется результирующий отбор вида: Номер = "Счет_1" И Номер = "Счет_2". Очевидно, что ни один документ не может удовлетворять обоим взаимоисключающим условиям одновременно, поэтому динамический список становится абсолютно пустым.
  4. Отсутствие событий у поля «Поиск». Поле ввода поиска в командной панели динамического списка является платформенным элементом. Перехватить ввод пользователя или нажатие кнопок очистки стандартного поиска с помощью событий формы невозможно, так как у этого элемента нет доступных обработчиков вроде ПриИзменении.

Кроме того, обратим внимание на типичную ошибку при вызове форм, которая часто встречается в коде:


// Ошибочный подход:
ФормаСписка = ПолучитьФорму("Документ.СчетНаОплатуПокупателю.ФормаСписка");
ФормаСписка.Параметры.РежимВыбора = Истина;
ОткрытьФорму("Документ.СчетНаОплатуПокупателю.ФормаСписка", ПараметрыВыбора);

При таком написании метод ПолучитьФорму инициализирует один экземпляр формы в памяти, а последующий вызов ОткрытьФорму создает и открывает совершенно другой экземпляр. Все параметры следует передавать единой структурой непосредственно в ОткрытьФорму.

Способ 1. Позиционирование на строке вместо жесткого отбора (рекомендуемый)

В большинстве сценариев пользователю на самом деле не требуется жестко ограничивать видимость документов. Главная цель — открыть список так, чтобы курсор сразу стоял на нужном документе, но при этом бухгалтер мог просматривать остальные записи и пользоваться полнотекстовым и стандартным поиском без каких-либо ограничений.

Для решения этой задачи в платформе 1С предусмотрен стандартный параметр формы ТекущаяСтрока. Посмотрим на правильную реализацию:


// Находим ссылку на нужный документ
СсылкаНаСчет = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру(Объект.НомерСчт, Объект.Дата);

ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимВыбора", Истина);
ПараметрыОткрытия.Вставить("ТекущаяСтрока", СсылкаНаСчет);

ОткрытьФорму("Документ.СчетНаОплатуПокупателю.ФормаСписка", ПараметрыОткрытия);

Разберем преимущества этого способа:

  1. Список документов открывается целиком, фиксированные настройки компоновщика остаются пустыми.
  2. Курсор в таблице сразу позиционируется и визуально выделяет требуемый документ.
  3. Стандартное поле поиска, фильтры по контрагентам, датам и статусам работают в штатном режиме. Пользователю не требуется совершать лишних действий для сброса ограничений.
  4. Не требуется изменять типовую конфигурацию или создавать расширения.

Способ 2. Программная очистка фиксированных настроек формы

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

Рассмотрим, как очистить коллекцию отборов в обработчике создания формы на сервере:


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

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

Способ 3. Перенос отбора в пользовательские настройки

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

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

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

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

← На главную