|
Генерация уникального числа | ☑ | ||
---|---|---|---|---|
0
avlav
24.08.12
✎
06:55
|
Добрый день.
Нужна идея, как сгенерировать уникальное 5-ти значное число в пределах дня. Сейчас работает регистр сведений (счетчик), жуткие тормоза и проблема с параллельностью работы. Полученное значение нужно для обмена документами со спец. оборудованием. Всю голову уже сломал, придумал генерацию из секунды в дне и номера сеанса пользователя, но числа получаются очень большие. |
|||
1
Cube
24.08.12
✎
06:57
|
ГенераторСлучайныхЧисел.СлучайноеЧисло (RandomNumberGenerator.RandomNumber)
ГенераторСлучайныхЧисел (RandomNumberGenerator) СлучайноеЧисло (RandomNumber) Синтаксис: СлучайноеЧисло(<НижнийДиапазон>, <ВерхнийДиапазон>) Параметры: <НижнийДиапазон> (необязательный) Тип: Число. Нижний диапазон. Задается целым числом и не может быть меньше 0. Значение по умолчанию: 0 <ВерхнийДиапазон> (необязательный) Тип: Число. Верхний диапазон. Задается целым числом и не может быть больше 4294967295 (2^32 - 1), а также меньше значения параметра <НижнийДиапазон>. Значение по умолчанию: 4294967295 Возвращаемое значение: Тип: Число. Описание: Возвращает случайное целое число в заданном диапазоне. Нижний диапазон не может быть меньше 0, а верхний диапазон не может быть больше 2^32 - 1. Доступность: Тонкий клиент, сервер, толстый клиент, внешнее соединение. Пример: ГСЧ = Новый ГенераторСлучайныхЧисел(255); ГСЧ.СлучайноеЧисло(0, 10000); |
|||
2
Живой Ископаемый
24.08.12
✎
06:58
|
2(1) проверял?
|
|||
3
vis_tmp
24.08.12
✎
06:59
|
А просто текущая секунда?
24 * 60 * 60 - пятизначное |
|||
4
0xFFFFFF
24.08.12
✎
06:59
|
(1) уникальность не гарантируется
|
|||
5
Wobland
24.08.12
✎
06:59
|
ГСЧ или гуиды.. всё равно нужно где-то знать уже выданные номера. ну или использовать хитрый алгоритм генерации СЧ без повторов. кстати, счётчик предлагать?
|
|||
6
Cube
24.08.12
✎
07:01
|
(4) А, блин, точно :)
|
|||
7
0xFFFFFF
24.08.12
✎
07:01
|
(0) посмотри это
v8: v8: Время (секунд) с точностью 1 знак после запятой |
|||
8
0xFFFFFF
24.08.12
✎
07:02
|
+(7) тока 5 знаков не хватит.
А вообще почему только 5 знаков? |
|||
9
0xFFFFFF
24.08.12
✎
07:03
|
(0) "Сейчас работает регистр сведений (счетчик), жуткие тормоза и проблема с параллельностью работы. "
Вообще такого быть не должно.... Видимо там у вас НачатьТранзакцию(); ВыполнитьЕщеОднуТоннуКода(); УвеличитьСчетчик(); ЗафиксироватьТранзакцию(); |
|||
10
Cube
24.08.12
✎
07:04
|
(0) Так один день это 86400 секунд (24*60*60) - пятизначное число. Если в секунду не предполагается генерирование больше одного числа, то просто текущую секунду можно брать.
|
|||
11
Wobland
24.08.12
✎
07:06
|
(10) получается 13600 неучтённых секунд
|
|||
12
Cube
24.08.12
✎
07:07
|
(11) Значений ты хотел сказать?) Ну, про то, что нужно все 99999 значений иметь никто не говорил...
|
|||
13
Cube
24.08.12
✎
07:09
|
(0) Как вариант, может для обмена с оборудованием использовать планы обмена, а в качестве уникального числа использовать номер сообщения?
|
|||
14
Wobland
24.08.12
✎
07:11
|
(12) вот это я имел в виду ;)
В обыкновенном году 365 дней и 6 часов. Эти 6 часов суммируют и возникает еще один день. То есть, каждый 4-й год становится високосным. Но я задумался, а точно ли в году 365 дней и 6 часов? Оказалось, что и это не так. В обычном году 365 дней, 6 часов и еще 3 секунды. 3! Это вам может подтвердить любой астроном. Достаточно подняться к звездам с хронометром в руках, чтобы проследить за вращением Земли. Я это делал не раз. Марта Вам может подтвердить. 3 секунды неучтенного времени. 3 секунды почему-то сбрасывают со счета. Почему? |
|||
15
MSII
24.08.12
✎
07:11
|
Номер секунды уникальности не гарантирует - не факт, что в ту же секунду другой пользователь не пытается выполнить обмен. Хотя вероятность этого невысока.
|
|||
16
Cashtane
24.08.12
✎
07:13
|
(15) Вероятность всё равно остается. Только хотел отписаться по этому поводу. Боюсь без регистра тут всё таки не обойтись.
|
|||
17
Гобсек
24.08.12
✎
07:19
|
(0)Каждому пользователю предоставлять диапазон из ста чисел. Первое число из диапазона хранить в регистре. Когда конкретный пользователь использует все числа из диапазона, он получает новый диапазон.
В принципе та же схема, что и раньше, но к регистру будут обращаться в 100 раз реже. |
|||
18
Живой Ископаемый
24.08.12
✎
07:20
|
вы так говорите, будто пользователя тоже нельзя свести к числу.
|
|||
19
smaharbA
24.08.12
✎
07:32
|
Гарантированная уникальность числа
Для Сч=0 По 100000000000 Цикл Сообщить(Сч); КонецЦикла; |
|||
20
MSII
24.08.12
✎
07:51
|
В общем, что не придумывай, но если количество всех обменов в день может быть больше 99999, задача решения не имеет.
|
|||
21
smaharbA
24.08.12
✎
08:03
|
уникальных пятизначных может быть только 89999
|
|||
22
neckto
24.08.12
✎
08:04
|
(18) ПолучитьНомерСеанса() - но числа большие получаются, от 100 000 и более
|
|||
23
vde69
24.08.12
✎
08:08
|
док = документы.дляСвязи.новыйдокумент
док.записать код = получитьхешь(док.моментвремени) |
|||
24
avlav
24.08.12
✎
08:08
|
(9) Обращение к регистру ПередЗаписью, там в основном проверки
|
|||
25
MSII
24.08.12
✎
08:09
|
(21) В смысле? 90000 уже не уникально? :)
(22) В (18) пишется про пользователя, а не про сеанс. Пользователей обычно какое-то разумное количество, сеансов может быть больше, но нам интересны именно пользователи, как я понимаю ТС. |
|||
26
smaharbA
24.08.12
✎
08:09
|
Корректирую (19)
Для Сч=10000 По 99999 Цикл Сообщить(Сч); КонецЦикла; |
|||
27
avlav
24.08.12
✎
08:10
|
(23) код функции получитьхэш выложишь ?)
|
|||
28
smaharbA
24.08.12
✎
08:10
|
(25) в смысле 9999 уже не пятизначное
|
|||
29
avlav
24.08.12
✎
08:10
|
(26) Это как?
|
|||
30
vde69
24.08.12
✎
08:11
|
(27) http://infostart.ru/public/68432/
правда на 64 сервере не работает |
|||
31
smaharbA
24.08.12
✎
08:11
|
(29) числа все уникальные и все пятизначные - все в соответствие с тз
|
|||
32
MSII
24.08.12
✎
08:11
|
(23) Осталось хэш свести к уникальному 5-значному числу :)
|
|||
33
avlav
24.08.12
✎
08:13
|
(30) Сервер как раз х64
|
|||
34
MSII
24.08.12
✎
08:13
|
(26)(28) Празднуешь что-то?
|
|||
35
vde69
24.08.12
✎
08:13
|
(32) полной уникальности не будет, но вероятнось будет маленькая...
еще вариант - секунда + идсеанса |
|||
36
avlav
24.08.12
✎
08:15
|
(35) Нужна уникальность, секунда + Ид сеанса - число очень большое. К примеру, номер сеанса 50, последняя секунда дня, УИД=5086399
|
|||
37
vde69
24.08.12
✎
08:19
|
(36) длинна уменьшается хеш функцией
по этому делай уникальный номер любой длинны а потом его хешируй |
|||
38
sTOd
24.08.12
✎
08:26
|
(0) Элементарно Ватсон! Бери количество миллисекунд и всё.
|
|||
39
avlav
24.08.12
✎
08:26
|
(37) Хм, не могу придумать взаимнооднозначное соответствие диапазона от 100000 до бесконечности к от 0 до 99 999. Кстати, интересно, как формируется номер сеанса пользователя, какое макс. число.
|
|||
40
avlav
24.08.12
✎
08:27
|
(39) Хотя не от 100000 до бесконечности, будут дырки длинной 99 999 между номерами сеансов...
|
|||
41
sTOd
24.08.12
✎
08:27
|
Наколка:
http://help1c.com/faq/view/617.html |
|||
42
avlav
24.08.12
✎
08:28
|
(38) Гарантированной уникальности не будет.
Подогрею интерес, оборудование медицинское. Прикинь, сдашь кровь на гемоглобин, придет ответ - ганарея. |
|||
43
MSII
24.08.12
✎
08:36
|
(42) Ваша задача, в том виде, как она сформулирована в (0), решения не имеет, я повторюсь. Вы ограничиваете количество возможных идентификаторов (Х), но при этом не накладываете никакого ограничения на количество возможных обменов (Y). Соответственно, обменов всегда может быть больше, чем емкость идентификатора (для любого X есть Y такой что Y > X).
|
|||
44
smaharbA
24.08.12
✎
08:36
|
Так чем не устраивает (используя глобальную переменную) ?
М=Новый Массив(); ГСЧ=Новый ГенераторСлучайныхЧисел(); Нач=1000; Кон=9999; Ч=ГСЧ.СлучайноеЧисло(Нач,Кон); Для Сч=Нач По Кон Цикл Пока Не М.Найти(Ч)=Неопределено Цикл Ч=ГСЧ.СлучайноеЧисло(Нач,Кон); КонецЦикла; М.Добавить(Ч); Сообщить(Ч); КонецЦикла; один раз заполни в какое нибудь хранилище или файл, после выдергивай последовательно без чудес файл (хранилище) раз заполненный можно использовать вечно будет |
|||
45
smaharbA
24.08.12
✎
08:37
|
(43) не нуди
|
|||
46
Гобсек
24.08.12
✎
08:40
|
(42)Чем не устраивает (17)?
|
|||
47
Лоботряс
24.08.12
✎
08:42
|
(46) а если больше ста пользователей?
|
|||
48
Гобсек
24.08.12
✎
08:48
|
(47)Количество одновременных пользователей здесь будет ограничено скорее 1000, чем 100. Кроме того, можно подобрать другую длину диапазона. Если диапазон сделать 50, то количество пользователей будет ограничено числом 2000. Главное, что здесь обеспечивается уникальность и решается проблема быстродействия.
|
|||
49
Гобсек
24.08.12
✎
08:48
|
(48)->(47)
|
|||
50
AndyD
24.08.12
✎
08:56
|
(14)из за того что год не ровно 365 дней и 6 часов
год високосен, то есть содержит 366 дней, если: номер года кратен 400 (1600, 2000, 2400); остальные годы — номер года кратен 4 и не кратен 100 (… 1892, 1896, 1904, 1908…). |
|||
51
avlav
24.08.12
✎
08:58
|
(49) Хорошая идея, надо подумать
|
|||
52
Ursus maritimus
24.08.12
✎
09:00
|
(0) Случайное число от уникального отличаешь?
Новый УникальныйИдентификатор() используй |
|||
53
avlav
24.08.12
✎
09:01
|
(52) Отличаю, с легкостью. Смотри ограничение - 5 цифр
|
|||
54
acsent
24.08.12
✎
09:04
|
чем гуид то не подошел?
|
|||
55
avlav
24.08.12
✎
09:06
|
Там как бэ число больше получается, цифр 15
|
|||
56
H A D G E H O G s
24.08.12
✎
09:08
|
(55) И что?
|
|||
57
vde69
24.08.12
✎
09:09
|
сложный но быстрый вариант решения
1. делается РС где хранятся ВСЕ уже использованые номера 2. делается регистр для текущего разделения по диапазонам между сеансами измерения ID_Сеанса, реквизиты стартовый_номер, ФинишныйНомер 2. делается параметр сеанса при начале сеанса 1. блокируем регистр 2 (что-бы нельзя было получить уже занятый планируемый диапазон) 2. получаем список сеансов, по этому списку из регистра 2 получаем список занятых диапазонов, джойним его с регистром 1 и находим свободный диапазон 3. записываем свободный диапазон в регистр 2 и сохраняем параметры в параметр сеанса при необходимости получения номера тупо инкремируем нижнюю границу лежащую в параметре сеанса и для фиксации - пишем в регист 1 если сеансов много - можно немного оптимизировать процесс выделения диапазона плюсы - скорость, медленные операции выполняются при инициализации сеанса минусы - резерв номеров |
|||
58
Sserj
24.08.12
✎
09:09
|
Чего то я не понял, если нужно просто уникальное в дне, зачем регистры?
Просто константа и увеличивать ее на 1 |
|||
59
avlav
24.08.12
✎
09:14
|
(56)->(0) 5 цифр надо
|
|||
60
Cube
24.08.12
✎
09:15
|
Мой вариант:
ГСЧ = Новый ГенераторСлучайныхЧисел(); СлучайноеЧисло = (ТекущаяДата() - НачалоДня(ТекущаяДата())) + ГСЧ.СлучайноеЧисло(0, 9999); В обработке со следующим кодом: МассивЧисел = Новый Массив; КоличествоЧисел = 0; ВремяНачала = ТекущаяДата(); ГСЧ = Новый ГенераторСлучайныхЧисел(); СлучайноеЧисло = (ТекущаяДата() - НачалоДня(ТекущаяДата())) + ГСЧ.СлучайноеЧисло(0, 9999); Пока МассивЧисел.Найти(СлучайноеЧисло) = Неопределено Цикл ОбработкаПрерыванияПользователя(); МассивЧисел.Добавить(СлучайноеЧисло); КоличествоЧисел = КоличествоЧисел + 1; СлучайноеЧисло = (ТекущаяДата() - НачалоДня(ТекущаяДата())) + ГСЧ.СлучайноеЧисло(0, 9999); КонецЦикла; Сообщить("За " + (ТекущаяДата() - ВремяНачала) + " сек. выбрано " + КоличествоЧисел + " уничальных пятизначных чисел."); Получаем результат (кнопку нажимал активно, раза 3 в секунду): За 0 сек. выбрано 63 уничальных пятизначных чисел. За 0 сек. выбрано 148 уничальных пятизначных чисел. За 0 сек. выбрано 64 уничальных пятизначных чисел. За 0 сек. выбрано 132 уничальных пятизначных чисел. За 0 сек. выбрано 178 уничальных пятизначных чисел. За 0 сек. выбрано 88 уничальных пятизначных чисел. За 0 сек. выбрано 94 уничальных пятизначных чисел. За 0 сек. выбрано 125 уничальных пятизначных чисел. За 0 сек. выбрано 127 уничальных пятизначных чисел. За 0 сек. выбрано 85 уничальных пятизначных чисел. За 0 сек. выбрано 85 уничальных пятизначных чисел. За 0 сек. выбрано 103 уничальных пятизначных чисел. За 0 сек. выбрано 109 уничальных пятизначных чисел. За 0 сек. выбрано 154 уничальных пятизначных чисел. За 0 сек. выбрано 115 уничальных пятизначных чисел. За 0 сек. выбрано 205 уничальных пятизначных чисел. За 0 сек. выбрано 92 уничальных пятизначных чисел. За 0 сек. выбрано 71 уничальных пятизначных чисел. За 0 сек. выбрано 214 уничальных пятизначных чисел. За 0 сек. выбрано 22 уничальных пятизначных чисел. За 0 сек. выбрано 157 уничальных пятизначных чисел. За 0 сек. выбрано 116 уничальных пятизначных чисел. За 0 сек. выбрано 107 уничальных пятизначных чисел. За 0 сек. выбрано 194 уничальных пятизначных чисел. За 0 сек. выбрано 255 уничальных пятизначных чисел. За 0 сек. выбрано 25 уничальных пятизначных чисел. За 0 сек. выбрано 111 уничальных пятизначных чисел. За 0 сек. выбрано 77 уничальных пятизначных чисел. За 0 сек. выбрано 73 уничальных пятизначных чисел. За 0 сек. выбрано 251 уничальных пятизначных чисел. За 0 сек. выбрано 292 уничальных пятизначных чисел. За 0 сек. выбрано 89 уничальных пятизначных чисел. За 0 сек. выбрано 215 уничальных пятизначных чисел. За 0 сек. выбрано 70 уничальных пятизначных чисел. За 0 сек. выбрано 223 уничальных пятизначных чисел. За 0 сек. выбрано 18 уничальных пятизначных чисел. За 0 сек. выбрано 64 уничальных пятизначных чисел. За 0 сек. выбрано 70 уничальных пятизначных чисел. За 0 сек. выбрано 192 уничальных пятизначных чисел. За 0 сек. выбрано 91 уничальных пятизначных чисел. За 0 сек. выбрано 134 уничальных пятизначных чисел. За 0 сек. выбрано 115 уничальных пятизначных чисел. За 0 сек. выбрано 124 уничальных пятизначных чисел. За 0 сек. выбрано 44 уничальных пятизначных чисел. За 0 сек. выбрано 90 уничальных пятизначных чисел. За 0 сек. выбрано 181 уничальных пятизначных чисел. За 0 сек. выбрано 66 уничальных пятизначных чисел. За 0 сек. выбрано 42 уничальных пятизначных чисел. За 0 сек. выбрано 31 уничальных пятизначных чисел. За 0 сек. выбрано 176 уничальных пятизначных чисел. За 0 сек. выбрано 74 уничальных пятизначных чисел. За 0 сек. выбрано 104 уничальных пятизначных чисел. За 0 сек. выбрано 101 уничальных пятизначных чисел. За 0 сек. выбрано 108 уничальных пятизначных чисел. За 0 сек. выбрано 113 уничальных пятизначных чисел. За 0 сек. выбрано 90 уничальных пятизначных чисел. За 0 сек. выбрано 84 уничальных пятизначных чисел. За 0 сек. выбрано 99 уничальных пятизначных чисел. За 0 сек. выбрано 163 уничальных пятизначных чисел. За 0 сек. выбрано 119 уничальных пятизначных чисел. За 0 сек. выбрано 88 уничальных пятизначных чисел. За 0 сек. выбрано 167 уничальных пятизначных чисел. За 0 сек. выбрано 94 уничальных пятизначных чисел. За 0 сек. выбрано 164 уничальных пятизначных чисел. За 0 сек. выбрано 106 уничальных пятизначных чисел. За 0 сек. выбрано 107 уничальных пятизначных чисел. За 0 сек. выбрано 38 уничальных пятизначных чисел. За 0 сек. выбрано 194 уничальных пятизначных чисел. За 0 сек. выбрано 143 уничальных пятизначных чисел. За 0 сек. выбрано 180 уничальных пятизначных чисел. За 0 сек. выбрано 179 уничальных пятизначных чисел. За 0 сек. выбрано 52 уничальных пятизначных чисел. За 0 сек. выбрано 43 уничальных пятизначных чисел. За 0 сек. выбрано 136 уничальных пятизначных чисел. За 0 сек. выбрано 167 уничальных пятизначных чисел. За 0 сек. выбрано 230 уничальных пятизначных чисел. За 0 сек. выбрано 118 уничальных пятизначных чисел. За 0 сек. выбрано 34 уничальных пятизначных чисел. За 0 сек. выбрано 123 уничальных пятизначных чисел. За 0 сек. выбрано 11 уничальных пятизначных чисел. За 0 сек. выбрано 189 уничальных пятизначных чисел. За 0 сек. выбрано 66 уничальных пятизначных чисел. Как видно, самое маленькое значение - 18 уникальных значений в секунду. Код можно и модернизировать, добиваясь большей уникальности, но идея, я думаю всем понятна. |
|||
61
avlav
24.08.12
✎
09:16
|
(60) Нет гарантированной уникальности.
|
|||
62
sTOd
24.08.12
✎
09:17
|
(42) Стопудово будет! Уже проверено.
|
|||
63
Sserj
24.08.12
✎
09:18
|
Ну так скажите мне пожалуйста, почему просто константа не подходит, обнуляющаяся в полночь???
|
|||
64
Cube
24.08.12
✎
09:18
|
(61) У тебя при любом раскладе, даже если ты будешь ГУИДы использовать, не будет 100% гарантии. Есть допустимая вероятность, отсюда и надо плясать.
|
|||
65
avlav
24.08.12
✎
09:19
|
(48), (57) Похоже, что ничего другого не остается, разделителем диапазонов будет Пользователь (спр. Пользователи). Единственный минус, исключительная блокировка на всю таблицу, когда диапазон у пользователя заканчивается.
|
|||
66
jenny_tea
24.08.12
✎
09:20
|
я бы сделала 2 константы: 1 дата, 2 число
Если НачалоДня(ТекущаяДата())<>Константа.ДатаДня.Получить() Тогда Константа.ДатаДня.Установить(НачалоДня(ТекущаяДата())); УникальноеЧисло = 10000; Иначе УникальноеЧисло = Константа.УникальноеЧисло.Получить()+1; конецесли; Константа.УникальноеЧисло.Установить(УникальноеЧисло); |
|||
67
avlav
24.08.12
✎
09:21
|
(64) Я ГУИДы не собирался использовать, нужна 100 % уникальность. см (42)
|
|||
68
avlav
24.08.12
✎
09:21
|
(66) Константы нельзя, при записи заблокируются все константы.
|
|||
69
jenny_tea
24.08.12
✎
09:23
|
Тогда РС, и брать срез последних
|
|||
70
MSII
24.08.12
✎
09:25
|
(69) все варианты, предполагающие работу с таблицами БД - медленные
|
|||
71
avlav
24.08.12
✎
09:25
|
(43) Ок, ограничение на колво обменов - 5ти значное
|
|||
72
avlav
24.08.12
✎
09:26
|
(70) Согласен, потому и задал вопрос (0) как уйти от запись в БД.
|
|||
73
MSII
24.08.12
✎
09:27
|
(67) Кстати, не думал считать номер секунды не от начала реального дня, а от начала "условного рабочего дня"? Высвобождаются 2 бита.
|
|||
74
avlav
24.08.12
✎
09:27
|
(73) Номер секунды в чистом виде не походит, и еще, нужна уникальность в пределах дня, поэтому считать от начала дня - нормально
|
|||
75
Cube
24.08.12
✎
09:28
|
(67) Тогда смотри (10) + регистр сведений в который пишется время последнего обмена, а при обмене проверку: если текущее время совпадает с временем последнего обмена, то подождать секунду.
|
|||
76
avlav
24.08.12
✎
09:28
|
(73) Про высвобождению 2-х бит не понял
|
|||
77
avlav
24.08.12
✎
09:29
|
(75) А как работает нумерация сообщений, полагаю там тот же регистр сведений (условно) от которого я хочу уйти
|
|||
78
Cube
24.08.12
✎
09:30
|
(77) Ты про (13) что ли? Нет, там своя таблица.
|
|||
79
avlav
24.08.12
✎
09:31
|
(78) Таблица своя, но принцип тот же. Я ж написал - условно в скобках
|
|||
80
Cube
24.08.12
✎
09:31
|
(76) Наверное, он имеет ввиду, что если считать секунды не от 00:00:00, а от 08:00:00, то освобождается 28800 значений (8*60*60).
|
|||
81
Cube
24.08.12
✎
09:33
|
(0) Ладно, задам главный вопрос - зачем тебе это надо?)) В смысле, опиши всю картину, как это число применяешь потом?
|
|||
82
avlav
24.08.12
✎
09:33
|
(80) Понятно.
|
|||
83
Ursus maritimus
24.08.12
✎
09:33
|
Сдается мне, что (0) где-то 3,14здит. 5значное число предполагает не более 100 тыс. записей в регистре сведений в сутки (В СУТКИ!!!!). При этом автор умудряется получить какие-то бешеные тормоза??? Может в руках проблема?
|
|||
84
avlav
24.08.12
✎
09:36
|
см (42) Пользователь вносит док-т Обращение пациента, в документ записывается уникальный в дне номер. По этому номеру происходит обмен с медицинским оборудованием.
|
|||
85
Cube
24.08.12
✎
09:37
|
(84) Капец, приехали... А чем тебе номер документа не угодил?
|
|||
86
Ursus maritimus
24.08.12
✎
09:38
|
(85)+100500
|
|||
87
avlav
24.08.12
✎
09:38
|
(83) Может и в руках, вот код, не знаю как тут правильно вставлять:
ПередЗаписью //Проверки Менеджер=РегистрСведений.Нумератор.ПолучитьМенеджерЗаписи(); Менеджер.Период = Дата; Менеджер.Прочитать() ТекНомер=Менеджер.Номер+1; Менеджер.Номер=ТекНомер; Менеджер.Период=Дата; Менеджер.Записать() КонецПроцедуры |
|||
88
Sserj
24.08.12
✎
09:39
|
(84) Что то мне сдается обмен с медицинским оборудованием никак не чиселками производится а битами, а там поле для полета фантазии безгранично и использовать можно не 10-ричную систему :)
|
|||
89
avlav
24.08.12
✎
09:39
|
(87) ЦУП показывает ожидание блокировок на строке Менеджер.Прочитать() - доходит до 25 секунд. Большая интенсивность ввода документов
|
|||
90
avlav
24.08.12
✎
09:40
|
(85) В БД несколько организаций, нумерация в каждой своя.
|
|||
91
Ursus maritimus
24.08.12
✎
09:40
|
Судя по (84) и (87). В (83) я был прав...
|
|||
92
avlav
24.08.12
✎
09:40
|
(88) На входе оборудование хавает xml
|
|||
93
Ursus maritimus
24.08.12
✎
09:41
|
(90) И Что?
|
|||
94
Sserj
24.08.12
✎
09:43
|
(87) а зачем тебе переодический регистр? Если история видимо нафик не нужна, зачем ее хранить в регистре и тем самым увеличивать расчеты?
|
|||
95
Cube
24.08.12
✎
09:43
|
(90) Да ё маё! В документ добавь реквизит, тип - число 5 символов. При присвоении документу нового номера (подписка на событие) присваивай реквизиту следующее по текущему дню значение. При выгрузке используй этот реквизит.
|
|||
96
avlav
24.08.12
✎
09:44
|
(95) Счас именно так и работает, как предлагаешь получить следующее значение?
|
|||
97
Cube
24.08.12
✎
09:45
|
(90) К тому же, каждой организации можно присвоить номер и добавлять его в качестве префикса к номеру документа...
|
|||
98
Cube
24.08.12
✎
09:45
|
(96) Запросом. Не нужно никаких регистров.
И сейчас совсем не так работает, не звизди :) |
|||
99
Ursus maritimus
24.08.12
✎
09:45
|
(95) НАХЕРА??
(90) Поставить в соответсвие буквенному префиксу число И ВСЕ АА=1 АБ=2 АА001 = 1001 АБ001 = 2001 АБ002 = 2002 |
|||
100
Cube
24.08.12
✎
09:47
|
(99) Опоздал)) См. (97).
Сотка! |
|||
101
avlav
24.08.12
✎
09:47
|
Номер документа - строка, длина 10 символов, нумерация уникальная в пределах года.
|
|||
102
qeos
24.08.12
✎
09:47
|
а если просто константу завести и инкрементировать просто?
|
|||
103
Ursus maritimus
24.08.12
✎
09:48
|
(100) Не. Ты предлагаешь менять префикс в номере документа, а я нет.
|
|||
104
avlav
24.08.12
✎
09:48
|
Номер документа - строка, длина 10 символов, нумерация в пределах года.
|
|||
105
Reset
24.08.12
✎
09:48
|
А чем не подходит поле код в справочнике?
|
|||
106
Ursus maritimus
24.08.12
✎
09:49
|
(101) И че? Поставь 5 символов и в пределах дня.
|
|||
107
Reset
24.08.12
✎
09:49
|
*или номер документа с периодичностью день
|
|||
108
Ursus maritimus
24.08.12
✎
09:49
|
(106)+Вернее 5 символов можно не ставить
|
|||
109
Cube
24.08.12
✎
09:49
|
(101) Нумерацию можно и в пределах дня настроить, если что... Но и без этого можно обойтись, если в год документов меньше, чем 9999.
|
|||
110
Reset
24.08.12
✎
09:50
|
Автор изобретает велосипед какойто имхо
|
|||
111
Ненавижу 1С
гуру
24.08.12
✎
09:50
|
внешним запросом выбирать значение последовательности (SEQUENCE) в какой нибудь СУБД
|
|||
112
Cube
24.08.12
✎
09:50
|
(103) Я предлагаю заменять префикс. То же самое, что и ты предложил :)
|
|||
113
Ursus maritimus
24.08.12
✎
09:50
|
(110) Причем крайне кривоопый
|
|||
114
Ursus maritimus
24.08.12
✎
09:51
|
(112) возьми пирожок
|
|||
115
avlav
24.08.12
✎
09:51
|
(111) Те же грабли с блокировкой таблицы
|
|||
116
Reset
24.08.12
✎
09:53
|
(115) Какие еще грабли?
|
|||
117
Ненавижу 1С
гуру
24.08.12
✎
09:53
|
(115) там ничего не блокируется, именно для этого SEQUENCE и были придуманы
|
|||
118
LobS
24.08.12
✎
09:53
|
(0) Как работает генератор случайных чисел
http://habrahabr.ru/post/128666/#habracut |
|||
119
Reset
24.08.12
✎
09:54
|
Игра в угадайку. Понравится автору/не понравится
|
|||
120
avlav
24.08.12
✎
09:54
|
(119) Ты о чем?
|
|||
121
avlav
24.08.12
✎
09:57
|
(117) Можно потестировать, только я не понимаю, как записи могут не блокироваться и при этом соблюдается уникальность
|
|||
122
Cube
24.08.12
✎
09:58
|
(101) Вот ещё вариант, примерно такой же, как и (95):
Номер документа делай 5 символов в пределах дня (тип число) и добавляй реквизит "Номер документа" длиной 10 символов (тип строка). При записи документа делай номер документа (наш новый реквизит) по принципу: ПрефиксОрганизации + ДеньГода(НашДокумент.Дата) + НашДокумент.Номер. |
|||
123
Ненавижу 1С
гуру
24.08.12
✎
09:59
|
(121) конечно блокируется в общем-то, но вне транзакций, в своей маленькой транзакции
именно поэтому последовательности гарантируют уникальность, но не гарантируют пропущенных номеров |
|||
124
avlav
24.08.12
✎
10:03
|
(122) Нумерация док-тов внутри каждой организации должна быть своя по идеологическим соображениям
|
|||
125
Reset
24.08.12
✎
10:05
|
(120)
(110) -> (105) -> (107) |
|||
126
Cube
24.08.12
✎
10:06
|
(124) Ну сделай номер документа 8 символов, три из которых префикс организации, уговорил...
|
|||
127
avlav
24.08.12
✎
10:08
|
(107)->(124), (105)- Уникальность в дне нужна. (110) - других вариантов не вижу
|
|||
128
avlav
24.08.12
✎
10:09
|
(126) Даже не думал уговаривать.
|
|||
129
Reset
24.08.12
✎
10:09
|
(127) Это никак не исключает возможностей как того, так и другого
|
|||
130
Reset
24.08.12
✎
10:11
|
(127) Двадцать раз уже сказали, что документ может нумероваться в предалах дня. Спрвочник может быть подчиненным и можно иметь сколь угодно параллельную нумерацию в пределах владельцев.
|
|||
131
avlav
24.08.12
✎
10:12
|
Двадцать раз уже ответил, что нумерация документов уникальна в каждой организации.
|
|||
132
Reset
24.08.12
✎
10:13
|
(131) 21 раз пояснили, что для разный организаций придумали префиксы
|
|||
133
avlav
24.08.12
✎
10:14
|
(132) И?
|
|||
134
avlav
24.08.12
✎
10:14
|
Попробуй на листочке пронумеровать два столбика от 1 до 10 - получишь уникальность?
|
|||
135
Cube
24.08.12
✎
10:16
|
(133) Ты что такой упоротый? Тебе уже 130 сообщений говорят, что не нужно тебе ничего, кроме номера документа... Если уникальность будет без учета организаций, то в разрезе организаций точно будет всё уникально...
|
|||
136
Reset
24.08.12
✎
10:16
|
(134) Я тебя не понимаю. Ладно, здесь есть более терпеливые, может поймут что тебе надо
|
|||
137
Cube
24.08.12
✎
10:16
|
(126) Этого делать нельзя, кстати. Я поторопился.
|
|||
138
avlav
24.08.12
✎
10:17
|
(135) см. (124) Нумерация док-тов внутри орг. должна быть СВОЯ, по идеологическим соображениям.
|
|||
139
Cube
24.08.12
✎
10:18
|
(138) Что значит СВОЯ? По порядку? Че за бред... Не счет-фактуры же нумеруешь...
|
|||
140
avlav
24.08.12
✎
10:20
|
(139) Ты с Заказчиками также разговариваешь? Ну вот уперся он, грит внутри организации должна быть своя непрерывная нумерация. Я ж не буду говорить ему, что он лох.
|
|||
141
Cube
24.08.12
✎
10:25
|
(140) Самый производительный для тебя вариант это либо (95), либо (122). Принцип я объяснил. Тебе осталось его понять и подпилить под свою задачу. Можно сделать так, что и волки сыты будут и овцы целы, но ты этого пока не понимаешь, т.к. уперся...
|
|||
142
Reset
24.08.12
✎
10:28
|
(140) Ты не заказчик, ты пришел помощи просить
|
|||
143
avlav
24.08.12
✎
10:45
|
Всем спасибо за помощь!
Резюмирую: нормальный вариант, предложен в (48),(57). (123) - тут повышаются затраты на подключение к внешней СУБД, можно потестить скорость работы, если приемлема, тоже вариант. Вариант (122) имеет место быть, при условии отсутствия необходимости сплошной нумерации доков внутри организации. Закрываю ветку. |
|||
144
Ursus maritimus
24.08.12
✎
10:47
|
Лол. А потом приходится за ними это гуано разгребать...
|
|||
145
Cube
24.08.12
✎
10:49
|
(143) С вариантом (122), как и с вариантом (95) можно иметь непрерывную нумерацию в разрезе организаций, ващета...
|
|||
146
Torquader
26.08.12
✎
01:38
|
когда мне нужен был уникальный номер в многопроцессорной системе-мне пришлось создавать файлы с номерами,и пока происходила ошибка создания-номер был занят-при больших номерах,конечно,существовала задержка,но вместо создания можно было просто прочитать директорию,чтобы отсеить заведомо занятые.
|
|||
147
mistеr
26.08.12
✎
02:30
|
(84) Механизм нумерации есть в платформе, и работает он эффективно, без блокировок "до 25 секунд". В этом топике же его неумело пытаются изобрести заново.
У тебя, как я понял, проблема в том, что док. Обращение пациента имеет свою нумерацию для разных организаций. А оборудование у них одно на всех, и обмены с ним также должны регистрироваться и нумероваться, уникально в пределах дня. Что отсюда следует? Сущность "обмен", или "анализ", или что там у вас, нужно выделить в отдельный документ. Настроить ему нумерацию в пределах дня, без префикса организации. В доке Обращение пациента вместо номера ссылку на док. Анализ. При программном его создании получаем уникальный номер. |
|||
148
КонецЦикла
26.08.12
✎
04:39
|
Ужос, 200 постов обсуждать ЭТО
Переходите на 8.3 штоле, там уж точно все реализовано :) |
|||
149
Torquader
26.08.12
✎
20:45
|
(147) Оно работает эффективно, если не пытаются в несколько десятков процессов создавать документы пачками.
Вообще-то, в нормальных SQL-серверах есть такое понятие, как генератор, которое специально для этого придумано, чтобы независимо от транзакций или параллельности выполнения выдавать уникальные значения на каждый вызов. И ситуация сильно зависит от того, сколько номеров нужно нагенерить - если это нумерация обращения пациента в устройство, то стандартная нумерация 1С вполне справится, если же нумерация нужна для передаваемых в устройство пакетов, а передаваться они будут несколько сот штук в секунду, то можно очень даже сильно подвесить 1С. |
|||
150
mistеr
27.08.12
✎
01:03
|
(149) >в несколько десятков процессов создавать документы пачками
Никогда еще не встречал реальную необходимость в подобном. В нише 1С естественно. |
|||
151
МишКа
27.08.12
✎
01:32
|
(0) ЭтаФорма.УникальныйИдентификатор чем не устраивает?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |