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

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

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

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

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