Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Выбрать ближайший из нескольких реквизитов          
niconix Подменю пользователя
сообщение 24.06.16, 8:50
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 5
Из: Кременчуг
Спасибо сказали: 0 раз
Рейтинг: 0

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

Вот за три года работы с 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 Подменю пользователя
сообщение 24.06.16, 9:05
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

niconix Подменю пользователя
сообщение 24.06.16, 9:26
Сообщение #3

Молчаливый
*
Группа: Пользователи
Сообщений: 5
Из: Кременчуг
Спасибо сказали: 0 раз
Рейтинг: 0

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

Vofka Подменю пользователя
сообщение 24.06.16, 9:36
Сообщение #4

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

Спасибо сказали: niconix,

Acid Подменю пользователя
сообщение 24.06.16, 9:44
Сообщение #5

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

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

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

Сообщение отредактировал Vofka - 24.06.16, 9:50


Signature

Документируйте Код! мать вашу...


niconix Подменю пользователя
сообщение 24.06.16, 12:08
Сообщение #6

Молчаливый
*
Группа: Пользователи
Сообщений: 5
Из: Кременчуг
Спасибо сказали: 0 раз
Рейтинг: 0

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, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 7:48
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!