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