Вход | Регистрация

1С:Предприятие ::

Метки: 

Индекс вне массива

Я
   mayet
 
13.08.18 - 14:15
Здравия вам господа! сегодня при написании внешней обработки столкнулся с проблемой, заставившей убедить себя в том, что я точно чайник...
В одной из функций потребовалось перебрать все реквизиты (в том числе и табчасти) выбранного документа, док может быть любым, так что возложил надежды по поставленной задаче на следующие строчки кода:

Если Док[ТабЧасть.Имя].Количество() > 0 тогда
            имена = новый Массив(ТабЧасть.Реквизиты.Количество());
            Сообщить(ТабЧасть.Реквизиты.Количество());
            ит = 0;
            Для Каждого РеквизитТЧ Из ТабЧасть.Реквизиты Цикл
                ОЗ = ОЗ+ "/" + РеквизитТЧ + Символы.ПС;
                имена[ит] = РеквизитТЧ;
                //Сообщить("//" + ит);

                ит = ит+1;
            КонецЦикла;
            
            ат = 0;
            Для Каждого Строка из Док[ТабЧасть.Имя] Цикл
                Для Каждого Рек из Строка Цикл
                    ОЗ = ОЗ + "\" + имена[ат] + "=" + Рек + Символы.ПС;                    
                    Сообщить("" +ат+1 + "/" + имена.Количество() + "\" + имена[ат] + "=" + Рек + Символы.ПС);
                    Если ат < ит тогда
                        ат = ат + 1;
                    КонецЕсли;
                КонецЦикла;
                ат = 0;
            
            КонецЦикла;

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

Вроде бы все выглядит как рабочий код, но при запуске меня ждало разочарование в себе как в программисте:

{ВнешняяОбработка.ПерегрузкаДокумента.Форма.Форма.Форма(116)}: Индекс находится за границами массива
                    ОЗ = ОЗ + "\" + имена[ат] + "=" + Рек + Символы.ПС;                    

Почесав немного голову, примерно догадался что итератор ат не обнуляется, помогите разобраться, что я делаю не так?
 
 
   Fragster
 
1 - 13.08.18 - 14:18
Если честно, выглядит как копрокод
   Cyberhawk
 
2 - 13.08.18 - 14:18
"что я делаю не так?" // Даешь имена переменным
   1Сергей
 
3 - 13.08.18 - 14:19
//ат = 0;

            Для Каждого Строка из Док[ТабЧасть.Имя] Цикл
                ат = 0;
                Для Каждого Рек из Строка Цикл
   Малыш Джон
 
4 - 13.08.18 - 14:23
(0) >>что я делаю не так?

заводишь пустой массив, а потом пытаешь обратиться по индексу к несуществующим элементам
   mayet
 
5 - 13.08.18 - 14:24
1Сергей, так выглядеть стало лучше, так же принял во внимание примечания о не очень хорошем стиле кода, но к сожалению на проблему вышеупомянутые действия пока не повлияли
   1Сергей
 
6 - 13.08.18 - 14:26
(5) Вообще не так это делается. Зачем Массив? Конечная задача какая?
   mayet
 
7 - 13.08.18 - 14:31
Конечной задачей данной функции на данный момент является запись в ОЗ(строка) всех реквизитов документа и табчасти. Это пока не окончательное требование от данной функции, но реализовав это с остальным проблем не будет.

Вот что выводится в сообщениях при исполнении данного кода:
3
1/3\Документ аванса=1
2/3\Сумма=Расходный кассовый ордер ТДЦУ-000012 от 10.03.2014 15:28:19
3/3\Удалить заявка на расходование денежных средств=700

Почему-то массив имен берется не с 0 значения а с 1, возможно что-то с этим
   Fedor-1971
 
8 - 13.08.18 - 14:46
(0) Например, при ит = 5, ат = 4
 После этого: 
  Если ат < ит тогда
     ат = ат + 1;
  КонецЕсли;

ат = 5, а такого индекса нет

Что-то ты намудрил с алгоритмом. 
Придумай как перестроить оный
   1Сергей
 
9 - 13.08.18 - 15:03
(7) посмотри на это:



        Если Док[ТабЧасть.Имя].Количество() > 0 тогда
            Сообщить(ТабЧасть.Реквизиты.Количество());
            
            Для Каждого Строка из Док[ТабЧасть.Имя] Цикл
                НомерРеквизита = 0;
                Для Каждого Реквизит из ТабЧасть.Реквизиты Цикл
                    НомерРеквизита = НомерРеквизита + 1;
                    Сообщить("" + НомерРеквизита + "/" + ТабЧасть.Реквизиты.Количество() + "\" + Реквизит.Синоним + "=" + Строка[Реквизит.Имя] + Символы.ПС);
                КонецЦикла;
            КонецЦикла;

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


Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует