Имя: Пароль:
1C
 
Сравнение двух списков значений
0 DayDreamer
 
07.12.07
10:40
Каким образом быстрее всего определить существуют ли элементы двух списков значений, присутствующие в обоих списках?
1 Фокусник
 
07.12.07
10:50
(0) правильно... быстрее всего на мисте спросить (:
2 DayDreamer
 
07.12.07
13:28
up
3 France
 
07.12.07
13:29
для 8.1 - выкинуть в таблицу значений и запросом выбрать через внутреннее соединение..
4 DayDreamer
 
07.12.07
13:32
(3) а можно чуть более развернуто?
если можно с примером
5 France
 
07.12.07
13:46
из списка значений в массив
из массива в таблицу значений
таблицs значений через менеджер значений в запрос



PS писать код времени нет да и лениво..
6 Asmody
 
модератор
07.12.07
13:56
(5) охренеть быстрее :)
7 France
 
07.12.07
13:57
(6) таки ж, кода может и не мало))..
конечно же, проше перебирать один из СП и проверяет его наличие во втором))..
8 nop
 
07.12.07
13:58
(6) +1.
Почему бы не соединить таблицыЗначений и не сделать свернуть?
9 DayDreamer
 
07.12.07
14:03
(8) и что нам это даст?
10 nop
 
07.12.07
14:04
(9) где х = 2 Те элементы есть в обеих списках
11 nop
 
07.12.07
14:06
загоняешь списки в ТЗ.
В тз делаешь нову колонку х.
Для ТЗ1.х = 1
Для ТЗ2.х = 2
Сворациваешь по колонке Объект, х - суммировать.
Просматриваешь результат
Если х = 1 только в в ТЗ1, 2- только ТЗ2, 3 - и там и там.
12 France
 
07.12.07
14:31
(11) сам то пробовал?..
13 nop
 
07.12.07
14:35
(12) зачем?
14 France
 
07.12.07
14:40
(13) покаж, как "загоняеш списки в ТЗ" и что за тз1 и тз2?
15 nop
 
07.12.07
14:59
(14) ты хочь увидеть нечто необычно? Через массив. ТЗ1 - это данные 1го списка. ТЗ2 - 2го
16 France
 
07.12.07
15:05
а дальше?.. можно код глянуть?
17 nop
 
07.12.07
15:12
(16) ок. щас напишу
18 nop
 
07.12.07
15:30
(16)
Функция СписокВтЗ(список)
   мас = список.ВыгрузитьЗначения();
   тз = Новый ТаблицаЗначений();
   кол = тз.Колонки.Добавить("объект");
   тз.ЗагрузитьКолонку(мас, кол);
   тз.Колонки.Добавить("х", "Число");
   тз.ЗаполнитьЗначения(1, "х");
   ВОзврат тз;
КонецФункции

Процедура ПристегнутьКтаблице(табл, что)
   Если ТипЗнч(что) = "СписокЗначений" Тогда
       Для каждого х из что Цикл
           стр = табл.Добавить();
           стр.х = 2;
           стр.Объект = х.Значение;
       КонецЦикла;
   КонецЕсли;
КонецПроцедуры

тз1 = СписокВТЗ(список1);
ПристегнутьКтаблице(тз1, список2);
Свернуть("объект", "х");
19 France
 
07.12.07
15:48
сам то проверял?
и что будет,если передать список из 100 000 элементов?
20 nop
 
07.12.07
15:58
(19) покажи как ты ТЗ в запрос вставишь
21 tsr
 
07.12.07
16:14
А если ЗначениеВСтрокуВнутр , а затем сравнить строки?
22 France
 
07.12.07
16:38
(20)
Процедура  СоздатьВрТабл(пТабЗнач,пИмяВремТаблицы, знач пМенеджер) Экспорт
   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = пМенеджер;
   Попытка
       Запрос.Текст = "Уничтожить "+Строка(пИмяВремТаблицы);
       Запрос.Выполнить();
   Исключение
   КонецПопытки;
   Запрос.Текст = "ВЫБРАТЬ *
   |    ПОМЕСТИТЬ " + Строка(пИмяВремТаблицы)
   +
   " ИЗ &ВнешнийИсточник как ВнешнийИсточник"    ;
   Запрос.УстановитьПараметр("ВнешнийИсточник",пТабЗнач);                        
   Запрос.Выполнить();
КонецПроцедуры
23 nop
 
07.12.07
16:40
(22) согласен, это быстрее будет
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.