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



Помогите разобраться с циклом

Помогите разобраться с циклом
Я
   maptbln
 
15.05.18 - 11:17
Добрый день , вроде простая задача , но чего-то пробуквосываю
есть следующий цикл
    
    
            Для к = 0 по КоличествоСтрок-1 Цикл
            Для н = 1 по КоличествоСтрок-1 Цикл
                Если тпБюджетныеОперации[к][1] = тпБюджетныеОперации[н][1] и тпБюджетныеОперации[к][2] = тпБюджетныеОперации[н][2] тогда
                    Для е = 7 по 19 цикл 
                    тпБюджетныеОперации[к][е]= тпБюджетныеОперации[к][е] + тпБюджетныеОперации[н][е];
                КонецЦикла;
            КонецЕсли;
            КонецЦикла;
        КонецЦикла;

        

в нём по логике должно искаться соответствие на одновременное равенство значений в 2ух столбцах , и если они равны
то к значениям в первой строке (9-20 стоблец) должны прибавляться значения другой строки

но на деле данные ниже 2 строки просто задвояются,
не могу понять,где я тут накосячил
 
 
   Волшебник
 
1 - 15.05.18 - 11:21
Сотри всё и напиши с нуля. Используй таблицы значений и соответствия.
   фросия
 
2 - 15.05.18 - 11:24
(0) правильно писать "задваиваются"
   фросия
 
3 - 15.05.18 - 11:25
вложенные циклы по к и н дважды к одной строке обращаются.
   dezss
 
4 - 15.05.18 - 11:27
если я правильно протелепатировал, то тебе нужно
            Для н = 1 по КоличествоСтрок-1 Цикл
заменить на
            Для н = к по КоличествоСтрок-1 Цикл
   dezss
 
5 - 15.05.18 - 11:27
(4) поправка
            Для н = к+1 по КоличествоСтрок-1 Цикл
   maptbln
 
6 - 15.05.18 - 11:37
(2) виноват
(1) тпБюджетныеОперации и есть ТЗ , с соответствиями пока не работал (
(5) ты верно протелепатировал,спасибо
   maptbln
 
7 - 15.05.18 - 11:55
а как реализовать удаление строки ,после того как добавили её к изначальной
пробовал 
Для к = 0 по КоличествоСтрок-1 Цикл
            Для н = к+1 по КоличествоСтрок-1 Цикл
                Если тпБюджетныеОперации[к][1] = тпБюджетныеОперации[н][1] и тпБюджетныеОперации[к][2] = тпБюджетныеОперации[н][2] тогда
                    Для е = 7 по 19 цикл 
                    тпБюджетныеОперации[к][е]= тпБюджетныеОперации[к][е] + тпБюджетныеОперации[н][е];
                КонецЦикла;
                тпБюджетныеОперации.Удалить(н);
                КоличествоСтрок=КоличествоСтрок-1;
            КонецЕсли;
            КонецЦикла;
        КонецЦикла;

но ругается на индексы
   фросия
 
8 - 15.05.18 - 11:58
тпБюджетныеОперации.Удалить(н);
вот это что такое?
   DmitriyDI
 
9 - 15.05.18 - 12:01
(7) добавляй в массив,а затем удаляй в цикле:
МасиивУдаления = Новый Массив;
МассивУдаления.Добавить(тпБюджетныеОперации[н]);

А после цикла твоего:
Для Каждого Знч Из МасиивУдаления  Цикл
тпБюджетныеОперации.Удалить(Знч );
КонецЦикла;
   DmitriyDI
 
10 - 15.05.18 - 12:01
(9) МасиивУдаления = Новый Массив; естественно надо перед циклом тоже добавить
 
 Рекламное место пустует
   maptbln
 
11 - 15.05.18 - 12:22
(10) спасибо большое , всё отрабатывает
правда в конце ругается 
{Документ.ИС_ПакетБюджетныхОпераций.Форма.ФормаДокумента.Форма(2024)}: Ошибка при вызове метода контекста (Удалить)
тпБюджетныеОперации.Удалить(Знч);
по причине:
Значение индекса выходит за границы диапазона
   catena
 
12 - 15.05.18 - 12:30
(11)Уникальный персонаж, умудрился при обходе элементов массива вылететь из массива. Я даже представить не могу как.
   DmitriyDI
 
13 - 15.05.18 - 13:13
(11) убери из основного цикла  тпБюджетныеОперации.Удалить(н);
   maptbln
 
14 - 15.05.18 - 17:18
(13)
убрал предварительно
не в этом дело ,

а в 1с возможно обойти цикл с последнего к первому элементу?
   dezss
 
15 - 15.05.18 - 17:33
(14) можно
просто сделай обычный цикл с условием и уменьшай индекс в цикле...
   dezss
 
16 - 15.05.18 - 17:34
(15) предвосхищая вопрос "как")
н = Массив.Количество()-1;
Пока н > 0 Цикл
.....
    н = н - 1;
КонецЦикла
   dezss
 
17 - 15.05.18 - 17:35
(16) ах да...внутри цикла можешь использовать
Массив[н]
   maptbln
 
18 - 15.05.18 - 17:48
(17) благодарю!)
   maptbln
 
19 - 16.05.18 - 11:12
(16)
и всё таки не могу понять, как в данном случае заставить цикл удалять значения из ТЗ не просто по индексу , а по значениям строк из МассиваУдаления ,как в (9)
   ПегийЛунь
 
20 - 16.05.18 - 11:31
Вариант А.
1. Предварительно выбрать в отдельный массив элементы удовлетворяющий условиям.
2. В цикле для каждого элемента из выбранного массива удалять соответствующие строчки.
НаУдаление = Новый Массив();
Для Каждого Элем из тпБюджетныеОперации Цикл 
     Если ТутУсловиеОтбора Тогда 
          НаУдаление.Добавить(Элем); 
     КонецЕсли; 
КонецЦикла; 
Для Каждого ЭлемМассива из НаУдаление Цикл 
     тпБюджетныеОперации.Удалить(ЭлемМассива);
КонецЦикла;

Вариант Б. ("перевертыш") Рекомендовано в ЖКК
Удаление при обратном проходе самой ТЗ.
КолвоЭлементов = тпБюджетныеОперации.Количество(); 
Для ОбратныйИндекс = 1 По КолвоЭлементов Цикл 
     ЭлементКоллекции = Коллекция[КолвоЭлементов - ОбратныйИндекс]; 
     Если ТутУсловиеОтбора Тогда 
          тпБюджетныеОперации.Удалить(ЭлементКоллекции); 
     КонецЕсли; 
КонецЦикла;
   maptbln
 
21 - 16.05.18 - 11:45
(20)
записал в блокнот , буду хранить)
   ПегийЛунь
 
22 - 16.05.18 - 11:46
Дело в том, что при непосредственно удалении в прямом цикле  в ТЗ строки как бы сдвигаются занимая место удаленной (аналогично поведение массива в Java через remove и в php такое можно организовать через array_splice)


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