Имя: Пароль:
1C
1С v8
как закодировать Наименование в Артикул?
0 D_Pavel
 
29.11.11
11:05
Нужно получить артикул из наименования товара, чтобы в нем не встречались всякие нехорошие символы, и желательно укоротить, и чтобы он был с большой вероятностью уникальным (при условии что наименование уникально).
По артикулу будут назначаться имена файлам, эти файлы будут в интернете, потому наименования не подходят, т.к. в них могут встречаться русские буквы, всякие кавычки и другой мусор.
Как бы такое сделать?
1 andrewks
 
29.11.11
11:05
MD5
2 Wobland
 
29.11.11
11:06
ГСЧ=Новый ГенераторСлучайныхЧисел...
3 GROOVY
 
29.11.11
11:06
Используй функцию "ЗакодироватьНаименованиеПоХитрому()"
4 Жан Пердежон
 
29.11.11
11:06
хэширование
5 Ненавижу 1С
 
гуру
29.11.11
11:06
создать хеш-функцию, на входе строка, на выходе число
вероятность одинаковых значений при разных наименованиях больше 0
6 mikecool
 
29.11.11
11:07
(0) тупо используй артикул с латиницей )
7 PR
 
29.11.11
11:07
(0) Зачем?
Что мешает просто генерить новый артикулдля каждой номенклатуры?
8 Ненавижу 1С
 
гуру
29.11.11
11:08
static void Main(string[] args)
       {
           string s = "Клавиатура Genius KB-06XE проводная";
           Console.WriteLine(s.GetHashCode()); //566656636
           Console.ReadKey();
       }
9 rs_trade
 
29.11.11
11:09
(7) как то слишком просто.
10 shuhard
 
29.11.11
11:09
(0) что мешает использовать в качестве артикула код номенклатуры ?
11 rutony
 
29.11.11
11:11
(0) А не проще использовать код номенклатуры??
или не... давайте изобретем велосипед))
12 kosts
 
29.11.11
11:12
Наименование = Наименование + ссылка.УникальныйИдентификатор()
13 D_Pavel
 
29.11.11
11:17
Код и генератор случайных чисел не подходят, потому что нет зависимости от наименования.
Если удалить товар и заново его создать с тем же наименованим, нужно чтобы артикул создался какой был.
14 Жан Пердежон
 
29.11.11
11:20
(13) используй РС тогда, в нем храни соответствие наименования и артикула
15 D_Pavel
 
29.11.11
11:23
(1)как MD5 сгенерировать?
16 kosts
 
29.11.11
11:26
(13) Какова вероятность создать новый товар с наименованием идентичным старому...
А пробелы, а регистр букв, и т.п...
17 Жан Пердежон
 
29.11.11
11:26
(16) 100%
хочешь создам?)
18 D_Pavel
 
29.11.11
11:29
(16) Товар загружается из прайса поставщика, наименование всегда идентично старому.
19 Romcheg
 
29.11.11
11:30
Написать функцию ВЛатиницуИУдалитьНахСпецСимволы()
20 acsent
 
29.11.11
11:31
Зачем кодировать? Просто перенумеровать и все
21 Eugene_life
 
29.11.11
11:35
(0) Создать таблицу кодировки Слог -> Число. Закодировать так номенклатуру. Пропить премию.
22 Ненавижу 1С
 
гуру
29.11.11
11:37
(21) прикольный будет РС
23 D_Pavel
 
29.11.11
11:38
А умные мысли есть у кого?
24 Lama12
 
29.11.11
11:39
(0)Хэш функции всегда имеют коллизии.
Что б однозначно закодировать в артикул наименование, артикул должен быть той же длины что и наименование.
Допустим у тебя для наименования используется 2 символа алфавита, и длина наименования 5 знаков. Тогда количество вариантов - 2^5.
Исходя из этого определи: сколько у тебя символов в алфавите, какова длина наименования.
Сколько символов в алфавите которым ты будешь пользоваться для создания артикула. Какова длина артикула.
На основании этих данных получишь количество комбинаций в наименовании и количество комбинаций в артикуле.
Далее используя систему счисления с основанием равным длине алфавита, можно закодировать артикул.
НО!
Это теория, хоть и верная и дающая однозначные результаты, но теория.
На практике сделал бы проще.
Вместе с файлами о номенклатуре выгружал бы отдельный служебный файл соответствий. В котором одна колонка - код, вторая наименование номенклатуры. Вот и все.
25 el-gamberro
 
29.11.11
11:42
Я бы сделал бы отдельную таблицу артикулов и не парил бы моск.
Хранить данные всегда выгоднее чем вычислять
26 Lama12
 
29.11.11
11:46
Ииии...
Автор, какое решение?
27 rs_trade
 
29.11.11
12:02
(26) Хранить соответствие в РС. Одно измерение Наименование, один ресурс Артикул. Если наименования нет, добавлять запись и назначать артикул. Если есть, получать артикул.
28 el-gamberro
 
29.11.11
12:23
(27) Илегантное решение.
29 D_Pavel
 
29.11.11
12:33
(26) пока ничего не буду делать. Всё хреново.
30 Lama12
 
29.11.11
12:35
(29) Хм.. :(
Печаль.
31 D_Pavel
 
29.11.11
12:39
Пока такой вариант на первом месте: Сложить все коды символов наименования, полученное число считать артикулом.
32 D_Pavel
 
29.11.11
12:57
Для й = 1 по СтрДлина(Наименование) цыкл
           Артикул = Артикул + КодСимвола(Наименование, й);
       КонецЦыкла;
33 Eugene_life
 
29.11.11
13:03
(32) Отличная бомба замедленного действия. Главное - непонятно, когда рванет :D Вполне вероятно, что артикулы от какого-нить "абабабабаба" окажется равен по сумме "щю".
34 D_Pavel
 
29.11.11
13:08
(33) Чтобы уменьшить эту вероятность, ввел влияние позиции символа в строке:

       АртикулНаш = 0;
       Для й = 1 по СтрДлина(Наименование) цикл
           АртикулНаш = АртикулНаш + КодСимвола(Наименование, й) * Pow(2, й);
       КонецЦикла;
35 AlexSvt
 
29.11.11
13:20
+ (33) Именно так и будет.
(34) Какое количество номенклатуры предполагается обрабатывать?
Проверил на своем справочнике - при 34318 элементов количество разных кодов:
- 17455 (только код символа)
- 24942 (с учетом Pow(2, й))
36 Eugene_life
 
29.11.11
13:26
(34) А, может, просто при создании номенклатуры генерить уникальную последовательность символов, и хранить ее в реквизите? С контролем уникальности по всему справочнику, но с возможностью ручного редактирования? Создал номенклатуру, 1С сгенерила случайную последовательность, по необходимости ее подправил. И все. Тебе же все равно не нужна прозрачная связь между кодом и названием.
37 D_Pavel
 
29.11.11
13:33
(35) из 2636 позиций 73 совпадения. Хреново. Желательно не больше 5
38 y88
 
29.11.11
13:42
(37) ну добавь еще кол-во символов
39 D_Pavel
 
29.11.11
13:43
(38) так и делаю
40 y88
 
29.11.11
13:44
(39) попробуй подели на кол-во символов :)
41 D_Pavel
 
29.11.11
13:45
(37) Ой, наверное это группы попали, у них артикул пустой, потому и совпадения.
42 D_Pavel
 
29.11.11
13:45
(40) этого делать точно не нужно, только увеличится вероятность повтора
43 MSOliver
 
29.11.11
13:50
"Наименование"+УникальныйИдентификатор()
44 kosts
 
29.11.11
14:19
Вот удобный вариант с промежуточным хранением.
Создаешь новый справочник.
При добавлении номенклатуры делаешь по нему поиск по наименованию.
Нашел - Артикул = его уникальный идентификатор.
Не нашел. Добавляешь. Присваиваешь наименование.Записываешь и смотришь его уникальный идентификатор.
При удалении номенклатуры в основном справочнике в дополнительном не удаляешь никогда.
45 karakusek
 
29.11.11
14:51
(44) А почему нельзя это сделать в регистре?
Как предлагалось в (25)
46 kosts
 
29.11.11
14:53
(45) Просто вариант. Система сама генерирует код.
47 D_Pavel
 
30.11.11
07:39
в таком варианте совпадений не произошло при 2636 элементах:

       Артикул = "";
       Для й = 1 по СтрДлина(Наименование) цикл
           Артикул = Артикул + Символ(КодСимвола(Наименование, й) % 25 + 65);
       КонецЦикла;
48 D_Pavel
 
30.11.11
08:00
(2) Хороший вариант, кстати.
49 Rie
 
30.11.11
08:03
(0) А делай так, как имя файла 8.3 строится из полного имени.
50 D_Pavel
 
30.11.11
08:03
(8) это как в 1С запихать?
51 Rie
 
30.11.11
08:05
(50) :-)
Напиши свою функцию хеширования.
Или возьми в качестве артикула УникальныйИдентификатор.
52 D_Pavel
 
30.11.11
08:27
на инфостарте хорошую функцию хеширования нашел. Совпадений 0, длина артикула не большая! ))))
53 D_Pavel
 
30.11.11
08:35
В итоге вот что получилось:

       Хэш = 0;
       Для й = 1 по СтрДлина(Наименование) цикл
           Хэш = 31 * Хэш + КодСимвола(Наименование, й);
       КонецЦикла;
       Хэш = Хэш % 18446744073709551616;
       
       База = 25;
       Артикул = "";
       Пока Хэш <> 0 Цикл
           Артикул = Символ(65 + Хэш % База) + Артикул;
           Хэш = Цел(Хэш / База);
       КонецЦикла;

Такие артикулы выдает:

WAHMHFGBAQXCK
WAHMHFGBAQXDG
WAHMHFGBAQXQW
WAHMHFGBAQYQH
WAHMHFGBAQYQM
WAHMHFGBAQYQR
WAHMHFGBAQYQT
FFMIUHYTEAGQWW
FFMIUHYTECEGUC
FFMIUHYTECEIIN
KXTAOUATDWTQPR
KXTAOUATDWTQQX
KXTAOUATDWTQRL
KXTAOUATDWWUCH
KXTAOUATDWWUFS
KXTAOUATISJAXN
KXTAOUATISJAYB
KXTAOUATISJBAH
KXTAOUATISJBCG
54 Эмбеддер
 
30.11.11
08:36
(53) Респект! Особенно удобно по сравнению с цифрами диктовать по телефону
55 D_Pavel
 
30.11.11
08:44
+(53) первый абзац дает десятеричный цифровой хеш, второй абзац перекодирует его в двадцатипятиричный буквенный что дает сокращение длины.
56 aleks-id
 
30.11.11
08:45
(55) найди функцию CRC32 (тут бегала на форуме) и не парь моск
57 Рэйв
 
30.11.11
08:51
(0)Тупо замени буквы на КодСимвола() тогда из наименования будет всегда один артикул
58 Эмбеддер
 
30.11.11
08:55
(55) Так можно и до байта дойти.
вообще чтобы уменьшить вероятность совпадения артикулов в 2 раза, наименование преобразовать через ВРег
59 0xFFFFFF
 
30.11.11
08:57
(0) Код символа используй. Но "число-строка" будет оооочень большим. В 3 раза больше оригинала.
60 Мимохожий Однако
 
30.11.11
08:57
(0)Ну, создал ты артикул из наименования и как это потом будешь использовать? Не понятно. Если поиск, то достаточно по наименованию, тем более что наименование в прайсе поставщика не меняется. Если хочешь оставить своё наименование, то заведи дополнительный реквизит и в него забрось наименование поставщика. Зачем эти шифрования и т.п.?
61 Umka2008
 
30.11.11
08:59
А код не предлагать?
62 Эмбеддер
 
30.11.11
09:02
Если проблема в именах файлов в интернете, то это не проблема, пробел выглядит как %20
63 D_Pavel
 
30.11.11
09:13
(58) если использовать ВРег, вероятность совпадения увеличится
(60) Это для интернета, в (0) написано
(62) проблема в людях которые администрируют сайт. У них оплата не сдельная, а по окладу. Не хотят делать поддержку русских букв и проверку на плохие символы.
64 Эмбеддер
 
30.11.11
09:15
(63) Щас я пример придумаю
65 Эмбеддер
 
30.11.11
09:19
например, у тебя вообще "12" и "0Q" даст один и тот же результат.

надо чтобы если уж ты умножаешь на 31, то и диапазон значений должен быть от 0 до 30
66 D_Pavel
 
30.11.11
09:20
(64) например: товары Золупа и ЗОЛУПА будут иметь одинаковый артикул если использовать ВРег.
67 D_Pavel
 
30.11.11
09:21
(65) может тогда на 25 умножать?
68 Эмбеддер
 
30.11.11
09:23
Нет, умножать на 256.
Если сделаешь ВРег, сможешь умножать на (256-33-26).
69 Эмбеддер
 
30.11.11
09:24
ну и тогда придется сдвигать коды чтобы не было пропусков, иначе (65) произойдет все равно
70 D_Pavel
 
30.11.11
09:25
(69) встречаются наименования и с кодом символа 7, диапазон большой. Сдвигать сильно не получится.
71 D_Pavel
 
30.11.11
09:26
(68) если умножать на 256 получится та же самая строка.
72 Эмбеддер
 
30.11.11
09:27
(70) например если нам нужно убрать все символы до пробела и восклицательный знак, то замена такая 31->0, 32->1, 34->2 и т.п.
73 D_Pavel
 
30.11.11
09:29
Я понял, ты хочешь предложить вариант без потери информации, но меня устроит просто с небольшой вероятностью повторов. 0.1% вполне годится.
74 Эмбеддер
 
30.11.11
09:31
(73) Потеря все равно будет когда делишь на 18446744073709551616, это не сильно плохо, но в твоем варианте из-за (65) повторов будет гораздо больше, чем если посчитать хэш стандартным способом
75 D_Pavel
 
30.11.11
09:33
(74) Не думаю что это верно. Согласен что повторов будет больше до деления на 18446744073709551616, но если предположить что почти всегда число получается больше чем 18446744073709551616 (длинное наименование), то после деления количество повторов должно быть одинаковым.
76 D_Pavel
 
30.11.11
09:36
Ты вот в чем прав: Если умножать на 256, а не на 31, то увеличивается вероятность что результат будет больше 18446744073709551616, это хорошо.
77 D_Pavel
 
30.11.11
09:37
хотя у меня и так при 2636 позициях не было ни одного совпадения.
78 Эмбеддер
 
30.11.11
09:45
(75) Если произошел повтор до деления, то после деления результат будет тот же (т.е. все равно повтор)
(77) Конечно можно оставить и так
79 AlexSvt
 
30.11.11
11:21
(77) повторил тест, для варианта (47) получаем 32002 различных артикула для 34318 наименований, для варианта (53) - 32016.
80 Reset
 
30.11.11
11:34
Из уточнения в (13) прямо следует единственное решение в (14).
"0.1% вполне годится" - каждый примерно тысячный товар будет перепутан с другим, и это устраивает? бред же
81 Reset
 
30.11.11
11:34
(80) про 0.1% - к посту в (74)
82 Reset
 
30.11.11
11:35
73 то есть, черт
83 AlexSvt
 
30.11.11
11:48
+(79) последний тест: 31962 различных артикулов для 31962 наименований.
84 D_Pavel
 
30.11.11
14:02
(80) Почему бред? Не у каждого товара будет привязан файл с картинкой, и с вероятностью 0.1% картинка будет не соответствовать товару, ну и фиг с ней, никто даже не заметит.
(83) это для какого варианта?
85 AlexSvt
 
01.12.11
11:29
(84) для варианта (53)
86 D_Pavel
 
01.12.11
11:40
(85) Значит хороший вариант.