Имя: Пароль:
1C
 
Индексирование кодов честного знака (интересная комбинаторная задачка)
,
0 Dzenn
 
гуру
22.01.25
15:26
Коллеги, привет.

Такая задачка — у нас есть массив из 100 000 000 кодов "Честного знака" — они все уникальны. Понятно, что делать индекс по уникальным значениям нельзя.

Все коды загружены в регистр сведений. Нужно обеспечить средствами 1С более эффективный поиск по таблице, нежели простым перебором.

Идея для решения задачки такая — придумать алгоритм, на входе которого будет уникальный код честного знака, а на выходе — неуникальное число от 1 до 1000, причём вероятность получения любого числа от 1 до 1000 в случае уникальности кодов (отбрасывая левые нули) должна быть примерно равной. Для этого числа можно создать дополнительную колонку регистра и по ней индексировать.

Знаете ли вы готовые алгоритмы для решения подобной задачи?
1 Dzenn
 
гуру
22.01.25
15:29
хотя блин я кажется уже сам догадался... сначала сделать хэширование, потом просуммировать все коды символов хеширования и взять остаток от деления на 1000
2 H A D G E H O G s
 
22.01.25
15:30
"Понятно, что делать индекс по уникальным значениям нельзя."

Нет, непонятно.
3 H A D G E H O G s
 
22.01.25
15:31
Возможно вы индекс не хотите делать по причине его размера, других объяснений нежелания у меня нет.
4 Dzenn
 
гуру
22.01.25
15:32
(3) ну конечно
5 H A D G E H O G s
 
22.01.25
15:33
(4) Поиск в 100000 строк тоже глупо
6 Dzenn
 
гуру
22.01.25
15:34
(5) влезать с оценочными суждениями, но без решений — примерно раз в 500 глупее
7 H A D G E H O G s
 
22.01.25
15:35
Я просто приколочу это здесь

p.s. Автор не понимает размера работ
8 Ненавижу 1С
 
гуру
22.01.25
15:35
(1) осталось доказать, что вероятность равномерная
9 H A D G E H O G s
 
22.01.25
15:35
(6) Вам хорошего дня.
10 ptiz
 
22.01.25
15:37
(1) А куда потом вкрячить это поле? Речь вообще про 1С?
ИМХО, лучше пересмотреть задачу целиком.
11 ptiz
 
22.01.25
15:40
а... вижу
"дополнительную колонку регистра" - а смысл?
Если новое поле сделать индексированным - в этот индекс 1С также включит все измерения РС, и индекс будет "большим".
Шаманить в СУБД напрямую?
12 ptiz
 
22.01.25
15:44
(грустно смотрю на свой справочник из 965 000 000 кодов)
13 Чеширский
 
22.01.25
15:45
Вот тоже с Ежиком согласен.
Мне тоже совсем не понятно, с какой стати не нужен индекс по уникальным значениям?
Может вы тогда пометку удаления еще предложите индексирвоать?
14 H A D G E H O G s
 
22.01.25
15:48
(12) Завод?
15 Ёпрст
 
22.01.25
15:51
(12) у нас скормнее, 198 577 055..но, это не чз, просто марка
16 Чеширский
 
22.01.25
15:52
ЧЗ -это вроде 31 цифра
17 Андрюха
 
22.01.25
15:59
(0) Зачем искать по всей таблице из 100М записей, наверняка коды в регистре хранятся с привязкой к номенклатуре.
18 ptiz
 
22.01.25
16:09
(14) Хуже - лекарства оптом.
19 Чеширский
 
22.01.25
16:50
(17) При наличии индексов в 100М таблице -  любая запись найдется за максимум 30 шагов чтения строк таблицы.
20 Garykom
 
гуру
22.01.25
17:05
(0) >Знаете ли вы готовые алгоритмы для решения подобной задачи?

Знаю.
Не хранить коды в 1С.
Вынести их наружу.
21 Garykom
 
гуру
22.01.25
17:10
(20)+ В 1С хранить только SGTIN или SSCC, их же указывать в доках
Нахрена вам в базе 1С криптохвосты?
22 Garykom
 
гуру
22.01.25
17:11
(21)+ а индекс по SGTIN уже есть
Это GTIN часть
23 Лодырь
 
22.01.25
17:40
(18) Вам кстати криптохвосты низзя вроде хранить в базе по закону. В отличие от других.
24 Garykom
 
гуру
22.01.25
18:26
(23) Нет такого
25 ptiz
 
22.01.25
18:27
(23) У нас их и нет, только sgtin. Кстати, в (0) тоже не указано - какой именно код они хранят.
26 Волшебник
 
22.01.25
18:56
(0) >> Понятно, что делать индекс по уникальным значениям нельзя.

Вы там совсем ёбнулись что ли?
27 Asmody
 
22.01.25
19:05
На уровне бреда: а если запихнуть коды во внешнюю базу, не 1С, и ходить в неё через внешний источник, быстрее не получится?
29 Волшебник
 
22.01.25
19:11
А может всё-таки бахнем индекс? Право, сударь! Для быстрого поиска люди придумали ИНДЕКСЫ!
30 Волшебник
 
22.01.25
19:13
(19) 👍
31 Лодырь
 
22.01.25
19:48
(24)
"IV. Правила хранения и использования кодов маркировки 4.1. Код маркировки (далее – КМ), включающие в себя идентификатор ключа подписи и код проверки (крипто-часть КМ) могут храниться в учетной системе или АСУТП Участника только в процессе производственного цикла. После отправки отчета об использовании (нанесении) КМ крипто-часть должна быть удалена. Хранение КМ, включающих в себя крипто-часть, после их нанесения на готовую продукцию и отправки отчета об использовании кодов маркировки в учетной системе или АСУТП Участника запрещено."
33 Dzenn
 
гуру
23.01.25
12:29
(8) угу, распределение оказалось неравномерным ) но при остатке от деления на 100 — вполне себе вышло, стандартное отклонение — 28,5229 :-)
34 Dzenn
 
гуру
23.01.25
12:31
(29) нет, ну можно конечно, просто индексная таблица будет невероятно большой, и при добавлении новых значений она будет сильно кряхтеть
35 Волшебник
 
23.01.25
12:31
(34) Не жмотитесь. При наличии 100 млн марок должны быть деньги на систему хранения типа SAS
36 Dzenn
 
гуру
24.01.25
10:11
(35) ста миллионов не будет, будет в районе миллиона, задачу специально означил таким образом, чтобы абстрагировать её в сторону алгоритма
37 Garykom
 
гуру
24.01.25
10:45
1. перевести код марки в огромное число N
2. получить его квадрат K = N*N
3. взять случайные 3 цифры из квадрата числа K (рядом подряд или произвольно, запомнить позиции и всегда брать их или из середины числа без 0 слева)
4. получится 0..999 - если надо от 1 до 1000 сделать +1
38 Asmody
 
24.01.25
10:40
(37) а чего тогда просто не взять 3 случайных цифры?
39 Garykom
 
гуру
24.01.25
10:42
(38) GTIN в начале, случайного распределения не будет
они вероятно чаще с одними и теми же поставщиками работают
40 Garykom
 
гуру
24.01.25
10:44
(38) но правильно заметил от "случайные" надо избавиться для хеша, для повторяемости
или всегда в середине брать
или запомнить случайные позиции и всегда брать их
41 Asmody
 
24.01.25
10:50
бери 3 последние цифры числа π, не ошибешься
42 Garykom
 
гуру
24.01.25
10:54
(41) тоже неплохая идея если брать "3 последние цифры числа π" начиная с позиции "перевести код марки в огромное число N"
43 ptiz
 
24.01.25
13:03
(42) Изобретаем свой хэш?