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

28.10.16

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
RandomNumberGenerator
.epf 6,34Kb
6
6 Скачать (1 SM) Купить за 1 850 руб.

В данном примере показано, как можно сгенерировать строку длинной в 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С v8.3 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    28645    dimanich70    83    

151

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

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

1 стартмани

18.03.2024    4788    6    John_d    11    

57

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

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

12.02.2024    30789    atdonya    25    

59

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

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

30.11.2023    6379    ke.92@mail.ru    17    

66

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

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

28.08.2023    17612    YA_418728146    8    

170

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

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

2 стартмани

22.08.2023    4639    76    progmaster    11    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 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    19567    186    sapervodichka    112    

137
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Pasha1st 850 28.10.16 08:05 Сейчас в теме
Почему-то многие забывают о такой вещи, что если строка предназначена для человека (это генератор паролей, например), то не стоит допускать одновременного появления в пароле визуально схожих символов - 0 и O, 1, l и I. Их требуется или полностью исключить, или оставить только какой-то однозначный вариант, например только цифры. А ещё можно сделать управление вероятностью появления символа из конкретного набора (больше-меньше цифр).
okabysh; dj_serega; +2 Ответить
2. okabysh 8 29.10.16 20:05 Сейчас в теме
(1) Pasha1st,
Приветствую, Павел.
Спасибо за комментарий.
Если использовать для генерации паролей пользователю, тогда очень желательно убрать генерацию символов, которые могут быть похожи друг на друга. Я обновлю данную обработку с Вашим пожеланием, вдруг и мне позже пригодится.
Лично я использовал для добавления данного идентификатора в назначение платежа. Не буду вдаваться в подробности, но эти символы обрабатывает компьютер как с одной так и с другой стороны, поэтому компьютер точно поймет какой символ пришел к нему)
3. Alias 176 31.10.16 10:11 Сейчас в теме
(2) "Для меня уникальность значений очень критична, поэтому я сохраняю все сгенерированные случайные числа в регистр сведений"
А если не секрет, почему именно такой, не самый оптимальный с моей точки зрения, путь выбран? Это же хранить все выданные последовательности, да ещё и постоянно проверять уникальность...
Скажите, разве не проще было сделать самый обычный инкрементальный счётчик, хоть в той же константе? Никаких регистров, никаких проверок... Сплошные плюсы! Знай себе +1 делай и всё.
А если очень хочется иметь именно 6-тисимвольный код, можно преобразовать значение полученного счётчика в символьную последовательность, -- алгоритм абсолютно аналогичен переводу в другую систему счисления. Бонусом имеем ещё и отслеживаемую хронологию...
М-м?
4. okabysh 8 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Совский генератор выдает достаточно ровно распределенный рандом. Погоня автора за гарантированно уникальными значениями случайных чисел - это вообще лютый трэш и попрание самого принципа случайности, особенно при генерации пароля, т.к. с увеличением длины пароля рост числа комбинаций замедляется.
А если уж так хочется гарантировать случайность последовательности, боясь нескольких инициализаций ГСЧ в одну секунду системного времени, то можно создать общий модуль ПовтИсп на время сеанса и поместить туда функцию, возвращающую новый ГСЧ
Оставьте свое сообщение