В процессе разработки интерфейсов в обычном приложении 1С (на базе платформы 8.2 или 8.3 в режиме совместимости) часто возникает задача создания «быстрых ссылок». Например, на рабочем столе пользователя должна быть кнопка, которая не просто открывает справочник Автомобили, а сразу переносит человека в конкретную папку (группу), например, СогласованиеТипаАвто. В этой статье мы подробно разберем, как реализовать такой переход программно, какие методы использовать и как добиться того, чтобы папка не просто выделялась, а фактически открывалась для просмотра.
Представим ситуацию: у нас есть сложная иерархия справочника. Внутри справочника Автомобили находятся группы первого, второго и третьего уровней. Нам нужно, чтобы при нажатии на кнопку в форме рабочего стола открывалась форма списка справочника, и курсор автоматически устанавливался на предопределенную группу. Проблема, с которой сталкиваются многие начинающие разработчики, заключается в том, что стандартный вызов формы просто открывает список в корне, игнорируя иерархию, либо же только подсвечивает папку, не заходя внутрь.
Разберем по шагам, как правильно написать код для этой задачи.
Первым делом нам необходимо получить ссылку на объект, на котором мы хотим позиционироваться. Существует несколько способов сделать это, в зависимости от того, как создана группа в конфигураторе.
Способ А: Обращение к предопределенному элементу
Если группа создана в конфигураторе как предопределенная и у нее заполнено имя (например, СогласованиеТипаАвто), мы можем обратиться к ней напрямую через точку:
СсылкаНаГруппу = Справочники.Автомобили.СогласованиеТипаАвто;
Способ Б: Поиск по коду или наименованию
Если папка создана пользователем вручную или у нее нет имени предопределенного элемента, используем методы поиска:
// Поиск по уникальному коду (наиболее надежный способ)
СсылкаНаГруппу = Справочники.Автомобили.НайтиПоКоду("000000010");
// Поиск по наименованию (менее надежен, так как названия могут меняться)
СсылкаНаГруппу = Справочники.Автомобили.НайтиПоНаименованию("Согласование типа авто", Истина);
Теперь рассмотрим, как открыть форму и передать ей команду на установку курсора. В обычном приложении для этого используется метод ПолучитьФормуСписка(). Проанализируем типичный алгоритм работы:
Процедура ОткрытьНужнуюПапкуНажатие(Элемент)
// 1. Получаем ссылку на группу
Ссылка = Справочники.Автомобили.СогласованиеТипаАвто;
// 2. Получаем форму списка.
// Первый параметр - имя формы, второй - владелец (необязательно)
Форма = Справочники.Автомобили.ПолучитьФормуСписка();
// 3. Работаем с элементами формы
// В обычных формах список элементов справочника обычно представлен
// табличным полем с именем "СправочникСписок" или "Список"
Если Ссылка.ЭтоГруппа Тогда
// Позиционируем курсор в основном списке
Форма.ЭлементыФормы.СправочникСписок.ТекущаяСтрока = Ссылка;
// Если на форме есть дерево групп (левая панель), позиционируем и там
Попытка
Форма.ЭлементыФормы.СправочникДерево.ТекущаяСтрока = Ссылка;
Исключение
// Если дерева на форме нет, ничего не делаем
КонецПопытки;
КонецЕсли;
// 4. Открываем подготовленную форму
Форма.Открыть();
КонецПроцедуры
Рассмотрим подробнее важный нюанс: свойство ТекущаяСтрока отвечает только за визуальное выделение строки (фокус). Однако пользователь часто ожидает, что система «войдет» в папку.
Если после выполнения кода выше папка просто выделяется синим цветом, но список элементов внутри нее не отображается, нам нужно применить дополнительные методы управления элементами формы.
Вариант 1. Установка родителя (фильтрация)
Чтобы в правой части (в списке элементов) отображалось только содержимое нашей папки, мы должны установить отбор по родителю. Это наиболее эффективный метод для пользователя.
Форма = Справочники.Автомобили.ПолучитьФормуСписка();
// Устанавливаем фильтр так, чтобы корень списка переместился внутрь группы
Форма.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Истина;
Форма.ЭлементыФормы.СправочникСписок.Значение.Отбор.Родитель.Установить(Ссылка);
Форма.Открыть();
Вариант 2. Использование метода Развернуть()
Если на форме списка используется элемент управления «Дерево» (левая панель со структурой папок), простого присвоения ТекущаяСтрока недостаточно, чтобы ветка дерева раскрылась визуально. В этом случае мы проанализируем ситуацию и добавим вызов метода разворота:
Форма = Справочники.Автомобили.ПолучитьФормуСписка();
Форма.Открыть(); // Сначала открываем, чтобы элементы формы инициализировались
// Разворачиваем узел в дереве
Форма.ЭлементыФормы.СправочникДерево.Развернуть(Ссылка, Ложь);
// Позиционируемся
Форма.ЭлементыФормы.СправочникДерево.ТекущаяСтрока = Ссылка;
Выясним причину, почему иногда переход не срабатывает. В обычном приложении у табличного поля, отображающего справочник, есть свойство ИерархическийПросмотр. Если оно выключено (Ложь), то справочник отображается плоским списком, и попытка позиционироваться на родителе или развернуть дерево может привести к ошибке или отсутствию результата.
Всегда проверяйте этот режим перед установкой фокуса:
СправочникСписок включена возможность иерархического просмотра.СправочникДерево на форме.Попытка...Исключение, так как имена элементов на форме могут отличаться в разных конфигурациях (например, Список вместо СправочникСписок).Соберем все рекомендации в один надежный блок кода, который можно использовать для кнопки на рабочем столе или в любой другой части программы:
Процедура ОткрытьГруппуСправочника()
// Определяем группу (используем предопределенное значение)
ГруппаСсылка = Справочники.Автомобили.СогласованиеТипаАвто;
// Проверяем, что ссылка не пустая
Если ГруппаСсылка.Пустая() Тогда
Возврат;
КонецЕсли;
// Получаем форму списка
ФормаСписка = Справочники.Автомобили.ПолучитьФормуСписка();
// 1. Позиционирование в дереве (если оно есть)
Попытка
ЭлементДерево = ФормаСписка.ЭлементыФормы.СправочникДерево;
ЭлементДерево.ТекущаяСтрока = ГруппаСсылка;
// Разворачиваем группу, чтобы увидеть вложенные папки
ЭлементДерево.Развернуть(ГруппаСсылка, Ложь);
Исключение
// Дерево групп отсутствует на форме
КонецПопытки;
// 2. Позиционирование в списке элементов
Попытка
ЭлементСписок = ФормаСписка.ЭлементыФормы.СправочникСписок;
// Включаем иерархический режим
ЭлементСписок.ИерархическийПросмотр = Истина;
// Устанавливаем курсор на саму группу
ЭлементСписок.ТекущаяСтрока = ГруппаСсылка;
Исключение
// Табличное поле списка называется иначе
КонецПопытки;
// Открываем результат
ФормаСписка.Открыть();
КонецПроцедуры
Разберем, что мы получили: данный код сначала находит нужный объект, затем подготавливает форму, настраивает отображение дерева и списка, и только после этого выводит окно пользователю. Такой подход гарантирует, что интерфейс будет выглядеть именно так, как ожидает заказчик — с открытой и выделенной нужной папкой.