Имя: Пароль:
1C
1С v8
Штрихкодирование документов. Дубли штрихкодов.
,
0 St-Anger
 
18.04.19
12:55
Добрый день.
В подписке на событие документов ПередЗаписью записывается штрихкод в РС Штрихкоды.
Формируется шк путем поиска последнего + 1.
Документы формируются несколькими операторами. И если одновременно (разница может быть до 2х секунды) записываются документы, то формируются одинаковые штрихкоды.
Как этого можно избежать?
1 Йохохо
 
18.04.19
12:57
формировать ШК из номера документа
2 Черный маклер
 
18.04.19
12:59
(0) ускорить ...путем поиска последнего + 1...
3 Darych
 
18.04.19
12:59
Функцию напиши из номера/даты/времени создания - веселись)
4 shuhard
 
18.04.19
12:59
(0) в типовых это уже сделано через номер, в чем смысл дублирования БСП ?
5 St-Anger
 
18.04.19
13:56
Номер/дата/время создания хорошо, но хотелось бы засунуть в EAN13

(4) в УПП 8.3 я не нашел
6 Darych
 
18.04.19
14:00
(5) ну я же не сказал, что бери и лей туда это))))))))) ... я на выбор)
7 NorthWind
 
18.04.19
14:01
(5) во-первых, в чем проблема засунуть в ean13, во-вторых, в чем проблема применить старый как какашка мамонта code128, который тоже читают все сканеры и у которого нет ограничения на 13 символов?
8 yzimin
 
18.04.19
14:04
делаем блокировку, получаем последний номер, записываем, разблокируем.
9 St-Anger
 
18.04.19
14:05
(8) можно поподробнее?блокировку РС?
10 yzimin
 
18.04.19
14:09
(9) да пожалуйста
https://its.1c.ru/db/metod8dev#content:5839:hdoc
11 St-Anger
 
18.04.19
14:13
Еще такой нюанс,штрихкод записывается до того, как номер документа будет известен (ПередЗаписью). Сделано это для того, чтобы можно было записать штрихкод в реквизит документа. Понимаю, что это немного неправильно, но так удобно просматривать штрихкоды (сразу его видно в документе).
Поэтому, лучше было бы исправить задвоение штрихкодов, а не переписывать весь алгоритм.
12 Darych
 
18.04.19
14:14
РС ШК пофиг
13 igork1966
 
18.04.19
14:16
(11) Без блокировки не получится правильно получить следующий номер.
14 Darych
 
18.04.19
14:17
(13) а когда ты его собираешься блочить?
15 igork1966
 
18.04.19
14:18
(14) Эксклюзивная блокировка до чтения.
16 Darych
 
18.04.19
14:20
(15) беда...
17 igork1966
 
18.04.19
14:21
(15) только нужно наверное константу сделать как вариант, на нее ставить блокировку увеличивать и отпускать.
Только в таком варианте если документ не сохранят, а другой успеет записать следующий, будут дырки в нумерации
18 Darych
 
18.04.19
14:25
(17) у них 2 мадам работают)).. истерика 1 обеспечена
19 Йохохо
 
18.04.19
14:28
(11) добавь передзаписью что если ЭтоНовый() То установитьссылкунового() установитьновыйномер() запилитьшк()
ссылкунового мб не надо
20 Darych
 
18.04.19
14:30
(19) толку-то
21 d4rkmesa
 
18.04.19
14:35
(0) В УПП есть такой код, можно сделать аналогично:

УстановитьПривилегированныйРежим(Истина);
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЖурналСобытийЭД");
ЭлементБлокировки.УстановитьЗначение("ПрисоединенныйФайл", СсылкаНаЭД);
Блокировка.Заблокировать();
    Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ЕСТЬNULL(МАКСИМУМ(ЖурналСобытийЭД.НомерЗаписи), 0) + 1 КАК НомерЗаписи
        |ИЗ
        |    РегистрСведений.ЖурналСобытийЭД КАК ЖурналСобытийЭД
        |ГДЕ
        |    ЖурналСобытийЭД.ПрисоединенныйФайл = &ПрисоединенныйФайл";
        Запрос.УстановитьПараметр("ПрисоединенныйФайл", СсылкаНаЭД);
        НомерЗаписи = Запрос.Выполнить().Выгрузить()[0].НомерЗаписи;
МенеджерЗаписи                    = РегистрыСведений.ЖурналСобытийЭД.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ПрисоединенныйФайл = СсылкаНаЭД;
МенеджерЗаписи.НомерЗаписи        = НомерЗаписи;
МенеджерЗаписи.ВладелецЭД         = СсылкаНаЭД.ВладелецФайла;
МенеджерЗаписи.СтатусЭД           = СсылкаНаЭД.СтатусЭД;
МенеджерЗаписи.Дата               = ТекущаяДатаСеанса();
МенеджерЗаписи.Пользователь       = ПараметрыСеанса.ТекущийПользователь;
МенеджерЗаписи.Ответственный      = СсылкаНаЭД.Ответственный;
МенеджерЗаписи.Комментарий        = СсылкаНаЭД.Описание;
МенеджерЗаписи.Записать();
ЗафиксироватьТранзакцию();
22 Garykom
 
гуру
18.04.19
14:37
(0)(5) Ничего не напоминает Обжать GUID до 9 символов? ?
23 St-Anger
 
18.04.19
14:39
(21) Вот,это уже интересно))
24 St-Anger
 
18.04.19
14:46
(22) Я так и не понял, можно или нет? В обсуждении ответа не нашел.
25 Йохохо
 
18.04.19
14:47
(20) ну номер надо было, вот он номер, делай из него шк, пиши в реквизит
26 Rema Dan
 
18.04.19
15:01
(24) Вполне возможно. GUID ужимается до 20-ти символов по маске подходящей к code 128. Ещё +1 символ на префикс обозначающий тип документа. Я делал такое в прошлом году по мотивам этой статьи: http://ethicorum.ru/?p=161&lang=ru
27 St-Anger
 
18.04.19
15:06
(26) до 20 может,а мне нужно влезть в EAN13
28 Rema Dan
 
18.04.19
15:08
(27) Не нужно. Если поиск документов идёт по GUID, то ничего дополнительного в регистре сведений хранить не нужно, т.к. все документы в базе уже "проштрихкодированы".
29 lodger
 
18.04.19
15:09
(27) дался вам этот еан13. давно уже одномерные сканеры читают все подряд.
30 lodger
 
18.04.19
15:13
вы еще скажите, что одномерный штрихкод вы печатаете отдельно от самой ПФ на принтере этикеток.
31 St-Anger
 
18.04.19
15:14
(30) нет,штрихкод печатается с печатной формой
32 lodger
 
18.04.19
15:15
https://stackoverflow.com/questions/31696296/most-efficient-barcode-to-store-a-guid
пример прямой конвертации гуида в шк.
33 Darych
 
18.04.19
15:16
(30) казалось бы причем здесь сабж?
34 lodger
 
18.04.19
15:16
но еще проще открыть какую-нибудь конфу с ШК для ПФ и скопировать там. УТ какой-нибудь или УНФ.
35 St-Anger
 
18.04.19
15:19
(34) да в том то и дело, что уже все настроено в ПФ под еан13. Подогнаны размеры. ПФ самописная, в принципе можно переделать, но хочется свести изменения к минимуму.
36 Garykom
 
гуру
18.04.19
15:26
(35) Ну так и в 12 символов тоже можно УИД документа успешно ужать.
37 St-Anger
 
18.04.19
15:29
(36) как?
38 St-Anger
 
18.04.19
15:30
И будет ли он уникальным?
39 Garykom
 
гуру
18.04.19
15:31
(38) От количества документов зависит
40 shuhard
 
18.04.19
15:31
(5)[в УПП 8.3 я не нашел]
открыть УТ 11 что-то мешает ?
41 Rema Dan
 
18.04.19
15:35
(36) Тут же не просто до 12-ти символов. Тут до 12-ти символов, в которые умеет EAN13, а он вроде как умеет только в цифры. Т.е. сжатия без потерь не получиться.
(35) Если пренепременно нужен EAN13, то тут лучше забыть про сжатие GUID'ов и додумывать блокировки вокруг одновременных записей в регистр сведений.
42 Garykom
 
гуру
18.04.19
15:39
(41) Пофиг и в 12 цифр можно, если кол-во документов за все время меньше и делаются они на одном сервере.
43 St-Anger
 
18.04.19
15:44
Решил проблему так:
Получаем номер УстановитьНовыйНомер() до записи документа. Формируем штрихкод из номера и времени создания, ну и форму еще включил (1-я или 2-я)
Получается такой вид:
НомерДокумента = Прав(СокрЛП(ДокОбъект.Номер),5);
ДатаДокумента = Формат(ДокОбъект.Дата,"ДФ=ЧЧммсс");
ДокФорма = "0";
Если Найти(ДокОбъект.Номер,"-") > 0 Тогда
  ДокФорма = "1";
КонецЕсли;
Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(НомерДокумента, Истина) Тогда
  Штрихкод = "2" + ДокФорма + НомерДокумента + ДатаДокумента;
  Если СтрДлина(Штрихкод) = 13 Тогда
    Возврат Штрихкод;
  КонецЕсли;
КонецЕсли;
44 Garykom
 
гуру
18.04.19
15:45
(42) "Можно ли вытащить время из гуида?" + добавляем нечто.
http://catalog.mista.ru/public/635159/
45 St-Anger
 
18.04.19
15:47
Считаю, что вероятность одинакового номера и времени создания (часы-минуты-секунды) ничтожно мала.
46 St-Anger
 
18.04.19
15:48
Даже с периодичностью номера документа - месяц.
47 Йохохо
 
18.04.19
16:04
(46) может вероятность изменения периодичности ничтожно мала? и можно бесполезных 6 символов времени потратить на yy и номер
и юзер френдли это наоборот ДатаДокумента + НомерДокумента, а лучше "190" + НомерДокумента
48 Rema Dan
 
18.04.19
16:04
(44) Выглядит как-то рисковано копаться во внутренностях самих GUID'ов. 1С в любой момент что-нибудь тут поменяет и всё поедет. (45) Не стоит недооценивать 1С. Если дубль может быть, то стоит предусмотреть как это должен будет решать пользователь. Почему бы просто не добавить запрос с ДЛЯ ИЗМЕНЕНИЯ при получении последнего свободного штрихкода? Книга знаний: Ключевое слово ДЛЯ ИЗМЕНЕНИЯ
49 Darych
 
18.04.19
16:05
(47) вероятности, сука, такие.. 4 года в покер играл.. может пойти такой стрик)
50 Йохохо
 
18.04.19
16:06
кстати СтрДлина(Штрихкод) = 13 косяк, надо РаботаСТорговымОборудованием.КонтрольныйСимволEAN тринадцатым, а то придется сканеры программировать и всё переписывать
51 Garykom
 
гуру
18.04.19
16:13
(50) EAN уже давно стал GTIN из 14 цифр
52 St-Anger
 
18.04.19
16:23
(50) спасибо, добавил контрольный символ
53 St-Anger
 
18.04.19
16:28
(47) вероятность 100% - каждый месяц нумерация начинается заново. Если оставить только дату без времени + номер, то вероятность больше получить такую же комбинацию в следующих месяцах.
"190" + НомерДокумента каждый месяц будет задваиваться.
54 Darych
 
18.04.19
16:31
(53) хэш и посоли по-своему)))))))))))
55 St-Anger
 
18.04.19
16:35
(54) и в банку закатать?)))
56 St-Anger
 
18.04.19
17:52
Я тут подумал, а процедура УстановитьНовыйНомер() не выдаст ли мне одинаковые номера при одновременном проведении?
57 Йохохо
 
18.04.19
18:03
(56) нет)
58 Darych
 
18.04.19
18:04
(56)эта точно не даст)
59 St-Anger
 
18.04.19
20:24
ну и отлично)
60 Широкий
 
18.04.19
22:53
Я делал по-другому. Тупо генерация случайного штрих-кода и поиск что он еще не занят
61 Широкий
 
18.04.19
22:53
От осмысленного номера отказался ибо тупик
62 Garykom
 
гуру
18.04.19
23:00
(60) Какова вероятность что два случайных ШК совпадут при одновременной записи например 100 документов?
В базе этого ШК еще нет, сто последовательных (до момента записи) проверок ничего не дадут.

Один фуй надо РС блокировать с момента чтения-проверки до записи.
63 Garykom
 
гуру
18.04.19
23:05
Лично я тупо делаю константу "ПоследнийНомерШК" и использую ее.

С установкой на нее блокировки, тогда вторая блокировка исключительная не пройдет.

Или банальной проверкой кто последний писал если к номеру добавить еще идентификатор сеанса.
Тогда можно проверить мы ли записали последний номер или другой сеанс.

Если не мы то берем новый номер и заново пробуем его +1 и записать со своим идентификатором.
64 Garykom
 
гуру
18.04.19
23:08
(63)+ Самый плюс этого механизма что можно резервировать себе ШК целыми блоками.
Например в обработке которая документы или другие объекты разом загружает/создает, если известно их количество.
65 Сияющий в темноте
 
18.04.19
23:22
В чем проблема блокировку на регистр перед плюс 1 поставить,а при записи проверять,а нет ли еще таких,чтобы не перезатирать?

та по сути,сделайте справочник,где ссылка на документ,а код будет для штрихкода использоваться,неуникальность номера только при обмене можно словить.
66 St-Anger
 
19.04.19
09:15
На самом деле проблема глобальнее, чем я написал. У нас РИБ, и штрихкоды создаются на разные виды документов.Заказы записываются сразу в двух базах, поэтому тут необходимо привязыватья к реквизитам документа.
67 Garykom
 
гуру
19.04.19
09:30
(66) Префиксы ШК от префиксов РИБа же
68 Йохохо
 
19.04.19
09:30
(66) к префиксу, Ваш Кэп.
69 Йохохо
 
19.04.19
09:31
кек
Прав(Организация.Код,2)
70 Garykom
 
гуру
19.04.19
09:32
(69) Организация может быть и одна а базы в РИБе разные
71 St-Anger
 
19.04.19
10:03
Организация одна,префиксы буквенные
72 St-Anger
 
19.04.19
10:07
Префиксы РИБ я имею ввиду