Создать собственный генератор конструктором без аргументов, получить сто реальных целых значений от 1 до 6 и учесть каждое в своём массиве. Полностью проверить шесть фактических частот и их сумму, затем показать строковый отчёт. Конкретные частоты, повторяемость, различие выборок и криптографическая пригодность не обещаются.
Где и как запускать
Сервер; неглобальный непривилегированный общий модуль УчебныеБроски85. Клиент своей управляемой формы получает только строковый отчёт.
Подготовка
Будущий опыт выполняйте в собственной НОВОЙ пустой учебной конфигурации на платформе 8.5.1.1343, в толстом управляемом клиенте. Не в рабочей УТ, КА или УНФ. Все 100 учебных значений и счётчики создаются внутри функции без параметров, только в памяти.
В Конфигураторе: Общие → Общие модули → создать УчебныеБроски85. Сервер=Да; Глобальный=Нет; Привилегированный=Нет; Вызов сервера=Нет; Клиент (управляемое приложение)=Нет; Клиент (обычное приложение)=Нет; Внешнее соединение=Нет; Повторное использование возвращаемых значений=Не использовать. Основной блок вставьте ЦЕЛИКОМ в пустой модуль.
Общие → Общие формы → создать управляемую форму РаспределениеУчебныхБросков85. Один реквизит Результат85: Строка неограниченной длины, начальное значение пустое. Выведите его многострочным полем только для чтения.
В свойствах этой формы установите АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать и СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два разных перечисления, не Булево. Не создавайте обработчиков сохранения данных.
В форме создайте команду ВыполнитьБроски85, Действие=ВыполнитьБроски85; выведите кнопку. Второй блок вставьте ЦЕЛИКОМ в пустой модуль этой формы. Объект Команда передаёт сама платформа при нажатии кнопки; не подставляйте его вручную.
Общие → Общие команды → создать ОткрытьУчебныеБроски85 без параметра. Включите её в командный интерфейс своей учебной подсистемы. Третий блок вставьте ЦЕЛИКОМ в её пустой модуль; ОбработкаКоманды получает два настоящих штатных параметра.
Обновите конфигурацию учебной базы, откройте её толстым управляемым клиентом, откройте форму своей общей командой и нажмите ВыполнитьБроски85. Генератор, массив и все расчёты находятся на сервере; клиент получает только строковый отчёт.
Не нужны отдельная виртуальная машина, системный пользователь, сведения о всей метадате или согласие на запись: этот ограниченный опыт не читает объекты базы, файлы, Интернет и ничего не сохраняет. Не расширяйте вход сторонними объектами или бизнес-данными.
Конкретный опыт в 1С пока не запускался. Компиляция и настоящий успешный отчёт остаются будущей ручной проверкой; любое исключение или неверное фактическое значение — остановка без успешного результата.
Функция ПолучитьРаспределениеБросков85() Экспорт
Генератор = Новый ГенераторСлучайныхЧисел();
Если ТипЗнч(Генератор) <> Тип("ГенераторСлучайныхЧисел") Тогда
ВызватьИсключение "Не создан настоящий генератор без заданного начального числа";
КонецЕсли;
Счетчики = Новый Массив;
Если ТипЗнч(Счетчики) <> Тип("Массив") Или Счетчики.Количество() <> 0 Тогда
ВызватьИсключение "Нужен собственный новый пустой массив";
КонецЕсли;
Для НомерСтороны = 1 По 6 Цикл
Счетчики.Добавить(0);
КонецЦикла;
Если Счетчики.Количество() <> 6 Тогда
ВызватьИсключение "Нужны ровно шесть собственных счётчиков";
КонецЕсли;
Для Индекс = 0 По 5 Цикл
Начальное = Счетчики[Индекс];
Если ТипЗнч(Начальное) <> Тип("Число") Или Начальное <> 0 Тогда
ВызватьИсключение "Каждая собственная ячейка должна содержать настоящий числовой ноль";
КонецЕсли;
КонецЦикла;
Для НомерБроска = 1 По 100 Цикл
Выпало = Генератор.СлучайноеЧисло(1, 6);
Если ТипЗнч(Выпало) <> Тип("Число") Тогда
ВызватьИсключение "Генератор должен вернуть настоящее Число";
КонецЕсли;
Если Выпало < 1 Или Выпало > 6 Или Цел(Выпало) <> Выпало Тогда
ВызватьИсключение "Получено не целое число от 1 до 6";
КонецЕсли;
Индекс = Выпало - 1;
До = Счетчики[Индекс];
Если ТипЗнч(До) <> Тип("Число") Тогда
ВызватьИсключение "Повреждён собственный числовой счётчик";
КонецЕсли;
Если До < 0 Или До >= НомерБроска Или Цел(До) <> До Тогда
ВызватьИсключение "Частота перед очередным броском должна быть целой и допустимой";
КонецЕсли;
Счетчики.Установить(Индекс, До + 1);
После = Счетчики[Индекс];
Если ТипЗнч(После) <> Тип("Число") Или После <> До + 1 Тогда
ВызватьИсключение "Реальное увеличение собственного счётчика не подтверждено";
КонецЕсли;
КонецЦикла;
Если Счетчики.Количество() <> 6 Тогда
ВызватьИсключение "Размер собственного массива неожиданно изменился";
КонецЕсли;
Итого = 0;
Частоты = "";
Для Индекс = 0 По 5 Цикл
Частота = Счетчики[Индекс];
Если ТипЗнч(Частота) <> Тип("Число") Тогда
ВызватьИсключение "Каждая итоговая частота должна быть настоящим Число";
КонецЕсли;
Если Частота < 0 Или Частота > 100 Или Цел(Частота) <> Частота Тогда
ВызватьИсключение "Итоговая частота должна быть целой от 0 до 100";
КонецЕсли;
Итого = Итого + Частота;
Частоты = Частоты + "Сторона " + Строка(Индекс + 1) + ": " + Строка(Частота) + "; ";
КонецЦикла;
Если ТипЗнч(Итого) <> Тип("Число") Или Итого <> 100 Тогда
ВызватьИсключение "Сумма всех настоящих частот не равна числу учебных бросков";
КонецЕсли;
Возврат Частоты + "Всего учтено: " + Строка(Итого) + ". Генератор создан без заданного начального числа.";
КонецФункцииЦелый модуль собственной управляемой формы РаспределениеУчебныхБросков85
Общие → Общие формы → РаспределениеУчебныхБросков85 → пустой модуль формы. Вставить ЦЕЛИКОМ; Результат85 — строковое поле только для чтения; команда ВыполнитьБроски85 связана через Действие.
Настоящий обработчик своей команды — клиент; получение распределения — сервер. По границе передаётся только Строка, не генератор или массив.
&НаКлиенте
Процедура ВыполнитьБроски85(Команда)
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ВыполнитьБроски85" Тогда
ВызватьИсключение "Нужна настоящая собственная команда формы";
КонецЕсли;
Результат85 = "";
Попытка
Получено = ПолучитьРаспределениеНаСервере85();
Если ТипЗнч(Получено) <> Тип("Строка") Или Получено = "" Тогда
ВызватьИсключение "Сервер не вернул полный строковый отчёт";
КонецЕсли;
Результат85 = Получено;
Исключение
Результат85 = "Распределение НЕ получено. Опыт остановлен.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПолучитьРаспределениеНаСервере85()
Если ИмяФормы <> "ОбщаяФорма.РаспределениеУчебныхБросков85"
Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
ВызватьИсключение "Нужна собственная форма с отключённым сохранением данных";
КонецЕсли;
Отчет = УчебныеБроски85.ПолучитьРаспределениеБросков85();
Если ТипЗнч(Отчет) <> Тип("Строка") Или Отчет = "" Тогда
ВызватьИсключение "Не получен полный строковый результат собственного модуля";
КонецЕсли;
Возврат Отчет;
КонецФункцииЦелый модуль собственной общей команды ОткрытьУчебныеБроски85
Общие → Общие команды → ОткрытьУчебныеБроски85 → пустой модуль команды. Вставить ЦЕЛИКОМ; без параметра, включить команду в свой учебный командный интерфейс.
Толстый управляемый клиент; настоящее событие ОбработкаКоманды с обоими штатными параметрами.
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если ПараметрКоманды <> Неопределено
Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
ВызватьИсключение "Откройте свою учебную форму штатной общей командой без параметра";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.РаспределениеУчебныхБросков85");
#Иначе
ВызватьИсключение "Учебная общая команда открывается в толстом управляемом клиенте";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Начальное число задаёт старт последовательности генератора. В прежнем уроке два генератора с одинаковым начальным числом дают повторяемую последовательность. Здесь показан другой конкретный конструктор: Новый ГенераторСлучайныхЧисел() без аргументов, с явными пустыми скобками.
Название варианта «Формирование неинициализированного объекта» может сбить с толку. Но его установленное описание прямо говорит: генератор инициализируется источником энтропии. Мы не задаём начальное число и не придумываем отдельный метод Инициализировать.
Собственный новый массив начинается пустым. Шесть явных Добавить(0) создают настоящие числовые счётчики для сторон 1..6. Массив из шести неопределённых ячеек не подменяет эту подготовку; типы и начальные нули проверяются.
Каждый из 100 настоящих вызовов СлучайноеЧисло(1,6) должен вернуть Число, целое от 1 до 6. Цел(Выпало)=Выпало проверяет целочисленность: дробное значение не округляется ради принятия.
Индексы массива начинаются с нуля: сторона 1 учитывается в ячейке 0, сторона 6 — в ячейке 5. После проверки диапазона вычисляется индекс; прочитанная прежняя частота увеличивается через Установить, а новое значение повторно читается и проверяется.
В конце читаются все шесть фактических частот. Каждая целая от 0 до 100; их настоящая сумма обязана быть 100. Из этих значений формируется отчёт, не из заранее заданного красивого распределения.
На клиент возвращается только строка после всех проверок. Перед новым обращением прежний результат очищается; ошибка показывает «Распределение НЕ получено», а не оставляет старый отчёт как будто новый опыт удался.
Как проверить результат
Первый будущий запуск: отчёт содержит шесть сторон 1..6, настоящие целые частоты от 0 до 100 и фактический итог 100. Конкретные шесть чисел заранее неизвестны; частота 0 допустима.
В своём учебном отладчике проверьте реальные типы ГенераторСлучайныхЧисел и Массив, размер 6, первоначальные числовые нули. В цикле должны быть ровно 100 настоящих вызовов СлучайноеЧисло, а не повторение одной константы.
Проследите реальную сторону 1 → индекс 0 и сторону 6 → индекс 5. После каждого Установить перечитанный счётчик должен равняться его прежнему значению плюс 1.
Нажмите кнопку повторно: создаются новые локальные генератор и массив. Снова проверяйте типы, границы и итог 100. Не требуйте другого текста, других частот или совпадения двух выборок: оба исхода допустимы.
Только в собственной учебной копии через отладчик задайте одной начальной ячейке Неопределено либо недопустимое значение результата. Ожидается остановка проверки; код не исправляет значения, не округляет их и не продолжает успешный отчёт.
При исключении поле сообщает «Распределение НЕ получено. Опыт остановлен»; ошибка повторно вызывается. Не засчитывайте отказ конструктора или неправильный диапазон как положительный пример.
Не проверяйте криптографическую или финансовую пригодность по этой маленькой выборке. Не используйте урок для паролей, токенов, ключей, денежных розыгрышей или любых рабочих данных.
Ожидаемый результат
Только после полного успешного контроля: шесть настоящих целых частот для сторон 1..6 от 0 до 100 и их фактически вычисленная сумма 100. Конкретное распределение заранее неизвестно; совпадение или различие последующих выборок допустимы.
На что обратить внимание
Источником начального состояния служит энтропия согласно описанию именно конструктора без аргументов. Конструктор с явным начальным числом относится к другому варианту и не демонстрирует этот пункт справочника.
Случайные значения могут повторяться. При 100 бросках со значениями от 1 до 6 повторения неизбежны. Не обещаны равные частоты, появление каждой стороны, разные отчёты при двух нажатиях или определённая последовательность между версиями платформы.
Строка(Число) зависит от национальных установок; существенны проверенные числа и их сумма, а не точный текст заранее заданного отчёта. Итог 100 вычислен из реальных частот, не подставлен вместо суммы.
Массив хранит значения произвольного типа. Поэтому наличие шести ячеек само по себе не доказывает шесть числовых счётчиков: каждое начальное, промежуточное и итоговое значение проверяется.
Формальные гарантии криптографической безопасности и статистического качества не следуют из названия или 100 учебных вызовов. Это урок работы с генератором и подсчётом выборки, не рекомендация для систем безопасности.
Вся изменяемая память принадлежит этому запуску функции. Никаких сохранений, запросов к базе, файлов, сетевых соединений, настроек рабочего пользователя или передачи генератора на клиент нет.
Компилятор, 1С, настоящая форма и генератор во время подготовки справочника не запускались. Статическая сверка API не заменяет будущую ручную проверку; ошибка не является успешным учебным опытом.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.