Получение случайного числа средствами 1С (пример функции)
Разработка - Универсальные функции
Функция СлучайноеЧисло(НачЧисло = 0,КонЧисло = 1,флЦелое = 0)
ТекВремя =ТекущееВремя();
СлЧисло = 0;
Пока ТекущееВремя() =ТекВремя Цикл
СлЧисло =СлЧисло + 1;
КонецЦикла;
СлЧисло =Число(Прав("000" +СлЧисло, 3)) / 1000;
// число от 0 до 0.999
СлЧисло =НачЧисло + (КонЧисло -НачЧисло) *СлЧисло;
// число от НачЧисло до КонЧисло
Возврат ?флЦелое = 1,Окр(СлЧисло, 0),СлЧисло);
КонецФункции
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)
ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.
30000 руб.
09.07.2026 1394 1 0
Загрузка и выгрузка в Excel Универсальные функции Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).
30.10.2025 8721 Abysswalker 11
Универсальные функции Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.
14.05.2025 14442 DeerCven 16
Инструментарий разработчика Универсальные функции Запросы Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Внешняя обработка для создания запроса на основании табличных данных.
22.07.2024 11930 276 ixijixi 10
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.
21.05.2024 68703 dimanich70 87
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.
1 стартмани
18.03.2024 9270 7 John_d 13
Универсальные функции Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.
12.02.2024 85724 atdonya 31
Универсальные функции Разработчик 1С:Предприятие 8 Бесплатно (free)
На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.
30.11.2023 13462 ke.92@mail.ru 18
Функция ПолучитьСлучайноеЧисло(Мин,Макс)
//вместо Randomize
Для н = 1 По 100 Цикл
Уник = Новый УникальныйИдентификатор;
КонецЦикла;
//генерируем GUID
Уник = СокрЛП(Новый УникальныйИдентификатор);
//оставляем только цифры
Уник = СтрЗаменить(Уник,"-","");
Уник = СтрЗаменить(Уник,"a","");
Уник = СтрЗаменить(Уник,"b","");
Уник = СтрЗаменить(Уник,"c","");
Уник = СтрЗаменить(Уник,"d","");
Уник = СтрЗаменить(Уник,"e","");
Уник = СтрЗаменить(Уник,"f","");
//знаменатель должен иметь такое же количество нулей + 1
Знаменатель = 10;
Для н = 2 По (СтрДлина(СтрЗаменить(Уник,Символы.НПП,""))) Цикл
Знаменатель = Знаменатель * 10;
КонецЦикла;
Случ = Число(Уник) / Знаменатель; //здесь получается дробное случайное число от 0 до 1
//преобразуем его в случайное число из заданного интервала, округляем до целого
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Возврат ЧислоИзИнтервала;
КонецФункции
| Код |
|---|
ГСЧ = Новый ГенераторСлучайныхЧисел(255);
Рэндом = ГСЧ.СлучайноеЧисло(0, 10000);
Показать полностью |
:)
Новый ГенераторСлучайныхЧисел(<НачальноеЧисло>)
Параметры:
<НачальноеЧисло> (необязательный)
Тип: Число.
Начальное число, которым инициализируется генератор случайных чисел.
Описание:
Генератор случайных чисел инициализируется начальным числом из параметра.
Последовательность случайных чисел для одного и того же начального числа будет одинакова.
нужно изменяющееся зерно задавать, например так
ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());
СлучайноеЧисло = ГенераторСлучайныхЧисел.СлучайноеЧисло(0, 99);
ГСЧ = Новый ГенераторСлучайныхЧисел;
Единиц = 0;
Двоек = 0;
Троек = 0;
//Проверим однородность
Для Счечтик= 1 По 1000 Цикл
СлучайноеЧисло = ГСЧ.СлучайноеЧисло(1,3);
Если СлучайноеЧисло=1 Тогда
Единиц = Единиц+1;
ИначеЕсли СлучайноеЧисло=2 Тогда
Двоек = Двоек+1;
ИначеЕсли СлучайноеЧисло=3 Тогда
Троек = Троек+1;
Иначе
Сообщить("Хрень");
КонецЕсли;
КонецЦикла;
Сообщить("Единиц:"+Единиц+", двоек:"+Двоек+", троек:"+Троек);
ПоказатьРезультат запустил код много раз:
Единиц:321, двоек:350, троек:329
Единиц:342, двоек:325, троек:333
Единиц:323, двоек:322, троек:355
Единиц:354, двоек:332, троек:314
Единиц:350, двоек:305, троек:345
Единиц:328, двоек:323, троек:349
Единиц:317, двоек:331, троек:352
Единиц:338, двоек:318, троек:344
Единиц:325, двоек:317, троек:358
Единиц:338, двоек:325, троек:337
Единиц:338, двоек:322, троек:340
Единиц:335, двоек:341, троек:324
Единиц:326, двоек:346, троек:328
Единиц:319, двоек:351, троек:330
Единиц:312, двоек:363, троек:325
Единиц:356, двоек:337, троек:307
Единиц:332, двоек:323, троек:345
Единиц:308, двоек:355, троек:337
Единиц:303, двоек:366, троек:331
Единиц:336, двоек:338, троек:326
Единиц:336, двоек:339, троек:325
Единиц:320, двоек:339, троек:341
Единиц:334, двоек:325, троек:341
Единиц:329, двоек:325, троек:346
Единиц:347, двоек:350, троек:303
Единиц:355, двоек:315, троек:330
Единиц:358, двоек:309, троек:333
Единиц:346, двоек:334, троек:320
Единиц:359, двоек:300, троек:341
Единиц:339, двоек:353, троек:308
Единиц:324, двоек:347, троек:329
Единиц:321, двоек:343, троек:336
Единиц:337, двоек:318, троек:345
Единиц:343, двоек:352, троек:305
Единиц:329, двоек:334, троек:337
Единиц:304, двоек:343, троек:353
при каком случае ГСЧ работает как какашка?
Видимо пофиксили, теперь нормально работает. 8 лет прошло от вашего сообщения до моего, припоминаю что действительно раньше не работало.
//НВЮ/ Получение Случайного Числа
//
// Параметры
// <Мин> - <Число> - Нижняя граница Равномерного Распределения
// <Макс> - <Число> - Верхняя граница Равномерного Распределения
//
// Возвращаемое значение:
// <Число> - Сгенерированное случайное число
//
Функция ПолучитьСлучайноеЧисло(Мин=0,Макс=100) Экспорт
//вместо Randomize
Для н = 1 По Макс Цикл
Уник = Новый УникальныйИдентификатор;
КонецЦикла;
//генерируем GUID
Уник = СокрЛП(Новый УникальныйИдентификатор);
//оставляем только цифры
Уник = СтрЗаменить(Уник,"-","");
Уник = СтрЗаменить(Уник,Символы.НПП,"");
Случ = 0;
//знаменатель должен иметь такую же разрядность
Знаменатель = 1;
Для н = 1 По (СтрДлина(Уник)) Цикл
ТекС = Сред(Уник,н,1);
Если ТекС="a" Тогда
Случ = Случ + Знаменатель*10;
ИначеЕсли ТекС="b" Тогда
Случ = Случ + Знаменатель*11;
ИначеЕсли ТекС="c" Тогда
Случ = Случ + Знаменатель*12;
ИначеЕсли ТекС="d" Тогда
Случ = Случ + Знаменатель*13;
ИначеЕсли ТекС="e" Тогда
Случ = Случ + Знаменатель*14;
ИначеЕсли ТекС="f" Тогда
Случ = Случ + Знаменатель*15;
ИначеЕсли ТекС="1" Тогда
Случ = Случ + Знаменатель;
ИначеЕсли ТекС="2" Тогда
Случ = Случ + Знаменатель*2;
ИначеЕсли ТекС="3" Тогда
Случ = Случ + Знаменатель*3;
ИначеЕсли ТекС="4" Тогда
Случ = Случ + Знаменатель*4;
ИначеЕсли ТекС="5" Тогда
Случ = Случ + Знаменатель*5;
ИначеЕсли ТекС="6" Тогда
Случ = Случ + Знаменатель*6;
ИначеЕсли ТекС="7" Тогда
Случ = Случ + Знаменатель*7;
ИначеЕсли ТекС="8" Тогда
Случ = Случ + Знаменатель*8;
ИначеЕсли ТекС="9" Тогда
Случ = Случ + Знаменатель*9;
КонецЕсли;
Знаменатель = Знаменатель * 16;
КонецЦикла;
Случ = Случ / Знаменатель; //здесь получается дробное случайное число от 0 до 1
//преобразуем его в случайное число из заданного интервала, округляем до целого
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Возврат ЧислоИзИнтервала;
КонецФункции //ПолучитьСлучайноеЧисло() Показать//НВЮ/ Получение Случайного Числа
//
// Параметры
// <Мин> - <Число> - Нижняя граница Равномерного Распределения
// <Макс> - <Число> - Верхняя граница Равномерного Распределения
//
// Возвращаемое значение:
// <Число> - Сгенерированное случайное число
//
Функция ПолучитьСлучайноеЧисло(Мин=0,Макс=100) Экспорт
//вместо Randomize
Для н = 1 По Макс Цикл
Уник = Новый УникальныйИдентификатор;
КонецЦикла;
//генерируем GUID
Уник = СокрЛП(Новый УникальныйИдентификатор);
//оставляем только цифры
Уник = СтрЗаменить(Уник,"-","");
Уник = СтрЗаменить(Уник,Символы.НПП,"");
Случ = 0;
//знаменатель должен иметь такую же разрядность
Знаменатель = 1;
Для н = 1 По (СтрДлина(Уник)) Цикл
ТекС = Сред(Уник,н,1);
Если ТекС="a" Тогда
Случ = Случ + Знаменатель*10;
ИначеЕсли ТекС="b" Тогда
Случ = Случ + Знаменатель*11;
ИначеЕсли ТекС="c" Тогда
Случ = Случ + Знаменатель*12;
ИначеЕсли ТекС="d" Тогда
Случ = Случ + Знаменатель*13;
ИначеЕсли ТекС="e" Тогда
Случ = Случ + Знаменатель*14;
ИначеЕсли ТекС="f" Тогда
Случ = Случ + Знаменатель*15;
ИначеЕсли ТекС="1" Тогда
Случ = Случ + Знаменатель;
ИначеЕсли ТекС="2" Тогда
Случ = Случ + Знаменатель*2;
ИначеЕсли ТекС="3" Тогда
Случ = Случ + Знаменатель*3;
ИначеЕсли ТекС="4" Тогда
Случ = Случ + Знаменатель*4;
ИначеЕсли ТекС="5" Тогда
Случ = Случ + Знаменатель*5;
ИначеЕсли ТекС="6" Тогда
Случ = Случ + Знаменатель*6;
ИначеЕсли ТекС="7" Тогда
Случ = Случ + Знаменатель*7;
ИначеЕсли ТекС="8" Тогда
Случ = Случ + Знаменатель*8;
ИначеЕсли ТекС="9" Тогда
Случ = Случ + Знаменатель*9;
КонецЕсли;
Знаменатель = Знаменатель * 16;
КонецЦикла;
Случ = Случ / Знаменатель; //здесь получается дробное случайное число от 0 до 1
//преобразуем его в случайное число из заданного интервала, округляем до целого
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Возврат ЧислоИзИнтервала;
КонецФункции //ПолучитьСлучайноеЧисло() Показать&НаКлиенте
Процедура ВамПредлогаетКомпьютерПриИзменении(Элемент)
Результат = ПолучитьСлучайноеЧисло(Мин,Макс, Элемент);
Сообщить (Результат);
КонецПроцедуры
Выдает ошибку, к преобразованию значения типу Число не может быть выполнено
{ВнешняяОбработка.ВнешняяОбработка1.Форма.БыкиИКоровыФорма.Форма(30)}: Преобразование значения к типу Число не может быть выполнено
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Help please
| Код |
|---|
//////////////////////////
// ГЕНЕРАТОР СЛУЧАЙНЫХ ЧИСЕЛ
// Автор Сергей Нефедов
//////////////////////////
Процедура randomize(а=0)
// сбрасывает генератор
Если а=0 тогда
randSeed=_getPerformanceCounter();
Иначе
randseed=а;
КонецЕсли;
КонецПроцедуры
Функция random()
// выдает случайное число 0 <= rand < 1
// интерпретация интерпритации AVB
// выдает последовательности лучше, и работает быстрее.
// (не замедляется)
// дело в том, что у него возникают очень большие числа,
// а 1С некокорректно с ними работает (операция %)
randSeed=(randSeed*1103515245+12345)%2147483648;
возврат randSeed/2147483648;
КонецФункции
Показать полностью |
Я долго искал возможность создания генератора случайных чисел в 1С7.7 и вот свершилось. Разброс чисел по оценке - отлично. Используется средствами VBScript
//Глобальный модуль
Функция _СлучайноеЧислоVBA(VBA, N, ВыдаватьНоль = 0) Экспорт
Если ВыдаватьНоль = 0 Тогда
N = N + 1;
КонецЕсли;
VBA.Language = "VBscript";
VBA.AddCode("
|Function GetRND(x)
|R = Int(0 + (Rnd() * x))
|GetRND = R
|End Function
|");
Результат=VBA.Modules("Global").CodeObject.GetRND(N);
Если Результат = 0 Тогда
Если ВыдаватьНоль = 0 Тогда
Результат = 1;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции Показать//Где-то в модуле формы
Процедура ПриОткрытии()
VBA = СоздатьОбъект("MSScriptControl.ScriptControl");
ДоЧисла = 3;
ВыдаватьНоль = 0;
Для Ц = 1 По 100 Цикл
Ранд = _СлучайноеЧислоVBA(VBA, ДоЧисла, ВыдаватьНоль);
Сообщить(Ранд);
КонецЦикла;
КонецПроцедуры ПоказатьПеред вызовом Rnd для инициализации генератора случайных чисел с начальным значением на основе системного таймера воспользуйтесь оператором Randomize без указания аргументов.
Код можно переписать так (будет генерить целые от 1 до 100):
Функция СлучайноеЧислоVBA(N)
VBA = СоздатьОбъект("MSScriptControl.ScriptControl");
VBA.Language = "VBscript";
VBA.AddCode("
|Function GetRND(x)
|Randomize
|R = Int(1 (Rnd() * x))
|GetRND = R
|End Function
|");
Возврат VBA.Modules("Global").CodeObject.GetRND(N);
КонецФункции
Процедура Тест()
Для Ц = 1 По 100 Цикл
Ранд = СлучайноеЧислоVBA(100);
Сообщить(Ранд);
КонецЦикла;
КонецПроцедуры
ПоказатьГСЧ = Новый ГенераторСлучайныхЧисел;
СлучЧисло = ГСЧ.СлучайноеЧисло(НецелоеЧисло1*100, НецелоеЧисло2*100);
СлучЧисло=Окр(СлучЧисло/100,2);
Вставлять в глобальный модуль
ЗЫЖ 7.7
Функция ПолучитьСлучайноеЧисло(МаксЗН,ВыдаватьНоль = 0) Экспорт Далее
//**********************************************************************
Функция ПолучитьСлучайноеЧисло(МаксЗН,ВыдаватьНоль = 0) Экспорт
//Увеличиваем на единицу, т.к. функция не возвращает верхний порог
МаксЗН = МаксЗН + 1;
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Результат= Цел(Скрипт.eval("Math.random()")*МаксЗН);
Если (ВыдаватьНоль = 0) и (Результат = 0) Тогда
Пока Результат = 0 Цикл
Результат = ПолучитьСлучайноеЧисло(МаксЗН,0)
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
ПоказатьГСЧ = Новый ГенераторСлучайныхЧисел();
Рэндом = ГСЧ.СлучайноеЧисло(0, 10000);
Описано в документации
Было:
Для объекта ГенераторСлучайныхЧисел использовался алгоритм Вихрь Мерсенна.
Стало:
Для объекта ГенераторСлучайныхЧисел используется генератор случайных чисел в соответствие со стандартом NIST SP 800-90A (алгоритм Hash_DRBG). Последовательность чисел, которая получается при создании двух разных объектов генератора случайных чисел с использованием одного и того же начального числа, будет различной.
Источник:
Генератор псевдослучайных чисел, то есть устройство, которое выдает последовательность чисел, отвечающую определенным статистическим критериям случайности.
Например можно воспользоватся классов из Win (mscorlib.dll):
Rnd = СоздатьОбъект("System.Random");
Сообщить(Rnd.Next());
В цикле за единицу времени множество итераций, поэтому генератор выдаст одинаковое число.
Проще и надежнее:
УИД = Новый УникальныйИдентификатор;
ГСЧ = Новый ГенераторСлучайныхЧисел(КодСимвола(Лев(УИД,5)) + КодСимвола(Лев(УИД,4)));//Получить случайное число в заданном диапазоне
//Примеры:
// СлучайноеЧисло(0, 100) // случайное целое число от 0 до 100
// СлучайноеЧисло(0, 100, 2) // случайное число от 0,00 до 100,00
// СлучайноеЧисло(0, 1, 3) // случайное число от 0,000 до 1,000
Функция СлучайноеЧисло(Мин, Макс, Разрядов = 0) Экспорт
Коэффициент = POW(10, Разрядов);
ГСЧ = Новый ГенераторСлучайныхЧисел();
СЧ = ГСЧ.СлучайноеЧисло(Мин * Коэффициент, Макс * Коэффициент) / Коэффициент;
Возврат СЧ
КонецФункции ПоказатьВы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 57305
Создание 03.10.08 06:26
Обновление 03.10.08 06:26
Просмотры 81382
Загрузки 0
Рейтинг
18
Комментарии 29
Код открыт Не указано
Рубрики Универсальные функции
Кому Разработчик
Тип файла Нет файла
Платформа Не имеет значения
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)