В свое время пришлось решать задачу позиционирования табличного поля, которое формировалось путем выгрузки результата запроса в таблицу значений. При этом стандартная реакция системы после такого обновления табличного поля - переход к первой строке, что не устраивало. Решение задачи оказалось несколько неочевидным, но весьма элегантным. Оказалось, что для этого используется свойство ТекущаяСтрока
элемента формы, которое предназначено не только для чтения, но и для записи. В этом свойстве, в зависимости от того, что отображается в табличном поле (т.е. в зависимости от расширения табличного поля для соответствующего объекта), хранится либо данные всей строки, либо ключ записи (или что-то еще ).
Итак, набросок кода:
// Здесь ТабличноеПоле1 - реквизит формы, соответствующий элементу управления // тип - таблица значений. ТабличноеПоле1 = Запрос.Выполнить().Выгрузить(); СтруктураПоиска = Новый Структура(); // Допустим, надо спозиционироваться на строке, колонка "Код" которой равна // значению переменной КодСтроки. СтруктураПоиска.Вставить("Код", КодСтроки); // ищем нужную строку и позиционируемся Строки = ТабличноеПоле1.НайтиСтроки(СтруктураПоиска); Если Строки.Количество() > 0 Тогда ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = Строки[0]; КонецЕсли;
Приведенный выше код (т.е. с использованием структуры поиска и последующим анализом полученного результата) является универсальным - т.е. если строку для позиционирования надо искать по какому-то сложному алгоритму. Если же мы до обновления табличной части запомнили текущую строку и уверены в том, что эта строчка останется после обновления, то, очевидно, код значительно упростится:
ТекСтр = ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока; ТабличноеПоле1 = Запрос.Выполнить().Выгрузить(); ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = ТекСтр;
Вот такая вот проблемка, над которой, как ни странно, мы довольно долго ломали голову. Надеюсь, эта заметка кому-нибудь пригодится!
Вопросы и ответы
Вопрос (Дмитрий): не работает у меня, в форме стоит Табличное поле с типом значения Регистр сведений и я не могу после обновления вернуть курсор на текущее поле.
ВремИнд = ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока; ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока); ТаблицаТоваров.Прочитать(); ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока = ВремИнд;
Ошибка при установке значения атрибута контекста (ТекущаяСтрока)
Ответ: для начала - строка, которую мы запомнили в первой строке (ВремИнд), остается после применения отбора?
Дмитрий: ВремИнд это текущая строка таблицы (ТаблицаТоваров), на которой стоит курсор, мне надо после обновления вернуть его на место. ВремИнд конечно остается.
Ответ: странно все. Значит по первому варианту надо пробовать (через структуру поиска).
Дмитрий: я не знаю, правильно ли это, но вот так стало работать:
Врем = ЭлементыФормы.ТаблицаТоваров.ТекущиеДанные; Если Врем <> Неопределено Тогда Врем = ТаблицаТоваров.Индекс(Врем); Иначе Врем = 0; КонецЕсли; ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока); ТаблицаТоваров.Прочитать(); КолВо = ТаблицаТоваров.Количество() - 1; Если КолВо > 0 Тогда ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока = ТаблицаТоваров.Получить(?(Врем > КолВо, КолВо, Врем)); КонецЕсли;
Ответ: некоторое недоумение вызывает последняя конструкция - ?(Врем > КолВо, КолВо, Врем)
, а так, в принципе, по индексу тоже неплохая идея.
P.S. Хотя если до изменения весов в этой таблице было больше строк, тогда да. Сначала немного тупанул.