Как определить наиболее часто встречающееся число в массиве в 1С?

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

При разработке на платформе 1С:Предприятие часто возникает задача анализа данных в массивах. Одной из классических задач является определение «моды» — числа, которое встречается в массиве чаще всего, а также получение информации о количестве этих повторов и их позициях. Давайте разберем, как эффективно решить эту задачу, используя инструменты языка 1С.

Решение через объект Соответствие

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

  1. Создаем пустое Соответствие, в котором ключом будет являться само значение числа, а значением — структура или массив с данными о позициях и счетчиком.
  2. Проходим по массиву в цикле. Для каждого элемента проверяем, есть ли он в Соответствии.
  3. Если элемент найден, увеличиваем счетчик вхождений и добавляем текущий индекс в список позиций.
  4. Если элемент отсутствует, создаем новую запись в Соответствии со счетчиком 1 и текущим индексом.
  5. После завершения цикла обходим Соответствие, чтобы найти запись с максимальным значением счетчика.

Вот пример реализации данного метода:


// Предположим, что ИсходныйМассив уже заполнен числами
Результаты = Новый Соответствие;

Для Индекс = 0 По ИсходныйМассив.Количество() - 1 Цикл
    Значение = ИсходныйМассив[Индекс];
    
    ТекущаяИнформация = Результаты.Получить(Значение);
    Если ТекущаяИнформация = Неопределено Тогда
        ТекущаяИнформация = Новый Структура(\"Количество, Позиции\", 0, Новый Массив);
        Результаты.Вставить(Значение, ТекущаяИнформация);
    КонецЕсли;
    
    ТекущаяИнформация.Количество = ТекущаяИнформация.Количество + 1;
    ТекущаяИнформация.Позиции.Добавить(Индекс);
КонецЦикла;

// Поиск максимума
МаксКоличество = 0;
ЧастоеЧисло = Неопределено;

Для Каждого Запись Из Результаты Цикл
    Если Запись.Значение.Количество > МаксКоличество Тогда
        МаксКоличество = Запись.Значение.Количество;
        ЧастоеЧисло = Запись.Ключ;
    КонецЕсли;
КонецЦикла;

Решение через запрос к базе данных

Если данные уже представлены в виде коллекции или их количество весьма велико, можно воспользоваться мощью языка запросов 1С. Для этого необходимо сначала поместить массив во временную таблицу, а затем сгруппировать данные.

Разберем логику работы запроса:

  1. Помещаем исходный массив во временную таблицу с помощью менеджера временных таблиц.
  2. Выполняем группировку данных по значению.
  3. Вычисляем количество вхождений для каждого значения.
  4. Сортируем результат по убыванию количества и берем первую запись.

Этот метод удобен тем, что позволяет легко расширить логику, например, применив дополнительные фильтры или объединения с другими справочниками системы.


Запрос = Новый Запрос;
Запрос.Текст = 
    \"ВЫБРАТЬ
    |    Т.Значение КАК Число,
    |    КОЛИЧЕСТВО(*) КАК Количество
    |ПОМЕСТИТЬ ВТ_Числа
    |ИЗ
    |    &МассивЧисел КАК Т
    |СГРУППИРОВАТЬ ПО
    |    Т.Значение
    |;
    |ВЫБРАТЬ ПЕРВЫЕ 1
    |    ВТ_Числа.Число,
    |    ВТ_Числа.Количество
    |ИЗ
    |    ВТ_Числа КАК ВТ_Числа
    |УПОРЯДОЧИТЬ ПО
    |    ВТ_Числа.Количество УБЫВ\";

Запрос.УстановитьПараметр(\"МассивЧисел\", ВашМассив);
Результат = Запрос.Выполнить().Выбрать();

Ключевые рекомендации и особенности

При реализации данного функционала важно учитывать несколько технических нюансов, чтобы код работал стабильно и предсказуемо:

Типизация данных: Помните, что в 1С типы данных играют важную роль. Например, при работе с Соответствие, число 5 (тип Число) и строка \"5\" будут считаться абсолютно разными ключами. Убедитесь, что все элементы массива приведены к единому типу данных перед началом обработки.

Обработка пустого массива: Всегда предусматривайте проверку массива на пустоту (метод Количество()) перед запуском алгоритмов, чтобы избежать ошибок при попытке обращения к индексам или выполнения запросов к пустым таблицам.

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

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

← На главную