Имя: Пароль:
1C
1С v8
Обход массива массивов
0 breezee
 
04.12.15
18:50
У меня есть массив. В ккаждом лементе массива слева и справа содержаться цифры мне нужно добавить в массив те элементы, у которых левые или правые цифры совпадают. Сделал алгоритм http://rghost.ru/86JyYBnyr
Может некорректно работать алгоритм?
Т.е. не потому что я его неправильно запрограммировал, а потому что неправильно составил.
1 breezee
 
04.12.15
18:52
Блин. тему не подправил. Она так плохо называется, потому что сначала хотел скинуть все что написал, потом решил что ошибка может быть в алгоритме, а написал я слишком много(особенно для вечеря пятницы)
2 breezee
 
04.12.15
19:03
Хотя, наверное, распишу. Уже создавал тему с пролблемой. Думал что решил - оказалось что нет.
У меня есть строка вида "КО_1,2;11,22+КО_3,3;11,22+КО_1,2;4,4+КО_5,5;55,55"
Эту строку я разбиваю в массив в котором содержаться стрктура. В этой струткуре содержится счет  МассивКООб[Тут мои счета]. Т.е. МассивКООб[0]=КО_1,2;11,22 У этого элемента массива Счета содержаться в значение структуры "СЧЕТ" Т.е.  МассивКООб[0].СЧЕТ = 1,2;11,22 А в этом счете содержаться еще 2 массива. В одном счета слева МассивКООб[0].СЧЕТ[0] = 1,2 и счета справа МассивКООб[0].СЧЕТ[1] = 11,22
И в этотом массиве еще 1 массив. Т.е. чтобы получить "1" из счета "КО_1,2;11,22" Мне нужно обратиться К МассивКООб[0].СЧЕТ[0][0]=1.
Из этой строки мне нужно найти все элементы самого верхнего массива МассивКООб[0] В котором одинаковы все элементы МассивКООб[к].СЧЕТ[0] или МассивКООб[кк].СЧЕТ[1].(к и ж - от 0 до конца количтва элементов главного массива МассивКООб[])
Т.е. в результате мне должно сказать что по кредиту у меня одинаковые счета
Одинаковые по кредиту КО_1,2;11,22+КО_1,2;4,4
Одинаковые по дебету КО_1,2;11,22+КО_3,3;11,22
Когда нахожу одинаковый счет - ставлю пометку "ПРОЙДЕН" и добавляю в массив. В отладке смотрю - странным образом добавляется только последний счет.
Вот код, может подскажете - где я мог ошибиться
    Для к = 0 По ОбщееКоличествоКОСчетов цикл //Обход всех КО
    Если НЕ МассивКООб[к].БЫЛПРОЙДЕН тогда    
        МассивСопавшихКт = Новый Массив;//Для каждого счета ищем полность совпавшие и добавляем в массив
        МассивСопавшихДт = Новый Массив;
        СтруктураСовпавших = Новый Структура("ДТ,КТ");
        ОписаниеВнешний = МассивКООб[к].ОПИСАНИЕ; //КО с Которым сравниваю
    
        МассивКООб[к].БЫЛПРОЙДЕН = истина;
        МассивСопавшихКт.Добавить(МассивКООб[к]);//Добавляю первый счет в любом случае
        Для кк = 0 По ОбщееКоличествоКОСчетов цикл   //Обход всех КО для еще раз для сравнения
            
            Если к <> кк и МассивКООб[к].СЧЕТ[0].Количество()= МассивКООб[кк].СЧЕТ[0].Количество() и МассивКООб[к].ЗНАК = МассивКООб[кк].ЗНАК и НЕ МассивКООб[кк].БЫЛПРОЙДЕН  Тогда //Если не разное количество счетов или тот же самый счет  
                ПолноеСовпадениеКредит = 0;
                
                Для ж = 0 По МассивКООб[к].СЧЕТ[0].Количество()-1 цикл //По счетам кредита верхнего КО                                      
                    
                    ЕстьСовпадениеДляОдногоСчета = Ложь;
                    Для жк = 0 По МассивКООб[кк].СЧЕТ[0].Количество()-1 цикл //По счетам кредита нижнего КО
                        Если  МассивКООб[к].СЧЕТ[0][ж] =  МассивКООб[кк].СЧЕТ[0][жк] тогда //Если счета не равны
                            ЕстьСовпадениеДляОдногоСчета = Истина;  //Если совпало хоть с одни
                        КонецЕсли;    
                    КонецЦикла;
                    
                    Если ЕстьСовпадениеДляОдногоСчета Тогда
                        ПолноеСовпадениеКредит = ПолноеСовпадениеКредит + 1;
                    КонецЕсли;

                    
                КонецЦикла;
                
                Если ПолноеСовпадениеКредит = МассивКООб[к].СЧЕТ[0].Количество() Тогда //Если есть полное совпадение
                    //МассивКООб[к].БЫЛПРОЙДЕН = истина;
                    МассивКООб[кк].БЫЛПРОЙДЕН = истина;
                    МассивСопавшихКт.Добавить(МассивКООб[кк]);//Добавляем в массив совпавших совпавший элемент
                КонецЕсли;
                
                ПолноеСовпадениеКредит = 0;
                
            КонецЕсли;
        КонецЦикла;
             СтруктураСовпавших.КТ = МассивСопавшихКт;
    ////////////////////////////////////////////////ДЕБЕТ////////////////////////////////////////////////////////////////    
        Для кк = 0 По ОбщееКоличествоКОСчетов цикл   //Обход всех КО для еще раз для сравнения
            
            Если к <> кк и МассивКООб[к].СЧЕТ[1].Количество()= МассивКООб[кк].СЧЕТ[1].Количество() и МассивКООб[к].ЗНАК = МассивКООб[кк].ЗНАК и НЕ МассивКООб[кк].БЫЛПРОЙДЕН  Тогда //Если не разное количество счетов или тот же самый счет  
                ПолноеСовпадениеКредит = 0;
                
                Для ж = 0 По МассивКООб[к].СЧЕТ[1].Количество()-1 цикл //По счетам кредита верхнего КО                                      
                    
                    ЕстьСовпадениеДляОдногоСчета = Ложь;
                    Для жк = 0 По МассивКООб[кк].СЧЕТ[1].Количество()-1 цикл //По счетам кредита нижнего КО
                        Если  МассивКООб[к].СЧЕТ[1][ж] =  МассивКООб[кк].СЧЕТ[1][жк] тогда //Если счета не равны
                            ЕстьСовпадениеДляОдногоСчета = Истина;  //Если совпало хоть с одни
                        КонецЕсли;    
                    КонецЦикла;
                    
                    Если ЕстьСовпадениеДляОдногоСчета Тогда
                        ПолноеСовпадениеКредит = ПолноеСовпадениеКредит + 1;
                    КонецЕсли;

                    
                КонецЦикла;
                
                Если ПолноеСовпадениеКредит = МассивКООб[к].СЧЕТ[1].Количество() Тогда //Если есть полное совпадение
                    //МассивКООб[к].БЫЛПРОЙДЕН = истина;
                    МассивКООб[кк].БЫЛПРОЙДЕН = истина;
                    МассивСопавшихДт.Добавить(МассивКООб[кк]);//Добавляем в массив совпавших совпавший элемент
                КонецЕсли;
                
                ПолноеСовпадениеКредит = 0;
                
            КонецЕсли;
        КонецЦикла;
             СтруктураСовпавших.ДТ = МассивСопавшихДт;

        
    КонецЕсли;    
    КонецЦикла;
3 Мэс33
 
04.12.15
19:03
(1) Ты пьян ))
Давайте завтра посмотрим )))
4 breezee
 
04.12.15
19:05
(3) Да не, я просто уставший как собака :D
5 фобка
 
04.12.15
19:05
(2) это жесть какая-то... Реально
6 Cyberhawk
 
04.12.15
19:06
Пилишь какой-нибудь конструктор проводок в режиме предприятия?
7 breezee
 
04.12.15
19:08
(6) Неа. Пишу написание запросов. У меня есть запросы к регистру бухглатерии вида КО_1,2;11,22+КО_3,3;11,22+КО_1,2;4,4+КО_5,5;55,55. И я хочу написать штуку,которая пишет запросы за меня. Вроде получается, вот только сейчас застрял.
8 Мэс33
 
04.12.15
19:09
(5) Мне тоже поплохело от строки вида "КО_1,2;11,22+КО_3,3;11,22+КО_1,2;4,4+КО_5,5;55,55"
9 фобка
 
04.12.15
19:09
"Т.е. МассивКООб[0]=КО_1,2;11,22 .... МассивКООб[0].СЧЕТ = 1,2;11,22" тут несходилово какое-то
10 фобка
 
04.12.15
19:10
А это структура типо
11 breezee
 
04.12.15
19:13
(9) Вот так это выглядт. Наглядность правда плоха. Может я что-то лишнее добавил(скорее всего)
http://rghost.ru/8JcvdHSd6
12 фобка
 
04.12.15
19:21
(11) надо переосмыслить..
Ты получил свой массив из строки
1) Делаешь тз с колонками: массив, дебет, кредит.
2) цикл по элементам массива, заполняешь колонки дебет/кредит и ссылку на массив второго уровня
3) побежали по тз, ищем совпадающие значения, пихаем значения поля массив из строки в результирующий массив или другую тз
13 breezee
 
04.12.15
19:26
(12) А потом в другой тз уже легче будет отсеить посторяющиеся. Вообще с тз работать легче. Еще завтра покапаюсь в том что написал(просто обидно, довольно долго это лепил) и если не получится - буду в тз обходить. Спасибо!
14 breezee
 
04.12.15
19:33
(12) Хотя подумал еще раз - у меня же почти тоже самое тз вышло
15 фобка
 
04.12.15
19:35
(14) ага, только структура сложная, циклов много, условий. Разбираться сложнее. В общем - утро вечера мудренЕЕ
16 breezee
 
04.12.15
19:38
(15) Еще раз спасибо. Я не знаю чего я так решил все в массив структур поместить. Кажется был неуверен что для элемента тз, если это массив удобно цикл делать.
17 Garykom
 
гуру
04.12.15
19:39
ТС сначала может объяснишь в "есть строка вида

"КО_1,2;11,22+КО_3,3;11,22+КО_1,2;4,4+КО_5,5;55,55""

что что и для чего? чтобы понятно было зачем?
18 Garykom
 
гуру
04.12.15
19:39
(17)+ просто у меня подозрение что задачка проще решается...
19 breezee
 
04.12.15
19:44
(17) Не думаю что проще КО_1,2;11,22 Это кредитовый оборот между счетами 1,2 и счетами 11,12(номера счетов конечно с потолка, для наглядности). В оборотах КО для совпавших счетов дебета или кредита, если они имеют одинаковый знак можно выбирать все счета в одном запросе, а не делать несколько. Вот мне и нужно получить все КО у которых по дебету или кредиту одинаковые счета. Блин. Пиши и понимаю что плохо объясняю. Действительно утро вечера мудренее.
20 фобка
 
04.12.15
19:45
(16) у тз есть возможность поиска по колонке - у массива нет (у тебя несколько уровней) - только обход в цикле..
(17) Можно взять сразу распарсить из строки в тз
Ид кол1 кол2 кол3 кол4
1      1       2     11        22
2      3       3     11        22
...
21 breezee
 
04.12.15
19:46
(20) Да, так точно будет проще. Еще раз спасибо большое!! Завтра переделаю
22 фобка
 
04.12.15
19:47
(21) незачто)