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