| 
    
        
     
     | 
    
  | 
Удаление из массива одинаковых строк | ☑ | ||
|---|---|---|---|---|
| 
    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
 
        ушки хорошие. большие.  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |