Имя: Пароль:
1C
1С v8
Есть ли какой быстрый способ получить разностную таблицу/список значений ?
0 smaharbA
 
27.10.13
11:02
Есть две ТЗ с одинаковой структурой - как быстрее всего получить различающиеся строки, и небольшое дополнение нужно получить отличающиеся строки только из второй таблицы.
1 smaharbA
 
27.10.13
11:03
+ метод желательно универсальный для ТЗ и СЗ, для упрощения в ТЗ такие колонки "Значение" и "Представление"
2 zak555
 
27.10.13
11:11
выбрать различные
3 smaharbA
 
27.10.13
12:19
(2) таблица/список могут быть невелики, запрос будет дольше чем перебор
4 XLife
 
27.10.13
12:47
(3) и в чем тогда вопрос? делай перебором...
5 smaharbA
 
27.10.13
13:41
(4) вопрос в ТЗ2 && ТЗ1
6 mistеr
 
27.10.13
15:15
(0) В смысле, строки из второй, которых нет в первой?

Первую индексируем по Значение, затем цикл по второй.
7 Нуф-Нуф
 
27.10.13
15:16
(27) полное соединение по всем полям. если таблицы динамические - собираешь запрос в цикле
8 smaharbA
 
27.10.13
15:31
Таблицы мелкие, не более 100 строк, а чаще до 10, но их бесконечное множество
9 mistеr
 
27.10.13
16:01
Другой метод - Слить две таблицы в одну с доп. колонкой "1", затем свернуть.
10 aspirator23
 
27.10.13
16:33
спроси vde69, у него есть алгоритм. Пользуюсь им уж лет пять.
быстрый.
11 Torquader
 
27.10.13
23:38
Если таблицы неупорядоченные - то только созданием копии и вычёркиванием (особенно, если попадаются полные дубли).
Реально делается так:
Выбираем таблицу с меньшим числом строк и копируем один в один.
Далее, перебираем таблицу с большим числом строк и ищем соответствие в копии - если есть, то удаляем найденную строку из неё. Если не нашли - то запоминаем строку различия (в отдельную четвёртую таблицу).
В конце получаем в таблицы-копии те строки, которые есть только в меньшей таблице, а в четвёртой таблице - те строки, которые есть только в большей.
P.S. у меня по подобному принципу работает алгоритм отслеживания изменений в документах.
12 Torquader
 
27.10.13
23:41
Если таблицы можно упорядочить - то пробежаться ленточным сравнением - начинаем сверху и идём до низу, выбирая и сравнивая строки.
Так как строки упорядочены, то для каждой строки задано сравнение - если в какой-то таблице обнаруживается строка, которая "выше" строки в другой - то она только в этой таблице - на следующий шаг сдвигаемся только по ней. Если строки одинаковые, то сдвигаемся по обеим таблицам.
13 smaharbA
 
28.10.13
07:58
(11)(12) единовременно сравниваются только 2 таблицы и результат нужен только от них.
Сравнение идет прошлой таблицы с текущей и так бесконечно, т.е. на всем протяжении работы с программой.
14 mistеr
 
28.10.13
10:53
(13) >и так бесконечно

Пахнет кривым дизайном.
15 smaharbA
 
28.10.13
21:53
(14) предложите лучше
16 Fragster
 
модератор
28.10.13
21:55
запрос, затем поле +1 и -1, объединение, сворачивание, отбор
или сразу отбор "не в"
17 smaharbA
 
28.10.13
22:08
(16) возвращаюсь к техническим данным - что быстрее запрос или перебор на 10-и строках и 2-х колонках ?

Нужен простой и быстрый метод, самое реальное свернуть, но свернуть ну оочень не быстрый и не легкий.
18 фобка
 
28.10.13
22:12
имхо запрос быстрее (надо тестить), но перебор проще написать (найти строки)
19 Classic
 
28.10.13
22:13
(13)
Массивы отсортированы?
20 smaharbA
 
28.10.13
22:14
(18) т.е. создание+уничтожение временной таблицы быстрее ?
21 фобка
 
28.10.13
22:14
+18 на 10 строках всё одинаково быстрое, если это не обновление таблиц на форме
22 Classic
 
28.10.13
22:15
(18)
Для неиндексированных таблиц спорное заявление
23 smaharbA
 
28.10.13
22:18
(19) нет, и время на сортировку жалко тратить, хотя конечно, если выигрыш во времени (и не мало важно ресурсов) на разбор отсортированных покроет расходы на сортировку, то можно и сортировать.

Для ускорения и снижения ресурсоемкости, таблицы даже были заменены на списки значений, но таблицы предпочтительнее (в СЗ теряю непомешавшую бы информацию)
24 Classic
 
28.10.13
22:20
(23)
Сортировка двух не покроет. Но за счет того, что отсортированная таблица сверяется в среднем два раза - хз.
Неотсортированные массивы - это все равно в худшем случае полный перебор. Пофиг каким методом ты будешь их перебирать.
25 smaharbA
 
28.10.13
22:21
Подумывал вообще о соответствии вместо тз или сз, тем более, что по сути "ключ" исходно уникален для каждой таблицы.
Таблицы - это список мди-окон - хендл и заголовок.
26 smaharbA
 
28.10.13
22:23
(24) понятно, что в конечном итоге перебор, но может быстрее реализован "внутре", чем когда прописан в коде 1с.
27 Classic
 
28.10.13
22:23
(25)
А какая разница - соответствие или ТЗ. У тебя ж явно вопрос не в простоте реализации стоит.
ИМХО стоит подумать о том, чтоб сравнивать на этапе формирования текущей ТЗ. Все равно обходишь данные пока пишешь в ТЗ
28 Classic
 
28.10.13
22:28
Откуда ТЗ получаешь?
29 mistеr
 
28.10.13
23:14
(15) Я не знаю задачи.

(17) Свернуть на 10 строках должно быть быстро.
30 smaharbA
 
29.10.13
07:37
(27) вариант, пусть и несколько снизит универсальность.
31 smaharbA
 
29.10.13
07:39
(29) оно быстро конечно когда разово.
(28) рекурсивно получаю дочерние окна главного окна, правдо с некоторым "фильтром" - интерес составляют только с текстом заголовка, с пустым не нужны.
32 1dvd
 
29.10.13
07:45
+1 к свернуть
33 1dvd
 
29.10.13
07:48
(32) в одной ТЗ спецколонку заполнить единицами, во второй - нулями. Объединить, свернуть. НайтиСтроки где спецколонка = 0
34 smaharbA
 
29.10.13
07:52
(33) это известно, спасибо. Конечно померяю, но сомнения, что быстрее и менее ресурсоемко перебора будет на малых тз.
35 smaharbA
 
29.10.13
07:53
+ да и объединить тз в восьмерке не такая уж быстрая операция.
36 1dvd
 
29.10.13
07:53
(33) + при условии, что нет дублей
37 mistеr
 
29.10.13
11:11
(31) И зачем тут сабж? одного стека (массива) не достаточно?
38 Поросенок Петр
 
29.10.13
11:47
И где вы вечно столько таблиц значений берете... Семерешкой попахивает.
39 Ёпрст
 
29.10.13
11:52
(0) штатно, новая Колонка + заполнить 1/-1 объединить ТЗ через Заполнить и свернуть.
усё.
40 Питерский_
Никола
 
29.10.13
11:52
Хм... ТС какую-то вирусятину пишет ??? Скоро на всех 1С-ах страны "Для формирования ОСВ пришлите смс на номер бла-бла-бла )))"
41 Ёпрст
 
29.10.13
11:53
Ну или ИТЗ использовать, там есть разность
42 smaharbA
 
29.10.13
14:40
(39) как в восьмерке объединить через заполнить ?
43 Ёпрст
 
29.10.13
15:35
(42) ты предупреждай, что  в снеговике хоть :(
там проще запросом всё лепить
44 badboychik
 
29.10.13
15:41
хорошо писать на T-SQL, там можно сделать

SELECT ...
EXCEPT
SELECT ...
45 Torquader
 
02.11.13
11:57
Если пара HANLE-TITLE, то, скорей всего, HANDLE уникальный.
Потом, по HANDLE имеет смысл сортировать, так как это число - и должно работать быстро, а строки уже потом можно сравнивать.
Как вариант, объединить два параметра в одну строку и уже по ней сортировать таблицы (заранее), чтобы сравнение шло быстрее.

Не забываем, что добавить строку в отсортированную таблицу проще, чем каждый раз её сортировать.

Конечно, оптимальнее по производительности будут "деревья", но с ними нужно правильно работать, а это писать дольше.
46 kiruha
 
02.11.13
12:29
(0)
1)2-я таблица индексируется по всем полям.
2)Новая колонка - отметка
3)Создается структура со свойствами соотв колонкам
4) Для каждой строчки первой таблицы заполняется структура (заполнить значения свойств)
5) По структуре ищутся строки во второй таблице
6) Во всех найденных ставится пометка
7) Все строки без пометок 2 таблицы - искомые

Сложность алгоритма 2n, т.е. 2 прохода
47 Torquader
 
02.11.13
14:16
А вообще, я так понимаю, нужно получить тех, кто родился после последнего прохода - у меня была подобная задача с файлами - решение очевидно, нужно при добавлении в таблицу ставить единицу, а при проходе для обработки сбрасывать её в ноль - тогда нужно будет обрабатывать только строки с единицами.
Если нужно отслеживать её и пропажу, то тем, кто есть, ставим двойки - потом те, у кого ноль, будут считаться потерянными.
P.S. по данному принципу у меня работает файловый монитор, который в файлах получает события (а файлы отправители могут дописывать) - надо сказать, что работает достаточно быстро.
48 kiruha
 
02.11.13
18:43
(46)+
Этот алгоритм быстрее на порядок свертки и уж тем более помещения во временую таблицу
49 oleg_km
 
02.11.13
20:11
Интересно, если прикрутить дот.нет и использовать его LINQ. Наверное долго будут данные в дот.нет перегоняться. ВК наверное можно сделать. В фокспро было очень удобно SQL использовать для курсоров (рекордсетов в памяти).
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой