При решении задач автоматизации часто возникает необходимость генерации тестовых данных для заполнения справочников или документов. Рассмотрим по шагам, как эффективно создать 100 000 документов, каждый из которых будет содержать случайную ссылку на элемент справочника, и как корректно отобразить статистику использования этих элементов в отчете.
Главная ошибка в исходном подходе автора заключалась в использовании метода НайтиПоНаименованию внутри цикла. Этот метод всегда возвращал один и тот же элемент. Чтобы выбор был действительно случайным, мы должны работать не с поиском по строке, а с коллекцией ссылок.
Разберем наиболее эффективные способы реализации этой задачи:
Этот метод является наиболее производительным, так как мы один раз обращаемся к базе данных, чтобы выгрузить все ссылки, а затем работаем с оперативной памятью.
// Сначала получаем массив всех ссылок справочника
МассивСсылок = Новый Массив;
Выборка = Справочники.СлучайныеЦвета.Выбрать();
Пока Выборка.Следующий() Цикл
МассивСсылок.Добавить(Выборка.Ссылка);
КонецЦикла;
// Используем генератор для выбора случайного индекса
ГСЧ = Новый ГенераторСлучайныхЧисел();
МаксИндекс = МассивСсылок.Количество() - 1;
Для Сч = 1 По 100000 Цикл
СлучайныйИндекс = ГСЧ.СлучайноеЧисло(0, МаксИндекс);
ВыбранныйЦвет = МассивСсылок[СлучайныйИндекс];
// Создание и запись документа
Документ = Документы.СлучайноВыбранныйЦвет.СоздатьДокумент();
Документ.Дата = ТекущаяДата();
Документ.ВыбранныйЦвет = ВыбранныйЦвет;
Документ.Записать();
КонецЦикла;
Если справочник имеет числовой код, можно использовать ТаблицаЗначений для сопоставления порядкового номера и ссылки. Это полезно, если требуется строгое управление вероятностью выбора.
// Создаем таблицу для хранения соответствий
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(\"Номер\", Новый ОписаниеТипов(\"Число\"));
ТЗ.Колонки.Добавить(\"Ссылка\");
Н = 0;
Выборка = Справочники.СлучайныеЦвета.Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Номер = Н;
СтрокаТЗ.Ссылка = Выборка.Ссылка;
Н = Н + 1;
КонецЦикла;
// Генерация документов
Для Сч = 1 По 100000 Цикл
СлучайнаяЦифра = ГСЧ.СлучайноеЧисло(0, Н - 1);
НайденнаяСсылка = ТЗ.Найти(СлучайнаяЦифра, \"Номер\").Ссылка;
// ... создание документа ...
КонецЦикла;
Для отображения абсолютного количества и процентного соотношения в системе компоновки данных (СКД) важно правильно настроить группировку и вычисляемые поля.
Ссылка (самому документу), а по реквизиту ВыбранныйЦвет.Количество() в ресурсах СКД.ВычислитьВыражение.В настройках ресурсов СКД для поля Количество (на основе Ссылка) установите выражение для расчета процента:
// Выражение для ресурса \"Процент\"
Сумма(Количество(Ссылка)) / ВычислитьВыражение(\"Сумма(Количество(Ссылка))\", , , \"ОбщийИтог\") * 100
Эта формула автоматически вычислит долю каждого цвета относительно общего количества документов в выборке. Обратите внимание, что для корректной работы отчета ВыбранныйЦвет должен быть указан в группировках отчета.
Создание 100 000 объектов — ресурсоемкая операция. Чтобы ускорить процесс:
НачатьТранзакцию() и ЗафиксироватьТранзакцию().ДокументОбъект.ОбменДанными.Загрузка = Истина. Это отключит проверки заполнения, расчет итогов и подписки на события, что значительно повысит скорость выполнения кода.ЦветXML (или ваши компоненты RGB) проиндексирован в конфигураторе.