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