Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Массивы в 1с

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

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

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

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

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

Разве 1 <> 3?
   bolobol
 
16 - 15.05.18 - 12:15
(13) (14) Коллеги, ТС же не на допросе, чего за странная манера. Задача полностью описана в (0), НП-полная, не знаю, что означает, но решение - имеет
   VS-1976
 
17 - 15.05.18 - 12:18
(16) Обычно пользователи сами не знаю что хотят
   dezss
 
18 - 15.05.18 - 12:19
(12) кэп, мне нужен генератор случайных чисел)
(0) ответ в (8) можно только немного улучшить. Скопируй массив, подготовь данные во 2-м массиве, а удаляй элементы из обоих.
   Ненавижу 1С
 
19 - 15.05.18 - 12:19
может у него массив структур?
   фросия
 
20 - 15.05.18 - 12:20
(16) задача описана, решение имеет, пусть решает, мы тут причем?
   SkAt
 
21 - 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)))
   dezss
 
22 - 15.05.18 - 12:21
(21) в (8) ответ.
Подготовь данные, а потом удаляй. Можешь подготовить в таком же массиве, но в котором будут значения только из 2 и 4 столбца
   фросия
 
23 - 15.05.18 - 12:22
а если 6строка \233\ууу\500\332\
её удалять?
   bolobol
 
24 - 15.05.18 - 12:23
(17) Это запрос не от пользователя. Это программеру задачу поставили и он её решение спрашивает. Найдите тут хоть одну тему от пользователя с попыткой постановки задачи

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

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

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


Если в какой-то строке совпадают одновременно Партнер и ТемаЗадания - брать только одну строку.
   dezss
 
32 - 15.05.18 - 12:44
(30) у меня ощущение, что в запросе делается конкатенация)))
   dezss
 
33 - 15.05.18 - 12:45
(31) как тогда у тебя на выходе получается строка????
 
 
   bolobol
 
34 - 15.05.18 - 12:46
(33) Вот, сразу с козырей, да?
   bolobol
 
35 - 15.05.18 - 12:47
(31) Подкину:
- Как массив-то получился?
   novichok79
 
36 - 15.05.18 - 12:47
В модуле общего назначения в БСП всегда есть много интересного
   novichok79
 
37 - 15.05.18 - 12:47
// Удаляет повторяющиеся элементы массива.

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

КонецЦикла;
   bolobol
 
43 - 15.05.18 - 13:21
(42) Это решение какой-то другой задачи... Удаление повторяющихся значений в каждой строке - это начало решения? Тогда - массив исходный попорчен, а так, наверное, нельзя
   novichok79
 
44 - 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 Цикл 
    
    АхумилительнаяСтрока = АхумилительныйМассив[ЯУмеюДелатьЦиклы];
    ВоБЛЯ = СтрРазделить(АхумилительнаяСтрока, " ", Ложь);
    УникальноеВоБЛЯ = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ВоБЛЯ);
    ВРотМнеНоги.Вставить(ЯУмеюДелатьЦиклы, СтрСоединить(УникальноеВоБЛЯ, " "));

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует