|
Индекс вне массива | ☑ | ||
---|---|---|---|---|
0
mayet
13.08.18
✎
14:15
|
Здравия вам господа! сегодня при написании внешней обработки столкнулся с проблемой, заставившей убедить себя в том, что я точно чайник...
В одной из функций потребовалось перебрать все реквизиты (в том числе и табчасти) выбранного документа, док может быть любым, так что возложил надежды по поставленной задаче на следующие строчки кода: Если Док[ТабЧасть.Имя].Количество() > 0 тогда имена = новый Массив(ТабЧасть.Реквизиты.Количество()); Сообщить(ТабЧасть.Реквизиты.Количество()); ит = 0; Для Каждого РеквизитТЧ Из ТабЧасть.Реквизиты Цикл ОЗ = ОЗ+ "/" + РеквизитТЧ + Символы.ПС; имена[ит] = РеквизитТЧ; //Сообщить("//" + ит); ит = ит+1; КонецЦикла; ат = 0; Для Каждого Строка из Док[ТабЧасть.Имя] Цикл Для Каждого Рек из Строка Цикл ОЗ = ОЗ + "\" + имена[ат] + "=" + Рек + Символы.ПС; Сообщить("" +ат+1 + "/" + имена.Количество() + "\" + имена[ат] + "=" + Рек + Символы.ПС); Если ат < ит тогда ат = ат + 1; КонецЕсли; КонецЦикла; ат = 0; КонецЦикла; Иначе Сообщить(Док[ТабЧасть.Имя].Количество()); КонецЕсли; Вроде бы все выглядит как рабочий код, но при запуске меня ждало разочарование в себе как в программисте: {ВнешняяОбработка.ПерегрузкаДокумента.Форма.Форма.Форма(116)}: Индекс находится за границами массива ОЗ = ОЗ + "\" + имена[ат] + "=" + Рек + Символы.ПС; Почесав немного голову, примерно догадался что итератор ат не обнуляется, помогите разобраться, что я делаю не так? |
|||
1
Fragster
гуру
13.08.18
✎
14:18
|
Если честно, выглядит как копрокод
|
|||
2
Cyberhawk
13.08.18
✎
14:18
|
"что я делаю не так?" // Даешь имена переменным
|
|||
3
1Сергей
13.08.18
✎
14:19
|
//ат = 0;
Для Каждого Строка из Док[ТабЧасть.Имя] Цикл ат = 0; Для Каждого Рек из Строка Цикл |
|||
4
Малыш Джон
13.08.18
✎
14:23
|
(0) >>что я делаю не так?
заводишь пустой массив, а потом пытаешь обратиться по индексу к несуществующим элементам |
|||
5
mayet
13.08.18
✎
14:24
|
1Сергей, так выглядеть стало лучше, так же принял во внимание примечания о не очень хорошем стиле кода, но к сожалению на проблему вышеупомянутые действия пока не повлияли
|
|||
6
1Сергей
13.08.18
✎
14:26
|
(5) Вообще не так это делается. Зачем Массив? Конечная задача какая?
|
|||
7
mayet
13.08.18
✎
14:31
|
Конечной задачей данной функции на данный момент является запись в ОЗ(строка) всех реквизитов документа и табчасти. Это пока не окончательное требование от данной функции, но реализовав это с остальным проблем не будет.
Вот что выводится в сообщениях при исполнении данного кода: 3 1/3\Документ аванса=1 2/3\Сумма=Расходный кассовый ордер ТДЦУ-000012 от 10.03.2014 15:28:19 3/3\Удалить заявка на расходование денежных средств=700 Почему-то массив имен берется не с 0 значения а с 1, возможно что-то с этим |
|||
8
Fedor-1971
13.08.18
✎
14:46
|
(0) Например, при ит = 5, ат = 4
После этого: Если ат < ит тогда ат = ат + 1; КонецЕсли; ат = 5, а такого индекса нет Что-то ты намудрил с алгоритмом. Придумай как перестроить оный |
|||
9
1Сергей
13.08.18
✎
15:03
|
(7) посмотри на это:
Если Док[ТабЧасть.Имя].Количество() > 0 тогда Сообщить(ТабЧасть.Реквизиты.Количество()); Для Каждого Строка из Док[ТабЧасть.Имя] Цикл НомерРеквизита = 0; Для Каждого Реквизит из ТабЧасть.Реквизиты Цикл НомерРеквизита = НомерРеквизита + 1; Сообщить("" + НомерРеквизита + "/" + ТабЧасть.Реквизиты.Количество() + "\" + Реквизит.Синоним + "=" + Строка[Реквизит.Имя] + Символы.ПС); КонецЦикла; КонецЦикла; Иначе Сообщить(Док[ТабЧасть.Имя].Количество()); КонецЕсли; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |