|
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 недели работал. ) До меня тут такие и работали, такой г(о)внокод, убил бы. )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |