Доброе утро, уважаемые программисты! Нужна помощь новичку) есть массив с множеством дат, как можно выбрать одну самую старую дату? Час уже сижу думаю...
---
создать переменную, пройти циклом массив и если значение элемента массива больше чем значение в переменной, то записать в переменную
---
создать переменную, пройти циклом массив и если значение элемента массива больше чем значение в переменной, то записать в переменную
---
```1c
    СЗ = Новый СписокЗначений;
    СЗ.ЗагрузитьЗначения(Массив);
    СЗ.СортироватьПоЗначению();
```

У ТЗ будет минус - с ней нельзя работать на клиенте.
---
Преобразовать в таблицу значений и отсортировать, например.
---
Или в таблицу, или в список значений. Самое простое решение.
---
а затем передать в качестве параметра в запрос :)
---
а потом выгрузить в ТЗ)
---
отличный план, надежен как швейцарские часы :) из пушки по воробьям интереснее всего
---
Из пушки по воробью попадешь наверняка, а вот из рогатки - не всегда.
---
тут ещё надо учитывать кто стреляет :) (а вообще есть вероятность, что воробья там нет)
---
Есть вероятность что и пушки нет. Не настолько уж сложен код:

```1c
    Функция НайтиСамуюСтаруюДату(НашМассив)
    Таб = Новый ТаблицаЗначений;
    Таб.Колонки.Добавить("Даты");
    Для к=1 По НашМассив.Количество() Цикл
    Таб.Добавить();
    КонецЦикла;
    Таб.ЗагрузитьКолонку(НашМассив,"Даты");
    Таб.Сортировать("Даты");
    Возврат Таб.Получить(0).Даты;

    КонецФункции
```
---
да дело не сложности... Просто странно для такой элементарной задачи прикручивать таблицу значений. Точнее я не одобряю :)
---
Я просто обожаю таблицы значений. Еще со времен 7.7. Удобная штука. Гораздо удобнее всех остальных массивов, структур и иже с ними.
---
Сообщение было скрыто модератором.
---
Все зависит от дальнейшей работы. Возможно, ТЗ на сервере и не будет лишней для последующих манипуляций.
---
а я считаю, что новичку для начала нужно научиться находить минимум в массиве без таблицы значений, списка значений и всего, что привязано к конкретному языку!)
---
Новичку придется многое еще освоить. БСП, например, где многое делается одной функцией, хоть и включающей в себя мегатонны кода.
---
Вот прямо заинтересовался вопросом сложности / эффективности решения простой задачи. Небольшой эксперимент дает следующие результаты (на моем компе, разумеется) для поиска минимального значения среди 100 000 дат: линейный перебор - 280 мс, сортировкой списка значений - 47 мс, сортировкой таблицы значений - 361 мс. Собственно тестовый код
```1c
    МассивДат = Новый Массив;
    СписокДат = Новый СписокЗначений;
    ТабДат = Новый ТаблицаЗначений;
    ТабДат.Колонки.Добавить("ДатаЗн");
    ТД = ТекущаяДата();
    Чет = Истина;
    Для ид = 1 По 100000 Цикл
    Если Чет Тогда
    ТД = ТД + ид * 1;
    Иначе
    ТД = ТД - ид * 3;
    КонецЕсли;
    МассивДат.Добавить(ТД);
    СписокДат.Добавить(ТД);
    нСтр = ТабДат.Добавить();
    нСтр.ДатаЗн = ТД;
    Чет = Не Чет;
    КонецЦикла;
    МинЗнач = МассивДат[0];
    отсечка1 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Для каждого ЭлМасс Из МассивДат Цикл
    Если ЭлМасс < МинЗнач Тогда
    МинЗнач = ЭлМасс;
    КонецЕсли;
    КонецЦикла;
    отсечка2 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    СписокДат.СортироватьПоЗначению(НаправлениеСортировки.Возр);
    МинЗнач1 = СписокДат[0].Значение;
    отсечка3 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ТабДат.Сортировать("ДатаЗн");
    МинЗнач2 = ТабДат[0].ДатаЗн;
    отсечка4 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Разница1 = отсечка2 - отсечка1;
    Разница2 = отсечка3 - отсечка2;
    Разница3 = отсечка4 - отсечка3;
```
---
а теперь отключите отладку и поймете, что линейный перебор будет самым быстрым.
---
тладку и поймете, что ли В отладке результаты примерно те же - ни о каком преимуществе линейного перебора речь не идет.
---
В отладке результаты примерно те же
Понимаете разницу с "а теперь отключите отладку"?
Закройте конфигуратор, откройте только в режиме предприятия и запустите свою обработку.

И почему убрали из отслеживания времени создание и загрузку массива в СЗ и ТЗ?
Задача была найти в массиве.
---
Ну, не знаю. Для пробы запихнул в конфигурацию обработку с таким кодом:

```1c
    &НаКлиенте
    Процедура Команда1(Команда)

    НашМассив = Новый Массив;
    Для сч = 0 По 10000 Цикл
    НашМассив.Добавить(Дата('2015.03.26 10:45:25')+сч*60*60*24);
    КонецЦикла;
    СтараяДата = НайтиСамуюСтаруюДату(НашМассив);

    КонецПроцедуры

    &НаСервере
    Функция НайтиСамуюСтаруюДату(НашМассив)
    отсечка1 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Таб = Новый ТаблицаЗначений;
    Таб.Колонки.Добавить("Даты");
    Для к=1 По НашМассив.Количество() Цикл
    Таб.Добавить();
    КонецЦикла;
    Таб.ЗагрузитьКолонку(НашМассив,"Даты");
    Таб.Сортировать("Даты");
    отсечка2 = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить(Отсечка2-Отсечка1);
    Возврат Таб.Получить(0).Даты;
    КонецФункции
```

В результате получил 90 мсек.
---
Для пробы запихнул в конфигурацию обработку с таким кодом Для 10 000 записей примерно такой результат будет и в моем случае - я оперировал в 10 раз большим объемом. Сортировка списка все равно будет быстрее - сравните сами.
---
Ок. Вот другой вариант кода, который дал мне 520 мсек.

```1c
    &НаКлиенте
    Процедура Команда1(Команда)

    НашМассив = Новый Массив;
    Для сч = 0 По 100000 Цикл
    НашМассив.Добавить(Дата('2015.03.26 10:45:25')+сч*60*60*24);
    КонецЦикла;
    СтараяДата = НайтиСамуюСтаруюДату(НашМассив);

    КонецПроцедуры

    &НаСервере
    Функция НайтиСамуюСтаруюДату(НашМассив)
    отсечка1=ТекущаяУниверсальнаяДатаВМиллисекундах();Таб=Новый ТаблицаЗначений;Таб.Колонки.Добавить("Даты");Для к=1 По НашМассив.Количество() Цикл Таб.Добавить();КонецЦикла; Таб.ЗагрузитьКолонку(НашМассив,"Даты");Таб.Сортировать("Даты");
    отсечка2=ТекущаяУниверсальнаяДатаВМиллисекундах();Разница=отсечка2-отсечка1;Сообщить(разница);
    Возврат Таб.Получить(0).Даты;
    КонецФункции
```
---
Пардон, не написал, что до этого была целая секунда. Запись команд в одну строку позволила сократить время почти вдвое.
---
который дал мне 520 мсек Всё правильно, метод с сортировкой таблицы значений работает значимо дольше линейного перебора, как и в моем примере.
---
Так никто и не спорит, что этот вариант по времени затратней. Если брать время отправки с клиента на сервер и обратно, то разница еще ощутимее. Но в отличие от перебора массива, мы получаем уже сортированную таблицу значений, и можем обращаться к ней по мере надобности. Если усложнить задачу и выбрать не минимальное значение, а третье по счету. В таблице находим нужное практически мгновенно, в массиве нужно будет переписывать алгоритм.
---
Попробуйте на вход передать не отсортированный массив дат. Результат будет другой.
---
ТабДат.Сортировать("ДатаЗн");
Зачем ты устраиваешь перестановки в памяти, если тебе надо просто перебрать элементы? Вот, прямо на твоих данных:

```1c
    СписокДат = Новый СписокЗначений;

    ТабДат = Новый ТаблицаЗначений;
    ТабДат.Колонки.Добавить("ДатаЗн", Новый ОписаниеТипов("Дата"));

    ТД = ТекущаяДата();
    Чет = Истина;
    Для ид = 1 По 100000 Цикл
    Если Чет Тогда
    ТД = ТД + ид * 1;
    Иначе
    ТД = ТД - ид * 3;
    КонецЕсли;

    СписокДат.Добавить(ТД);

    нСтр = ТабДат.Добавить();
    нСтр.ДатаЗн = ТД;
    Чет = Не Чет;
    КонецЦикла;

    Отсечка1 = ТекущаяУниверсальнаяДатаВМиллисекундах();

    СписокДат.СортироватьПоЗначению(НаправлениеСортировки.Возр);
    МинЗнач1 = СписокДат[0].Значение;

    Отсечка2 = ТекущаяУниверсальнаяДатаВМиллисекундах();

    Построитель = Новый ПостроительЗапроса;
    ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДат);
    ИсточникДанных.Колонки.ДатаЗн.Итог = "МИНИМУМ(ДатаЗн)";
    Построитель.ИсточникДанных = ИсточникДанных;
    Построитель.Выполнить();
    Выборка = Построитель.Результат.Выбрать();
    Выборка.Следующий();
    МинЗнач2 = Выборка.ДатаЗн;

    Отсечка3 = ТекущаяУниверсальнаяДатаВМиллисекундах();

    Сообщить("Список: " + (Отсечка2 - Отсечка1) + " = " + МинЗнач1);
    Сообщить("Таблица: " + (Отсечка3 - Отсечка2) + " = " + МинЗнач2);
```

Список: 50 = 16.07.1864 12:51:30
Таблица: 31 = 16.07.1864 12:51:30

Учись, студент.
---
следующие результаты
Попробуйте на вход передать не отсортированный массив, в этом случае скорость линейного перебора значительно быстрее.
Например для тех же 100000 у меня вышло:
Таблица значений: 1428
Список значений: 270
Линейный перебор: 28
---
DBV, Zevzm , Vlan, vadim.semyonov.rzn, user1278383, спасибо большое за помощь и ответы) в итоге вот так сделал, получилось)

```1c
    &НаКлиенте
    Процедура Команда1(Команда)

    НашМассив = Новый Массив;
    НашМассив.Добавить(Дата('2017.03.26 10:45:25')) ;
    НашМассив.Добавить(Дата('2017.03.29 10:45:25'));
    НашМассив.Добавить(Дата('2017.03.25 10:45:25'));
    НашМассив.Добавить(Дата('2017.03.28 10:45:25'));
    НашМассив.Добавить(Дата('2017.03.21 10:45:25'));
    НайтиСамуюСтаруюДату(НашМассив);

    КонецПроцедуры

    Функция НайтиСамуюСтаруюДату(НашМассив)

    НачПер = НашМассив[0];
    Для Каждого Элемент из НашМассив цикл
    Если Элемент < НачПер тогда
    НачПер = Элемент;
    КонецЕсли;
    КонецЦикла;
    Возврат НачПер;

    КонецФункции
```
---
Несколько замечаний:

1. '2017.03.21 10:45:25' - это уже дата. Не нужно приводить к типу Дата, можно написать:
НашМассив.Добавить('2017.03.21 10:45:25');

2. Функция НайтиСамуюСтаруюДату(НашМассив) - нужно тоже указать &НаКлиенте, иначе функция буден на сервере. Зачем нужен серверный вызов?

3. Если массив пустой, то возникнет ошибка.
---
Можно еще
```1c
    Если Элемент < НачПер тогда
    НачПер = Элемент;
    КонецЕсли;
```
 заменить на
```1c
    НачПер = Мин(НачПер, Элемент);
```

Есть желающие померить что быстрее?
---
Только не Макс, а Мин, мы же самую "старую" дату ищем. Да, с Мин будет быстрее. Результаты:
Перебор с Мин: 20
Сортировка: 126
Перебор: 22
Код:
```1c
    &НаКлиенте
    Процедура МетодПеребора(Команда)
    МетодПеребораНаСервере();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура МетодПеребораНаСервере()

    Массив = Новый Массив;
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    ТекущаяДата = ТекущаяДата();
    Для Сч = 1 По 100000 Цикл
    Массив.Добавить(ТекущаяДата + ГСЧ.СлучайноеЧисло(0, 60 * 60 * 24 * 30));
    КонецЦикла;

    НачалоВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();

    НаименьшееЗначение = '00010101';
    Для Каждого Элемент Из Массив Цикл Если НаименьшееЗначение > Элемент Тогда НаименьшееЗначение = Элемент КонецЕсли КонецЦикла;

    ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоВыполнения;

    Сообщить("Перебор: " + ВремяВыполнения);

    КонецПроцедуры

    &НаКлиенте
    Процедура МетодСортировки(Команда)
    МетодСортировкиНаСервере();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура МетодСортировкиНаСервере()

    Массив = Новый Массив;
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    ТекущаяДата = ТекущаяДата();
    Для Сч = 1 По 100000 Цикл
    Массив.Добавить(ТекущаяДата + ГСЧ.СлучайноеЧисло(0, 60 * 60 * 24 * 30));
    КонецЦикла;

    НачалоВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();

    СписокЗначений = Новый СписокЗначений;
    СписокЗначений.ЗагрузитьЗначения(Массив);
    СписокЗначений.СортироватьПоЗначению();
    НаименьшееЗначение = СписокЗначений[0].Значение;

    ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоВыполнения;

    Сообщить("Сортировка: " + ВремяВыполнения);

    КонецПроцедуры

    &НаКлиенте
    Процедура ПереборСМин(Команда)
    ПереборСМинНаСервере();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ПереборСМинНаСервере()

    Массив = Новый Массив;
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    ТекущаяДата = ТекущаяДата();
    Для Сч = 1 По 100000 Цикл
    Массив.Добавить(ТекущаяДата + ГСЧ.СлучайноеЧисло(0, 60 * 60 * 24 * 30));
    КонецЦикла;

    НачалоВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();

    НаименьшееЗначение = '00010101';
    Для Каждого Элемент Из Массив Цикл НаименьшееЗначение = Мин(НаименьшееЗначение, Элемент) КонецЦикла;

    ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоВыполнения;

    Сообщить("Перебор с Мин: " + ВремяВыполнения);

    КонецПроцедуры
```
---
Перебор с Мин: 20
Сортировка: 126
Перебор: 22
Не особо быстрее, но все же.
---
Да это на уровне погрешности.
Возможно, если выполнить тест 10, 100, 1000 раз, будут другие показатели.
---
Да, с Мин будет быстрее. Любопытно: а если вместо Мин() использовать условный оператор - как это повлияет на скорость?

```1c
    Для Каждого Элемент Из Массив Цикл НаименьшееЗначение = ?(НаименьшееЗначение > Элемент, Элемент, НаименьшееЗначение) КонецЦикла;
```
---
По моим данным, чуть хуже чем просто "Если" и мин/макс.
---
Вообще было бы интересно не присваивать минимальное значение переменной, а запоминать индекс массива, да беда в том что в "Для Каждого..." индекс элемента массива узнать нельзя, а через "Для Сч=0..." все заведомо медленнее.
---
Есть ощущение, как будто с какой-то версии платформы циклы оптимизировали. Но новички до сих пор считают решение через циклы неоптимальным – видимо, где-то в обучающих скрижалях так сказано.
---
Не знаю как везде, но обход коллекций через "Для каждого" быстрее иных вариантов обхода работает, но, следует признать, не в разы.
---
Как найти самую старую дату в массиве
======================================
Чтобы найти самую старую дату в массиве, вы можете использовать следующий алгоритм:

Инициализируйте переменную oldest_date самой старой датой, например, текущей датой.
Переберите все элементы массива с помощью цикла.
Для каждой даты в массиве сравните ее с переменной oldest_date. Если текущая дата старше, то обновите значение oldest_date на текущую дату.
После того как вы переберете все элементы массива, oldest_date будет содержать самую старую дату.
Вот пример реализации этого алгоритма на Python:

Copy code
import datetime

def find_oldest_date(dates):
  oldest_date = datetime.datetime.now()
  for date in dates:
    if date < oldest_date:
      oldest_date = date
  return oldest_date

dates = [datetime.datetime(2020, 1, 1), datetime.datetime(2021, 1, 1), datetime.datetime(2019, 1, 1)]
oldest_date = find_oldest_date(dates)
print(oldest_date) # Output: 2019-01-01 00:00:00
---
как вариант. Прикрутить http-сервис и получать результат :)
---
Петросян, выйди из класса!
---
Как вариант, не задавать на форуме вопросы, ответы на которые можно получить у языковой модели
---
Блок-схема где? Нейросеть не осилила?
---
не задавать на форуме вопросыА ловко ты их нахрен послал. Я сначала и не понял.
---
Запрос уже предлагали?
---
Сообщение было скрыто модератором.
---
Это слишком просто.
Надо каждое значение массива передавать как параметр в отдельный запрос, а потом объединить эти запросы, и уже после этого сортировать.