Имя: Пароль:
1C
1С v8
Из множества ТЗ найти совпадающую с эталоном.
0 Слабак
 
19.05.17
10:11
Привет. Задача лоическая. Есть ТЗ со значениями, и есть кучка других ТЗ. Структура одинакова, отличаются только значения. Необходимо по первой ТЗ, получить из той кучи, ТЗ которые на 100% совпадают по значениям. Может кто то делал уже. Интересует логика, и наиболее оптимальный вариант выполнения...потому как таблицы большие.
1 polosov
 
19.05.17
10:13
(0) ТЗ в запрос и там ищи.
Запрос имхо динамически построенный.
2 Gamm
 
19.05.17
10:13
Хеш по каждой таблице и сравнение хешей.
3 Ёпрст
 
19.05.17
10:15
4 МихаилМ
 
19.05.17
10:19
+ уменьшите кол-кандидатов тз
предварительным отсеиванием на колво строк, и разницу по суммам числовых колонок.
5 Buster007
 
19.05.17
10:21
(2) как ее сделать?
6 polosov
 
19.05.17
10:23
(5) ХешФункция (HashFunction)
SHA1 (SHA1)
Описание:

Вычислять значение SHA-1.
7 МихаилМ
 
19.05.17
10:23
(5)
значение в файл ,  на него хаш
8 polosov
 
19.05.17
10:24
+(6)
ХешированиеДанных (DataHashing)
Свойства:

ХешСумма (HashSum)
ХешФункция (HashFunction)

Методы:

Добавить (Append)
ДобавитьФайл (AppendFile)

Конструкторы:

По указанной хеш-функции

Описание:

Реализует инкрементальный расчет хеш-суммы по добавленным данным. Способ расчета и тип вычисляемого значения определяются типом хеш-функции.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
См. также:

ХешФункция
9 Asmody
 
19.05.17
10:26
ЗначениеВСтрокуВрнутр() и сравнивай строки
10 Ёпрст
 
19.05.17
10:31
(9) это не верно в общем виде.
Покатит, если только обе ТЗ будут отсортированы одинаково
11 Ёпрст
 
19.05.17
10:32
ну и для больших тз, это медленно
12 Слабак
 
19.05.17
10:33
Хеш я так понял тоже построчно..это медленно.
13 Ёпрст
 
19.05.17
10:34
(12) нет.
14 Ёпрст
 
19.05.17
10:34
просто сравниваешь 2 хеша и привет
15 Слабак
 
19.05.17
10:35
подскажите тогда как загнать ТЗ в ХЕШ?
16 Вафель
 
19.05.17
10:36
ТЗ1 = ТЗ2 или ТЗ1 содержит в себе ТЗ2?
17 Ёпрст
 
19.05.17
10:36
(15)самый  примитв - (9)
18 Ёпрст
 
19.05.17
10:37
предварительно тока, сортируй тз одинаково
19 Слабак
 
19.05.17
10:38
ТЗ1 - эталон

ТЗ2
ТЗ3
ТЗ4
ТЗ5
Массив ТЗ

нужно найти к примеру что ТЗ1=ТЗ4
20 Слабак
 
19.05.17
10:57
Я таки не понял, обьясните на пальцах как загнать в Хеш ТЗ без цикла?
21 Рэйв
 
19.05.17
11:03
Если ЗначениеВСтроку(ТЗ1)=ЗначениеВСтроку(ТЗ2) Тогда
   Сообщить("Оно!");
КонецЕсли;
22 Рэйв
 
19.05.17
11:06
+(21) *ЗначениеВСтрокуВнутр
23 Слабак
 
19.05.17
11:10
Не работает
24 Ёпрст
 
19.05.17
11:13
(23) руки мыл перед этим ?
25 Слабак
 
19.05.17
11:14
попробуй сам.

    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РеализацияТоваровУслугТовары.Ссылка,
        |    РеализацияТоваровУслугТовары.Номенклатура,
        |    РеализацияТоваровУслугТовары.Количество,
        |    РеализацияТоваровУслугТовары.Цена,
        |    РеализацияТоваровУслугТовары.Сумма
        |ИЗ
        |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        |ГДЕ
        |    РеализацияТоваровУслугТовары.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", РН);
    
    ТЗ = Запрос.Выполнить().Выгрузить();
    ТЗ1=ТЗ.Скопировать();
    
    
    Если ЗначениеВСтрокуВнутр(ТЗ)=ЗначениеВСтрокуВнутр(ТЗ1) Тогда
           Сообщить("Оно!");
    КонецЕсли;
26 МихаилМ
 
19.05.17
11:22
(25) а ссылка то зачем. сравнивайте без ссылки
27 МихаилМ
 
19.05.17
11:22
(25) а если порядок строк изменен ?
28 Слабак
 
19.05.17
11:24
в ТЗ хранятся разные значения..и ссылочные и числовые и строковые
29 Ёпрст
 
19.05.17
11:24
(25) см.(10), много думай
30 Слабак
 
19.05.17
11:30
"(9) это не верно в общем виде.
Покатит, если только обе ТЗ будут отсортированы одинаково"

что именно в твоем утвеждении правда? то что это все не верно или по поводу сортировки? так при копировании ТЗ сортировка не нарушается вроде..
31 Рэйв
 
19.05.17
11:30
(23)Все работает
https://yadi.sk/i/klsPDg9o3JKUQg
32 Ёпрст
 
19.05.17
11:33
(30)
Подумай над этим:   ТЗ = Запрос.Выполнить().Выгрузить();

    ТЗ1=ТЗ.Скопировать();
    ТЗ2=ТЗ.Скопировать();
    
    
    Если ЗначениеВСтрокуВнутр(ТЗ1)=ЗначениеВСтрокуВнутр(ТЗ2) Тогда
           Сообщить("Оно!");
    КонецЕсли;
33 Слабак
 
19.05.17
11:36
(32) Да..так работает..однако причина для меня осталась загадкой...почему ТЗ1<>ТЗ ?
34 Ёпрст
 
19.05.17
11:37
Потому, что копировать неверно переносит тип колонки
35 Слабак
 
19.05.17
11:38
не знал ..спасибо.
36 Ёпрст
 
19.05.17
11:46
хотя не, посмортел строки, там только последний параметр меняется
37 Ёпрст
 
19.05.17
11:46
ну не важно, это один хрен копировать так делает
38 Слабак
 
19.05.17
11:57
В общем вариант ЗначениеВСтрокуВнутр так себе...много ньюансов...обход построчно и хеширование значений  - надежнее я понимаю..
39 FIXXXL
 
19.05.17
12:09
Две ТЗ в запрос. Служебное поле с значением "1". Сворачиваем по всем полям и СУММА("1"). Выбираем "1". Результат пустой - ОК.
40 Слабак
 
19.05.17
12:17
Тот запрос я сделал для примера...в реальном случае там очень много полей с разными ссылочными значениями. Не прокатит данный вариант.
41 Слабак
 
19.05.17
12:19
(39) Понял..попробую..может прокатить. Спасибо.
42 1dvd
 
19.05.17
13:10
(39) а почему 1 в кавычках?
43 Bigbro
 
19.05.17
14:46
если таблицы реально большие то только хэш.
44 НЕА123
 
19.05.17
14:54
(39)
не надо сумма()

ВЫБРАТЬ ПЕРВЫЕ 1 1 ....
45 FIXXXL
 
19.05.17
16:53
(42) да хз, так текст вышел :) это не строка, число конечно

(44) а как наличие расхождения отловить без сумма?
2 - как раз показатель того, что строка нашла себе пару
1 после суммирования - строка без пары
46 Timon1405
 
19.05.17
17:22
(39) лучше первой таблице в служебную колонку поставить 1, а второй -1
тогда при суммировании нули дадут совпадения, колонки где 1 - данные из первой таблицы, колонки где "-1" - данные из второй таблицы