Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выбрать ближайший из нескольких реквизитов
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Вся 1С
niconix
Доброго времени суток.

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

Итак.
Дано:
Справочник, который имеет следующие реквизиты:
  • Количество - Число 0..7
  • Срок1 - Число 0..31
  • Срок2 - Число 0..31
  • Срок3 - Число 0..31
  • ...
  • Срок7 - Число 0..31

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

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

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

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

Помогите, пожалуйста, друзья-товарищи. Я уже себе весь моск сломал.
Если это можно реализовать как-то по-другому с радостью выслушаю предложения.
Vofka
В чем конкретно проблема? Вы не понимаете, как это логически организовать? Или проблема с технической реализацией?
niconix
Vofka @ Сегодня, 10:05 необходимо зарегистрироваться для просмотра ссылки,
Не понимаю как это сделать без говнокода с каскадом Если-Тогда
Vofka
Т.к. сама задача не очень ясна, то подсказать какой-то другой вариант реализации сложно. Если принять структуру в том виде, как вы это сделали, то я бы делал так:
Пробуем определить минимально бОльшую цифру от номера текущего дня. В данном случае такой нету, т.к. 10 и 20 меньше 24. Если такой нету, это значит, что нужная дата находится в следующем месяце. Ищем теперь минимальную цифру среди всех. В данном случае это 10. Т.к. это следующий месяц от текущей даты, то месяц (даже с привязкой к году) мы знаем. Ну и все, мы знаем начальную дату и конечную. Вычисляем разницу. Если бы на шаге "Пробуем определить минимально бОльшую цифру от номера текущего дня" такая бы нашлась (например, было бы 30), то это означает, что это текущий месяц. Ну и, как в предыдущем случае, мы знаем начальную и конечную дату, поэтому вычисляем разницу.
Acid
niconix @ Сегодня, 9:50 необходимо зарегистрироваться для просмотра ссылки,
ДатаСобытия = Мин(Срок1,Срок2);
Результат = (ДатаСобытия - ТекущаяДата)/ (60 * 60 * 24);

Срок1 и Срок2 должны быть Датами.
niconix
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"));


ЗЫ. Тему можно считать закрытой
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.