Имя: Пароль:
1C
1С v8
Работа с датой
0 Hennessy
 
15.01.14
13:15
Я наткнулся на проблему, взял цикл в него внес условие

Пока '20140101'<='20241231 Цикл (это все грубо говоря)

После чего мне стало нужно определить ПЕРЕМЕННУЮ с конкретной датой, но не указывая ГОД в ней! чтобы когда цикл продолжался в каждом из годов в который переходит цикл была конкретная дата! Подскажите что можно использовать и как записать? К примеру чтобы переменная содержала только месяц и дату!
2 Hennessy
 
15.01.14
13:17
Ну либо проще говоря, из такой записи: Дата(2014, 02, 23); мне нужно отрезать ГОД
3 Wobland
 
15.01.14
13:18
(2) а=2; б=23;
4 GROOVY
 
15.01.14
13:18
Дата(0001, 02, 23) пойдет?
5 Hennessy
 
15.01.14
13:21
(3) у меня цель чтобы переменная содержала дату и месяц, но года небыло, в данном случае год всеравно придется указывать же?!
6 Maxus43
 
15.01.14
13:22
Пока Месяц(дата)<=10 И день(дата)<= 12 Цикл
7 Wobland
 
15.01.14
13:22
(5) занятная цель. без меня
8 Wobland
 
15.01.14
13:23
(7) сторно: структура
9 Hennessy
 
15.01.14
13:27
(8)  интересное предложение, но как конкретно мне это использовать, я от думаю над этим
10 Wobland
 
15.01.14
13:28
(9) всё-таки другая цель, да?
11 Ненавижу 1С
 
гуру
15.01.14
13:29
(0) зачем?
12 Hennessy
 
15.01.14
13:29
(10) ну вот я говорю, моя конкретная цель это получение переменной со значением, 23 февраля, год должен меняться сам по себе
13 Ненавижу 1С
 
гуру
15.01.14
13:30
(12) еще раз, для чего?
14 Wobland
 
15.01.14
13:30
(11) а чтоб с днём рождения поздравить. перебираем все года, перебираем сотрудников...
15 Wobland
 
15.01.14
13:30
(12) это решение, причём не самое прямое
16 Wobland
 
15.01.14
13:31
(12) раз уж так хочется: ПеременнаяСоЗначением="23 февраля"
17 Defender aka LINN
 
15.01.14
13:32
(12) "Само по себе" в этом мире ничего не происходит, а в программировании - тем более.
Даты "23 февраля" в информатике не существует. Если 23 февраля 2014 года, 13:57:06.
Ну и если "конкретная цель это получение переменной со значением" - представь, что ты ее получил и успокойся, ведь по твоим собственным словам это и есть цель, никто ничего с этой переменной больше делать не будет.
18 Hennessy
 
15.01.14
13:32
(15) дело в том что я делаю это внешней обработкой, у меня нет ни ревизитов, ни чего либо, у меня есть лишь модуль формы, в котором я описываю цикл определенного времени и мне нужно отследить 23 февраля в каждом из всех перечисленых годов!
19 Рэйв
 
15.01.14
13:33
для н=1 По 2014 Цикл
   Сообщить(Формат(Дата(н,2,23,0,0,0),"ДФ=""дд.ММММ.гггг"""));
Конеццикла
20 Wobland
 
15.01.14
13:34
(18) а запускается обработка в чистом ДОСе
21 Hennessy
 
15.01.14
13:35
(19) Неплохая идея, попробую поэксперементировать, спасибо!
22 Defender aka LINN
 
15.01.14
13:36
(21) Рукалицо.
(18) О как. Уже, оказывается, годы где-то перечислены.
23 catena
 
15.01.14
13:37
А чем структура не подходит?
24 Hennessy
 
15.01.14
13:39
(23) структурой тоже попробую воспользоваться
P.S.: (8) Спасибо!
25 azernot
 
15.01.14
13:43
Посмотрите темы автора. Мне кажется, что программирование - просто не его тема, и чем раньше он займётся чем-то другим, тем больше шансов добиться успеха.
26 Hennessy
 
15.01.14
13:45
(25) Не стоит, я тебя не критикую и меня тоже не стоит! я учусь!
27 Михаил 1С
 
15.01.14
13:46
(0) сделай просто - год поставь 0001. И все.
Можешь сравнивать две такие даты, у которых нет года. Ты им поставь обоим одинаковый год (0001), и все.
28 Hennessy
 
15.01.14
13:47
(25) Больше чем уверен ты тоже сталкивался с огромным множеством проблем когда учился! и многое не понимал! + к тому же у многих были курсы и тому подобное! а я самоучка, сижу и учусь по различным книгам и смотрю различные видиокурсы, если у меня есть проблема, мне даже неукого спросить что то, кроме как тут!!!
29 Михаил 1С
 
15.01.14
13:47
(27) А потом, когда надо - поставь место года 0001 уже тот, что надо. И будет тебе "мне надо, чтобы год менялся сам по себе".
30 Hennessy
 
15.01.14
13:48
(27) спасибо, попробую
31 Михаил 1С
 
15.01.14
13:48
В справке найди как работать с типом Дата. И составишь дату какую тебе надо.
32 Wobland
 
15.01.14
13:48
(28) тебя русским языком спросили: зачем? а ты не понял
33 Рэйв
 
15.01.14
13:50
(28)Ты не поверишь. Когда я начинал не было ни курсов ни литературы. У меня не было даже интернета. Только желто-красные книжки и старенький комп.  Так что нечего бравировать. Тут большинство самоучки в 1С.
34 Cube
 
15.01.14
13:50
(28) Так тебя пытаются спросить зачем, выяснить детали... А ты упираешься, молчишь как партизан... "Ну и ходи босой, раз такой умный" (С)
35 Hennessy
 
15.01.14
13:52
(33) я ничего плохого ни про кого не сказал! Более того я признаю тот факт что я сейчас нулевой в программировании! НО! не стоит пытаться критиковать! То что сказал тот человек, было не целесообразно и не очень красиво!
36 Hennessy
 
15.01.14
13:53
Зачем мне это нужно? Я же уже описал это
37 Wobland
 
15.01.14
13:53
(36) ничего ты не описал
38 Рэйв
 
15.01.14
13:54
(35)Какие мы нежные:-) Могу тебя уверить, что пока ты не выйдешь хотя бы на средний уровень  - тебя будут нещадно пинать. Спасет тебя только выдержка и правильно заданные вопросы.Так что привыкай.
39 vicof
 
15.01.14
13:54
(35) справедливости нет
40 Wobland
 
15.01.14
13:54
(39) есть. я могу кидаться какашками, а ТС - нет ;)
41 Hennessy
 
15.01.14
13:55
Хорошо, сейчас опишу подробнее
42 Wobland
 
15.01.14
13:55
(41) про желаемый конечный результат не забудь
43 Hennessy
 
15.01.14
14:00
Процедура Вычисление5(Команда)
    
     ДатаНач = Дата(2018, 01, 01, 0, 0, 0);
     ДатаКон = Дата(2018, 12, 30, 23, 59, 59);

     НовГод = Дата(2018, 01, 01);
     ДвТрФев = Дата(2018, 02, 23);
     ВосМарта = Дата(2018, 03, 08);
    
     Счетчик = 1;
     Счетчик2 = 1;
     Счетчик3 = 1;
         
     Пока ДатаНач<=ДатаКон Цикл         
        
         ДатаНач = ДатаНач+86400;
         ДН = ДеньНедели(ДатаНач);
        
        
         Если ДН=1 или ДН=2 или ДН=3 или ДН=4 или ДН=5 Тогда
             Счетчик2 = Счетчик2+1;
            
             Если НовГод = ДатаНач Тогда
                 Счетчик3=Счетчик3+1;
                 //Сообщить("НОВЫЙ ГОД");
             КонецЕсли;
            
             Если ДвТрФев = ДатаНач Тогда
                 Счетчик3=Счетчик3+1;
                 //Сообщить("23 Февраля");
             КонецЕсли;
            
             Если ВосМарта = ДатаНач Тогда        
                 Счетчик3=Счетчик3+1;
                 //Сообщить("8 Марта");
             КонецЕсли;
            
         КонецЕсли;
        
        
         Счетчик = Счетчик+1;
        
         Если ДН = 6 или ДН = 7  Тогда
            
         Иначе
             //Сообщить(ДН);
             //Сообщить(ДатаНач);
         КонецЕсли;
        
     КонецЦикла;
    
     ИтогДней = Счетчик2-Счетчик3;
    
     Сообщить("Всего дней в 2018 году:"+" "+ Счетчик);
     Сообщить("Рабочих дней всего в 2018 году:"+" "+Счетчик2);
     Сообщить("Количество рабочих Дней с учетом Праздников в 2018г:"+ИтогДней);

     ПоказатьОповещениеПользователя("ИНФОРМАЦИЯ ДЛЯ ПОЛЬЗОВАТЕЛЯ", ,"Теперь прокрутите бегунок вниз и вы увидите результат");

КонецПроцедуры

У меня есть такая процедура, в ней расчитывается количество рабочих дней в году! Выходные и праздники не отображаются! мне нужно поменять её, сделать период цикла с 2014год по 2024! соотвецтвенно праздничные дни, такие как "новый год", "23 февраля" и "8 марта" мне нужно привязать не конкретно к 2014 году а чтобы когда я перепишу процедуру
дата так же не отображалась в другие годы!

Пример того что хочу, без того что мне нужно:
ДатаНач = Дата(2014, 01, 01, 0, 0, 0);
    ДатаКон = Дата(2024, 12, 30, 23, 59, 59);
    
    
    
     Счетчик = 1;
     Счетчик2 = 1;
    
     Пока ДатаНач<=ДатаКон Цикл         
        
         ДатаНач = ДатаНач+86400;
         ДН = ДеньНедели(ДатаНач);
        
        
         Если ДН=1 или ДН=2 или ДН=3 или ДН=4 или ДН=5 Тогда
            
             Счетчик2 = Счетчик2+1;
                         
         КонецЕсли;
        
        
         Счетчик = Счетчик+1;
        
         Если ДН = 6 или ДН = 7  Тогда        
         Иначе
             //Сообщить(ДН);
             //Сообщить(ДатаНач);
         КонецЕсли;
        
        
     КонецЦикла;      
    
     Сообщить("Всего дней в Промежуток ЛЕТ:"+" "+ Счетчик);
     Сообщить("Рабочих дней всего в Промежуток ЛЕТ:"+" "+Счетчик2);
44 vicof
 
15.01.14
14:01
ПоказатьОповещениеПользователя("ИНФОРМАЦИЯ ДЛЯ ПОЛЬЗОВАТЕЛЯ", ,"Теперь прокрутите бегунок вниз и вы увидите результат");
класс, спасибо, поржал :)))
45 Wobland
 
15.01.14
14:01
правильно ли будет сказать, что тебе нужно поиметь количество рабочих дней в указанных пользователем годах?
46 Hennessy
 
15.01.14
14:04
(45) мне нужно получить количество рабочих дней! Другим языком из 365 дней убрать ВЫХОДНЫЕ дни и ПРАЗДНИКИ(те которые указываю)
47 Wobland
 
15.01.14
14:04
(46) видишь, как всё просто
48 Wobland
 
15.01.14
14:06
самый тупой вариант. шарашить циклом по дням и смотреть в день недели и в попадание в праздник
49 Wobland
 
15.01.14
14:07
(48) попадание в праздник делается сравнением дня и месяца с эталонным
50 Jofa
 
15.01.14
14:07
(46)А зачем тебе это?
51 vicof
 
15.01.14
14:07
(46) Обрати внимание на РС РегламентированныйПроизводственныйКалендарь в типовых
52 1dvd
 
15.01.14
14:07
Функция ДатаБезГода(ЗначениеДаты) Экспорт
    
    ДеньДаты = День(ЗначениеДаты);
    МесяцДаты = Месяц(ЗначениеДаты);
    
    Возврат Дата(01, МесяцДаты, ДеньДаты);
    
КонецФункции

//Использование:
ВосьмоеМарта = ДатаБезГода(Дата(2014, 03, 08));
Если ДатаБезГода(ТекущаяДата) = ВосьмоеМарта Тогда
    Предупреждение("С 8 марта! @>-\---");
КонецЕсли;
53 Wobland
 
15.01.14
14:08
(51) у него хардкор. пустая скорей всего
54 Jofa
 
15.01.14
14:08
(51)А за чем туда смотреть?
55 vicof
 
15.01.14
14:09
(53) Я понимаю, поэтому и советую посмотреть в нужную сторону)
56 Hennessy
 
15.01.14
14:10
(52) Спасибо!
57 Wobland
 
15.01.14
14:10
(55) я поддерживаю идею запроса, да. но календарь ещё заполнять положено. а ну как препод захочет затестить 19й век
58 Рэйв
 
15.01.14
14:10
(43)>>ДатаКон = Дата(2024, 12, 30, 23, 59, 59);

В декабре 31 день вообщето:-)

Делал бы уж тогда
ДатаКон = КонецГода(ДатаНач);
59 Hennessy
 
15.01.14
14:10
(55) Я уже смотрел это и пробовал, спсибо за предложение! просто мне нужно это сделать самому!
60 Wobland
 
15.01.14
14:11
(52) а не взлетит же после 3999го, не?
61 Hennessy
 
15.01.14
14:11
(58) я знаю, я написал 30 целенаправлено! потому что если написать 31 то в цикл войдет и 1.01.2015г., а мне это не подходит
62 Wobland
 
15.01.14
14:12
(58) я бы не поручился за медведева в 24м году...
63 1dvd
 
15.01.14
14:12
(60) Знаешь, я буду очень рад, если этот код будет использоваться хотя бы до 3998-го
64 Wobland
 
15.01.14
14:12
(61) и день потерял, двоечник
65 Ненавижу 1С
 
гуру
15.01.14
14:14
(57) в 19 веке 23-е февраля не праздновали еще
66 Hennessy
 
15.01.14
14:15
(64) я ничего не потерял, получилось все верно 365 дней, цикл заканчивается как раз когда в цикл переходит на 31.12.2014, а мои условия это устраивает
67 Wobland
 
15.01.14
14:16
(66) цикл устроен неверно вне зависимости от степени удоветворённости результатом
68 Hennessy
 
15.01.14
14:16
Ребят прекращайте тролить, я учусь, не надо меня осуждать! Я уверен что все начинали не во много лучше!
69 Wobland
 
15.01.14
14:17
(68) закройся газеткой и учись ;)
70 Рэйв
 
15.01.14
14:18
А вобще все просто

если твоим перебором, то как то так
тДанные=Новый ТаблицаЗначений;
тДанные.Колонки.Добавить("Год");
тДанные.Колонки.Добавить("Дней");
Для н=2014 По 2024 Цикл
    Д=(н,1,1,23,59,59);
    ДатаКон=Дата(н,12,31,23,59,59);
    Нов=тДанныеДобавить();
    Нов.Год=н;
    Нов.Дней=0;
    Пока Д <=ДатаКон Цикл
         ДеньН=ДеньНедели(Д);
         Если ДеньН=6  Или ДеньН=7
              Или (День(Д)=1 И Месяц(Д)=1)
              Или (День(Д)=23 И Месяц(Д)=2)
              Или (День(Д)=8 И Месяц(Д)=3)Тогда
              Прододжить;

         КонецЕсли;
         Нов.Дней=Нов.Дней+1;
    КонецЦикла;
Конеццикла;
тДанные.ВыбратьСтроку();
71 Рэйв
 
15.01.14
14:19
да..Забыл в цикле надо еще добавить перед КонецЦикла
Д=Д+86400;
72 Рэйв
 
15.01.14
14:19
во вложенном цикле по дням
73 Hennessy
 
15.01.14
14:21
(70) спасибо
74 Рэйв
 
15.01.14
14:21
(73)Не во что:-)
75 Пятничник
 
15.01.14
14:36
(28) здесь проблема не в программировании на конкретном языке, а в построении алгоритма, что невозможно (или существенно затруднено) без стройного логического мышления.
76 Пятничник
 
15.01.14
14:40
(70) а 1, 2, 9 мая?
кстати, у вас 23 февраля - выходной? а у нас - рабочий...
77 Рэйв
 
15.01.14
14:43
(76)У нас тоже. Но раз автор хочет, пусть отдыхает:-)
А остальные праздники пусть сам в условие добавляет копипастом, если ему лень регистр сведений какойнить придумать
78 Torquader
 
15.01.14
14:48
Функция ДеньРожденияСотрудникаСегодня(лдДеньРождения,лдТекущаяДата)
лчМесяцРождения=Месяц(лдДеньРождения);
лчДеньМесяца=День(лдДеньРождения);
Если(День(лдТекущаяДата)=лчДеньМесяца)И(Месяц(лдТекущаяДата)=лчМесяцРождения)Тогда
  Возврат Истина;
КонецЕсли;
Если(лчМесяцРождения=2)И(лчДеньМесяца=29)Тогда
  Если(День(лдТекущаяДата)=28)И(Месяц(лдТекущаяДата)=2)И(День(ТекущаяДата+86400)=1)Тогда
   Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции

Функция НапомнитьОДнеРожденияСотрудника(лдДеньРождения,лдТекущаяДата,лчКоличествоДней)
Если ДеньРожденияСотрудникаСегодня(лдДеньРождения,лдТекущаяДата)=Истина Тогда
  Возврат "Сегодня";
КонецЕсли;
Для лч=1 По лчКоличествоДней Цикл
  Если ДеньРожденияСотрудникаСегодня(лдДеньРождения,лдТекущаяДата+(86400*лч))=Истина Тогда
   Возврат "Напомнить";
  КонецЕсли;
КонецЦикла;
Возврат "Не скоро";
КонецФункции
79 catena
 
15.01.14
15:22
ВЫБРАТЬ
    ВЫБОР
        КОГДА РАЗНОСТЬДАТ(&ТекущаяДата, ДОБАВИТЬКДАТЕ(Ссылка.ДатаРождения, ГОД, РАЗНОСТЬДАТ(Ссылка.ДатаРождения, &ТекущаяДата, ГОД)), ДЕНЬ) < 0
            ТОГДА РАЗНОСТЬДАТ(&ТекущаяДата, ДОБАВИТЬКДАТЕ(Ссылка.ДатаРождения, ГОД, РАЗНОСТЬДАТ(Ссылка.ДатаРождения, &ТекущаяДата, ГОД) + 1), ДЕНЬ)
        ИНАЧЕ РАЗНОСТЬДАТ(&ТекущаяДата, ДОБАВИТЬКДАТЕ(Ссылка.ДатаРождения, ГОД, РАЗНОСТЬДАТ(Ссылка.ДатаРождения, &ТекущаяДата, ГОД)), ДЕНЬ)
    КОНЕЦ КАК ОсталосьДнейДоДняРождения
ИЗ
    Справочник.ФизическиеЛица
80 Пятничник
 
15.01.14
15:31
(78) (79) при чем тут дни рождения? вроде уже выяснили, что речь идет о праздниках, точнее - посчитать количество рабочих дней в году (за вычетом выходных и праздников), не используя типовые графики и регистры сведений :-)
81 catena
 
15.01.14
15:34
(80)Как пример сравнения даты_числа в разных годах.
82 Hennessy
 
15.01.14
15:46
Сделал так, только вот теперь нужно отделить года друг от друга, Дополнительно выводить сообщения "Сообщить()" с определенным годом, количеством дней в нем и количеством рабочих дней в нем!

Процедура Дополнительно(Команда)
    
     ДатаНач = Дата(2014, 01, 01, 0, 0, 0);
     ДатаКон = Дата(2024, 12, 30, 23, 59, 59);    
     Счетчик = 1;
     Счетчик2 = 1;
     Счетчик3 = 1;
    
     Пока ДатаНач<=ДатаКон Цикл    
        
         ДатаНач = ДатаНач+86400;
         ДН = ДеньНедели(ДатаНач);
         ДГ = ДеньГода(ДатаНач);
        
        
         Если ДГ = 1 или ДГ = 54 или ДГ = 67 Тогда
             Счетчик3 = Счетчик3+1;
         КонецЕсли;
        
         Если ДН=1 или ДН=2 или ДН=3 или ДН=4 или ДН=5 Тогда                          
             Счетчик2 = Счетчик2+1;
         КонецЕсли;
        
         Счетчик = Счетчик+1;
        
         Если ДН = 6 или ДН = 7  Тогда        
         Иначе
             //Сообщить(ДН);
             //Сообщить(ДатаНач);
             //Сообщить(ДГ);
         КонецЕсли;    
     КонецЦикла;      
    
     ИтоговоеЗначениеВсехЛет=Счетчик2-Счетчик3;
    
     Сообщить("ИТОГ, ВСЕГО ДНЕЙ с 2014 по 2024:"+" "+ Счетчик);
     Сообщить("ИТОГ РАБОЧИХ ДНЕЙ С УЧЕТОМ ВЫХОДНЫХ:"+" "+Счетчик2);
     Сообщить("ИТОГ РАБОЧИХ ДНЕЙ С УЧЕТОМ ВЫХОДНЫХ И ПРАЗДНИКОВ:"+" "+ИтоговоеЗначениеВсехЛет);
     ПоказатьОповещениеПользователя("ОПОВЕЩЕНИЕ...", ,"ГОТОВО");
    
КонецПроцедуры
83 Wobland
 
15.01.14
16:02
(82) вперёд!
84 Wobland
 
15.01.14
16:03
>Если ДГ = 1 или ДГ = 54 или ДГ = 67 Тогда
это для обычного или високосного?
85 Пятничник
 
15.01.14
16:14
(84) опередил... :-)
86 Пятничник
 
15.01.14
16:15
(84) хотя с другой стороны, ему же нужно количество, так что особой разницы, когда он назначит выходной - на 8-е марта или на 7-е - не вижу.
87 Wobland
 
15.01.14
16:22
(86) возражений не имею. неплохо было бы это услышать от автора ;)
88 vmv
 
15.01.14
16:25
запросом сгенерить таблицу дат с полями номера года, месяца, дня и фильтруй как хочешь в полпинка

переборы для девочек
89 vmv
 
15.01.14
16:27
(88) производственный календарь + запрос рулит, если там замес и на праздники/выходные

все остальное от лукавого
90 alxxsssar
 
15.01.14
16:44
(53) В чем сложность скопировать из типовой производственный календарь? даже драг энд дропом
91 Wobland
 
15.01.14
16:45
(90) будет ветка про заполнить календарь. а оно нам надо? ;)
92 alxxsssar
 
15.01.14
16:47
(91) а чо? поможем. Поржем заодно)))
93 Torquader
 
15.01.14
23:15
(80) А как тогда узнать, что у нас праздник, а что выходной день, и как быть, если праздник выпадает на выходной или через день перед ним ?
94 Seducer
 
16.01.14
00:09
(82) В 2015 переписывать код будем? И кстати, у вас только три праздника в году? Не жалеете вы себя.
95 Пятничник
 
16.01.14
13:25
(93) а у нас если праздник попадает на выходной - то выходным объявляется и первый рабочий день после выходных! :-)
то есть типа КолПраздников++ :-)
96 Wobland
 
16.01.14
13:32
(95) у него по ТЗ переноса праздников нет
97 Пятничник
 
16.01.14
13:38
(96) поэтому я и сказал ему (75)
98 Wobland
 
16.01.14
13:41
вот в канун пятницы и сделаем сотку..
99 Wobland
 
16.01.14
13:41
кто тут главный по сотням?
100 Torquader
 
16.01.14
13:41
Сотко!
101 Torquader
 
16.01.14
13:43
(95) Насколько я помню, табель-календарь на следующий год утверждает правительство - в том числе и переносы дней, если праздник приходится на выходные. При этом, считается, что число выходных и праздничных дней не должно уменьшится.