К статье
Практический материал

Разработка и Конфигурация · 10 мин

Генератор случайных чисел в 1С: создание и настройка

Как создать генератор случайных чисел в 1С: объект ГенераторСлучайныхЧисел, диапазоны, уникальные значения, примеры кода и типичные ошибки разработчиков.

В платформе 1С:Предприятие 8 есть встроенный объект ГенераторСлучайныхЧисел, который позволяет получать псевдослучайные числа без подключения внешних компонентов. Он подходит для тестовых данных, распределения нагрузки, генерации кодов и выборок. Объект доступен и на сервере, и на клиенте, в толстом и тонком клиенте, а также в веб-клиенте.

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

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

Создание объекта и первое случайное число

Объект создаётся конструктором Новый ГенераторСлучайныхЧисел(). Без параметров платформа сама выбирает начальное зерно (seed), поэтому при каждом запуске последовательность будет отличаться. Если передать в конструктор целое число, последовательность станет воспроизводимой — это удобно для тестирования.

Метод СлучайноеЧисло(НижняяГраница, ВерхняяГраница) возвращает целое число в указанном диапазоне включительно. Если границы не заданы, возвращается число от 0 до 4294967295 (максимальное значение беззнакового 32-битного целого).

Генератор = Новый ГенераторСлучайныхЧисел();

СлучайноеЗначение = Генератор.СлучайноеЧисло(1, 100);

Сообщить("Случайное число от 1 до 100: " + СлучайноеЗначение);

bsl
Генератор = Новый ГенераторСлучайныхЧисел();
Число = Генератор.СлучайноеЧисло(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. 1
    Создайте объект: Генератор = Новый ГенераторСлучайныхЧисел() — один раз, вне цикла
  2. 2
    Определите диапазон и вызовите СлучайноеЧисло(Мин, Макс) — границы входят в диапазон
  3. 3
    Для уникальных значений отсекайте дубликаты через Соответствие
  4. 4
    Для строк и дат преобразуйте случайное число в нужный тип (символ, секунды)
  5. 5
    Проверьте результат на тестовом наборе: повторяемость, граничные значения, отсутствие дублей

Где выполняется генерация: клиент и сервер

Объект ГенераторСлучайныхЧисел доступен в обоих контекстах. Для массовой генерации тестовых данных — тысяч документов или записей — выполняйте код на сервере, чтобы избежать лишних клиент-серверных вызовов. Для интерактивных сценариев в форме (например, кнопка «Заполнить случайно») генерация допустима и на клиенте.

При передаче случайных данных между клиентом и сервером помните, что сам генератор сериализации не подлежит — передавайте уже сгенерированные значения или массивы значений. Также учитывайте, что в фоновых заданиях генератор работает штатно, что удобно для пакетного создания тестовых данных без блокировки интерфейса.

Для заполнения тестовых баз удобно завести общий модуль с функциями СлучайноеЧисло, СлучайнаяСтрока, СлучайнаяДата и вызывать их из обработок заполнения. Это избавляет от дублирования кода и упрощает сопровождение.
ПЗ
Практическое замечание

Типичные ошибки и их последствия

Большинство проблем с генератором случайных чисел в 1С связано не с самим объектом, а с неправильной организацией кода. Ниже — ошибки, которые встречаются чаще всего.

Типичные ошибки
01
Создание генератора внутри цикла — серия одинаковых или сильно похожих чисел из-за совпадающих зёрен
02
Ожидание уникальности от СлучайноеЧисло() без фильтра дубликатов — повторы в выборке и сбои логики
03
Неверные границы диапазона: забыт сдвиг на -1 при выборе индекса массива — выход за границы или недостижимый последний элемент
04
Использование генератора для паролей и ключей — псевдослучайная последовательность предсказуема и небезопасна
05
Запрос уникальных чисел больше размера диапазона — бесконечный цикл и зависание сеанса

Отдельно стоит сказать о тестировании. Если вы проверяете код с фиксированным зерном, убедитесь, что в продуктивной версии зерно не задано явно — иначе все пользователи получат одинаковые «случайные» последовательности, что сведёт на нет смысл генерации.

Проверка качества результата

После внедрения генератора стоит убедиться, что распределение и поведение соответствуют ожиданиям. Простейшая проверка — сгенерировать большую выборку (например, 10 000 чисел) и подсчитать частоту появления каждого значения через соответствие. При равномерном распределении частоты должны быть близки друг к другу.

Контрольные точки

Как проверить результат

Значения на границах диапазона
Норма

Минимум и максимум периодически встречаются в выборке

Тревожный признак

Граничные значения не выпадают никогда — ошибка в границах

Повторяемость при запусках
Норма

Каждый запуск даёт новую последовательность (без фиксированного зерна)

Тревожный признак

Последовательности совпадают — генератор пересоздаётся или зерно задано явно

Уникальность набора
Норма

Количество уникальных значений равно запрошенному

Тревожный признак

Дубликаты — отсутствует фильтр через Соответствие

Для статистически значимых выводов о равномерности малой выборки недостаточно — случайные флуктуации на малых объёмах нормальны. Не спешите «чинить» генератор, увидев небольшой перекос на сотне чисел.

Итог

Что важно запомнить

ГенераторСлучайныхЧисел создаётся один раз и вызывается многократно; границы диапазона включаются; уникальность обеспечивается фильтром дубликатов; для криптографии встроенный генератор не подходит; воспроизводимость последовательности задаётся фиксированным зерном.

Частые вопросы

Можно ли получить дробное случайное число в 1С?

Метод СлучайноеЧисло() возвращает только целые числа. Для дробного значения сгенерируйте целое в расширенном диапазоне и разделите: например, СлучайноеЧисло(0, 10000) / 100 даст число от 0 до 100 с двумя знаками после запятой.

Почему при каждом вызове в цикле получаются одинаковые числа?

Скорее всего, объект генератора создаётся внутри цикла, и платформа инициализирует его одинаковым зерном. Вынесите создание генератора за пределы цикла и только вызывайте СлучайноеЧисло() внутри него.

Подходит ли генератор для создания паролей и токенов?

Нет. Встроенный генератор выдаёт псевдослучайную последовательность, которая при известном зерне полностью воспроизводима. Для паролей, ключей и токенов используйте криптографически стойкие средства.

Как сделать воспроизводимую последовательность для тестов?

Передайте в конструктор фиксированное целое число: Новый ГенераторСлучайныхЧисел(123). Каждый запуск с этим зерном выдаст одну и ту же последовательность, что удобно для автотестов и отладки.

Как выбрать случайную строку табличной части документа?

Сгенерируйте индекс: Генератор.СлучайноеЧисло(0, ТабличнаяЧасть.Количество() - 1), затем обратитесь к строке по этому индексу. Предварительно проверьте, что табличная часть не пуста, иначе получите ошибку обращения по недопустимому индексу.

Работает ли генератор в веб-клиенте и мобильной платформе?

Да, объект ГенераторСлучайныхЧисел доступен в тонком, веб-клиенте и на мобильной платформе. Различий в синтаксисе нет, но массовую генерацию данных всё же лучше выполнять на сервере ради производительности.