Внезапно обнаружил неприятный глюк.
Табличное поле строится с помощью поставщика данных "ПоставщикДанныхODBC.MSSQL" на основе справочника. В качестве ключевого поля установлен ID элемента справочника. Для сохранения текущей строки при обновлении табличного поля используется такой вот элементарный код:
//
текСтрока = ТабличноеПоле.ТекущаяСтрока;
ТабличноеПоле.ПоставщикДанных.Обновить(текСтрока);
Вроде все должно работать. Но сегодня обнаружил, что текущая строка прыгает после обновления. Натыкал вывод значения переменной "текСтрока" и свойства "ТабличноеПоле.ТекущаяСтрока" до и после вызова метода Обновить(). Получаю на некоторых строках вот такое:
до: ' 8W ' :: ' 8W '
после: ' 8C ' :: ' 8W '
Т.е. в текСтрока нормально помещается ID элемента, но после обновления текущая строка содержит совсем другой ID и строка, соответственно, устанавливается другая. Пробовал после обновления напрямую присваивать:
//
текСтрока = ТабличноеПоле.ТекущаяСтрока;
ТабличноеПоле.ПоставщикДанных.Обновить();
ТабличноеПоле.ТекущаяСтрока = текСтрока;
Глюк не ушел.
Но!
Если и в Обновить() передавать строку, и после присвоить напрямую:
//
текСтрока = ТабличноеПоле.ТекущаяСтрока;
ТабличноеПоле.ПоставщикДанных.Обновить(текСтрока);
ТабличноеПоле.ТекущаяСтрока = текСтрока;
Текущей становится нужная строка.
Вот что за на фиг?
А мы еще гнали на транспортный отдел, что это у них глюки или они мышкой дергают сильно...
Может Обновить() ещё не может найти новую строку и перепозиционирует ТекущаяСтрока() на предыдущую/первую/последнюю? Типа такого https://1cpp.ru/forum/YaBB.pl?num=1181142885/all
При Обновить() ТП вылетает достаточно стабильно, при Пречитать() не вылетает (или вылетает значительно реже), имхо.
Цитата: Харлампий Дымба от 19 марта 2025, 17:51Может Обновить() ещё не может найти новую строку и перепозиционирует ТекущаяСтрока() на предыдущую/первую/последнюю? Типа такого https://1cpp.ru/forum/YaBB.pl?num=1181142885/all
Изначально я не передавал в Обновить текущую строку. Когда добился воспроизводимости глюка, начал комбинировать разные способы установки.
Цитата: Djelf от 19 марта 2025, 19:02При Обновить() ТП вылетает достаточно стабильно, при Пречитать() не вылетает (или вылетает значительно реже), имхо.
Вот это странно. У меня много лет работает и никогда не вылетала.
Почему вместо всего этого не использовать ТабличноеПоле.ОбновитьСтроки() ?
Этот метод и обновляет строки и сохраняет текущую строку
Если ТП вылетает, то скорее всего не соблюдается уникальность ключа (или идполе)
Цитата: trad от 21 марта 2025, 10:51Почему вместо всего этого не использовать ТабличноеПоле.ОбновитьСтроки() ?
Этот метод и обновляет строки и сохраняет текущую строку
Исторически так сложилось. Насколько я помню, ОбновитьСтроки() не обновляло данные когда поставщик - запрос с параметрами. Но могу ошибаться.
upd. Вспомнил. Из-за того что ОбновитьСтроки() только перечитывает данные строк, но не обновляет выборку.
хм ???
почти везде применяю ОбновитьСтроки и если, допустим, в таблице появились новые строки, то они появляются в ТП
Цитата: trad от 21 марта 2025, 19:04хм ???
почти везде применяю ОбновитьСтроки и если, допустим, в таблице появились новые строки, то они появляются в ТП
Если источник таблица, то да. В этом случае и сам применяю этот метод. А вот если источник запрос, то у меня были именно описанные проблемы с обновлением состава выборки.
Может я чего и путаю, конечно. Попробую ещё потестить.