|   |   | 
| 
 | v7: Найди ближайшую дату. | ☑ | ||
|---|---|---|---|---|
| 0
    
        mishaPH модератор 05.10.17✎ 11:39 | 
        Блин что-то мозг не соображает
 есть некий платежный календарь в рамках недели. например платим по понедельникам и средам. Как найти ближайший платежный день?? если есть текущая дата и день недели к ней. например вторник и день недели 2. есть текущая дата и день недели к ней. например четверг и день недели 4. | |||
| 1
    
        Волшебник модератор 05.10.17✎ 11:42 | 
        нужен запрос в цикле     | |||
| 2
    
        Филиал-msk 05.10.17✎ 11:44 | 
        "В рамках недели" это всего 7 вариантов. Проверь каждый и не выноси мозг.     | |||
| 3
    
        dezss 05.10.17✎ 11:45 | 
        э..ну разницу посчитай и минимум сделай     | |||
| 4
    
        DrShad 05.10.17✎ 11:45 | 
        и не забудь проверку на конец календаря в 1С     | |||
| 5
    
        dezss 05.10.17✎ 11:45 | 
        (3) разницу дат, а не дней недели, ессно)     | |||
| 6
    
        Рэйв 05.10.17✎ 11:47 | 
        (0)Если вторник, то ближайший- следующая среда. Все остальное - ближайший понедельник. Если я правильно понял сабж     | |||
| 7
    
        mishaPH модератор 05.10.17✎ 11:49 | 
        (2) 5     | |||
| 8
    
        mishaPH модератор 05.10.17✎ 11:50 | 
        (6) нее. у контрагента календарь, где отменено, что День2 = 1 и день 4 = 1
 Это не просто найти ближайший рабочий день | |||
| 9
    
        mishaPH модератор 05.10.17✎ 11:50 | 
        (6) да     | |||
| 10
    
        VladZ 05.10.17✎ 11:53 | 
        Из контрагента получаем дни оплаты в виде (2,4). Получаем все даты календаря, добавляем колонку "деньНедели" (как ДеньНедели). Накладываем условие деньНедели в (2,4). По полученным дням определяем ближайшую. Дальше расписывать?     | |||
| 11
    
        torgm 05.10.17✎ 11:56 | 
        (0) минимальная неотрицательная разница по дням недели, у меня логистика примерно так же работает.
 дни недели доставки привязаны к сектору в регистре сведений | |||
| 12
    
        mishaPH модератор 05.10.17✎ 11:56 | 
        (10) если не трудно. что то не пойму пипец. завтра в отпуск и мозг не соображает ;)     | |||
| 13
    
        mishaPH модератор 05.10.17✎ 11:58 | 
        (11) есть 1с 7ка. какой регистр сведений вы о чем... у контрагента есть День1...День5 реквизит там 0 или 1
 есть тек дата или дата минимальная от которой надо идя вперед по дням недели найти тот который у ка = 1 и опознить его датой | |||
| 14
    
        Zmich 05.10.17✎ 11:58 | 
        Функция ПолучитьБлижайшийДеньПлатежа(ВыбДата)
 День1 = 1; // понедельник - платежный день День2 = 3; // среда - тоже платежный день ВыбДеньНедели = ДеньНедели(ВыбДата); БлижайшийДеньПлатежа = НачалоДня(ВыбДата); Пока ((ВыбДеньНедели <> День1) И (ВыбДеньНедели <> День2)) Цикл БлижайшийДеньПлатежа = БлижайшийДеньПлатежа + 86400; ВыбДеньНедели = ДеньНедели(БлижайшийДеньПлатежа); КонецЦикла; Возврат БлижайшийДеньПлатежа; КонецФункции Не претендую на оптимальность, тупой перебор день за днем, пока не получим нужный. | |||
| 15
    
        mishaPH модератор 05.10.17✎ 11:58 | 
        могу конечно сделать дикий цикл 5*5 но хочется как-то покороче и элегантней.     | |||
| 16
    
        mishaPH модератор 05.10.17✎ 12:00 | 
        (14) начало дня это что?     | |||
| 17
    
        Альбатрос 05.10.17✎ 12:01 | 
        (16) Это 00:00:00     | |||
| 18
    
        VladZ 05.10.17✎ 12:01 | 
        (13) Так это 7.7? Тогда вариант (14).     | |||
| 19
    
        Альбатрос 05.10.17✎ 12:01 | 
        (16) Можно и без него кстати     | |||
| 20
    
        VladZ 05.10.17✎ 12:02 | 
        Только он корявенький, ИМХО.     | |||
| 21
    
        Zmich 05.10.17✎ 12:02 | 
        (16). Начало дня не обязательно, просто чтобы возвращалась дата со временем 0:00:00, а не непонятно что. В 7-ке код из (14) не будет работать. ДеньНедели() не уверен, что там есть. И вместо +86400 просто +1.     | |||
| 22
    
        mishaPH модератор 05.10.17✎ 12:03 | 
        (21) день недели есть НомерДняНедели     | |||
| 23
    
        dezss 05.10.17✎ 12:04 | 
        перенесите ветку в семерошную, а то путають тут нас...     | |||
| 24
    
        mishaPH модератор 05.10.17✎ 12:04 | 
        счасПопробую..     | |||
| 25
    
        Zmich 05.10.17✎ 12:04 | 
        (20). Не спорю, что корявенький, но работать будет.     | |||
| 26
    
        mishaPH модератор 05.10.17✎ 12:08 | 
        тут еще момент. у ка может быть в рамках от 1 до 5 платежных дней. т.е. 
 День1 = 1;// понедельник - платежный день День2 = 3;// среда - тоже платежный день дней моет быть несколько а может и не быть | |||
| 27
    
        VladZ 05.10.17✎ 12:09 | 
        (26) Я и говорю, корявенький. :)     | |||
| 28
    
        mistеr 05.10.17✎ 12:09 | 
        (13) 1. Собрать дни платежа в список значений: ПлатежныеДни.
 2. Получить номер дня текущей даты (не помню, как в семерке): ТекДень. 3. В ПлатежныеДни ищем первый ПлатежныйДень, который >= ТекДень. Разница = ПлатежныйДень - ТекДень. 4. Если такого нет, берем просто ПлатежныйДень = ПлатежныеДни(0). Разница = 7 - ТекДень + ПлатежныйДень. 5. ДатаПлатежа = ТекущаяДата + Разница. | |||
| 29
    
        VladZ 05.10.17✎ 12:10 | 
        Как-то так.  Писал по памяти, 7.7 нет под рукой
 Функция ПолучитьБлижайшийДеньПлатежа(ВыбДата, СписокДнейОплаты) ВыбДеньНедели = ДеньНедели(ВыбДата); БлижайшийДеньПлатежа = НачалоДня(ВыбДата); Пока СписокДнейОплаты.Принадлежит(ВыбДеньНедели) = 0 Цикл БлижайшийДеньПлатежа = БлижайшийДеньПлатежа + 86400; ВыбДеньНедели = ДеньНедели(БлижайшийДеньПлатежа); КонецЦикла; Возврат БлижайшийДеньПлатежа; КонецФункции | |||
| 30
    
        VladZ 05.10.17✎ 12:10 | 
        Упс. БлижайшийДеньПлатежа = БлижайшийДеньПлатежа + 1;     | |||
| 31
    
        VladZ 05.10.17✎ 12:11 | 
        На входе еще желательно проверить, заполнен ли список дней оплаты.     | |||
| 32
    
        mishaPH модератор 05.10.17✎ 12:11 | 
        (28) да можно в список, можно в строк
 а далее например вышла строка 1,3 и в условии Если найти(СтрокаА,ВыбДеньНедели) = 0 | |||
| 34
    
        mishaPH модератор 05.10.17✎ 12:12 | 
        (29) Да или так     | |||
| 35
    
        mishaPH модератор 05.10.17✎ 12:29 | 
        Функция ПолучитьБлижайшийДеньПлатежа(ВыбДата, СписокДнейОплаты)
 ВыбДеньНедели = НомерДняНедели(ВыбДата); БлижайшийДеньПлатежа = ВыбДата; Пока СписокДнейОплаты.Принадлежит(ВыбДеньНедели) = 0 Цикл БлижайшийДеньПлатежа = БлижайшийДеньПлатежа + 1; ВыбДеньНедели = НомерДняНедели(БлижайшийДеньПлатежа); КонецЦикла; Возврат БлижайшийДеньПлатежа; КонецФункции Процедура Сформировать() СписокДнейОплаты = СоздатьОбъект("СписокЗначений"); СписокДнейОплаты.ДобавитьЗначение(1); СписокДнейОплаты.ДобавитьЗначение(3); Сообщить(ПолучитьБлижайшийДеньПлатежа(ДатаА,СписокДнейОплаты)); КонецПроцедуры вот . работает если кому-то надо будет | |||
| 36
    
        Злопчинский 05.10.17✎ 13:12 | 
        СписокДнейОплаты = СоздатьОбъект("СписокЗначений");
 СписокДнейОплаты.ДобавитьЗначение(1,"1"); СписокДнейОплаты.ДобавитьЗначение(2,"3"); СписокДнейОплаты.ДобавитьЗначение(3,"3"); СписокДнейОплаты.ДобавитьЗначение(4,"1"); СписокДнейОплаты.ДобавитьЗначение(5,"1"); СписокДнейОплаты.ДобавитьЗначение(6,"1"); СписокДнейОплаты.ДобавитьЗначение(7,"1"); //ТДН - текущий день недели ДеньПлатежа=""; СписокДнейОплаты.ПолучитьЗначение(ТДН,ДеньПлатежа); ДеньПлатежа = Число(ДеньПлатежа); | |||
| 37
    
        mistеr 05.10.17✎ 15:18 | 
        (35) Добавь проверку, что СписокДнейОплаты не пустой, а то зациклишься.     | |||
| 38
    
        mishaPH модератор 05.10.17✎ 15:22 | 
        (37) мерси     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |