Имя: Пароль:
1C
 
Индекс вне массива
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;
                    Сообщить("" + НомерРеквизита + "/" + ТабЧасть.Реквизиты.Количество() + "\" + Реквизит.Синоним + "=" + Строка[Реквизит.Имя] + Символы.ПС);
                КонецЦикла;
            КонецЦикла;

        Иначе
            Сообщить(Док[ТабЧасть.Имя].Количество());    
        КонецЕсли;