Разработка и Конфигурация · 10 мин
Генератор случайных чисел в 1С: создание и настройка
Как создать генератор случайных чисел в 1С: объект ГенераторСлучайныхЧисел, диапазоны, уникальные значения, примеры кода и типичные ошибки разработчиков.
В платформе 1С:Предприятие 8 есть встроенный объект ГенераторСлучайныхЧисел, который позволяет получать псевдослучайные числа без подключения внешних компонентов. Он подходит для тестовых данных, распределения нагрузки, генерации кодов и выборок. Объект доступен и на сервере, и на клиенте, в толстом и тонком клиенте, а также в веб-клиенте.
Важно понимать ограничение: встроенный генератор выдаёт псевдослучайные числа и не предназначен для криптографических задач — генерации паролей, ключей шифрования, токенов доступа. Для таких сценариев нужны специализированные средства защиты информации. Для прикладных же задач — перемешивания, тестирования, жеребьёвки — встроенного механизма достаточно.
Ниже разобраны создание объекта, работа с диапазонами и зерном инициализации, генерация уникальных значений, случайных строк и дат, а также типичные ошибки, которые приводят к повторяющимся последовательностям.
Создание объекта и первое случайное число
Объект создаётся конструктором Новый ГенераторСлучайныхЧисел(). Без параметров платформа сама выбирает начальное зерно (seed), поэтому при каждом запуске последовательность будет отличаться. Если передать в конструктор целое число, последовательность станет воспроизводимой — это удобно для тестирования.
Метод СлучайноеЧисло(НижняяГраница, ВерхняяГраница) возвращает целое число в указанном диапазоне включительно. Если границы не заданы, возвращается число от 0 до 4294967295 (максимальное значение беззнакового 32-битного целого).
Генератор = Новый ГенераторСлучайныхЧисел();
СлучайноеЗначение = Генератор.СлучайноеЧисло(1, 100);
Сообщить("Случайное число от 1 до 100: " + СлучайноеЗначение);
Генератор = Новый ГенераторСлучайныхЧисел();
Число = Генератор.СлучайноеЧисло(1, 100); // целое число от 1 до 100 включительноОбратите внимание: обе границы включаются в диапазон. Вызов СлучайноеЧисло(1, 6) моделирует бросок игрального кубика и может вернуть как 1, так и 6. Перепутывание этого поведения — частая причина ошибок «на единицу» в логике выборки.
Управление зерном инициализации
Зерно (seed) — это начальное значение, от которого строится вся последовательность псевдослучайных чисел. Два генератора с одинаковым зерном выдадут идентичные последовательности. Это свойство полезно, когда нужно воспроизвести тест или сравнить поведение двух алгоритмов на одинаковых данных.
// Воспроизводимая последовательность для тестов
Генератор = Новый ГенераторСлучайныхЧисел(42);
ПервоеЧисло = Генератор.СлучайноеЧисло(1, 1000);
ВтороеЧисло = Генератор.СлучайноеЧисло(1, 1000);
Если зерно не задано, платформа инициализирует генератор от системного источника энтропии. Однако при быстром последовательном создании нескольких генераторов в одном цикле они могут получить близкие или одинаковые зёрна и выдать совпадающие числа. Поэтому правило простое: один участок кода — один экземпляр генератора, который вызывается многократно.
Генерация уникальных случайных чисел
Стандартный метод не гарантирует уникальность: при повторных вызовах значения могут совпадать. Если нужен набор неповторяющихся чисел — например, случайные номера для выборки документов — используйте соответствие как фильтр дубликатов.
Функция СлучайныеУникальныеЧисла(Количество, Мин, Макс)
Результат = Новый Массив;
УжеВыбрано = Новый Соответствие;
Генератор = Новый ГенераторСлучайныхЧисел();
Пока Результат.Количество() < Количество Цикл
Число = Генератор.СлучайноеЧисло(Мин, Макс);
Если УжеВыбрано[Число] = Неопределено Тогда
УжеВыбрано.Вставить(Число, Истина);
Результат.Добавить(Число);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
У этого подхода есть ограничение: если запрошенное количество близко к размеру диапазона, цикл будет выполняться долго из-за частых коллизий. Когда нужно перемешать весь диапазон, эффективнее создать массив всех значений и случайно переставлять элементы местами (алгоритм тасования).
Случайные строки, даты и элементы списков
Случайная строка заданной длины
Для генерации кодов, тестовых наименований и идентификаторов соберите строку посимвольно из допустимого алфавита:
Функция СлучайнаяСтрока(Длина)
Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Генератор = Новый ГенераторСлучайныхЧисел();
Результат = "";
Для Сч = 1 По Длина Цикл
Позиция = Генератор.СлучайноеЧисло(1, СтрДлина(Алфавит));
Результат = Результат + Сред(Алфавит, Позиция, 1);
КонецЦикла;
Возврат Результат;
КонецФункции
Случайная дата в интервале
Дата в 1С внутренне представлена с точностью до секунды, поэтому случайную дату удобно получить прибавлением случайного числа секунд к начальной границе:
Генератор = Новый ГенераторСлучайныхЧисел();
ДатаНачала = Дата(2026, 1, 1);
ДатаОкончания = Дата(2026, 12, 31, 23, 59, 59);
РазницаВСекундах = ДатаОкончания - ДатаНачала;
СлучайнаяДата = ДатаНачала + Генератор.СлучайноеЧисло(0, РазницаВСекундах);
Случайный элемент массива или строки таблицы
Чтобы выбрать случайный элемент, сгенерируйте индекс от 0 до Количество() - 1. Помните, что индексация массивов в 1С начинается с нуля:
Индекс = Генератор.СлучайноеЧисло(0, Массив.Количество() - 1);
СлучайныйЭлемент = Массив[Индекс];
- 1Создайте объект: Генератор = Новый ГенераторСлучайныхЧисел() — один раз, вне цикла
- 2Определите диапазон и вызовите СлучайноеЧисло(Мин, Макс) — границы входят в диапазон
- 3Для уникальных значений отсекайте дубликаты через Соответствие
- 4Для строк и дат преобразуйте случайное число в нужный тип (символ, секунды)
- 5Проверьте результат на тестовом наборе: повторяемость, граничные значения, отсутствие дублей
Где выполняется генерация: клиент и сервер
Объект ГенераторСлучайныхЧисел доступен в обоих контекстах. Для массовой генерации тестовых данных — тысяч документов или записей — выполняйте код на сервере, чтобы избежать лишних клиент-серверных вызовов. Для интерактивных сценариев в форме (например, кнопка «Заполнить случайно») генерация допустима и на клиенте.
При передаче случайных данных между клиентом и сервером помните, что сам генератор сериализации не подлежит — передавайте уже сгенерированные значения или массивы значений. Также учитывайте, что в фоновых заданиях генератор работает штатно, что удобно для пакетного создания тестовых данных без блокировки интерфейса.
Для заполнения тестовых баз удобно завести общий модуль с функциями СлучайноеЧисло, СлучайнаяСтрока, СлучайнаяДата и вызывать их из обработок заполнения. Это избавляет от дублирования кода и упрощает сопровождение.
Типичные ошибки и их последствия
Большинство проблем с генератором случайных чисел в 1С связано не с самим объектом, а с неправильной организацией кода. Ниже — ошибки, которые встречаются чаще всего.
Отдельно стоит сказать о тестировании. Если вы проверяете код с фиксированным зерном, убедитесь, что в продуктивной версии зерно не задано явно — иначе все пользователи получат одинаковые «случайные» последовательности, что сведёт на нет смысл генерации.
Проверка качества результата
После внедрения генератора стоит убедиться, что распределение и поведение соответствуют ожиданиям. Простейшая проверка — сгенерировать большую выборку (например, 10 000 чисел) и подсчитать частоту появления каждого значения через соответствие. При равномерном распределении частоты должны быть близки друг к другу.
Как проверить результат
Минимум и максимум периодически встречаются в выборке
Граничные значения не выпадают никогда — ошибка в границах
Каждый запуск даёт новую последовательность (без фиксированного зерна)
Последовательности совпадают — генератор пересоздаётся или зерно задано явно
Количество уникальных значений равно запрошенному
Дубликаты — отсутствует фильтр через Соответствие
Для статистически значимых выводов о равномерности малой выборки недостаточно — случайные флуктуации на малых объёмах нормальны. Не спешите «чинить» генератор, увидев небольшой перекос на сотне чисел.
Что важно запомнить
ГенераторСлучайныхЧисел создаётся один раз и вызывается многократно; границы диапазона включаются; уникальность обеспечивается фильтром дубликатов; для криптографии встроенный генератор не подходит; воспроизводимость последовательности задаётся фиксированным зерном.
Частые вопросы
Можно ли получить дробное случайное число в 1С?
Метод СлучайноеЧисло() возвращает только целые числа. Для дробного значения сгенерируйте целое в расширенном диапазоне и разделите: например, СлучайноеЧисло(0, 10000) / 100 даст число от 0 до 100 с двумя знаками после запятой.
Почему при каждом вызове в цикле получаются одинаковые числа?
Скорее всего, объект генератора создаётся внутри цикла, и платформа инициализирует его одинаковым зерном. Вынесите создание генератора за пределы цикла и только вызывайте СлучайноеЧисло() внутри него.
Подходит ли генератор для создания паролей и токенов?
Нет. Встроенный генератор выдаёт псевдослучайную последовательность, которая при известном зерне полностью воспроизводима. Для паролей, ключей и токенов используйте криптографически стойкие средства.
Как сделать воспроизводимую последовательность для тестов?
Передайте в конструктор фиксированное целое число: Новый ГенераторСлучайныхЧисел(123). Каждый запуск с этим зерном выдаст одну и ту же последовательность, что удобно для автотестов и отладки.
Как выбрать случайную строку табличной части документа?
Сгенерируйте индекс: Генератор.СлучайноеЧисло(0, ТабличнаяЧасть.Количество() - 1), затем обратитесь к строке по этому индексу. Предварительно проверьте, что табличная часть не пуста, иначе получите ошибку обращения по недопустимому индексу.
Работает ли генератор в веб-клиенте и мобильной платформе?
Да, объект ГенераторСлучайныхЧисел доступен в тонком, веб-клиенте и на мобильной платформе. Различий в синтаксисе нет, но массовую генерацию данных всё же лучше выполнять на сервере ради производительности.