При переходе на новые версии платформы разработчики нередко сталкиваются с ситуацией, когда привычные механизмы платформы 1С 8.3 перестают вести себя ожидаемым образом. Одним из таких типовых сценариев является программное открытие формы выбора динамического списка с передачей стандартного параметра ТекущаяСтрока расширения формы динамического списка.
В классическом сценарии для управляемых форм код выглядит следующим образом:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ТекущаяСтрока", Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", ПараметрыФормы);
В платформе 8.3 при таком вызове форма открывается с активизацией нужной строки. Однако в ветке 1С 8.5 (в частности, в некоторых тестовых сборках линейки 8.5.4) разработчики наблюдают поведение, при котором форма успешно открывается, но курсор в динамическом списке остается на первой строке или сбрасывается. Проанализируем, почему это происходит и какие варианты обхода существуют.
Разберем в первую очередь технические причины сбоя на уровне самой платформы. Как показывает практика тестирования релизов 1С 8.5, поведение механизма позиционирования может кардинально отличаться в зависимости от конкретного билда. Например, в сборке 8.5.1.1094 функциональность работает штатно, тогда как в тестовых сборках линейки 8.5.4 активизация строки через параметры расширения формы может давать сбой из-за измененной внутренней модели асинхронной загрузки данных списка.
Прежде чем менять программную логику, выполним базовые проверки:
Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура действительно возвращает ссылку нужного типа, а не значение Неопределено или строку. Если строка в исходном списке не выбрана, свойство ТекущиеДанные возвращает Неопределено, что приведет к игнорированию параметра.Выясним, какие настройки самого динамического списка в открываемой форме могут блокировать позиционирование:
ТекущаяСтрока корректно работает только тогда, когда у динамического списка целевой формы явно задано свойство Основная таблица. Если список построен на произвольном запросе с объединениями и свойство не заполнено, платформа не может сопоставить переданную ссылку со строкой выборки.Если форма выбора доступна для редактирования, наиболее надежным решением будет перехват параметра и прямая установка фокуса на уровне открываемой формы. Рассмотрим код в модуле формы выбора:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Параметры.Свойство("ТекущаяСтрока") И ЗначениеЗаполнено(Параметры.ТекущаяСтрока) Тогда
Элементы.Список.ТекущаяСтрока = Параметры.ТекущаяСтрока;
КонецЕсли;
КонецПроцедуры
Такой подход принудительно указывает таблице формы целевую строку, минуя стандартную логику инициализации параметров расширения.
В некоторых сборках 8.5 данные динамического списка загружаются асинхронно, и к моменту срабатывания события ПриОткрытии первая порция данных еще не помещена в контекст клиента. Из-за этого прямое присвоение свойства ТекущаяСтрока может сбрасываться. В такой ситуации применим однократный обработчик ожидания с минимальным интервалом:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Параметры.Свойство("ТекущаяСтрока") И ЗначениеЗаполнено(Параметры.ТекущаяСтрока) Тогда
ПодключитьОбработчикОжидания("УстановитьПозициюВСписке", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПозициюВСписке()
Элементы.Список.ТекущаяСтрока = Параметры.ТекущаяСтрока;
КонецПроцедуры
Использование интервала в 0.1 секунды позволяет интерфейсу формы завершить отрисовку и связаться с динамической выборкой данных, после чего строка активизируется гарантированно.
Если дорабатывать модуль целевой формы выбора нельзя (например, форма принадлежит типовой неизменяемой конфигурации), применим явное открытие формы через получение ее клиентского экземпляра:
ПараметрыФормы = Новый Структура;
НужнаяСсылка = Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура;
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", ПараметрыФормы, ЭтотОбъект);
ФормаВыбора.Открыть();
Если ЗначениеЗаполнено(НужнаяСсылка) Тогда
ФормаВыбора.Элементы.Список.ТекущаяСтрока = НужнаяСсылка;
КонецЕсли;
Посмотрим на результат: метод ПолучитьФорму возвращает объект формы, позволяя напрямую обратиться к ее элементам сразу после вызова метода Открыть().
Если у пользователя сохранена предыдущая позиция курсора, платформа может восстанавливать старое значение поверх переданного параметра. Для устранения этого конфликта проверим свойства таблицы в форме: снимем признак Восстанавливать текущую строку либо очистим сохраненные пользовательские настройки для данной формы с помощью объекта ХранилищеСистемныхНастроек.