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