Сохранение текущей строки при перезаполнении ТаблицыФормы

1. A.Sytchev 11.06.15 17:09 Сейчас в теме
Всем привет. Имеется таблица формы, перезагружаем данные в нее, нужно после перезагрузки данных сохранить текущую строку активной.
Делаю так:
&НаКлиенте
Процедура ОбновитьДанныеСписка()
	
	ТекущийИД = ЭтаФорма.Элементы.ДанныеСписка.ТекущиеДанные.ИдентификаторЗаписи;
	ОбновитьДанныеСпискаНаСервере();
	МассивПоИД = ДанныеСписка.НайтиСтроки(Новый Структура("ИдентификаторЗаписи", ТекущийИД));
	Если МассивПоИД.Количество() > 0 Тогда
		ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока = МассивПоИД[0];	
	КонецЕсли;

	
КонецПроцедуры

Показать


Не работает, при обновлении все равно перескакивает на первую строку.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Xershi 1508 15.06.15 10:13 Сейчас в теме
(1) A.Sytchev, а что в вашем понимании сохранить текущую строку. Вы же все переписываете?
7. A.Sytchev 15.06.15 10:38 Сейчас в теме
(5) Xershi,
а что в вашем понимании сохранить текущую строку. Вы же все переписываете?

У меня имеется некоторый регистр сведений, в котором как одно из измерений хранится строка с неким внешним ИД, уникальным для данного регистра. Так вот, мне необходимо, что бы пользователь, работая со строкой №10, ИД которой = 123, после обновления списка остался на той же строке (ид которой = 123), даже если теперь эта строка будет №11.

Если у вас есть ИД строки, вы его запомнили, затем обновили список. Затем появляется некий МассивПоИД.

Этот массив результат НайтиСтроки по сохраненному ИД в таблице формы.

Так вот в отладчике чему он равен?

Равен массиву с одним элементом.

И если он больше 0, то что содержит МассивПоИД[0]?

ДанныеФормыЭлементКоллекции, т.е. та строка, на которую мне нужно сделать фокус.

И результат нам.

Хм, почему-то Неопределено...
8. Xershi 1508 15.06.15 10:40 Сейчас в теме
(7) A.Sytchev, значит запихнули не то что нужно.
Мне не нравится как вы получаете МассивПоИД. Скорее всего проблема в этом.
9. A.Sytchev 15.06.15 10:56 Сейчас в теме
(8) Xershi, а как нужно? Если совсем абстрагироваться от деталей задачи, то мне сейчас просто нужно в таблице формы выделить строку, которая содержит нужное мне значение. Традиционное замечание, что в обычных формах это делается элементарно :). А вот как это сделать в управляемых?
10. deniseek77 86 15.06.15 11:03 Сейчас в теме
(9) A.Sytchev, В порядке бреда... Еще 1 колонка скрытая, с гуидом. Перед перезаполнением в переменную запоминаешь его. А после заполнения ищешь по нему. Далее позиционируешься.
12. A.Sytchev 15.06.15 11:39 Сейчас в теме
(10) deniseek77, нашел, запомнил. Перезаполнил список и снова нашел. Теперь как спозиционироваться?
Если после:
ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока = МассивПоИД[0].ПолучитьИдентификатор();

ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока = Неопределено?
11. Xershi 1508 15.06.15 11:08 Сейчас в теме
(9) A.Sytchev, у нас на обычных все так и работает как в (10).
2. PetroP 11.06.15 17:17 Сейчас в теме
3. A.Sytchev 11.06.15 17:44 Сейчас в теме
ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока = МассивПоИД[0].ПолучитьИдентификатор();


Тоже не работает. Я в печали.
4. A.Sytchev 15.06.15 09:42 Сейчас в теме
(3) A.Sytchev, подниму тему, так и не решил данную проблему
6. Xershi 1508 15.06.15 10:18 Сейчас в теме
Если у вас есть ИД строки, вы его запомнили, затем обновили список. Затем появляется некий МассивПоИД. Так вот в отладчике чему он равен?
И если он больше 0, то что содержит МассивПоИД[0]?

А далее добавляем после условия код
сообщить(ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока); 


И результат нам.
13. Xershi 1508 15.06.15 12:56 Сейчас в теме
У вас тип ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока совпадает с МассивПоИД[0].ПолучитьИдентификатор()?
14. A.Sytchev 15.06.15 13:09 Сейчас в теме
(13) Xershi, должнобыть число. Но после того, как я устанавливаю значение ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока оно остается Неопределено.
15. Xershi 1508 15.06.15 13:11 Сейчас в теме
(14) A.Sytchev, в отладчике посмотри до того как ты ему присвоишь и результат какой?
16. A.Sytchev 15.06.15 14:36 Сейчас в теме
(15) Xershi, до обновления списка в нем число. После обновления - Неопределено. После присвоения также Неопределено
17. spacecraft 15.06.15 14:42 Сейчас в теме
(16) A.Sytchev, не совсем так. На сервере там число, а на клиенте неопределено?
18. A.Sytchev 15.06.15 14:54 Сейчас в теме
(17) spacecraft, на клиенете, до перезагрузки списка:
Сообщить(ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока);

Выводит 4, например.

После перезагрузки списка до и после присвоения, выводит Неопределено.
Все, кроме загрузки списка происходит на клиенте.
19. A.Sytchev 15.06.15 15:09 Сейчас в теме
Кажется нащупал проблему. Если код:
ТекущийИД = "8b1876eb-a5c3-4d35-a0d6-5b495a6445c2";
	МассивПоИД = ДанныеСписка.НайтиСтроки(Новый Структура("ИдентификаторЗаписи", ТекущийИД));
	Если МассивПоИД.Количество() > 0 Тогда
		ЭтаФорма.Элементы.ДанныеСписка.ТекущаяСтрока = МассивПоИД[0].ПолучитьИдентификатор();
	КонецЕсли;



вынести в команду и руками ее запускать, то строка позиционируется просто чудесно. Получается, что несмотря на то, что список был обновлен на сервере, и в ДанныеСписка на клиенте уже есть новые записи, в ЭтаФорма.Элементы.ДанныеСписка этих записей еще как бы нет. Выходит так?) На всякий случай приведу текст ОбновитьДанныеСпискаНаСервере()

&НаСервере
Процедура ОбновитьДанныеСпискаНаСервере()
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = 
	"ВЫБРАТЬ
	|*,
	|	НЕДЕЛЯ(РегистрСведенийЖурналЗаявок.Дата) КАК НомерНедели
	|ИЗ
	|	РегистрСведений.ЖурналЗаявок КАК РегистрСведенийЖурналЗаявок
	|ГДЕ
	|	РегистрСведенийЖурналЗаявок.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

	
	Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));
	Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ДанныеСписка.Загрузить(РезультатЗапроса.Выгрузить());
	
КонецПроцедуры
Показать
20. A.Sytchev 15.06.15 15:50 Сейчас в теме
Изменил с
ДанныеСписка.Загрузить(РезультатЗапроса.Выгрузить());


на
ЗначениеВРеквизитФормы(РезультатЗапроса.Выгрузить(), "ДанныеСписка");


Теперь необходимая мне строка остается выделенной, но тем не менее, при окончании редактирования фокус смещается на первую строку. Получается что у меня выделено 2 строки нужная мне и первая, при том, что в ТаблицеФормы запрещен множественный выбор. Как быть? Как при окончании редактирования запретить автоматически изменять фокус на первую строку?
Второй день сижу над такой простой задачей, просто слов нет...
21. Xershi 1508 15.06.15 17:28 Сейчас в теме
(20) A.Sytchev, скорее всего в каком то месте идет переключение. Найдешь через отладчик. Включи отладку на сервере заодно, будет полегче искать.
A.Sytchev; +1 Ответить
22. starjevschik 15.06.15 18:09 Сейчас в теме
Я бы сформулировал ключ строки, запомнил его где-то в реквизитах например формы, потом нашел бы в таблице после перезаполнения.
Наверное ведь есть какой-то набор колонок таблицы, которые составляют уникальный ключ строки.
23. A.Sytchev 16.06.15 10:17 Сейчас в теме
(22) starjevschik, уникальный ключ есть. По нему нахожу нужную строку и позиционируюсь на ней. Она становится выделенной, однако при этом выделяется и первая строка (хотя множественный выбор отключен) Получается, что в списке выделено 2 строки, та которая нужна и первая. Как это побороть, пока не понятно.
24. zetrox 11.07.16 15:58 Сейчас в теме
Такая же проблема! Есть ТабличноеПоле с СпискомЗначений оно не обновляется. При обработке события "Выбор" есть переход на серверную процедуру, по возвращению с нее ТекущиеДанные теряются и фокус с нужной строки уходит на первую. Уже сломал голову что только не пробывал!

на точке останова "установить видимость"
элемент.ТекДанные неопределено, ТекущаяСтрока не определено. Только ВыбраннаяСтрока сохраняет номер. Но ничего с ним не сделать! номер больше кол-ва строк в таблице.

&НаКлиенте
Процедура СписокВыбораВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Объект.ТекID = Формат(Элемент.ТекущиеДанные.TYP_ID, "ЧГ=0");
	ПостроитьДеревоГруппНаСервере();
	УстановитьВидимость("СтраницаВыборГруппыОткрыть");
КонецПроцедуры

&НаСервере
Процедура ПостроитьДеревоГруппНаСервере() Экспорт
	ТекущийОбъект = ЭтотОбъект();
	ТекущийОбъект.ПостроитьДеревоГрупп();
	ЭтотОбъект(ТекущийОбъект);
КонецПроцедуры
Показать
25. sizeoff 17 07.06.23 16:12 Сейчас в теме
Если количество строк до перезаполнения и после однозначно совпадает, то можно так:

//запомним текущую строку
ИДТекущейСтрокиП = Элементы.ТЧ.ТекущаяСтрока;
Если ИДТекущейСтрокиП <> Неопределено Тогда
	ТекущНомерСтрокиП = ТЧ.НайтиПоИдентификатору(ИДТекущейСтрокиП).НомерСтроки;
Иначе
	ТекущНомерСтрокиП = Неопределено;
КонецЕсли;
	
ЗаполнитьТЧ();
	
//установим текущую строку
Если ТекущНомерСтрокиП <> Неопределено Тогда
	Элементы.ТЧ.ТекущаяСтрока = ТЧ[ТекущНомерСтрокиП-1].ПолучитьИдентификатор();
КонецЕсли;
Показать
26. user1826630 07.06.23 16:33 Сейчас в теме
(25) Ты реально веришь, что при перезаполнении ТЧ идентификаторы строк останутся прежними? Не номера, а именно идентификаторы?
И строки, конечно же будут отсортиорованы в том же порядке, что и до.

И вообще - выбрось лопату!!!
dandykry; +1 Ответить
27. user2009841 02.11.23 15:19 Сейчас в теме
ИндексТекущейСтроки = 0;
Если Элементы.ТЧ.ТекущаяСтрока <> Неопределено Тогда
    ИндексТекущейСтроки = ТЧ.Индекс(ТЧ.НайтиПоИдентификатору(Элементы.ТЧ.ТекущаяСтрока));
КонецЕсли;
    
ЗаполнитьТЧ();
    
Элементы.ТЧ.Обновить();
Если ИндексТекущейСтроки > 0 И ТЧ.Количество() > 1 Тогда
	Если ИндексТекущейСтроки + 1 >= ТЧ.Количество() Тогда
	    ИндексТекущейСтроки = ТЧ.Количество() - 1;
	КонецЕсли;
    Элементы.ТЧ.ТекущаяСтрока = ТЧ.Получить(ИндексТекущейСтроки).ПолучитьИдентификатор();
КонецЕсли;
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот