Как использовать произвольную форму с деревом значений в качестве формы выбора в 1С

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

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

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

Выясним причину поведения платформы

Штатный механизм автоматического выбора элемента и закрытия формы выбора работает «из коробки» только тогда, когда основным реквизитом формы является Динамический список. В этом случае платформа 1С автоматически связывает стандартные команды («Выбрать», двойной клик мыши и клавишу Enter) со ссылкой текущей строки списка.

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

Пошаговая настройка произвольной формы выбора

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

  1. Назначение формы в свойствах справочника:

    Чтобы форма автоматически открывалась во всех полях ввода без необходимости вручную указывать ее в каждом документе, откроем свойства справочника в дереве метаданных и укажем нашу созданную форму в свойстве Основная форма выбора. При открытии такой формы из любого поля ввода платформа автоматически передает параметр Параметры.РежимВыбора = Истина и связывает форму с полем-владельцем (ВладелецФормы).

  2. Обработка события выбора в таблице дерева:

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

    
    &НаКлиенте
    Процедура ДеревоЭлементовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
        СтандартнаяОбработка = Ложь;
        
        ТекущиеДанные = Элементы.ДеревоЭлементов.ТекущиеДанные;
        Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
            ОповеститьОВыборе(ТекущиеДанные.Ссылка);
        КонецЕсли;
    КонецПроцедуры
    

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

  3. Создание кнопки «Выбрать» на командной панели:

    Так как стандартная кнопка выбора динамического списка для произвольной таблицы недоступна, создадим пользовательскую команду формы (например, КомандаВыбрать) и вынесем ее на командную панель формы. В палитре свойств кнопки включим флаг КнопкаПоУмолчанию в значение Истина.

    В модуле формы пропишем обработчик для созданной команды:

    
    &НаКлиенте
    Процедура КомандаВыбрать(Команда)
        ТекущиеДанные = Элементы.ДеревоЭлементов.ТекущиеДанные;
        Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
            ОповеститьОВыборе(ТекущиеДанные.Ссылка);
        КонецЕсли;
    КонецПроцедуры
    

Важные нюансы и обработка исключений

Проанализируем специфические моменты, на которые следует обратить внимание при работе с деревом значений:

  1. Проверка группировочных строк:

    В иерархическом дереве значений на верхних уровнях часто располагаются искусственные группы или узлы, у которых реквизит Ссылка не заполнен. Обязательно проверяйте условие ЗначениеЗаполнено(ТекущиеДанные.Ссылка) перед отправкой оповещения, чтобы не передать в документ пустое значение.

  2. Контекст открытия формы:

    Метод ОповеститьОВыборе() завершится системной ошибкой во время выполнения, если форма открыта просто для просмотра (без режима выбора). Если форма планируется как универсальная (и для выбора, и для независимого просмотра), в событии ПриСозданииНаСервере или ПриОткрытии анализируйте свойство Параметры.РежимВыбора и отображайте кнопку выбора только тогда, когда форма открыта в режиме подбора/выбора значения.

Таким образом, использование метода ОповеститьОВыборе() внутри событий таблицы формы позволяет превратить любую произвольную форму с коллекцией ДеревоЗначений в полноценную форму выбора, совместимую со всеми документами конфигурации без изменения их программного кода.

← На главную