При разработке интерфейсов в 1С часто возникает задача упростить навигацию для пользователя. Вместо того чтобы заставлять человека вручную искать нужную группу в огромном справочнике Партнеры или Номенклатура, мы можем вывести в панель навигации подсистемы прямую ссылку, которая сразу откроет список с нужным фильтром. В этой статье мы подробно разберем, как реализовать открытие формы с отбором и как динамически управлять заголовком окна, чтобы пользователь точно понимал, с каким сегментом данных он работает.
Самый быстрый и очевидный способ — передать структуру Отбор в параметрах открытия формы. Рассмотрим ситуацию, когда нам нужно открыть список партнеров, являющихся пациентами. Для этого мы создаем команду и прописываем в ней следующий код:
ПараметрыОтбора = Новый Структура("Родитель", ПолучитьГруппуПациенты());
ОткрытьФорму("Справочник.Партнеры.ФормаСписка",
Новый Структура("Отбор", ПараметрыОтбора),
ПараметрыВыполненияКоманды.Источник,
Новый УникальныйИдентификатор(),
ПараметрыВыполненияКоманды.Окно);
Разберем, что здесь происходит. Мы создаем Структура, где ключом является имя поля компоновки данных (в данном случае Родитель), а значением — ссылка на конкретную группу справочника. Система при открытии формы автоматически применит этот фильтр к динамическому списку. Однако у этого метода есть особенность: пользователь сможет легко увидеть этот отбор в настройках и отключить его, что не всегда желательно.
Если мы хотим, чтобы пользователь не мог случайно или намеренно сбросить установленный нами фильтр по родителю, нам следует использовать механизм Фиксированных настроек. Фиксированные настройки применяются "поверх" пользовательских и не редактируются через стандартный интерфейс настройки списка.
Проанализируем алгоритм реализации этого метода:
НастройкиКомпоновкиДанных.Отбор.ФиксированныеНастройки при вызове ОткрытьФорму.
Группа = Справочники.Партнеры.НайтиПоНаименованию("Пациенты");
Настройки = Новый НастройкиКомпоновкиДанных;
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Родитель");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Группа;
ЭлементОтбора.Использование = Истина;
ПараметрыФормы = Новый Структура("ФиксированныеНастройки", Настройки);
ОткрытьФорму("Справочник.Партнеры.ФормаСписка", ПараметрыФормы);
Этот подход считается наиболее профессиональным и надежным при разработке сложных интерфейсов на управляемых формах.
Иногда возникают ситуации, когда стандартных параметров недостаточно (например, в типовых конфигурациях вроде УТ 11, где формы списка перегружены сложной логикой). В этом случае мы можем получить форму программно, изменить её КомпоновщикНастроек и только потом открыть.
Рассмотрим пример функции, которая универсально добавляет отбор в настройки компоновщика:
&НаКлиенте
Функция ДобавитьОтборВКомпоновщик(Компоновщик, ИмяПоля, Значение)
НовоеПоле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Отбор = Компоновщик.Настройки.Отбор;
// Проверяем, нет ли уже такого отбора, чтобы не дублировать
ЭлементОтбора = Неопределено;
Для каждого Элемент Из Отбор.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") И Элемент.ЛевоеЗначение = НовоеПоле Тогда
ЭлементОтбора = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = Отбор.Эleменты.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
КонецЕсли;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = НовоеПоле;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Значение;
Возврат ЭлементОтбора;
КонецФункции
После подготовки такой функции вызов формы будет выглядеть следующим образом:
ФормаСписка = ПолучитьФорму("Справочник.Партнеры.ФормаСписка");
ДобавитьОтборВКомпоновщик(ФормаСписка.Список.КомпоновщикНастроек, "Родитель", ГруппаСсылка);
ФормаСписка.Открыть();
Вопрос об изменении названия в самой панели подсистемы (командном интерфейсе) имеет свои тонкости. Непосредственно "текст" команды в конфигураторе является статичным свойством метаданных. Чтобы добиться эффекта "динамического заголовка" в интерфейсе подсистемы, обычно используют один из двух подходов:
Выясним, как программно изменить заголовок окна, чтобы вместо "Партнеры" там красовалось название группы. В модуле формы списка (например, Справочник.Партнеры.ФормаСписка) в обработчике ПриСозданииНаСервере нужно прописать логику анализа параметров:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие отбора по родителю в параметрах
Если Параметры.Свойство("Отбор") И Параметры.Отбор.Свойство("Родитель") Тогда
ЗаголовокГруппы = Строка(Параметры.Отбор.Родитель);
ЭтаФорма.АвтоЗаголовок = Ложь;
ЭтаФорма.Заголовок = "Партнеры: " + ЗаголовокГруппы;
КонецЕсли;
КонецПроцедуры
Таким образом, когда пользователь нажмет на пункт "Пациенты" в меню, откроется окно с заголовком "Партнеры: Пациенты", что значительно повышает удобство работы.
Разберем типичную ошибку, когда после применения кода форма списка оказывается пустой. Проанализируем основные причины:
Родитель может ожидать другой тип или быть скрыто. Убедитесь, что передаваемая ссылка принадлежит именно тому справочнику, который открывается.ВидСравненияКомпоновкиДанных.Равно может не показать вложенные элементы, если они находятся на более глубоких уровнях. В таком случае эффективнее использовать ВидСравненияКомпоновкиДанных.ВИерархии.Совет: Всегда проверяйте, включено ли использование иерархического просмотра в форме. Для корректного отображения плоского списка с отбором по родителю рекомендуется принудительно устанавливать режим просмотра:
ПараметрыФормы.Вставить("РежимПросмотра", РежимПросмотраДинамическогоСписка.Список);