Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Найди ближайшую дату.

Я
   mishaPH
 
Модератор
05.10.17 - 11:39
Блин что-то мозг не соображает

есть некий платежный календарь в рамках недели. например платим по понедельникам и средам.

Как найти ближайший платежный день??
если
есть текущая дата и день недели к ней. например вторник и день недели 2.
есть текущая дата и день недели к ней. например четверг и день недели 4.
 
 
   Волшебник
 
Модератор
1 - 05.10.17 - 11:42
нужен запрос в цикле
   Филиал-msk
 
2 - 05.10.17 - 11:44
"В рамках недели" это всего 7 вариантов. Проверь каждый и не выноси мозг.
   dezss
 
3 - 05.10.17 - 11:45
э..ну разницу посчитай и минимум сделай
   DrShad
 
4 - 05.10.17 - 11:45
и не забудь проверку на конец календаря в 1С
   dezss
 
5 - 05.10.17 - 11:45
(3) разницу дат, а не дней недели, ессно)
   Рэйв
 
6 - 05.10.17 - 11:47
(0)Если вторник, то ближайший- следующая среда. Все остальное - ближайший понедельник. Если я правильно понял сабж
   mishaPH
 
Модератор
7 - 05.10.17 - 11:49
(2) 5
   mishaPH
 
Модератор
8 - 05.10.17 - 11:50
(6) нее. у контрагента календарь, где отменено, что День2 = 1 и день 4 = 1

Это не просто найти ближайший рабочий день
   mishaPH
 
Модератор
9 - 05.10.17 - 11:50
(6) да
   VladZ
 
10 - 05.10.17 - 11:53
Из контрагента получаем дни оплаты в виде (2,4). Получаем все даты календаря, добавляем колонку "деньНедели" (как ДеньНедели). Накладываем условие деньНедели в (2,4). По полученным дням определяем ближайшую. Дальше расписывать?
 
 Рекламное место пустует
   torgm
 
11 - 05.10.17 - 11:56
(0) минимальная неотрицательная разница по дням недели, у меня логистика примерно так же работает.

дни недели доставки привязаны к сектору в регистре сведений
   mishaPH
 
Модератор
12 - 05.10.17 - 11:56
(10) если не трудно. что то не пойму пипец. завтра в отпуск и мозг не соображает ;)
   mishaPH
 
Модератор
13 - 05.10.17 - 11:58
(11) есть 1с 7ка. какой регистр сведений вы о чем... у контрагента есть День1...День5 реквизит там 0 или 1

есть тек дата или дата минимальная от которой надо идя вперед по дням недели найти тот который у ка = 1 и опознить его датой
   Zmich
 
14 - 05.10.17 - 11:58
Функция ПолучитьБлижайшийДеньПлатежа(ВыбДата)
  День1 = 1;// понедельник - платежный день

  День2 = 3;// среда - тоже платежный день

  ВыбДеньНедели = ДеньНедели(ВыбДата);
  БлижайшийДеньПлатежа = НачалоДня(ВыбДата);
  Пока ((ВыбДеньНедели <> День1) И (ВыбДеньНедели <> День2)) Цикл
    БлижайшийДеньПлатежа = БлижайшийДеньПлатежа + 86400;
    ВыбДеньНедели = ДеньНедели(БлижайшийДеньПлатежа);
  КонецЦикла;
  Возврат БлижайшийДеньПлатежа;
КонецФункции

Не претендую на оптимальность, тупой перебор день за днем, пока не получим нужный.
   mishaPH
 
Модератор
15 - 05.10.17 - 11:58
могу конечно сделать дикий цикл 5*5 но хочется как-то покороче и элегантней.
   mishaPH
 
Модератор
16 - 05.10.17 - 12:00
(14) начало дня это что?
   Альбатрос
 
17 - 05.10.17 - 12:01
(16) Это 00:00:00
   VladZ
 
18 - 05.10.17 - 12:01
(13) Так это 7.7? Тогда вариант (14).
   Альбатрос
 
19 - 05.10.17 - 12:01
(16) Можно и без него кстати
   VladZ
 
20 - 05.10.17 - 12:02
Только он корявенький, ИМХО.
   Zmich
 
21 - 05.10.17 - 12:02
(16). Начало дня не обязательно, просто чтобы возвращалась дата со временем 0:00:00, а не непонятно что. В 7-ке код из (14) не будет работать. ДеньНедели() не уверен, что там есть. И вместо +86400 просто +1.
   mishaPH
 
Модератор
22 - 05.10.17 - 12:03
(21) день недели есть НомерДняНедели
   dezss
 
23 - 05.10.17 - 12:04
перенесите ветку в семерошную, а то путають тут нас...
   mishaPH
 
Модератор
24 - 05.10.17 - 12:04
счасПопробую..
   Zmich
 
25 - 05.10.17 - 12:04
(20). Не спорю, что корявенький, но работать будет.
   mishaPH
 
Модератор
26 - 05.10.17 - 12:08
тут еще момент. у ка может быть в рамках от 1 до 5 платежных дней. т.е.

  День1 = 1// понедельник - платежный день


  День2 = 3// среда - тоже платежный день


дней моет быть несколько а может и не быть
   VladZ
 
27 - 05.10.17 - 12:09
(26) Я и говорю, корявенький. :)
   mistеr
 
28 - 05.10.17 - 12:09
(13) 1. Собрать дни платежа в список значений: ПлатежныеДни.
2. Получить номер дня текущей даты (не помню, как в семерке): ТекДень.
3. В ПлатежныеДни ищем первый ПлатежныйДень, который >= ТекДень. Разница = ПлатежныйДень - ТекДень.
4. Если такого нет, берем просто ПлатежныйДень = ПлатежныеДни(0). Разница = 7 - ТекДень + ПлатежныйДень.
5. ДатаПлатежа = ТекущаяДата + Разница.
   VladZ
 
29 - 05.10.17 - 12:10
Как-то так.  Писал по памяти, 7.7 нет под рукой

Функция ПолучитьБлижайшийДеньПлатежа(ВыбДата, СписокДнейОплаты)

  ВыбДеньНедели = ДеньНедели(ВыбДата);
  БлижайшийДеньПлатежа = НачалоДня(ВыбДата);
  Пока СписокДнейОплаты.Принадлежит(ВыбДеньНедели) = 0 Цикл
    БлижайшийДеньПлатежа = БлижайшийДеньПлатежа + 86400;
    ВыбДеньНедели = ДеньНедели(БлижайшийДеньПлатежа);
  КонецЦикла;
  Возврат БлижайшийДеньПлатежа;
КонецФункции
   VladZ
 
30 - 05.10.17 - 12:10
Упс. БлижайшийДеньПлатежа = БлижайшийДеньПлатежа + 1;
   VladZ
 
31 - 05.10.17 - 12:11
На входе еще желательно проверить, заполнен ли список дней оплаты.
   mishaPH
 
Модератор
32 - 05.10.17 - 12:11
(28) да можно в список, можно в строк

а далее например вышла строка 1,3
и в условии Если найти(СтрокаА,ВыбДеньНедели) = 0
   mishaPH
 
Модератор
34 - 05.10.17 - 12:12
(29) Да или так
   mishaPH
 
Модератор
35 - 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");

    //ТДН - текущий день недели

    ДеньПлатежа="";
    СписокДнейОплаты.ПолучитьЗначение(ТДН,ДеньПлатежа);
    ДеньПлатежа = Число(ДеньПлатежа);
   mistеr
 
37 - 05.10.17 - 15:18
(35) Добавь проверку, что СписокДнейОплаты не пустой, а то зациклишься.
   mishaPH
 
Модератор
38 - 05.10.17 - 15:22
(37) мерси



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует