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

28.10.16

Разработка - Универсальные функции

Для 1С:Предприятие 8.2.17(и выше) или 8.3

Скачать файлы

Наименование Файл Версия Размер
RandomNumberGenerator
.epf 6,34Kb
6
.epf 6,34Kb 6 Скачать

В данном примере показано, как можно сгенерировать строку длинной в 6-ть символов, состоящие из цифр, маленьких и больших букв латиницы.

Процедура КнопкаСгенерировать()    
    Для Сч = 1 по 100 Цикл
        Сообщить(ГенерацияСлучайногоСимвола(ТекущаяУниверсальнаяДатаВМиллисекундах()));
    КонецЦикла;   
КонецПроцедуры

Функция ГенерацияСлучайногоСимвола(Счетчик)
    ГСЧ = Новый ГенераторСлучайныхЧисел(Счетчик);    
    СлучайнаяСтрока = "";
    // генерируем случайное число из 6-ти символов, например "d0c8Yf"
    Для Сч = 1 по 6 Цикл        
        Набор = ГСЧ.СлучайноеЧисло(1,3);    
        Если Набор = 1 Тогда
            // это число
            СлучайныйСимвол = ГСЧ.СлучайноеЧисло(0,9);    
        ИначеЕсли Набор = 2 Тогда
            // это Большая буква латиницы
            СлучайныйСимвол = Символ(ГСЧ.СлучайноеЧисло(65,90));
        ИначеЕсли Набор = 3 Тогда
            // это маленькая буква латиницы
            СлучайныйСимвол = Символ(ГСЧ.СлучайноеЧисло(97,122));
        КонецЕсли;
        СлучайнаяСтрока = СлучайнаяСтрока + СлучайныйСимвол;
    КонецЦикла;      
    Возврат(СлучайнаяСтрока);    
КонецФункции

!Особенность.Если ТекущаяУниверсальнаяДатаВМиллисекундах() вернет 2 и более одинаковых числа (т.е. сервер настолько быстрый, что 2 и более операции произошли в рамках 1 миллисекунды), будут сгенерированы 2 и более одинаковых "случайных числа".

Для меня уникальность значений очень критична, поэтому я сохраняю все сгенерированные случайные числа в регистр сведений и после генерирования нового случайного числа проверяю его на наличие в регистре сведений  (естественно, 99,9999% его там нет). Но если вдруг произойдет совпадение, генерирую новое случайное число и снова проверяю на наличие в регистре.

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2684    1    John_d    8    

55

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4620    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3965    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8850    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2078    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16157    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7244    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Pasha1st 837 28.10.16 08:05 Сейчас в теме
Почему-то многие забывают о такой вещи, что если строка предназначена для человека (это генератор паролей, например), то не стоит допускать одновременного появления в пароле визуально схожих символов - 0 и O, 1, l и I. Их требуется или полностью исключить, или оставить только какой-то однозначный вариант, например только цифры. А ещё можно сделать управление вероятностью появления символа из конкретного набора (больше-меньше цифр).
okabysh; dj_serega; +2 Ответить
2. okabysh 7 29.10.16 20:05 Сейчас в теме
(1) Pasha1st,
Приветствую, Павел.
Спасибо за комментарий.
Если использовать для генерации паролей пользователю, тогда очень желательно убрать генерацию символов, которые могут быть похожи друг на друга. Я обновлю данную обработку с Вашим пожеланием, вдруг и мне позже пригодится.
Лично я использовал для добавления данного идентификатора в назначение платежа. Не буду вдаваться в подробности, но эти символы обрабатывает компьютер как с одной так и с другой стороны, поэтому компьютер точно поймет какой символ пришел к нему)
3. Alias 176 31.10.16 10:11 Сейчас в теме
(2) "Для меня уникальность значений очень критична, поэтому я сохраняю все сгенерированные случайные числа в регистр сведений"
А если не секрет, почему именно такой, не самый оптимальный с моей точки зрения, путь выбран? Это же хранить все выданные последовательности, да ещё и постоянно проверять уникальность...
Скажите, разве не проще было сделать самый обычный инкрементальный счётчик, хоть в той же константе? Никаких регистров, никаких проверок... Сплошные плюсы! Знай себе +1 делай и всё.
А если очень хочется иметь именно 6-тисимвольный код, можно преобразовать значение полученного счётчика в символьную последовательность, -- алгоритм абсолютно аналогичен переводу в другую систему счисления. Бонусом имеем ещё и отслеживаемую хронологию...
М-м?
4. okabysh 7 02.11.16 01:15 Сейчас в теме
(3) Александр, спасибо за комментарий.
ответ на: "А если не секрет, почему именно такой, не самый оптимальный с моей точки зрения, путь выбран? Это же хранить все выданные последовательности, да ещё и постоянно проверять уникальность...".
Дело в том, что мне нужно знать, какому объекту я выдал в моем случае 6-ти значный код, поэтому я храню данные в регистре по 2-м измерениям: ссылку на объект и 6-ти значный код с типом "Строка". Когда потребуется найти объект, я его всегда найду, зная 6ть символов кода. В моем случае требовалось использовать минимум символов для кодирования, но чтобы их было нельзя подобрать, поэтому я не мог брать простой счетчик, к примеру, от 100000 + 1, +1, +1 ...
Еще можно использовать GUID, тогда уникальность практически на 100% гарантируется, но коду требуется уже 36 символов. Повторюсь, в моей ситуации 36 символов это много и следовательно не подходит. Поэтому я сделал, как сделал)

Основная цель публикации:
показать на "пальцах" как использовать ГенераторСлучайныхЧисел() и его особенность.
Так что пусть каждый реализует свою логику как считает нужным.
5. Alias 176 02.11.16 09:58 Сейчас в теме
(4) Ясно, спасибо за уточнение. "...Чтобы их было нельзя подобрать..." -- это ключевая фраза. Да, в таком случае автоинкрементируемый счётчик не очень подходит -- он слишком легко прогнозируем (что в других случаях могло бы быть плюсом).
6. vika64 75 21.05.20 22:13 Сейчас в теме
спасибо большое, сэкономили кучу времени!!
7. nuctoh 31 24.11.20 17:28 Сейчас в теме
БОЖЕЧКИ ЧТО ЗА ДИЧЬ?!
Чтобы в цикле на каждой итерации получать случайное число генератором случайных чисел, то всего лишь достаточно инициализировать его один раз вне цикла, и дальше вызывать ГСЧ.СлучайноеЧисло() столько раз, сколько захочется - 1Совский генератор выдает достаточно ровно распределенный рандом. Погоня автора за гарантированно уникальными значениями случайных чисел - это вообще лютый трэш и попрание самого принципа случайности, особенно при генерации пароля, т.к. с увеличением длины пароля рост числа комбинаций замедляется.
А если уж так хочется гарантировать случайность последовательности, боясь нескольких инициализаций ГСЧ в одну секунду системного времени, то можно создать общий модуль ПовтИсп на время сеанса и поместить туда функцию, возвращающую новый ГСЧ
Оставьте свое сообщение