Имя: Пароль:
1C
1С v8
v8: GUID свой собственный - чем дело кончилось?
0 Mikhail Volkov
 
15.07.11
12:21
Здесь GUID свой собственный тема, которая очень меня волнуют - нужен алгоритм формирования GUID по 6-ти значному коду (артикулу). Есть такой?
В качестве бэк-офиса УПП1.3 - УТ10.3 - УТ11 (последняя на обкатке), фронт-офис - СуперМАГ. Все начинается с заявок от магазинов, идентификация товара по артикулу СуперМАГ. Надо сделать так, чтобы куда из 3-х баз заявка не попала, сформировался GUID однозначно. Чтобы при обменах УПП1.3 - УТ10.3 - УТ11 это был один и тот же товар.
1 le_
 
15.07.11
12:27
А зачем формировать GUID? Пользуйся артикулом.
2 Fragster
 
гуру
15.07.11
12:27
не нужно.
3 Mikhail Volkov
 
15.07.11
12:47
(1) Не весь товар идет в розничную сеть, не у всех присвоены артикулы. Бывает так, товар в розницу не идет, но когда срок реализации кончается, его толкают в наши магазины, только тогда присваивают артикул...
4 Lama12
 
15.07.11
12:50
(3) Вам сюда wiki:Хеш-сумма
5 Aleksey
 
15.07.11
12:52
(0) И в чем проблема? У меня уже год так работает, т.е. сам формирую ГУИД для товара и клиентов. Проблем нет
6 Defender aka LINN
 
15.07.11
13:11
СтрокаИД = "00000000-0000-0000-0000-000000" + Артикул;
ИД = Новый УникальныйИдентификатор(СтрокаИД);
7 Mikhail Volkov
 
15.07.11
19:55
(6) Хм, так посто? Это проверено?
(5) Код засвети?
8 PR
 
15.07.11
20:12
(6) И что, можно в строку любое количество символов передавать?
9 DGorgoN
 
15.07.11
20:13
В чем проблема сформировать гуид?

Артикул + СлучайноеЧисло(1) + СлучайноеЧисло(2) + ...
10 Mikhail Volkov
 
15.07.11
20:13
(6) Не, мне надо чтобы ГУИД остался "00000000-0000-0000-0000-000000" формата
11 DGorgoN
 
15.07.11
20:14
+(9) Ну там еще можно привязку ко времени и т.п., ошибся - вместо 1 - 9 надо поставить..
12 PR
 
15.07.11
20:16
И какой ГУИД должен быть у пустого артикула?
13 Mikhail Volkov
 
15.07.11
20:20
(11) Не надо ко времени, надо чтобы во всех базах формировался ГУИД по артикулу одинаково - однозначно
14 PR
 
15.07.11
20:27
(13) Так что насчет (12)?
И (1).
15 Aleksey
 
15.07.11
22:21
(7) Код чего? У меня простои источник база на 7-ке с модом, и в качестве ГУИД у меня IDD справочника из 7-ки
16 Aleksey
 
15.07.11
22:24
(14) Ну смотри к примеру нужно из источника загрузить в приемник. Причем приемники соединены в УРИБ, т.е. между ними типовые обмены по ГУИД. При этом один и тот же товар одновременно может быть загружен и создан в несколько источников. Что станет номенклатурой после обмена? Будет куча дублей.

А так, если преобразовать артикул в гуид, то после обмена все будет хорошо

(12) Например добавить к артиклю код из источника и запретить код менять.
17 Mikhail Volkov
 
15.07.11
22:27
(15) Как из IDD МОДа формируешь ГУИД?
18 Aleksey
 
15.07.11
22:30
(17) Насколько фантазии хватит. Дело в том что IDD - 17 символов, гуид 32. Так что как придуамаешь так и будет
19 Aleksey
 
15.07.11
22:30
Например у меня так


Функция ПолучитьГуид(ИДД)
   //17->32
   НовСтрока="";
   Для й=1 по 14 Цикл
       КС=КодСимв(сред(ИДД,й,1));
       КС=?(КС>128,КС-848,КС);//перевод Юникод в не Юникод
       НовСтрока=НовСтрока+Прав("0"+СокрЛП(Из_10_В_Любую(КС,16)),2);
   КонецЦикла;
   
   НовСтрока="F"+Лев(НовСтрока,7)+"-"+Сред(НовСтрока,8,4)+"-"+Сред(НовСтрока,12,4)+"-"+Сред(НовСтрока,16,4)+"-"+Сред(НовСтрока,20,9)+Прав(ИДД,3);
   Возврат ""+НовСтрока+"";
КонецФункции
20 Aleksey
 
15.07.11
22:34
Т.е. я беру код символа, перевожу его из 10 системы в 16 и получаю код для символа гуид

Т.е. каждый символ МОД преобразовываю в 2 символа ГУИД, только я не все 17 символов а только первые 14, остальные 3 беру как есть, ну и чдля разнообразия и для отличия пишу первый символ "F"
21 Mikhail Volkov
 
15.07.11
22:40
(20) Для ясности, можно Из_10_В_Любую(КС,16)?
22 Aleksey
 
15.07.11
22:48
Функция Из_10_В_Любую(Знач Значение=0,Нотация=36) Экспорт
    Если Нотация<=0 Тогда Возврат("") КонецЕсли;
    Значение=Число(Значение);
    Если Значение<=0 Тогда Возврат("0") КонецЕсли;
    Значение=Цел(Значение);
    Результат="";
    Пока Значение>0 Цикл
         Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%Нотация+1,1)+Результат;
         Значение=Цел(Значение/Нотация) ;
    КонецЦикла;
    Возврат Результат;
КонецФункции
23 Mikhail Volkov
 
15.07.11
22:49
(20) Я правильно понял, МОД распространил объект по всем 1С базам, и Функция ПолучитьГуид(ИДД) создала всем один и тот же ГУИД?
24 Aleksey
 
15.07.11
22:52
Мод был в 7-ке. И да справочники были общие для всех баз (миграция с помощью При выгрузки в 8-ку я врусную формировал гуид и создавал в 8-ке уже объекты с сформированным гуидом.

А так как ИДД у во всех базах в 7-ке у одного элемента был одинаков, то при выгрузки этого элемента из любой базы 7-ки в в любую 8-ную базу формировался одинаковый ГУИД, т.е. после УРИЮ обмена элементы не задваивались (максимум мог поменяться код, я его не переношу, а формируется автоматом)
25 Aleksey
 
15.07.11
22:53
Собственно тебе проще. У тебя везде 8-ки, поэтому Функция ПолучитьГуид(ИДД) тебе не нужна, у тебя ГУИД и так уже есть
26 Aleksey
 
15.07.11
22:53
просто бери и используй его
27 Mikhail Volkov
 
15.07.11
23:19
(14) Этот случай не рассматривается, ГУИД формируется обычным путем.
(25) Важный момент - УТ11 на обкатке, пока у меня нет (у 1С тоже) ПКО сверху вниз от УТ11 к УТ10.3 и УПП1.3, только наоборот - снизу вверх. Оптовые фирмы компании работают в УТ10.3 частично "на сторону", частично на нашу розничную сеть магазинов. В УТ11 работает фирма РЦ - распределительный центр, распределяет по магазинам. Пока наша розница (СуперМАГ - не 1С) не заказала товар из опта, он без артикула. Заказывает, прежде всего, в РЦ - УТ11, и тогда там артикул появляется. Но УТ10.3 и УПП об этом не знают. По цепочке заказ розницы с артикулами доходит до УТ10.3, надо чтобы по артикулу сформировался точно такой же ГУИД как в УТ11.
28 Mikhail Volkov
 
16.07.11
07:43
(26) Твоя и идея верная, только не в плане размазывания IDD - 17 символов до размера GUID - 32 символа, а в аналогии конструкции. Прекрасно помню МОД http://www.pb.ru/ по 1С 7.7. Первые 7 символов (цифр) IDD - это IDD базы данных, остальные 10 - объекта. Для IDD объекта у меня 6 цифр артикула из СуперМАГ, ну добавлю еще 14 (или только 8) - дата-время от туда же (вроде для товара так же не изменяемый параметр в СуперМАГе). Итого для объекта - 20 символов. Остается задать 12 символов для идентификации базы. Вот об этой части идентификатора и речь!
По началу Билл Гейтс для этой части идентификатора использовал мак-адрес компьютера. 1С согласно их определения:
УникальныйИдентификатор (UUID) - Предназначен для создания и хранения глобального уникального идентификатора GUID.
Данный объект может быть сериализован в/из XML. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: UUID
т.е. идентификатор базы данных. Как его определить?
У нас консолидирующая база - УПП, она скоро умрет, но она родитель всех остальных баз - УТ10.3, УТ11, а теперь еще БП2.0... Как выделить ее базовую часть в GUID, чтобы по ней создавать свои GUID-ы для сохранения наследственных признаков?
29 PR
 
16.07.11
10:14
(16) А, ну тогда (16), в котором из строки пустого ГУИДа вычитается 6 символов, они берутся из артикула.
30 Aleksey
 
16.07.11
10:26
(28) Забудь про била. Для 1С это просто уникальный набор цифр в 16-ном формате. Какой идентификатор базы данных ты хочешь найти? Зачем он тебе.
31 Mikhail Volkov
 
16.07.11
11:31
(30) Такой же как в МОД Константа.IDD в формуле (9). Только в этой формуле не все СлучайноеЧисло(), Дата-время точно есть. В общем, хочу знать все составляющие ГУИДа
32 Aleksey
 
16.07.11
11:36
(31) Еще раз ГУИД от 1С к ГУИД от била имеет отдаленое отношения
33 Aleksey
 
16.07.11
11:37
GUID 1С формирует не по правилам Microsoft, а инкрементно.
В начале сеанса формируется стартовый GUID, r примеру
6F9619FF-8B86-D011-B42D-00CF4FC964F0
(c) v8: Где взять описание GUID, который в 1С 8?
34 Aleksey
 
16.07.11
11:40
Нету в GUID даты, нету. В 1C ом GUID нету.
Создайте новую конфу.
Создайте в ней справочник.
Заведите в справочнике пару элементов.
Выведите их "GUID"
Выйдите из 1С.
зайдите в 1С
создайте 1 элемент
покурите
создайт 2 ой элемент
Выведите 'GUiD'ы
Сожалею..
(c) v8: GUID и вычисление(восстановление) даты из него
35 Aleksey
 
16.07.11
11:44
1С при начале работы берет и генерит GUID.
При записи нового объекта записывает этот объект с этом ГУИД-ом.
Дальше он инкрементирует GUID. В области времени.
(c) v8: Диапазон идентификаторов (GUID) элементов справочника
36 Mikhail Volkov
 
16.07.11
12:28
(35) Спс, почитал по твоим ссылкам... остается верить, что GUID 1С - чисто случайное число. Мне это не подходит. Мне надо наоборот, исключить всякую случайность. К примеру, 12 символов - константа идентификации СуперМАГ + 20 цифр Артикул-дата-время. Чтобы заявки пришедшие одновременно из СуперМАГ с новым товаром в УТ10.3 и УТ11 сгенерировали один GUID! Свой GUID не 1С! Тема то как называется!? Надеялся продолжить, узнать мнение уважаемого Вуглускр1991.
Кстати, где на ИТС функция формирования GUID, на свежих дисках убрали чоли?
37 Mikhail Volkov
 
16.07.11
12:46
+ из СуперМАГ еще штрих-код можно брать к Артикул-дата-время. Не суть конечно, но главное исключить СлучайноеЧисло() из GUID. Жду критики...
38 Mikhail Volkov
 
16.07.11
13:13
А если окажется "случайность - не понятая закономерность", и в составе GUID есть аналог IDD базы?
39 Aleksey
 
16.07.11
13:27
(380 Плохо значит читал. Ищи, пока никто не нашел.

Еще раз 1С гуид - это просто идентификатор, который формируется один раз при начале работы. Дальше он тупо увеличивается на 1. И там нет аналога IDD базы

Что будет в версии 1С 9.0 - никто не знает, может что-то и поменяеться, а пока это просто НАБОР цифр в 16ти ричной системе

P.S. Интересно что ты хочешь услышать? Тебе длень делать, и ждешь когда скажут что так делать нельзя?
40 Aleksey
 
16.07.11
13:32
(37) - "СуперМАГ еще штрих-код можно брать к Артикул-дата-время."

Тебе что нужно просто уникальное число? Тогда есть функция для этого

Или тебе нужно чтобы при выгрузки гуид всегда был одинаковый у одной и той же позиции. Тогда дата и время каким боком?

Если у тебя артикул цифровой, и к примеру 6 символов,, то  можешь просто написать

00000000-0000-0000-000-00000ХХХХХХ, где ХХХХХХ артикул
Можешь преобразовать посимвольно в код символа и писать коды символов

В любом случае 1С все равно что ты напишешь, главное чтобы уникальность, а на остальное 1С плевать

P.S. И какая разница как 1С формирует символ, для 1С это просто первичный ключ, который должен быть уникальный. Никаких проверок на формат этого ключа нет в 1С
41 Mikhail Volkov
 
16.07.11
13:54
(40) Да, ты абсолютно прав. Нашел в своих архивах по 7.7:
// глСоздатьИдентификатор()
//
// Параметры:
//  Нет
//
// Возвращаемое значение:
//  Идентификатор (строка GUID)
//
// Описание:
//  Возвращает новый Идентификатор (GUID)
//
Функция глСоздатьИдентификатор()    Экспорт
   
   Если ЗагрузитьВнешнююКомпоненту("V7Plus.dll") <> 1 Тогда
           Сообщить("Ошибка загрузки компоненты V7+");
   КонецЕсли;                                        
   
   НТТРСистИнформ = СоздатьОбъект("AddIn.V7SysInfo");
   
   Возврат СокрЛП(НТТРСистИнформ.СоздатьGUID());
   
КонецФункции    // глСоздатьИдентификатор()

Входных параметров действительно нет! Сомнения одалели...
Основная теорема систематики: Новые системы плодят новые проблемы.