Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 ноя 2024, 01:00

Генератор случайных чисел

Автор trialex3, 12 апр 2018, 10:08

0 Пользователей и 1 гость просматривают эту тему.

trialex3

Всем привет. Выручайте пожалуйста. Есть документ с созданным движением
Движения.АР_РегистрМаркировки.Записывать = Истина;
Движения.АР_РегистрМаркировки.Очистить();
Для Каждого ТекСтрокаОтработано Из Отработано Цикл
Движение = Движения.АР_РегистрМаркировки.Добавить();
Движение.ШтрихКод = ГенерацияУИ.ГенерацияУИ(Дата) + " "+ТекСтрокаОтработано.Характеристика;
Движение.ТипШтрихКода = "ТипШтрихкода";
Движение.Год = Прав(Год(Дата),2);
Движение.Месяц = Формат(Месяц(Дата),"ЧЦ=2; ЧВН=");
Движение.Дата = Дата;
Движение.ДокРегистратор = Ссылка;
Движение.КодИзделия = "2";
Движение.ЗаказНаПроизводство = ЗаказНаПроизводство;
Движение.ХарактеристикаНоменклатуры = ТекСтрокаОтработано.Характеристика;
КонецЦикла;

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

Уникальность измерения за счет ШтрихКода. Ему присваивается рандомно сгенерированный номер функцией ГенерацияУИ(Дата).
Вот сама функция.
      Функция ГенерацияУИ(ГУИДата) Экспорт
ГуиМесяц = Формат(Месяц(ГУИДата),"ЧЦ=2; ЧВН=");
ГуиГод = Прав(Год(ГУИДата),2);
Рандом = Новый ГенераторСлучайныхЧисел;
Рандом5Знаков = Формат(Рандом.СлучайноеЧисло(0,99999),"ЧЦ=5; ЧВН=; ЧГ=");

УИ = Строка("0")+Строка(ГУИГод)+Строка(Рандом5Знаков)+Строка(ГУИМесяц);

Признак = Ложь;
    Пока Признак = Ложь Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АР_РегистрМаркировки.КодИзделия
|ИЗ
| РегистрСведений.АР_РегистрМаркировки КАК АР_РегистрМаркировки
|ГДЕ
| АР_РегистрМаркировки.КодИзделия = &УИ";

Запрос.УстановитьПараметр("УИ",УИ);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Если ВыборкаДетальныеЗаписи.Количество() = 0 Тогда
Признак = Истина;
Возврат УИ;
КонецЕсли;
КонецЦикла;

КонецФункции


Далее если я начинаю проводить документ с 1ой строкой, то все работает

Но если добавить еще 1 и более строк то получается следующее

Как это побороть? Есть идеи?
1С:Предприятие 8.2 (8.2.19.130)
Управление производственным предприятием, редакция 1.3 (1.3.91.2)

trialex3


Sandi

Я бы документ-регистратор из реквизита перенесла в измерение, и добавила еще дополнительное измерение - НомерСтроки.
Этого уже будет достаточно для уникальности записей

trialex3

Цитата: Sandi от 12 апр 2018, 12:12
Я бы документ-регистратор из реквизита перенесла в измерение, и добавила еще дополнительное измерение - НомерСтроки.
Этого уже будет достаточно для уникальности записей
да вы правы, теперь строки попадают в регистр,

https://yadi.sk/i/To5K52M-3ULxv9

но в штрихкоде одинаковый серийник генерится. Хотя  функция вызывается в цикле. Т е она по идее должна новый генерить каждый раз как ее вызывают

KOI8-R

Цитата: trialex3 от 12 апр 2018, 12:28
Цитата: Sandi от 12 апр 2018, 12:12
Я бы документ-регистратор из реквизита перенесла в измерение, и добавила еще дополнительное измерение - НомерСтроки.
Этого уже будет достаточно для уникальности записей
да вы правы, теперь строки попадают в регистр,

https://yadi.sk/i/To5K52M-3ULxv9

но в штрихкоде одинаковый серийник генерится. Хотя  функция вызывается в цикле. Т е она по идее должна новый генерить каждый раз как ее вызывают
В общем модуле "ГенерацияУИ" часом не установлено повторное использование возвращаемых значений?

trialex3

Цитата: KOI8-R от 12 апр 2018, 12:56
Цитата: trialex3 от 12 апр 2018, 12:28
Цитата: Sandi от 12 апр 2018, 12:12
Я бы документ-регистратор из реквизита перенесла в измерение, и добавила еще дополнительное измерение - НомерСтроки.
Этого уже будет достаточно для уникальности записей
да вы правы, теперь строки попадают в регистр,

https://yadi.sk/i/To5K52M-3ULxv9

но в штрихкоде одинаковый серийник генерится. Хотя  функция вызывается в цикле. Т е она по идее должна новый генерить каждый раз как ее вызывают
В общем модуле "ГенерацияУИ" часом не установлено повторное использование возвращаемых значений?
там установлено "Не использовать"

Sandi

Цитата: trialex3 от 12 апр 2018, 10:08
Всем привет. Выручайте пожалуйста. Есть документ с созданным движением
Движение.ШтрихКод = ГенерацияУИ.ГенерацияУИ(Дата) + " "+ТекСтрокаОтработано.Характеристика; //////////Дата одна и та же, генерируется одно и то же число



Движение.ШтрихКод = ГенерацияУИ.ГенерацияУИ(ТекущаяДата()) + " "+ТекСтрокаОтработано.Характеристика;  //// Дата постоянно будет меняться и будет генерироваться новое число

или попробуйте так:
Движение.ШтрихКод = ГенерацияУИ.ГенерацияУИ(ЧисловойКодПоСсылке(Ссылка))+ТекСтрокаОтработно.НомерСтроки + " "+ТекСтрокаОтработано.Характеристика;  ////штрихкод будет содержжать в себе числовое представление ссылки и номер строки -  тоже уникальное сочетание.

Вот пример получения числового значения для формирования штрихкода при штрихкодировании печатных форм в 1С:

////////////////ВЗЯТО ИЗ МОДУЛЯ ШТРИХКОДИРОВАНИЕ ПЕЧАТНЫХ ФОРМ"
Функция ЧисловойКодПоСсылке(Ссылка) Экспорт
ШестнадчатиричноеЧисло = СтрЗаменить(Строка(Ссылка.УникальныйИдентификатор()),"-","");
Возврат ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(ШестнадчатиричноеЧисло);
КонецФункции

Функция ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(Знач Значение)

Значение = НРег(Значение);
ДлинаСтроки = СтрДлина(Значение);

Результат = 0;
Для НомерСимвола = 1 По ДлинаСтроки Цикл
Результат = Результат * 16 + СтрНайти("0123456789abcdef", Сред(Значение, НомерСимвола, 1)) - 1;
КонецЦикла;

Возврат Формат(Результат, "ЧГ=0");

КонецФункции
//////////////////////////////////////////////////////////////////////////////


trialex3

Цитата: Sandi от 12 апр 2018, 12:58
С текущей датой не получается. серийник одинаковый. Да и дата в формировании серийника участвует частично. только месяц и год. Уникальность идет за счет 5 цифр посередине, которые генерятся рандомно. Во всяком случае должны.

Sandi

тогда пробуйте второй вариант с ссылкой и номером строки. В этом случае вам год, месяц и характеристика не понадобятся для обеспечения уникальности штрихкода

KOI8-R

И еще в дополнение:
Вы когда проверяете наличие штрихкода в регистре, вы по факту с относительной уверенностью можете в пределах одного документа только первый штрихкод проверить. Т.к. проверяя второй вы не делаете запись первого провернного штрихкода в регистр. Соответственно система его не найдет и посчитает, что его можно присвоить и еще одной позиции в табличной части.

Теги:  

Похожие темы (5)

Рейтинг@Mail.ru

Поиск