Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=30518)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Вся 1С _ Выбрать ближайший из нескольких реквизитов

Автор: niconix 24.06.16, 8:50

Доброго времени суток.

Вот за три года работы с 1с впервые немогу нагуглить решение.

Итак.
Дано:
Справочник, который имеет следующие реквизиты:


Количество указывает сколько первых реквизитов используется(заполнено)
Срок указывает день месяца

Задача:
Найти количество дней от текущей даты до ближайшего срока

Пример:
Количество = 2
Срок1 = 10
Срок2 = 20
ТекущаяДата = 24.06.2016

Результат = 16 (дней)

Помогите, пожалуйста, друзья-товарищи. Я уже себе весь моск сломал.
Если это можно реализовать как-то по-другому с радостью выслушаю предложения.

Автор: Vofka 24.06.16, 9:05

В чем конкретно проблема? Вы не понимаете, как это логически организовать? Или проблема с технической реализацией?

Автор: niconix 24.06.16, 9:26

Vofka @ Сегодня, 10:05 *,
Не понимаю как это сделать без говнокода с каскадом Если-Тогда

Автор: Vofka 24.06.16, 9:36

Т.к. сама задача не очень ясна, то подсказать какой-то другой вариант реализации сложно. Если принять структуру в том виде, как вы это сделали, то я бы делал так:
Пробуем определить минимально бОльшую цифру от номера текущего дня. В данном случае такой нету, т.к. 10 и 20 меньше 24. Если такой нету, это значит, что нужная дата находится в следующем месяце. Ищем теперь минимальную цифру среди всех. В данном случае это 10. Т.к. это следующий месяц от текущей даты, то месяц (даже с привязкой к году) мы знаем. Ну и все, мы знаем начальную дату и конечную. Вычисляем разницу. Если бы на шаге "Пробуем определить минимально бОльшую цифру от номера текущего дня" такая бы нашлась (например, было бы 30), то это означает, что это текущий месяц. Ну и, как в предыдущем случае, мы знаем начальную и конечную дату, поэтому вычисляем разницу.

Автор: Acid 24.06.16, 9:44

niconix @ Сегодня, 9:50 *,

ДатаСобытия = Мин(Срок1,Срок2);
Результат = (ДатаСобытия - ТекущаяДата)/ (60 * 60 * 24);

Срок1 и Срок2 должны быть Датами.

Автор: niconix 24.06.16, 12:08

Vofka @ Сегодня, 10:36 *,

Спасибо за наводку. Сделал немного по другому

    СпрОбъект = Категория.ПолучитьОбъект;
    МасДат = Новый Массив;  // Массив Дат выгрузки
    Сч1 = 2;                // Текущий и следующий месяц
    Пока Сч1 > 0 Цикл
        Сч2 = Количество;   // Количество перебираемых реквизитов
        НачалоМес = НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), Сч1 - 1));
        Пока Сч2 > 0 Цикл   // Заполняем массив датами выгрузки
            МасДат.Добавить(НачалоМес + ((СпрОбъект["ПолеВвода"+Сч2]-1)*60*60*24));
            Сч2 = Сч2 - 1;
        КонецЦикла;
        Сч1 = Сч1 - 1;
    КонецЦикла;
    Минимум = 999;          // "Нереально большой" срок
    Для Каждого Дт Из МасДат Цикл   // Перебираем массив в поисках подходящей даты
        Разность = (НачалоДня(Дт) - НачалоДня(ТекущаяДата())) / 86400;
        Если Разность < 1 Тогда     // Если дата меньше текущей, то не берем к сравнению
            Продолжить;             // т.к. отрицательный срок будет всегда меньше
        КонецЕсли;
        Минимум = Мин(Минимум, Разность); // Находим наименьший положительный срок
    КонецЦикла;
    // Сообщаем пользователю
    Предупреждение("Заявка будет отправлена " + Формат(ТекущаяДата() + (Минимум*60*60*24),"ДФ=dd.MM.yyyy"));


ЗЫ. Тему можно считать закрытой

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua