Имя: Пароль:
1C
1С v8
Как сравнить два массива с датами?
, ,
0 drago92
 
10.08.15
07:30
Есть 2 массива с датами, их надо сравнить между собой и вывести те даты которые не повторились.
1 1Сергей
 
10.08.15
07:31
самое простое, но не оптимальное: цикл в цикле
2 drago92
 
10.08.15
07:31
а если через таблицу значений
3 Альбатрос
 
10.08.15
07:32
Запросом
4 drago92
 
10.08.15
07:32
то тогда как в ее запихнуть оба массива, один без проблем получается, со вторым беда
5 magicSan
 
10.08.15
07:36
Запросом фигли там думать
6 1Сергей
 
10.08.15
07:38
(1) + хотя можно одним циклом с поиском в другом массиве
7 drago92
 
10.08.15
08:31
Для каждого Элемент ИЗ КолонкаМесяц Цикл
МассивСтрок.Найти(Элемент)
Если
а как дальше
8 el7cartel
 
10.08.15
08:35
(7) ну так посмотри что тебе возвращает функция МассивСтрок.Найти(Элемент), запоминай номер и значение!
9 DCKiller
 
10.08.15
08:35
1. Создаешь 2 таблицы значений
2. Выгружаешь каждый массив в свою ТЗ.
3. Делаешь запрос к обеим таблицам, помещаешь их в ВТ.
4. Потом в запросе формируешь внутренним соединением таблицу с повторяющимися датами.
5. В запросе формируешь финальную таблицу объединением из двух исходных, установив фильтр НЕ по таблице, создаваемой на предыдущем шаге.
6. PROFIT!!!!1111
10 Фокусник
 
10.08.15
08:43
(9) Чем это лучше такого:
1. Создаем одну ТЗ с колонками: Дата, Счетчик
2. Делаем два цикла заполнения этой ТЗ для каждого массива. По первому массиву в "Счетчик" помещаем +1, по второму -1
3. Сворачиваем эту ТЗ.Свернуть("Дата", "Счетчик").
4. Перебираем ТЗ, при этом можно сразу определить в каком массиве есть дата (+1 или -1, или 0 если в обоих).

Уточнение. Если заранее не известно, могут ли повторяться даты в массиве, то нужно предварительно сгруппировать:
ТЗ.Свернуть("Дата, Счетчик")
а потом уже сворачивать:
ТЗ.Свернуть("Дата", "Счетчик")

Разве запрос быстрее, проще? ;)
11 drago92
 
10.08.15
09:06
Для Индекс = 0 по МассивСтрок.ВГраница() Цикл
Ок = 0;
Для Индекс1 = 0 по КолонкаМесяц.ВГраница() Цикл
Если  МассивСтрок[Индекс]=КолонкаМесяц Тогда
Ок = 1;
КонецЕсли;
КонецЦикла;
//Сообщить(Ок);
Если Ок<>1 тогда
Сообщить("Нет Значения"+ МассивСтрок[Индекс]);
КонецЕсли;
   КонецЦикла;
я сделал вот так он работает
12 Альбатрос
 
10.08.15
09:17
(11) чот сомнительна...
13 drago92
 
10.08.15
09:29
она работает и выводит месяца каких нет в массиве
Как сделать, что одним циклом?
14 DCKiller
 
10.08.15
20:48
(10) Того, что ты написал - точно, и быстрее, и проще.
15 Armando
 
10.08.15
21:33
16 Фокусник
 
10.08.15
22:28
(14) хм, у меня и пунктов меньше и кода в итоге будет меньше ;)
17 Ildarovich
 
11.08.15
12:19
(11) Вариант "цикл в цикле" на больших массивах будет очень долго работать.
Вот вариант, свободный от этого недостатка:

/////////////
Функция ИсключающееИЛИ(Массив1, Массив2)
    
    Результат = Новый Массив;
    
    Повтор = Новый Соответствие;
    
    Для каждого Элемент Из Массив1 Цикл
        Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина)
    КонецЦикла;
    
    Для каждого Элемент Из Массив2 Цикл
        Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина)
    КонецЦикла;
    
    Для каждого Элемент Из Повтор Цикл
        Если НЕ Элемент.Значение Тогда
            Результат.Добавить(Элемент.Ключ)
        КонецЕсли
    КонецЦикла;
    
    Возврат Результат

КонецФункции

///////////

Тип данных в массивах может быть любым: не обязательно даты. Повторы в рамках одного массива также будут учтены.

Если ограничиться датами, то можно сократить один цикл:

//////////
Функция ИсключающееИЛИ(Массив1, Массив2)
    
    Результат = Новый Массив;
    
    Повтор = Новый Соответствие;
    
    Для каждого Элемент Из Массив1 Цикл
        Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина)
    КонецЦикла;
    
    Для каждого Элемент Из Массив2 Цикл
        Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина)
    КонецЦикла;
    
    Для каждого Элемент Из Повтор Цикл
        Если НЕ Элемент.Значение Тогда
            Результат.Добавить(Элемент.Ключ)
        КонецЕсли
    КонецЦикла;
    
    Возврат Результат

КонецФункции //
//////////
18 Ildarovich
 
11.08.15
12:21
+(17) Про соответствие, которое является основой решения, можно почитать здесь: http://catalog.mista.ru/public/79285/
19 Ildarovich
 
11.08.15
12:24
+(17) Поправка про "если ограничиться датами"(не тот код из буфера вставился). Верный код такой:

//////////////////
Функция ИсключающееИЛИ1(Массив1, Массив2)
    
    Результат = Новый Массив;
    
    Строка1 = ЗначениеВСтрокуВнутр(Массив1);
    Строка2 = ЗначениеВСтрокуВнутр(Массив2);
    
    Для каждого Элемент Из Массив1 Цикл
        Если НЕ Найти(Строка2, Формат(Элемент,"ДФ=ггггММддЧЧммсс")) Тогда
            Результат.Добавить(Элемент)
        КонецЕсли
    КонецЦикла;
    
    Для каждого Элемент Из Массив2 Цикл
        Если НЕ Найти(Строка1, Формат(Элемент,"ДФ=ггггММддЧЧммсс")) Тогда
            Результат.Добавить(Элемент)
        КонецЕсли
    КонецЦикла;
    
    Возврат Результат

КонецФункции
//////////////////
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой