ADirks писал(а) 19. Декабря 2007 :: 05:22: _т.ВыбратьСтроки("Кол1");
Пока _т.ПолучитьСтроку("Кол1") =1 Цикл
Сообщить(""+_т.НомерСтроки("Кол1")+": Кол1 = "+_т.Кол1);
_т.УдалитьСтроку(1);
Сообщить(""+_т.НомерСтроки("Кол1")+": Кол1 = "+_т.Кол1+", "+_т.Получить(_т.НомерСтроки("Кол1"), "Кол1"));
Прервать;
КонецЦикла;
КонецПроцедуры
Только выполни его обязательно, поведение итератора всё равно косячное.
О. Познавательно.
Без итераторов ситуация вырождается в такой вариант:
Сообщить("Номер строки: " +_т.НомерСтроки +", значение: " +_т.Кол1);
_т.НомерСтроки =1;
Сообщить("Номер строки: " +_т.НомерСтроки +", значение: " +_т.Кол1);
_т.УдалитьСтроку(1);
Сообщить("Номер строки: " +_т.НомерСтроки +", значение: " +_т.Кол1);
Смысл в том, что текущая строка удалена, но ссылка в pCurrentRow остается.
Ну, здесь, конечно, решается легко, если я правильно понимаю.
Цитата:Отработка выражений типа _т.Кол1 в текущей реализации ИТ врядли возможно, т.к. индексов может быть много. Вот с выделенными итераторами это можно легко сделать.
Вот здесь чего-то мной не догоняется.
_т.Кол1 - это же уже не проблема итератора - это проблема зависшей ссылки на текущую строку (глобальную).
Или нет?
Цитата:По идее, если в дереве происходят какие-то изменения в процессе итерации, надо брать ключ, и искать строку по условию >=, учитывая при этом что индексы бывают неуникальными. Сейчас же просто делается Next(), и как будто бы все счастливы... а счастья то как раз и нету...
Леша, я вот к чему пока пришел.
Надо разделить 2 состояния индекса: состояние итерирования и состояние обновления.
Я бы предложил вообще при переходе в состояние обновления инвалидировать все итераторы по данному индексу.
Т.е. изменили индекс - нет проблем, но все итераторы будьте любезны найти заново (по ключам, или еще как - не важно).
Особенно это актуально как раз для отвязанных итераторов, где "щас прибью" сделать проблематичнее
В качестве реализации я подумываю просто сделать поле "версии" индекса, инкрементируемое при любых операциях с индексом.
Итератор ссылается на индекс, с учетом поля "версии".
Как только версия итератора перестает соответствовать версии индекса, он инвалидируется.
Как такая схема? Ничего я не забыл?