|
v8: Значение индекса выходит за границы диапазона | ☑ | ||
|---|---|---|---|---|
|
0
Exclusive
12.09.06
✎
11:25
|
Есть обработка, в ней код:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОприходованиеТоваровТовары.Ссылка, | ОприходованиеТоваровТовары.НомерСтроки, | ОприходованиеТоваровТовары.Номенклатура |ИЗ | Документ.ОприходованиеТоваров.Товары КАК ОприходованиеТоваровТовары |ГДЕ | ОприходованиеТоваровТовары.Номенклатура.Услуга = ИСТИНА "; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Попытка НачатьТранзакцию(); Пока Выборка.Следующий() Цикл ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект(); ДокументОбъект.Товары.Удалить(Выборка.НомерСтроки - 1); ДокументОбъект.Записать(); КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); Сообщить(ОписаниеОшибки()); КонецПопытки; Когда я запускаю обработку, выдает ошибку из и ничего не удаляет, но если эту же обрабботку пройти отладчиком, то никаких ошибок, все что надо удаляется. Если потом опять запустить обработку без отладчика - опять ошибка. Ошибка: {Обработка.Удаление.Форма.Форма(487)}: Ошибка при вызове метода контекста (Удалить): Значение индекса выходит за границы диапазона Это что глюк 1С или у меня? |
|||
|
1
ТелепатБот
гуру
12.09.06
✎
11:25
|
||||
|
2
Exclusive
12.09.06
✎
11:27
|
Круто, да не то!!!
|
|||
|
3
Exclusive
12.09.06
✎
11:43
|
Если сделать отдельной обработкой, то работает. В чем дело?
|
|||
|
4
asady
12.09.06
✎
11:48
|
(0) выгрузи в ТЗ и сверни по ссылке.
у тебя в выборке есть строки с ссылкой на один и тот же документ! |
|||
|
5
Exclusive
12.09.06
✎
12:12
|
(4)А как это сделать, и что значит свернуть по ссылке?
|
|||
|
6
Exclusive
12.09.06
✎
12:30
|
АП
|
|||
|
7
asady
12.09.06
✎
12:31
|
(5) где-то так (если догонишь смысл этого текста ... с тебя пиво):
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОприходованиеТоваровТовары.Ссылка, | ОприходованиеТоваровТовары.НомерСтроки, | ОприходованиеТоваровТовары.Номенклатура |ИЗ | Документ.ОприходованиеТоваров.Товары КАК ОприходованиеТоваровТовары |ГДЕ | ОприходованиеТоваровТовары.Номенклатура.Услуга = ИСТИНА |УПОРЯДОЧИТЬ ПО ОприходованиеТоваровТовары.НомерСтроки"; Результат = Запрос.Выполнить(); ТЗ=Результат.Выгрузить(); ТЗДок=Результат.Выгрузить(); ТЗДок.Свернуть("Ссылка"); Попытка НачатьТранзакцию(); Для каждой стр из ТЗДок Цикл Отбор=Новый Структура("Ссылка",стр.Ссылка); ДокументОбъект = стр.Ссылка.ПолучитьОбъект(); МассивСтрок=ТЗ.ВыбратьСтроки(Отбор); Для Сч=0 По МассивСтрок.ВГраница() Цикл тстр=МассивСтрок[Сч]; ДокументОбъект.Товары.Удалить(тстр.НомерСтроки - 1); КонецЦикла; ДокументОбъект.Записать(); КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); Сообщить(ОписаниеОшибки()); КонецПопытки; |
|||
|
8
asady
12.09.06
✎
12:33
|
(7)+ уточню....
|УПОРЯДОЧИТЬ ПО ОприходованиеТоваровТовары.НомерСтроки УБЫВ"; |
|||
|
9
Exclusive
12.09.06
✎
12:43
|
{Обработка.удаление.Форма.Форма(51,20)}: Ожидается символ '='
Для каждой <<?>>стр из ТЗДок Цикл |
|||
|
10
elisem
12.09.06
✎
12:50
|
(9) читай синтакс-помошник
|
|||
|
11
elisem
12.09.06
✎
12:51
|
тебе же даже раскрасили текст не правильно
Для КаждОГО стр из ТЗДок Цикл |
|||
|
12
Оселок
12.09.06
✎
12:55
|
если в выборку попадает несколько строк из одного документа, то при удалении любой вышестоящей строки уже невозможно получить по номеру нижестоящуюю строку.
поэтому из табличных частей строки удаляются "снизу" т.е. в запросе целесообразны Итоги по ссылке и, как уже указывали, обратное упорядочивание по номеру строки в самом запросе поставить ДЛЯ ИЗМЕНЕНИЯ |
|||
|
13
Exclusive
12.09.06
✎
13:06
|
{Обработка.удаление.Форма.Форма(26)}: Метод объекта не обнаружен (ВыбратьСтроки)
|
|||
|
14
Exclusive
12.09.06
✎
13:09
|
+ (13) Надо ВыбратьСтроку()
А вот что надо здесь: ошибка ВГраница() |
|||
|
15
Оселок
12.09.06
✎
13:11
|
(13) МассивСтрок=ТЗдок.НайтиСтроки(Отбор);
кто-нибудь из руководства знает, что ты корректируешь документы ? |
|||
|
16
Exclusive
12.09.06
✎
13:13
|
Метод объекта не обнаружен (ВГраница), почему?
|
|||
|
17
Exclusive
12.09.06
✎
13:19
|
(15)Не, скорее надо (14), т.к. если поставить НайтиСтроки(), тогда еще ощибка
{Обработка.удаление.Форма.Форма(29)}: Поле объекта не обнаружено (НомерСтроки) ДокументОбъект.Товары.Удалить(тстр.НомерСтроки - 1); |
|||
|
18
asady
12.09.06
✎
13:19
|
(16)
потому что смысл не понят. копипастишь просто и не думаешь совсем. пока не догонишь смысла того что делает этот код не работай на реальной базе, будет катастрофа. МассивСтрок=ТЗ.НайтиСтроки(Отбор); //именно ТЗ а не ТЗДок |
|||
|
19
Exclusive
12.09.06
✎
13:21
|
Так ведь я на демо базе, т.к. учусь
|
|||
|
20
Exclusive
12.09.06
✎
13:25
|
С горем пополам исправил:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОприходованиеТоваровТовары.Ссылка, | ОприходованиеТоваровТовары.НомерСтроки, | ОприходованиеТоваровТовары.Номенклатура |ИЗ | Документ.ОприходованиеТоваров.Товары КАК ОприходованиеТоваровТовары |ГДЕ | ОприходованиеТоваровТовары.Номенклатура.Услуга = ИСТИНА |УПОРЯДОЧИТЬ ПО ОприходованиеТоваровТовары.НомерСтроки"; Результат = Запрос.Выполнить(); ТЗ = Результат.Выгрузить(); ТЗДок = Результат.Выгрузить(); ТЗДок.Свернуть("Ссылка"); //Попытка // НачатьТранзакцию(); Для каждого стр из ТЗДок Цикл Отбор = Новый Структура("Ссылка",стр.Ссылка); ДокументОбъект = стр.Ссылка.ПолучитьОбъект(); МассивСтрок=ТЗ.НайтиСтроки(Отбор);//.ВыбратьСтроки(Отбор); Для Сч = 0 По МассивСтрок.ВГраница() Цикл тстр = МассивСтрок[Сч]; ДокументОбъект.Товары.Удалить(тстр.НомерСтроки - 1); КонецЦикла; ДокументОбъект.Записать(); КонецЦикла; // ЗафиксироватьТранзакцию(); //Исключение // ОтменитьТранзакцию(); // Сообщить(ОписаниеОшибки()); //КонецПопытки; Но результат тот же, что и при (0) {Обработка.удаление.Форма.Форма(29)}: Ошибка при вызове метода контекста (Удалить): Значение индекса выходит за границы диапазона ДокументОбъект.Товары.Удалить(тстр.НомерСтроки - 1); по причине: Значение индекса выходит за границы диапазона Так что разбираться в коде еще рано, т.к. непонятно что не работает? |
|||
|
21
asady
12.09.06
✎
13:27
|
(20)
какие номера увидишь? Сообщить("Номер строки к удалению ="+тстр.НомерСтроки); ДокументОбъект.Товары.Удалить(тстр.НомерСтроки - 1); |
|||
|
22
Exclusive
12.09.06
✎
13:49
|
0, 3, 13
|
|||
|
23
asady
12.09.06
✎
13:50
|
(22) если от 0 отнять 1 сколько будет?
|
|||
|
24
asady
12.09.06
✎
13:59
|
Отсюда вывод:
вместо ДокументОбъект.Товары.Удалить(тстр.НомерСтроки - 1); надо ДокументОбъект.Товары.Удалить(тстр.НомерСтроки ); |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |