Имя: Пароль:
1C
1C 7.7
v7: Гав-окод ли это? Определение последних двух рабочих дней месяца
0 Ночной Эльф
 
18.02.13
14:17
Собственно вот код, вышло слишком много вот и хотел узнать гав-окод это или нет. И если да то как можно реализовать лучше?

ВыводитьНапоминалку = 0;
   ВыходныеДни = 0;
   
   Сегодня = ТекущаяДата();
   ПроверкаНаВыходные = Сегодня;
   
   //Определяем последние два рабочих дня в месяце
   Если ДатаЧисло(Сегодня) = 30 Тогда
       Если (НомерДняНедели(Сегодня) <> 6)и(НомерДняНедели(Сегодня) <> 7) Тогда
           ВыводитьНапоминалку = 1;
       КонецЕсли;
   Иначе
       Если (ДатаМесяц(Сегодня) = 1)или(ДатаМесяц(Сегодня) = 3)или(ДатаМесяц(Сегодня) = 5)
           или(ДатаМесяц(Сегодня) = 7)или(ДатаМесяц(Сегодня) = 8)или(ДатаМесяц(Сегодня) = 10)или(ДатаМесяц(Сегодня) = 12) Тогда
               
               Если ДатаЧисло(Сегодня) = 28 Тогда
                   Если (НомерДняНедели(Сегодня)+1 = 6)или(НомерДняНедели(Сегодня)+1 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+2 = 6)или(НомерДняНедели(Сегодня)+2 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+3 = 6)или(НомерДняНедели(Сегодня)+3 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если ВыходныеДни = 2 Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;
               
               Если ДатаЧисло(Сегодня) = 29 Тогда
                   Если (НомерДняНедели(Сегодня)+1 = 6)или(НомерДняНедели(Сегодня)+1 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+2 = 6)или(НомерДняНедели(Сегодня)+2 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если ВыходныеДни > 0 Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;

               Если ДатаЧисло(Сегодня) = 31 Тогда
                   Если (НомерДняНедели(Сегодня) <> 6)и(НомерДняНедели(Сегодня) <> 7) Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;
               
       ИначеЕсли ДатаМесяц(Сегодня) = 2 Тогда
               Если ДатаЧисло(Сегодня) = 25 Тогда
                   Если (НомерДняНедели(Сегодня)+1 = 6)или(НомерДняНедели(Сегодня)+1 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+2 = 6)или(НомерДняНедели(Сегодня)+2 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+3 = 6)или(НомерДняНедели(Сегодня)+3 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если ВыходныеДни = 2 Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;
               
               Если ДатаЧисло(Сегодня) = 26 Тогда
                   Если (НомерДняНедели(Сегодня)+1 = 6)или(НомерДняНедели(Сегодня)+1 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+2 = 6)или(НомерДняНедели(Сегодня)+2 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если ВыходныеДни > 0 Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;

               Если ДатаЧисло(Сегодня) = 27 Тогда
                   Если (НомерДняНедели(Сегодня) <> 6)и(НомерДняНедели(Сегодня) <> 7) Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;
               
               Если ДатаЧисло(Сегодня) = 28 Тогда
                   Если (НомерДняНедели(Сегодня) <> 6)и(НомерДняНедели(Сегодня) <> 7) Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;
       Иначе
               Если ДатаЧисло(Сегодня) = 27 Тогда
                   Если (НомерДняНедели(Сегодня)+1 = 6)или(НомерДняНедели(Сегодня)+1 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+2 = 6)или(НомерДняНедели(Сегодня)+2 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+3 = 6)или(НомерДняНедели(Сегодня)+3 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если ВыходныеДни = 2 Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;
               
               Если ДатаЧисло(Сегодня) = 28 Тогда
                   Если (НомерДняНедели(Сегодня)+1 = 6)или(НомерДняНедели(Сегодня)+1 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если (НомерДняНедели(Сегодня)+2 = 6)или(НомерДняНедели(Сегодня)+2 = 7) Тогда
                       ВыходныеДни = ВыходныеДни + 1;
                   КонецЕсли;
                   Если ВыходныеДни > 0 Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;

               Если ДатаЧисло(Сегодня) = 29 Тогда
                   Если (НомерДняНедели(Сегодня) <> 6)и(НомерДняНедели(Сегодня) <> 7) Тогда
                       ВыводитьНапоминалку = 1;
                   КонецЕсли;
               КонецЕсли;
       КонецЕсли;
   КонецЕсли;
1 Джинн
 
18.02.13
14:18
А из календаря не взять?
2 Ночной Эльф
 
18.02.13
14:19
А как ?
3 Wobland
 
18.02.13
14:19
календаря не вижу. г-код
4 IamAlexy
 
18.02.13
14:19
жесть
5 tdm
 
18.02.13
14:21
(2) производственный календарь, запросом выводить 2 записи(или сколько там дней надо) с отбором вид рабочего дня и по месяцу))
6 Irek-kazan
 
18.02.13
14:21
гы, даешь еще пару если конецесли
7 Иде я?
 
18.02.13
14:21
Автор не учитывает праздники и перенос дней.
8 tdm
 
18.02.13
14:22
(7) +1)))
9 Steel_Wheel
 
18.02.13
14:22
Хорошая практика: занести весь календарь в периодическую константу, а потом ее мучать
10 Иде я?
 
18.02.13
14:22
А если не учитывает, то бытрее будет :
Если месяц=февраль 2013, тогда 27 и 28
11 zak555
 
18.02.13
14:22
(5) в бухии 77 производственный календарь в mxl хранится
12 VladZ
 
18.02.13
14:23
Программист должне быть достаточно ленив, чтобы не писать как в (0).
13 VladZ
 
18.02.13
14:24
Уважаемый автор! Начни воспитывать в себе лень. Для программиста это нужное качество!
14 Попытка1С
 
18.02.13
14:24
(0) Какая компонента?
15 GANR
 
18.02.13
14:25
(0) на клавиатуру вырвет
16 Ночной Эльф
 
18.02.13
14:26
Нашел как работать с календарем нашел вот такую функцию

//функция определяет количество рабочих дней в интервале дат
Функция гРабочиеДни(ДатаН,ДатаК,Вид="Основной") Экспорт
    К=СоздатьОбъект("Календарь."+Вид);
    К.УчитыватьПраздники(1);
    Если К.Автозаполнение(ДатаН,ДатаК)=1 Тогда
         Возврат К.Дней(ДатаН,ДатаК);
    КонецЕсли;
КонецФункции

вставил в свой код

Сегодня = ТекущаяДата();
   К=СоздатьОбъект("Календарь.Основной");
   К.УчитыватьПраздники(1);
   Если К.Автозаполнение(Сегодня,Сегодня)=1 Тогда
       Сообщить(К.Дней(Сегодня,Сегодня));
   КонецЕсли;

Выдает вот такую ошибку

К=СоздатьОбъект("Календарь.Основной");
{Глобальный модуль(61571)}: Неудачная попытка создания объекта (Календарь.Основной)

Что не так ?
17 КуплюКровать
 
18.02.13
14:26
на 77 весь код - г0вн0код
18 zak555
 
18.02.13
14:27
(16) нет в папке с платформой файла calc.dll
19 КуплюКровать
 
18.02.13
14:27
(16)нету календаля с именем основной. ваш кэп
20 VladZ
 
18.02.13
14:27
(17) Цыц под лавку!
21 Ночной Эльф
 
18.02.13
14:28
(19) тут по подробнее можно?
22 zak555
 
18.02.13
14:28
(17) +1

когда его пишут 8шники
23 КуплюКровать
 
18.02.13
14:29
(21)а может и 18 правильно. я на 77 уже забыл че как
24 Попытка1С
 
18.02.13
14:30
(16) Календарь существует только в компоненте расчет.
25 sapphire
 
18.02.13
14:30
(17) Ну ты, наверное, и на снеговике так пишешь.
26 ЧеловекДуши
 
18.02.13
14:31
(0)Ваша национальность Индус. С чем и поздравляю, ваша догадка, по поводу гуано кода, оправдана :)
27 Mikeware
 
18.02.13
14:31
это какие грибы жрать надо....
28 Ночной Эльф
 
18.02.13
14:33
Чем нести чушь лучше бы подсказали начинающему как реализовать лучше
29 ЧеловекДуши
 
18.02.13
14:33
(21)В пофигураторе добавь. Потом заполни. И будет тебе счастье.
Кстати, календари у 1С работает лучше всего :)
30 ЧеловекДуши
 
18.02.13
14:34
(28)А тебе разве самому не стыдно за такой код? :)
31 zak555
 
18.02.13
14:34
(28) ты конфигурацию / компоненту назовёшь ?
32 VladZ
 
18.02.13
14:34
(0) ИМХО, проще так: идем с конца месяца и проверяем, выходной ли это.
33 Ночной Эльф
 
18.02.13
14:36
(30) мне не стыдно стыдно было бы говорить что это лучший код и не пытаться развиваться
34 Надсмотрщик
 
18.02.13
14:36
(0) НомерДняНедели(<?>)
Синтаксис:
НомерДняНедели(<Дата>)
Назначение:
Возвращает порядковый номер дня недели для заданной даты.
Параметры:
<Дата> - выражение со значением типа дата.
Замечание:
Порядковые номера дней недели: 1 - понедельник, 2 - вторник, ..., 7 - воскресенье.

КонМесяца(<?>)
Синтаксис:
КонМесяца(<Дата>)
Назначение:
Возвращает дату конца месяца для заданной даты.
Параметры:
<Дата> - выражение со значением типа дата.


А твой код - ГОВ..КОД
35 Ночной Эльф
 
18.02.13
14:37
(32) а как с конца а скажем если сегодня 28 ?
36 ЧеловекДуши
 
18.02.13
14:37
+(28)>>> последних двух рабочих дней месяца

В цикле организуй от конца месяца до начала, на проверку на Субботу и Воскресенье. И в остальные дни считай рабочими.
И как только Количество раб. дней превысит допустимое значение, то выходи из цикла.
А походу в цикле еще запоминай рабочие дни в какую либо ТЗ :)
...
По выходу из цикла ты будешь иметь некую ТЗ с датами, которую и используй дальше.
37 zak555
 
18.02.13
14:39
(35)

Для н = - КонецМесяца(ТекДата) по - 1 Цикл
38 Скользящий
 
18.02.13
14:39
А не проще, если нет компоненты расчет, и добавлять ее не хочется, просто завести справочник Календарь с реквизитами "число","месяц","год","дата","ТипДня", заполнять его раз в году (обработкой присвоить 6 и 7 дню выходной день, остальное ручками по производственному календарю) и все. Такой справочник в начале года заполнить делов на полчаса при наличии готовой обработки проставления выходных дней.
39 ЧеловекДуши
 
18.02.13
14:40
(38)НЕ проще. Отстой еще тот. Работает медленно. :)
Видел сею поделку... изрядная пакость.
40 VladZ
 
18.02.13
14:42
(35) Итак...  Давай начнем с начала... Текст программы должен быть понятен и читаем... Другими словами отделим мухи от котлет.

Как я понял тебе нужно выполнить нужные действия в определенный день. Другими словами должно быть так:

Если СегодняНужныйДень()=1 Тогда
ВыполнитьДействия();
КонецЕсли;

Но для этого тебе нужно получить список этих нужных дней. Т.е. должна быть функция получения нужных дней.
41 фобка
 
18.02.13
14:43
(0)Без учета праздников просто сделать..
например:

   КонецМесяца = КонМесяца(ТекущаяДата());
   
   Если НомерДняНедели(КонецМесяца)>5 Тогда
       ПоследнийРабочийДеньМесяца = КонецМесяца+5-НомерДняНедели(КонецМесяца);
   КонецЕсли;
   
   
   ПредпоследнийРабочийДеньМесяца = ПоследнийРабочийДеньМесяца-?(НомерДняНедели(ПоследнийРабочийДеньМесяца) = 1,3,1);
   
   Если (ТекущаяДата() = ПоследнийРабочийДеньМесяца) ИЛИ (ТекущаяДата() = ПоследнийРабочийДеньМесяца) Тогда
       Сообщить("Выводить напоминалку");        
   КонецЕсли;
42 VladZ
 
18.02.13
14:45
Идем дальше... Функция СегодняНужныйДень() должна проверять сегодня (текущий день) и список нужных дней.

Т.е. как-то так.

Функция СегодняНужныйДень()
  Сегодня = ТекущаяДата();

  Если СписокНужныхДней.НайтиЗначение(Сегодня) > 0 Тогда
    выхЗнач = 1;
  Иначе
    ВыхЗнач = 0;
  КонецЕсли;

Возврат ВыхЗнач;

КонецФункции
43 Скользящий
 
18.02.13
14:45
(39) в моей конфе еще при царе горохе добавлено, работает норм. Работает, не трогаю. Единственное, пришлось на коленке в начале года набросать обработку присвоения выходных дней, а то говорят бедные бухи вручную проставляли. )
44 zak555
 
18.02.13
14:46
PrClnd07.mxl
45 фобка
 
18.02.13
14:46
(43) логичнее справочник праздников завести (меньше элементов лопатить)
46 Скользящий
 
18.02.13
14:47
(45) Зачем? Берешь производственный
47 Скользящий
 
18.02.13
14:47
календарь, и праздники проставляешь, там всего 15 праздников вроде.
48 Скользящий
 
18.02.13
14:48
выглядит примерно так. http://gyazo.com/22f8e6bb86c83bf700b7ebde05af89cc И не надо волноваться и херачить кучу функций и плодить г(о)внокод.
49 VladZ
 
18.02.13
14:48
И теперь самое интересное... Как заполнить этот самый СписокНужныхДней...

Процедура ЗаполнитьСписокНужныхДней()
  СписокНужныхДней = СоздатьОБЪект("СписокЗначений");
 
   Сегодня = ТекущаяДата();

  Для сч = 0 по 5 Цикл
    ТекДата = КОнМесяца(Сегодня) - сч;
   
    // здесь не будут расписывать - лень. Тупо проверь на СБ или ВС.
    Если ЭтоВыходной Тогда
      Продолжить;
    КонецЕсли;

    СписокНужныхДней.ДобавитьЗначение(ТекДата);

  КонецЦикла;

КонецПроцедуры
50 zak555
 
18.02.13
14:49
(48) г0внокод
51 VladZ
 
18.02.13
14:49
+49 Ну и вставь нужное условие, чтобы у тебя получилось два дня...
52 Mikeware
 
18.02.13
14:51
(40) книжка Ван Тассела в трех постах? :-)
53 VladZ
 
18.02.13
14:51
+51 Твой код в (0) - это алгоритм в стиле "машина состояний". Пока не научишься мыслить алгоритмами - не быть тебе хорошим программистом.
54 NS
 
18.02.13
14:52
сч=0;
Для а=Текущаядата() по конмесяца(текщаядата) цикл
Если НомерДняНедели(а)<6 тогда
сч=сч+1;
КонецЦикла;
Сообщить("сегодня "+сч+" рабочий день недели с конца месяца");
Если (сч<=2)и(Номерднянедели(Текущаядата())<6) тогда
55 NS
 
18.02.13
14:53
сч=0;
Для а=Текущаядата() по конмесяца(текущаядата()) цикл
Если НомерДняНедели(а)<6 тогда
сч=сч+1;
КонецЦикла;
Сообщить("сегодня "+сч+" рабочий день недели с конца месяца");
Если (сч<=2)и(Номерднянедели(Текущаядата())<6) тогда
56 hhhh
 
18.02.13
14:56
(51) а зачем условие вставлять? И так ведь прокатит.
57 Mikeware
 
18.02.13
14:56
(49) осталось добавит переносы выходных на праздники, праздников на выходные и т.д...
58 VladZ
 
18.02.13
14:56
Преставь, что будет в твоем случае, если твой постановщик задачи прибежит в ужасе и скажет "А давай эту фигню будем делать в другие дни!". В моем случае - достаточно поправить одну процедуру. А в твоем???
59 Ночной Эльф
 
18.02.13
14:57
(53) мыслить алгоритмами хотя бы в какую сторону копать или что почитать?

Не зря же я учился на специальности ВМКСС вычислительные машины комплексы системы и сети ))))
60 Ночной Эльф
 
18.02.13
14:57
Переделал вот как

Сегодня = ТекущаяДата();
   КонецМесяца = КонМесяца(Сегодня);
   К=СоздатьОбъект("Календарь.Пятидневка");
   К.УчитыватьПраздники(1);
   Если К.Автозаполнение(Сегодня,КонецМесяца)=1 Тогда
       Если (К.Дней(Сегодня,КонецМесяца) = 2)или(К.Дней(Сегодня,КонецМесяца) = 1) Тогда
           ВыводитьНапоминалку = 1;
       КонецЕсли;
   КонецЕсли;

Все работает проверял
61 фобка
 
18.02.13
14:58
(60) тю
62 Скользящий
 
18.02.13
15:01
Осталось только компоненту расчет в базу добавить. А ключик на нее есть?
63 Ночной Эльф
 
18.02.13
15:03
VladZ  
Спасибо большое есть над чем подумать
64 zak555
 
18.02.13
15:03
(62) сайт файл calc.dll ключ не просит
65 Ночной Эльф
 
18.02.13
15:03
(62) до меня тут все стояло значит есть 1с лицензионное
66 Ночной Эльф
 
18.02.13
15:05
(64) а где этот файл должен находится ?
67 Ночной Эльф
 
18.02.13
15:05
я потому что у себя его не могунайти
68 zak555
 
18.02.13
15:06
папка с платформой
69 Ночной Эльф
 
18.02.13
15:06
Нету там
70 Ночной Эльф
 
18.02.13
15:08
А работает не чудеса ли )))
71 zak555
 
18.02.13
15:10
ты это не в базовой делаешь Г?
72 zak555
 
18.02.13
15:10
* + во внешних объектах
73 Ночной Эльф
 
18.02.13
15:11
конфигурация комплексная
74 Ночной Эльф
 
18.02.13
15:11
+CRM
75 zak555
 
18.02.13
15:35
я такую не знаю
76 varelchik
 
18.02.13
18:49
(73) Интересно как комплексная можут быть без Календарей?
Ну насмешил!
77 Mагистр
 
18.02.13
18:53
а не проще вопросом сделать? :))   Типо КонМесяц(Дата)-1 и КонМесяц(дата)-2   Рабочие дни, Как Вы считаете? Если да тогда то то и то то Иначе то то и то то и то то КонецЕсли;
78 Лефмихалыч
 
18.02.13
19:05
(0) а прибавить 1 и посмотреть, не поменялся ли месяц - не ком иль фо?
79 Лефмихалыч
 
18.02.13
19:05
ветку не читал
80 КонецЦикла
 
18.02.13
19:06
(0) Мегаспец *убегает из ветки*
81 Trier
 
18.02.13
19:07
да, это он
82 Лефмихалыч
 
18.02.13
19:10
кстати, в (0) адовы говны детектед:
1. дублирование кода
2. волшебные числа
3. смысл кода противоречит возвращаемому значению - смысл в ответе на вопрос: "а последнее ли нынче число", а возвращаемое значение: "а може напоминалку напомним?.."

Автор, вон из профессии
83 Mагистр
 
18.02.13
19:28
(82) я б вопросом решил бы , а если серьезно - надо тупо посмотреть как это в ЗиКе сделано и все дила.
84 Mагистр
 
18.02.13
19:29
Можно еще в справочник напихать последние дни каждого месяца ина три года расписать.
85 Mагистр
 
18.02.13
19:30
даже можно часик посидеть и на 10 лет вперед накатать в справочник - я б так и сделал. И не надо ничего писать и придумывать год = 24 записям.
86 Mагистр
 
18.02.13
19:32
а там пока заполнял бы ручками справочник  глядишь и закономерность какую нить открыл бы ...
87 Mikeware
 
18.02.13
19:33
завсом еще более фееричный долбо@б, нежели топикстартер...
88 Лефмихалыч
 
18.02.13
21:33
(87) +1 :)
89 Скользящий
 
18.02.13
22:00
Завсому главное деньги получить за код, и чтобы код хотя бы 2 недели работал. ) До меня тут такие и работали, такой г(о)внокод, убил бы. )