Как реализовать массовое создание документов со случайными ссылками и построить отчет по их распределению в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При решении задач автоматизации часто возникает необходимость генерации тестовых данных для заполнения справочников или документов. Рассмотрим по шагам, как эффективно создать 100 000 документов, каждый из которых будет содержать случайную ссылку на элемент справочника, и как корректно отобразить статистику использования этих элементов в отчете.

Решение задачи: Выбор случайного элемента справочника

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

Разберем наиболее эффективные способы реализации этой задачи:

Способ 1: Использование массива ссылок (рекомендуемый)

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


// Сначала получаем массив всех ссылок справочника
МассивСсылок = Новый Массив;
Выборка = Справочники.СлучайныеЦвета.Выбрать();
Пока Выборка.Следующий() Цикл
    МассивСсылок.Добавить(Выборка.Ссылка);
КонецЦикла;

// Используем генератор для выбора случайного индекса
ГСЧ = Новый ГенераторСлучайныхЧисел();
МаксИндекс = МассивСсылок.Количество() - 1;

Для Сч = 1 По 100000 Цикл
    СлучайныйИндекс = ГСЧ.СлучайноеЧисло(0, МаксИндекс);
    ВыбранныйЦвет = МассивСсылок[СлучайныйИндекс];
    
    // Создание и запись документа
    Документ = Документы.СлучайноВыбранныйЦвет.СоздатьДокумент();
    Документ.Дата = ТекущаяДата();
    Документ.ВыбранныйЦвет = ВыбранныйЦвет;
    Документ.Записать();
КонецЦикла;

Способ 2: Нумерация элементов через таблицу значений

Если справочник имеет числовой код, можно использовать ТаблицаЗначений для сопоставления порядкового номера и ссылки. Это полезно, если требуется строгое управление вероятностью выбора.


// Создаем таблицу для хранения соответствий
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(\"Номер\", Новый ОписаниеТипов(\"Число\"));
ТЗ.Колонки.Добавить(\"Ссылка\");

Н = 0;
Выборка = Справочники.СлучайныеЦвета.Выбрать();
Пока Выборка.Следующий() Цикл
    СтрокаТЗ = ТЗ.Добавить();
    СтрокаТЗ.Номер = Н;
    СтрокаТЗ.Ссылка = Выборка.Ссылка;
    Н = Н + 1;
КонецЦикла;

// Генерация документов
Для Сч = 1 По 100000 Цикл
    СлучайнаяЦифра = ГСЧ.СлучайноеЧисло(0, Н - 1);
    НайденнаяСсылка = ТЗ.Найти(СлучайнаяЦифра, \"Номер\").Ссылка;
    // ... создание документа ...
КонецЦикла;

Как правильно построить отчет в СКД

Для отображения абсолютного количества и процентного соотношения в системе компоновки данных (СКД) важно правильно настроить группировку и вычисляемые поля.

  1. Группировка: В наборе данных (запросе) необходимо сгруппировать данные не по Ссылка (самому документу), а по реквизиту ВыбранныйЦвет.
  2. Абсолютное количество: Используйте стандартную агрегатную функцию Количество() в ресурсах СКД.
  3. Процентное соотношение: Для расчета процента используйте конструкцию ВычислитьВыражение.

В настройках ресурсов СКД для поля Количество (на основе Ссылка) установите выражение для расчета процента:


// Выражение для ресурса \"Процент\"
Сумма(Количество(Ссылка)) / ВычислитьВыражение(\"Сумма(Количество(Ссылка))\", , , \"ОбщийИтог\") * 100

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

Советы по оптимизации процесса

Создание 100 000 объектов — ресурсоемкая операция. Чтобы ускорить процесс:

← На главную