Глюк текущей строки табличного поля 1С++

Автор АЛьФ, 19 марта 2025, 13:21

« назад - далее »

АЛьФ

Внезапно обнаружил неприятный глюк.
Табличное поле строится с помощью поставщика данных "ПоставщикДанныхODBC.MSSQL" на основе справочника. В качестве ключевого поля установлен ID элемента справочника. Для сохранения текущей строки при обновлении табличного поля используется такой вот элементарный код:
// текСтрока = ТабличноеПоле.ТекущаяСтрока; ТабличноеПоле.ПоставщикДанных.Обновить(текСтрока);
Вроде все должно работать. Но сегодня обнаружил, что текущая строка прыгает после обновления. Натыкал вывод значения переменной "текСтрока" и свойства "ТабличноеПоле.ТекущаяСтрока" до и после вызова метода Обновить(). Получаю на некоторых строках вот такое:
до: '    8W   ' :: '    8W   ' после: '    8C   ' :: '    8W   '
Т.е. в текСтрока нормально помещается ID элемента, но после обновления текущая строка содержит совсем другой ID и строка, соответственно, устанавливается другая. Пробовал после обновления напрямую присваивать:
// текСтрока = ТабличноеПоле.ТекущаяСтрока; ТабличноеПоле.ПоставщикДанных.Обновить(); ТабличноеПоле.ТекущаяСтрока = текСтрока;
Глюк не ушел.
Но!
Если и в Обновить() передавать строку, и после присвоить напрямую:
// текСтрока = ТабличноеПоле.ТекущаяСтрока; ТабличноеПоле.ПоставщикДанных.Обновить(текСтрока); ТабличноеПоле.ТекущаяСтрока = текСтрока;
Текущей становится нужная строка.

Вот что за на фиг?

АЛьФ

А мы еще гнали на транспортный отдел, что это у них глюки или они мышкой дергают сильно...

Харлампий Дымба

Может Обновить() ещё не может найти новую строку и перепозиционирует ТекущаяСтрока() на предыдущую/первую/последнюю? Типа такого https://1cpp.ru/forum/YaBB.pl?num=1181142885/all

Djelf

При Обновить() ТП вылетает достаточно стабильно, при Пречитать() не вылетает (или вылетает значительно реже), имхо.

АЛьФ

Цитата: Харлампий Дымба от 19 марта 2025, 17:51Может Обновить() ещё не может найти новую строку и перепозиционирует ТекущаяСтрока() на предыдущую/первую/последнюю? Типа такого https://1cpp.ru/forum/YaBB.pl?num=1181142885/all

Изначально я не передавал в Обновить текущую строку. Когда добился воспроизводимости глюка, начал комбинировать разные способы установки.

АЛьФ

Цитата: Djelf от 19 марта 2025, 19:02При Обновить() ТП вылетает достаточно стабильно, при Пречитать() не вылетает (или вылетает значительно реже), имхо.

Вот это странно. У меня много лет работает и никогда не вылетала.

trad

Почему вместо всего этого не использовать ТабличноеПоле.ОбновитьСтроки() ?
Этот метод и обновляет строки и сохраняет текущую строку

trad

Если ТП вылетает, то скорее всего не соблюдается уникальность ключа (или идполе)

АЛьФ

Цитата: trad от 21 марта 2025, 10:51Почему вместо всего этого не использовать ТабличноеПоле.ОбновитьСтроки() ?
Этот метод и обновляет строки и сохраняет текущую строку

Исторически так сложилось. Насколько я помню, ОбновитьСтроки() не обновляло данные когда поставщик - запрос с параметрами. Но могу ошибаться.
upd. Вспомнил. Из-за того что ОбновитьСтроки() только перечитывает данные строк, но не обновляет выборку.

trad

хм ???
почти везде применяю ОбновитьСтроки и если, допустим, в таблице появились новые строки, то они появляются в ТП

АЛьФ

Цитата: trad от 21 марта 2025, 19:04хм ???
почти везде применяю ОбновитьСтроки и если, допустим, в таблице появились новые строки, то они появляются в ТП

Если источник таблица, то да. В этом случае и сам применяю этот метод. А вот если источник запрос, то у меня были именно описанные проблемы с обновлением состава выборки.
Может я чего и путаю, конечно. Попробую ещё потестить.