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

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

При работе со справочниками товаров в режиме подбора часто возникает задача сохранить и восстановить текущую позицию курсора. В обычных формах платформы «1С:Предприятие 8» для табличного поля предусмотрено свойство ВосстанавливатьТекущуюСтроку. Однако при работе с иерархическими справочниками стандартный механизм может работать нестабильно: если элемент находится на 3-м или более глубоком уровне вложенности, платформа сбрасывает позицию в корень или на верхнюю родительскую папку.

Рассмотрим, почему возникает эта проблема и как корректно настроить позиционирование на элементах любой глубины вложенности.

Выясним причину сброса позиции

Разберем механику работы иерархического табличного поля. Когда открывается форма списка или выбора справочника, динамический список считывает данные порциями. Если элемент находится глубоко в дереве групп, платформа «не знает» о его существовании в текущей выборке, пока не будет раскрыта вся цепочка родительских папок.

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

Способ 1. Явная установка родительской группы

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

Посмотрим на пример кода в обработчике ПриОткрытии или при восстановлении позиции:


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

КонецПроцедуры

Этот способ гарантирует, что табличное поле переключит контекст просмотра на нужную папку независимо от уровня вложенности.

Способ 2. Использование свойства ПараметрТекущаяСтрока

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

Проанализируем пример передачи параметра при программном открытии формы:


// Код в форме документа или подбора
ФормаВыбора = Справочники.Товары.ПолучитьФормуВыбора();
ФормаВыбора.ПараметрТекущаяСтрока = ПоследнийВыбранныйТовар;
ФормаВыбора.Открыть();

Также внутри самой формы справочника перед открытием можно задать значение данного параметра:


Процедура ПриОткрытии()
    Если ЗначениеЗаполнено(СохраненныйТовар) Тогда
        ПараметрТекущаяСтрока = СохраненныйТовар;
    КонецЕсли;
КонецПроцедуры

Способ 3. Использование параметра НачальноеЗначениеВыбора

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

Пример программного вызова формы выбора с указанием начального элемента:


СтруктураПараметров = Новый Структура("НачальноеЗначениеВыбора", СохраненнаяСсылкаНаТовар);
ОткрытьФорму("Справочник.Товары.ФормаВыбора", СтруктураПараметров, Элемент);

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

При настройке позиционирования обратите внимание на следующие моменты:

  1. Проверьте имя реквизита на форме: В обычных формах табличное поле списка справочника по умолчанию может называться СправочникСписок или ТабличноеПоле1. Убедитесь, что обращение идет к существующему элементу формы.
  2. Событие ПриАктивизацииСтроки: В этом обработчике часто выполняются дополнительные запросы (например, расчет остатков или получение цен). Если код в ПриАктивизацииСтроки видоизменяет текущие данные или перебивает позиционирование при открытии, необходимо использовать флаг-заглушку на время инициализации формы.
  3. Синхронизация с деревом папок: Если на форме выведено отдельное табличное поле для дерева групп, сначала требуется установить текущую строку в дереве папок, а уже затем позиционировать список элементов.
← На главную