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

В свое время пришлось решать задачу позиционирования табличного поля, которое формировалось путем выгрузки результата запроса в таблицу значений. При этом стандартная реакция системы после такого обновления табличного поля - переход к первой строке, что не устраивало. Решение задачи оказалось несколько неочевидным, но весьма элегантным. Оказалось, что для этого используется свойство ТекущаяСтрока элемента формы, которое предназначено не только для чтения, но и для записи. В этом свойстве, в зависимости от того, что отображается в табличном поле (т.е. в зависимости от расширения табличного поля для соответствующего объекта), хранится либо данные всей строки, либо ключ записи (или что-то еще rolleyes).

Итак, набросок кода:

// Здесь ТабличноеПоле1 - реквизит формы, соответствующий элементу управления
// тип - таблица значений.
ТабличноеПоле1 = Запрос.Выполнить().Выгрузить();
СтруктураПоиска = Новый Структура();
// Допустим, надо спозиционироваться на строке, колонка "Код" которой равна
// значению переменной КодСтроки.
СтруктураПоиска.Вставить("Код", КодСтроки);

// ищем нужную строку и позиционируемся
Строки = ТабличноеПоле1.НайтиСтроки(СтруктураПоиска);
Если Строки.Количество() > 0 Тогда
  ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = Строки[0];
КонецЕсли;

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

ТекСтр = ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока;
ТабличноеПоле1 = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = ТекСтр;

Вот такая вот проблемка, над которой, как ни странно, мы довольно долго ломали голову. Надеюсь, эта заметка кому-нибудь пригодится! smile

Вопросы и ответы

Вопрос (Дмитрий): не работает у меня, в форме стоит Табличное поле с типом значения Регистр сведений и я не могу после обновления вернуть курсор на текущее поле.

ВремИнд = ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока;
ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока);
ТаблицаТоваров.Прочитать();
ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока = ВремИнд; 

Ошибка при установке значения атрибута контекста (ТекущаяСтрока)

Ответ: для начала - строка, которую мы запомнили в первой строке (ВремИнд), остается после применения отбора?

Дмитрий: ВремИнд это текущая строка таблицы (ТаблицаТоваров), на которой стоит курсор, мне надо после обновления вернуть его на место. ВремИнд конечно остается.

Ответ: странно все. Значит по первому варианту надо пробовать (через структуру поиска).

Дмитрий: я не знаю, правильно ли это, но вот так стало работать:

Врем = ЭлементыФормы.ТаблицаТоваров.ТекущиеДанные;
Если Врем <> Неопределено Тогда
  Врем = ТаблицаТоваров.Индекс(Врем);
Иначе
  Врем = 0;
КонецЕсли;
ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока);
ТаблицаТоваров.Прочитать();
КолВо = ТаблицаТоваров.Количество() - 1;
Если КолВо > 0 Тогда
  ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока =
    ТаблицаТоваров.Получить(?(Врем > КолВо, КолВо, Врем));
КонецЕсли;

Ответ: некоторое недоумение вызывает последняя конструкция - ?(Врем > КолВо, КолВо, Врем) wacko, а так, в принципе, по индексу тоже неплохая идея.
P.S. Хотя если до изменения весов в этой таблице было больше строк, тогда да. Сначала немного тупанул.


Категория: Программирование, 1С | Опубликовано 26.03.2009 | Редакция от 08.01.2017

Похожие материалы:


Комментарии, обсуждение

комментарии простроенны на платформе Disqus