Имя: Пароль:
1C
1С v8
Массивы в 1с
,
0 SkAt
 
15.05.18
11:58
Доброго времени суток! Есть массив: куча строк и в каждой по несколько значений. Как удалить повторяющиеся элементы?? Тут важный момент: полностью одинаковых строк точно нет (Массив.Найти() не подходит). Нужно проверить 2 значения в строке и если в другой строке такие же - удалить. Заранее спасибо.
1 фросия
 
15.05.18
11:59
перебрать. сравнить. повторяющиеся- удалить
2 VS-1976
 
15.05.18
12:00
(0) И чем же в строке разделяются значения?
3 VS-1976
 
15.05.18
12:01
(1) Значения могут стоять в разных местах. Скорее всего 1,2,3 должно быть = 2,1,3 и равно 3,1,2 и т.д.
4 Мандалай
 
15.05.18
12:05
Есть массив, а есть таблица значений.
С чем работаем в данном случае?
5 1Сергей
 
15.05.18
12:07
Каким образом в каждую строку массива запихивал много элементов?
6 MonteCarlo
 
15.05.18
12:07
Если массив строк, а строка это какие то значения разделенные знаком препинания, то можно наверное строки разложить в массив и сравнивать между собой элементы массива уже.
7 VS-1976
 
15.05.18
12:09
(6) В сравнении есть шанс на оптимизацию :)
8 bolobol
 
15.05.18
12:09
(4) В случае (0) - таблицы значений нет.
Массив.Найти() - скомпилировано.
Обход - нет, если объёмы не большие - моно и циклом в цикле циклично.
Но правильнее - подготовить данные для Массив.Найти(), хоть на этапе заполнения, хоть перед использованием.
9 SkAt
 
15.05.18
12:10
Пример

Массив[1]: Т=1, П=1
Массив[2]: Т=2, П=1
Массив[3]: Т=1, П=1
Массив[4]: Т=3, П=3
Массив[5]: Т=2, П=1
...

Удалить строки 5 и 3
10 bolobol
 
15.05.18
12:10
Держи:

Массив[1]: Т=1, П=1
Массив[3]: Т=1, П=1
Массив[4]: Т=3, П=3
11 VS-1976
 
15.05.18
12:11
(9) Это у тебя контрольная или что?
12 bolobol
 
15.05.18
12:12
Тьфу ты... Держи:

Массив[1]: Т=1, П=1
Массив[2]: Т=2, П=1
Массив[4]: Т=3, П=3
13 VS-1976
 
15.05.18
12:12
(9) А есть Массив[6]: Т=1, П=2 как должна поступать программа?
14 фросия
 
15.05.18
12:13
(9) почему 5 и 3,   а не 1 и 2?
15 1C programmer
 
15.05.18
12:14
Тут важный момент: полностью одинаковых строк точно нет

Разве 1 <> 3?
16 bolobol
 
15.05.18
12:15
(13) (14) Коллеги, ТС же не на допросе, чего за странная манера. Задача полностью описана в (0), НП-полная, не знаю, что означает, но решение - имеет
17 VS-1976
 
15.05.18
12:18
(16) Обычно пользователи сами не знаю что хотят
18 dezss
 
15.05.18
12:19
(12) кэп, мне нужен генератор случайных чисел)
(0) ответ в (8) можно только немного улучшить. Скопируй массив, подготовь данные во 2-м массиве, а удаляй элементы из обоих.
19 Ненавижу 1С
 
гуру
15.05.18
12:19
может у него массив структур?
20 фросия
 
15.05.18
12:20
(16) задача описана, решение имеет, пусть решает, мы тут причем?
21 SkAt
 
15.05.18
12:20
Ладно, объяснять я явно не умею. Нарисую массив:

|123|456|789|101|
|qwe|456|cxz|101|
|dfg|gfd|765|342|
|233|200|500|332|
|100|gfd|222|342|

Сравниваю значения во 2 и 4 столбце. Совпали строки (1и2) и (3и5). Удалить из массива строки 2 и 5 (можно 1 и 3)))
22 dezss
 
15.05.18
12:21
(21) в (8) ответ.
Подготовь данные, а потом удаляй. Можешь подготовить в таком же массиве, но в котором будут значения только из 2 и 4 столбца
23 фросия
 
15.05.18
12:22
а если 6-я строка \233\ууу\500\332\
её удалять?
24 bolobol
 
15.05.18
12:23
(17) Это запрос не от пользователя. Это программеру задачу поставили и он её решение спрашивает. Найдите тут хоть одну тему от пользователя с попыткой постановки задачи

(18) Я займусь этим вопросом - очень нестандартно, свежо! Я думаю, это может иметь успех!

(19) Без разницы - ответ всё равно в (8)

(20) Вы - не при чём, вопрос был к тем, кто может ответить, ящетаю (с)
25 фросия
 
15.05.18
12:23
все, перечитала условия вопрос снят
26 VS-1976
 
15.05.18
12:31
(21) Известно сколько в строке параметров? И почему значения в столбце 2 и 4. Или всё же различное количество значений в строке?
27 SkAt
 
15.05.18
12:37
(26) Значений в строке одинаковое. Массив - результат выгрузки запроса.
Проверяем значения в любых двух указанных столбцах. Только для примера 2 и 4.
28 dezss
 
15.05.18
12:41
(27) а покажи сам запрос
29 bolobol
 
15.05.18
12:42
(27) Тут либо слово -лишнее-, либо +пропущено+ "в любых двух -указанных- +кем-то+ столбцах"
30 bolobol
 
15.05.18
12:43
(28) Может, процесс выгрузки его данных в такую странную структуру, заодно?
31 SkAt
 
15.05.18
12:44
(28)
ВЫБРАТЬ
        |    ЗадачаИсполнителя.Ссылка КАК Ссылка,
        |    ЗадачаИсполнителя.ДатаНачала КАК НачалоСобытия,
        |    ЗадачаИсполнителя.СрокИсполнения КАК ОкончаниеСобытия,
        |    ЗадачаИсполнителя.Дата КАК Дата,
        |    ЗадачаИсполнителя.Автор КАК Ответственный,
        |    ЗадачаИсполнителя.БизнесПроцесс.Наименование КАК ТемаЗадания,
        |    ЗадачаИсполнителя.Предмет КАК Партнер,
        |    ЗадачаИсполнителя.БизнесПроцесс.РезультатВыполнения КАК Содержание
        |ИЗ
        |    Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
        |ГДЕ
        |    ЗадачаИсполнителя.Выполнена = ЛОЖЬ


Если в какой-то строке совпадают одновременно Партнер и ТемаЗадания - брать только одну строку.
32 dezss
 
15.05.18
12:44
(30) у меня ощущение, что в запросе делается конкатенация)))
33 dezss
 
15.05.18
12:45
(31) как тогда у тебя на выходе получается строка????
34 bolobol
 
15.05.18
12:46
(33) Вот, сразу с козырей, да?
35 bolobol
 
15.05.18
12:47
(31) Подкину:
- Как массив-то получился?
36 novichok79
 
15.05.18
12:47
В модуле общего назначения в БСП всегда есть много интересного
37 novichok79
 
15.05.18
12:47
// Удаляет повторяющиеся элементы массива.
//
Функция УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь) Экспорт
    
    ОписаниеТиповСправочники  = Справочники.ТипВсеСсылки();
    ОписаниеТиповДокументы    = Документы.ТипВсеСсылки();
    ОписаниеТиповПВХ          = ПланыВидовХарактеристик.ТипВсеСсылки();
    ОписаниеТиповПланыСчетов  = ПланыСчетов.ТипВсеСсылки();
    ОписаниеТиповПланыРасчета = ПланыВидовРасчета.ТипВсеСсылки();
    
    Если ТипЗнч(Массив) = Тип("Массив") Тогда
        
        УжеВМассиве            = Новый Соответствие;
        БылоНеопределено        = Ложь;
        КоличествоЭлементовВМассиве = Массив.Количество();
        
        Для ОбратныйИндекс = 1 По КоличествоЭлементовВМассиве Цикл
            
            ЭлементМассива = Массив[КоличествоЭлементовВМассиве - ОбратныйИндекс];
            ТипЭлемента    = ТипЗнч(ЭлементМассива);
            
            Если ЭлементМассива = Неопределено Тогда
                
                Если БылоНеопределено ИЛИ НеИспользоватьНеопределено Тогда
                    Массив.Удалить(КоличествоЭлементовВМассиве - ОбратныйИндекс);
                Иначе
                    БылоНеопределено = Истина;
                КонецЕсли;
                
                Продолжить;
                
            ИначеЕсли ОписаниеТиповСправочники.СодержитТип(ТипЭлемента)
             ИЛИ ОписаниеТиповДокументы.СодержитТип(ТипЭлемента)
             ИЛИ ОписаниеТиповПВХ.СодержитТип(ТипЭлемента)
             ИЛИ ОписаниеТиповПланыСчетов.СодержитТип(ТипЭлемента)
             ИЛИ ОписаниеТиповПланыРасчета.СодержитТип(ТипЭлемента) Тогда
                
                ИДЭлемента = Строка(ЭлементМассива.УникальныйИдентификатор());
                
            Иначе
                
                ИДЭлемента = ЭлементМассива;
                
            КонецЕсли;
            
            Если УжеВМассиве[ИДЭлемента] = Истина Тогда
                Массив.Удалить(КоличествоЭлементовВМассиве - ОбратныйИндекс);
            Иначе
                УжеВМассиве[ИДЭлемента] = Истина;
            КонецЕсли;
            
        КонецЦикла;      
        
    КонецЕсли;
    
    Возврат Массив;
    
КонецФункции
38 VS-1976
 
15.05.18
12:48
(34) Убедился что человеку нужно одно, а он решает задачу через задний проход. Ну и как тут вопросы не задавать?
39 dezss
 
15.05.18
12:49
(31) делай
Запрос.Выполнить.Выгрузить(), у тебя получится ТЗ и все сразу станет на места...
но я бы, все таки просто сделал группировку по этим 2-м полям в самом запросе. И раз тебе не важно, какие строки останутся, то берем максимум по ссылке, пихаем в ВТ, а потом эту ВТ еще раз соединяем с таблицей по ссылке и выбираем все остальные поля.
40 dezss
 
15.05.18
12:50
(34) крик души....я еще не очерствел до такой степени)))
41 bolobol
 
15.05.18
12:50
(38) Задача вполне конкретна. Через проход он её не решал, ибо само решение спрашивает.
Истоки задачи и источниками данных поинтересовались из-за того, что стало интересно и понеслась!
42 novichok79
 
15.05.18
12:59
а если так?

АхумилительныйМассив = Новый Массив;
АхумилительныйМассив.Добавить("1 2 2 2 3 33 33 44 4 4 4");
АхумилительныйМассив.Добавить("456 656 56 3 32 3 3 2 5 55 55 55");

Для ЯУмеюДелатьЦиклы = 0 По АхумилительныйМассив.Количество() - 1 Цикл
    
    АхумилительнаяСтрока = АхумилительныйМассив[ЯУмеюДелатьЦиклы];
    ВоБЛЯ = СтрРазделить(АхумилительнаяСтрока, " ", Ложь);
    УникальноеВоБЛЯ = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ВоБЛЯ);
    АхумилительныйМассив[ЯУмеюДелатьЦиклы] = СтрСоединить(УникальноеВоБЛЯ, " ");

КонецЦикла;
43 bolobol
 
15.05.18
13:21
(42) Это решение какой-то другой задачи... Удаление повторяющихся значений в каждой строке - это начало решения? Тогда - массив исходный попорчен, а так, наверное, нельзя
44 novichok79
 
15.05.18
13:51
(43) ладно, а вот так тогда?

АхумилительныйМассив = Новый Массив;
АхумилительныйМассив.Добавить("1 2 2 2 3 33 33 44 4 4 4");
АхумилительныйМассив.Добавить("456 656 56 3 32 3 3 2 5 55 55 55");

ВРотМнеНоги = Новый Массив;

Для ЯУмеюДелатьЦиклы = 0 По АхумилительныйМассив.Количество() - 1 Цикл
    
    АхумилительнаяСтрока = АхумилительныйМассив[ЯУмеюДелатьЦиклы];
    ВоБЛЯ = СтрРазделить(АхумилительнаяСтрока, " ", Ложь);
    УникальноеВоБЛЯ = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ВоБЛЯ);
    ВРотМнеНоги.Вставить(ЯУмеюДелатьЦиклы, СтрСоединить(УникальноеВоБЛЯ, " "));

КонецЦикла;
45 novichok79
 
15.05.18
13:52
(43) а не, соррян, это я невнимательно задание прочитал
46 Franchiser
 
гуру
15.05.18
14:38
ОбщегоНазначенияБПВызовСервера.УдалитьПовторяющиесяЭлементыМассива(ТвойМассив)
47 RKx
 
15.05.18
14:39
Запихать в запрос, и выбрать различные:)
48 dezss
 
15.05.18
15:03
(47) ты не поверишь...
он эти данные из запроса и получает))))