Как в 1С открыть форму выбора справочника с выделением нужного элемента и раскрытием дерева?

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

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

Использование параметров формы для позиционирования

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

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


// Определим ссылку, на которую нужно установить курсор
НужнаяСсылка = Справочники.Номенклатура.НайтиПоНаименованию("Настольная лампа");

// Подготовим структуру параметров для открытия формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ТекущаяСтрока", НужнаяСсылка);

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

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

Модальный режим и современная альтернатива (блокировка интерфейса)

В старых конфигурациях или при работе в обычном приложении часто использовался метод ОткрытьФормуМодально(). Этот метод полностью останавливает выполнение кода до момента закрытия формы пользователем. Однако в современной платформе 8.3 (особенно при включенном режиме "Не использовать модальные окна") этот метод вызовет исключение. Проанализируем, как добиться похожего поведения, соблюдая требования актуальных стандартов.

Для имитации модальности, когда пользователю необходимо заблокировать основное окно до завершения выбора, мы используем параметр РежимОткрытияОкнаФормы. Выясним, как это реализовать:


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

// Указываем владельца формы и режим блокировки интерфейса
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", 
             ПараметрыФормы, 
             ЭтаФорма, 
             Истина, 
             ВариантОткрытияОкна.БлокироватьВесьИнтерфейс);

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

Асинхронная работа и обработка результата выбора

Если нам необходимо получить выбранное значение и выполнить с ним какие-либо действия в коде (например, заполнить реквизит на форме), использование модальности — не лучший путь. Рассмотрим правильную асинхронную модель работы через ОписаниеОповещенияОЗавершении.

Посмотрим на пример реализации в модуле формы:


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

&НаКлиенте
Процедура ПослеВыбораНоменклатуры(РезультатВыбора, ДополнительныеПараметры) Экспорт
    
    Если ЗначениеЗаполнено(РезультатВыбора) Тогда
        Объект.Товар = РезультатВыбора;
        // Здесь можно вызвать серверный код для заполнения цен или других данных
    КонецЕсли;
    
КонецПроцедуры

Что делать, если дерево не раскрывается автоматически?

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

В модуле открываемой формы (например, ФормаВыбора справочника "Номенклатура") в обработчике ПриОткрытии можно использовать метод Развернуть() для элемента формы типа Таблица.

Пример кода внутри формы выбора:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Если нам передали параметр для позиционирования
    Если Параметры.Свойство("ТекущаяСтрока") И ЗначениеЗаполнено(Параметры.ТекущаяСтрока) Тогда
        
        // Попытаемся получить родителя элемента (группу)
        РодительЭлемента = ПолучитьРодителяНаСервере(Параметры.ТекущаяСтрока);
        
        Если ЗначениеЗаполнено(РодительЭлемента) Тогда
            // Разворачиваем узел дерева
            Элементы.Список.Развернуть(РодительЭлемента);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

Особенности работы с динамическим списком

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

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

Подведем итоги

Для реализации качественного интерфейса выбора в 1С 8.3 мы рекомендуем придерживаться следующего алгоритма:

  1. Всегда используйте структуру ПараметрыФормы с ключом ТекущаяСтрока для базового позиционирования.
  2. Вместо устаревшего ОткрытьФормуМодально применяйте ОткрытьФорму с параметром блокировки интерфейса ВариантОткрытияОкна.БлокироватьВесьИнтерфейс.
  3. Для обработки результата используйте асинхронный механизм ОписаниеОповещенияОЗавершении — это обеспечит стабильную работу в тонком и веб-клиенте.
  4. Если дерево групп содержит много уровней и автоматика дает сбой, используйте метод Развернуть() в модуле самой формы выбора, предварительно передав туда нужные данные через параметры.

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

← На главную