Почему не работает параметр ТекущаяСтрока при открытии формы выбора в 1С 8.5 и как это исправить?

Программист 1С v8.5 IT и автоматизация бизнеса
← На главную

При переходе на новые версии платформы разработчики нередко сталкиваются с ситуацией, когда привычные механизмы платформы 1С 8.3 перестают вести себя ожидаемым образом. Одним из таких типовых сценариев является программное открытие формы выбора динамического списка с передачей стандартного параметра ТекущаяСтрока расширения формы динамического списка.

В классическом сценарии для управляемых форм код выглядит следующим образом:


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

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

Причина 1. Ошибки тестовых сборок и проверка типа данных

Разберем в первую очередь технические причины сбоя на уровне самой платформы. Как показывает практика тестирования релизов 1С 8.5, поведение механизма позиционирования может кардинально отличаться в зависимости от конкретного билда. Например, в сборке 8.5.1.1094 функциональность работает штатно, тогда как в тестовых сборках линейки 8.5.4 активизация строки через параметры расширения формы может давать сбой из-за измененной внутренней модели асинхронной загрузки данных списка.

Прежде чем менять программную логику, выполним базовые проверки:

  1. Проверим тип передаваемого значения: убедимся, что выражение Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура действительно возвращает ссылку нужного типа, а не значение Неопределено или строку. Если строка в исходном списке не выбрана, свойство ТекущиеДанные возвращает Неопределено, что приведет к игнорированию параметра.
  2. Проверим версию платформы: если проект тестируется на предварительной сборке, проверим поведение в стабильных выпусках ветки 8.5.1.

Причина 2. Ограничения динамического списка целевой формы

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

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

Способ решения 1. Явная установка свойства в обработчике ПриОткрытии

Если форма выбора доступна для редактирования, наиболее надежным решением будет перехват параметра и прямая установка фокуса на уровне открываемой формы. Рассмотрим код в модуле формы выбора:


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

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

Способ решения 2. Отложенное позиционирование через обработчик ожидания

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если Параметры.Свойство("ТекущаяСтрока") И ЗначениеЗаполнено(Параметры.ТекущаяСтрока) Тогда
        ПодключитьОбработчикОжидания("УстановитьПозициюВСписке", 0.1, Истина);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПозициюВСписке()
    Элементы.Список.ТекущаяСтрока = Параметры.ТекущаяСтрока;
КонецПроцедуры

Использование интервала в 0.1 секунды позволяет интерфейсу формы завершить отрисовку и связаться с динамической выборкой данных, после чего строка активизируется гарантированно.

Способ решения 3. Позиционирование из вызывающей формы

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


ПараметрыФормы = Новый Структура;
НужнаяСсылка = Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура;

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

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

Способ решения 4. Отключение восстановления настроек формы

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

← На главную