Имя: Пароль:
1C
1С v8
Удаление из массива одинаковых строк
0 Garnet27
 
28.12.15
09:59
Добрый день! Подскажите, пожалуйста. Есть массив строк ТЗ, из которого надо удалить одинаковые. В дальнейшем эти строки нужно будет удалить из самой ТЗ, так что повторов в массиве быть не должно. Когда сворачиваю, перегрузив в новую тз, и возвращаю обратно в массив, строками старой ТЗ он их уже не признает. Очень жду ответа, спасибо.
1 aka AMIGO
 
28.12.15
10:09
Я-б свернутую не возвращал в ТЗ. В цикле просмотрел в свертке задвоенные, а уж найти строку с первым задвоенным и удалить её уже из ТЗ - несложно.
ИМХО.
2 НЕА123
 
28.12.15
10:09
Хитро.
Что надо?
3 ДемонМаксвелла
 
28.12.15
10:10
(0) отсортировать ТЗ или массив по тем реквизитам, набор которых должен быть уникальным, затем сравнивать соседние строки
4 salvator
 
28.12.15
10:11
В БП есть готовая функция УдалитьПовторяющиесяЭлементыМассива
5 Garnet27
 
28.12.15
10:12
(1) Свернутую не возвращать в ТЗ? Я ее возвращаю в массив. Поясните подробнее, если можно
6 RomaH
 
naïve
28.12.15
10:13
надо уходить от "Свернуть()"
НайтиСтроки - наше все
7 Garnet27
 
28.12.15
10:14
(4) Это где именно? У нас нестандартная конфа
8 Garnet27
 
28.12.15
10:16
(2) Надо удалить строки из ТЗ, которые грузим в массив. Но дело в том, что есть повторяющиеся, соответственно, ругается при удалении.такие дела...
9 Фрэнки
 
28.12.15
10:16
(7) в любой Бухгалтерии предприятия в конфиге поиском посмотри
10 Garnet27
 
28.12.15
10:17
(6) Найти Строки - это надо задавать конкретные условия нахождения, а они каждый раз разные. Как угадаешь?
11 ДемонМаксвелла
 
28.12.15
10:17
(8) тогда вообще не так

Определить массив строк, которые нужно удалить, и удалить их
12 salvator
 
28.12.15
10:17
(7) Общий модуль "ОбщегоНазначения".
13 Фрэнки
 
28.12.15
10:18
//Удаляет повторяющиеся элементы массива.
Функция УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь) Экспорт
    
    ОписаниеТиповСправочники  = Справочники.ТипВсеСсылки();
    ОписаниеТиповДокументы    = Документы.ТипВсеСсылки();
    ОписаниеТиповПВХ          = ПланыВидовХарактеристик.ТипВсеСсылки();
    ОписаниеТиповПланыСчетов  = ПланыСчетов.ТипВсеСсылки();
    ОписаниеТиповПланыРасчета = ПланыВидовРасчета.ТипВсеСсылки();
    
    Если ТипЗнч(Массив) = Тип("Массив") Тогда
14 aka AMIGO
 
28.12.15
10:18
тогда вот:
//Удаляет повторяющиеся элементы массива.
Функция УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь) Экспорт
    
    ОписаниеТиповСправочники  = Справочники.ТипВсеСсылки();
    ОписаниеТиповДокументы    = Документы.ТипВсеСсылки();
    ОписаниеТиповПВХ          = ПланыВидовХарактеристик.ТипВсеСсылки();
    ОписаниеТиповПланыСчетов  = ПланыСчетов.ТипВсеСсылки();
    ОписаниеТиповПланыРасчета = ПланыВидовРасчета.ТипВсеСсылки();
    
    Если ТипЗнч(Массив) = Тип("Массив") Тогда
        
        УжеВМассиве = Новый Соответствие;
        БылоНеопределено = Ложь;
        
        КолвоЭлементовВМассиве = Массив.Количество();
        
        Для ОбратныйИндекс = 1 По КолвоЭлементовВМассиве Цикл
            ЭлементМассива = Массив[КолвоЭлементовВМассиве - ОбратныйИндекс];
            ТипЭлемента = ТипЗнч(ЭлементМассива);
            Если ЭлементМассива = Неопределено Тогда
                Если БылоНеопределено или НеИспользоватьНеопределено Тогда
                    Массив.Удалить(КолвоЭлементовВМассиве - ОбратныйИндекс);
                Иначе
                    БылоНеопределено = Истина;
                КонецЕсли;
                Продолжить;
            ИначеЕсли ОписаниеТиповСправочники.СодержитТип(ТипЭлемента)
                ИЛИ ОписаниеТиповДокументы.СодержитТип(ТипЭлемента)
                ИЛИ ОписаниеТиповПВХ.СодержитТип(ТипЭлемента)
                ИЛИ ОписаниеТиповПланыСчетов.СодержитТип(ТипЭлемента)
                ИЛИ ОписаниеТиповПланыРасчета.СодержитТип(ТипЭлемента) Тогда
                
                ИДЭлемента = Строка(ЭлементМассива.УникальныйИдентификатор());
                
            Иначе
                
                ИДЭлемента = ЭлементМассива;
                
            КонецЕсли;
            
            Если УжеВМассиве[ИДЭлемента] = Истина Тогда
                Массив.Удалить(КолвоЭлементовВМассиве - ОбратныйИндекс);
            Иначе
                УжеВМассиве[ИДЭлемента] = Истина;
            КонецЕсли;
        КонецЦикла;      
        
    КонецЕсли;
    
    Возврат Массив;
    
КонецФункции
15 Фрэнки
 
28.12.15
10:22
только я сильно сомневаюсь, что эта функция сработает так, как нужно для строк ТЗ. Массив строк ТЗ это не тоже самое, что указано в качестве типов в коде функции, который дан в (14)
16 Wern
 
28.12.15
10:22
тз.Колонки.Добавить("Номер")
Для Ном=1 По тз.Количество() Цикл
  тз[Ном-1].Номер=Ном
КонецЦикла;
Для Каждого Строка Из МассивТЗ Цикл
  Строка.Номер=0;
КонецЦикла
тз.Свернуть(СписокНужныхКолонок+",Номер");
тз.Колонки.Удалить("Номер");
17 aka AMIGO
 
28.12.15
10:23
(15) Однозначно.
18 Garnet27
 
28.12.15
10:34
Ой, все получилоооось!!!!!! Сейчас покажу, как.
1. Сортируем "пузырьком". Поскольку наш массив - это строки ТЗ, то сравниваем по нужному элементу (в нашем случае - это колонка [6]):
     Для i = 0 По МассивКУдалениюОбщих.ВГраница() Цикл
        Для j = 0 ПО МассивКУдалениюОбщих.Вграница() - i - 1 Цикл
            Если МассивКУдалениюОбщих[j][6] > МассивКУдалениюОбщих[j + 1][6] Тогда
                Замена = МассивКУдалениюОбщих[j][6];
                МассивКУдалениюОбщих[j][6] = МассивКУдалениюОбщих[j + 1][6];
                МассивКУдалениюОбщих[j + 1][6] = Замена;
            КонецЕсли;            
        КонецЦикла;        
    КонецЦикла;    

2. И Далее удаляем ставшие рядышком:

    Для Каждого Строка Из МассивКУдалениюОбщих Цикл
        ТекущийИндекс = 0;
        ВсегоЭлементов = МассивКУдалениюОбщих.Количество();
        Пока ТекущийИндекс < ВсегоЭлементов Цикл
            Индекс2 = ТекущийИндекс + 1;
            Пока Индекс2 < ВсегоЭлементов Цикл
                Если МассивКУдалениюОбщих[Индекс2] = МассивКУдалениюОбщих[ТекущийИндекс] Тогда
                    МассивКУдалениюОбщих.Удалить(Индекс2);
                    ВсегоЭлементов = ВсегоЭлементов - 1;
                Иначе
                    Индекс2 = Индекс2 + 1;
                КонецЕсли;
            КонецЦикла;
            ТекущийИндекс = ТекущийИндекс + 1;
        КонецЦикла;
19 НЕА123
 
28.12.15
10:43
ТЗУдаляемых = Новый ТаблицаЗначений;
ТЗУдаляемых.Колонки.Добавить("УдаляемаяСтрока");
ТЗУдаляемых.ЗагрузитьКолонку(МассивУдаляемыхСтрок,"УдаляемаяСтрока");
ТЗУдаляемых.Свернуть("УдаляемаяСтрока");

Для каждого стр из ТЗУдаляемых Цикл
     ТЗОткудаУдалить.Удалить(Стр.УдаляемаяСтрока);
КонецЦикла;
20 НЕА123
 
28.12.15
10:44
OFF
ушки хорошие. большие.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой