Разработка и Конфигурация · 9 мин
Как найти минимальное значение в массиве 1С
Как найти минимальное значение в массиве 1С: перебор циклом, функция сравнения, свёртка таблицы значений, типичные ошибки и готовые примеры кода на встроенном языке.
Во встроенном языке 1С нет готовой функции вида «МинимумИзМассива», поэтому поиск минимального значения реализуют вручную — чаще всего перебором элементов в цикле с запоминанием текущего минимума. Такой подход работает в любой версии платформы и не требует подключения внешних компонент.
Задача встречается постоянно: найти минимальную цену поставщика, самую раннюю дату в выборке, наименьший остаток по складу. Алгоритм один и тот же, но есть нюансы в зависимости от типа элементов массива — числа, даты, строки сравниваются по-разному, а пустой массив требует отдельной обработки, иначе код вернёт неопределённый результат.
Кроме классического цикла, существуют альтернативы: свёртка таблицы значений с группировкой, сортировка массива и выбор первого элемента, запрос с функцией МИНИМУМ. Каждый вариант имеет свои ограничения по производительности и удобству, и выбор зависит от того, где лежат данные — в массиве, таблице или в базе.
Базовый алгоритм: перебор массива в цикле
Стандартное решение — объявить переменную для хранения минимума, присвоить ей первый элемент массива и пройти циклом по остальным элементам. Если текущий элемент меньше сохранённого значения, минимум обновляется. После завершения цикла в переменной остаётся искомое значение.
Важная деталь: начинать сравнение нужно со второго элемента (индекс 1), потому что первый уже записан как минимум. Либо можно начать с нулевого элемента — сравнение его самого с собой безвредно, просто лишняя итерация.
Функция НайтиМинимум(Массив)
Если Массив.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
Минимум = Массив[0];
Для Индекс = 1 По Массив.Количество() - 1 Цикл
Если Массив[Индекс] < Минимум Тогда
Минимум = Массив[Индекс];
КонецЕсли;
КонецЦикла;
Возврат Минимум;
КонецФункции
Минимум = Массив[0];
Для Каждого Элемент Из Массив Цикл
Если Элемент < Минимум Тогда
Минимум = Элемент;
КонецЕсли;
КонецЦикла;Вариант с циклом «Для Каждого» короче и читается легче, но не даёт доступа к индексу элемента. Если нужно знать не только минимальное значение, но и его позицию в массиве, используйте цикл по индексам и запоминайте индекс вместе со значением.
Проверка пустого массива и типов данных
Обращение к Массив[0] у пустого массива вызывает ошибку «Индекс находится за границами массива» и прерывает выполнение кода. Поэтому проверка Массив.Количество() = 0 — обязательная первая строка любой функции поиска. Что возвращать в этом случае — Неопределено, 0 или вызывать исключение — решает разработчик исходя из логики прикладного кода.
Второй риск — смешанные типы. Если в массиве числа и строки, сравнение «меньше» может дать неожиданный результат или ошибку несоответствия типов. Перед сравнением полезно проверить тип элемента через ТипЗнч() или заранее гарантировать однородность массива на этапе его заполнения.
Для дат алгоритм работает без изменений: оператор «меньше» корректно сравнивает даты, и минимальная дата — это самая ранняя. Для строк сравнение идёт по алфавиту с учётом регистра, что редко бывает нужно на практике, но технически работает.
Поиск минимума по свойству объектов в массиве
Часто массив содержит не числа, а структуры, строки таблицы значений или ссылки, а минимум нужен по конкретному полю — например, по цене или дате. В этом случае сравнивают не сами элементы, а их свойства.
МинимальнаяЦена = Неопределено;
Для Каждого Строка Из МассивСтрок Цикл
Если МинимальнаяЦена = Неопределено
Или Строка.Цена < МинимальнаяЦена Тогда
МинимальнаяЦена = Строка.Цена;
КонецЕсли;
КонецЦикла;
Здесь удобен приём с начальным значением Неопределено: не нужно отдельно обрабатывать первый элемент, условие само «подхватит» его на первой итерации. Если дополнительно требуется сама строка с минимальной ценой, сохраняйте в отдельную переменную и элемент целиком.
Альтернатива: сортировка и выбор первого элемента
Массив в 1С можно отсортировать методом СортироватьПоВозрастанию() через объект СортировкаЗначений, после чего минимальный элемент окажется первым. Способ рабочий, но избыточный для простого поиска: сортировка выполняет больше операций, чем один проход сравнения, и изменяет исходный массив.
Сортировку оправданно применять, когда упорядоченный массив нужен и для других целей — например, одновременно требуются минимум, максимум и медиана или данные всё равно выводятся пользователю в отсортированном виде. Для разового поиска минимума цикл быстрее и не портит порядок элементов.
Сравнение подходов
Универсальный способ: один проход, массив не меняется, работает с любыми сравнимыми типами. Оптимален для разового поиска.
Минимум — первый элемент после сортировки. Подходит, если порядок элементов нужен и для других задач; иначе избыточна.
Лучший вариант, если данные ещё в базе: не выгружайте их в массив только ради поиска минимума.
Для данных в таблице значений — свёрнуть с пустым отбором не сработает для минимума, используйте запрос или цикл по строкам.
Минимум через запрос и таблицу значений
Если данные ещё не выгружены из базы, искать минимум в массиве вообще не нужно — агрегатная функция МИНИМУМ в запросе сделает это на уровне СУБД быстрее и без написания цикла. Это правильный путь для больших объёмов: перебор десятков тысяч элементов встроенным языком заметно медленнее запроса.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МИНИМУМ(Цены.Цена) КАК МинимальнаяЦена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК Цены
|ГДЕ
| Цены.Номенклатура = &Номенклатура";
Для таблицы значений готового метода «минимум по колонке» нет: метод Итог() считает только сумму. Поэтому либо перебирайте строки циклом по тому же алгоритму, либо выгрузите колонку методом ВыгрузитьКолонку() и примените к полученному массиву функцию поиска.
Как выбрать способ
Проверка результата и типичные ошибки
После внедрения функции проверьте её на контрольных наборах: массив из одного элемента, массив с отрицательными числами, массив, где минимум стоит первым и последним, пустой массив. Эти пять случаев покрывают все ветки алгоритма и выявляют ошибки граничных условий.
Как проверить результат
Функция возвращает этот элемент
Ошибка индекса или Неопределено
Возвращается самое маленькое отрицательное число
Возвращается 0 или положительное значение
Возвращается Неопределено без исключения
Ошибка «индекс за границами массива»
Значение найдено корректно
Возвращается второй по величине элемент
Отдельно проверьте поведение при значениях Неопределено внутри массива: сравнение с Неопределено может привести к ошибке. Если такие значения возможны, пропускайте их в цикле через Если Элемент = Неопределено Тогда Продолжить;.
FAQ
Есть ли в 1С встроенная функция для поиска минимума в массиве?
Нет, готового метода у объекта Массив нет. Минимум ищут циклом сравнения, через сортировку или агрегатной функцией МИНИМУМ в запросе, если данные находятся в базе.
Что вернуть из функции, если массив пустой?
Общепринятый вариант — Неопределено: вызывающий код сможет проверить результат и отличить «минимум не найден» от реального значения. Возврат 0 опасен, так как 0 может быть легитимным элементом массива.
Как найти минимальную дату в массиве?
Тем же циклом сравнения: оператор «меньше» корректно работает с датами, минимальная дата — самая ранняя. Следите, чтобы в массиве не было пустых дат (01.01.0001), если они не должны участвовать в сравнении.
Как найти минимум и его индекс одновременно?
Используйте цикл по индексам от 1 до Количество()-1 и внутри условия сохраняйте не только значение, но и текущий индекс в отдельную переменную. Цикл «Для Каждого» для этого не подходит, так как не даёт индекса.
Что быстрее: цикл или запрос с МИНИМУМ?
Если данные в базе — однозначно запрос: агрегация выполняется на сервере СУБД без переноса всех записей в память. Цикл по массиву оправдан только когда данные уже собраны в массив по другим причинам.
Как найти минимум по колонке таблицы значений?
Готового метода нет: Итог() считает только сумму. Выгрузите колонку методом ВыгрузитьКолонку() в массив и примените функцию поиска, либо переберите строки таблицы циклом со сравнением значений колонки.
Что важно запомнить
Минимум в массиве 1С ищут циклом сравнения, начиная с первого элемента, с обязательной проверкой на пустоту. Для данных в базе используйте МИНИМУМ в запросе, для таблицы значений — цикл по строкам или выгрузку колонки. Сортировка ради одного минимума избыточна и меняет порядок элементов.