Имя: Пароль:
1C
 
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);

надо
ДокументОбъект.Товары.Удалить(тстр.НомерСтроки );
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой