Имя: Пароль:
1C
1С v8
Запрос, возвращающий количество дней в месяце без учёта выходных
,
0 Sibi-2
 
19.10.13
12:52
Написать запрос, который по входному параметру «Месяц» типа «Дата», возвращает количество дней в месяце без выходных (субботы, воскресенья).

Например, параметр Месяц = «1 мая 2013», результат запроса: 23.
1 Maxus43
 
19.10.13
12:54
производственный календарь есть в конфе? тогда проблем нет
2 Генерал
 
19.10.13
12:55
свяжи с производственным календарем и извлекай
3 Sibi-2
 
19.10.13
12:55
Нет, это задача исключительно для решения при помощи запросов :) Никакой конфы у нас условно нет
4 Grobik
 
19.10.13
12:57
Если за определенный год, например 2009-2014 то без проблем. А в общем случае никак.
5 Maxus43
 
19.10.13
12:57
(3) в общем случае это невозможно, по той простой причине что каждый Год правительство РФ сама тасует праздники, переносит их на другие дни и выпускает утверждённый календарь
6 Sibi-2
 
19.10.13
12:58
Выкидываем только субботу и воскресение
7 GROOVY
 
19.10.13
12:59
Хорошая, но тупая, для проверки знаний сотрудника, задача. Взял в копилку...
8 Grobik
 
19.10.13
13:00
(6) Тогда вообще смехотворно.
9 Maxus43
 
19.10.13
13:02
(7) я вот сходу запрос не напишу такой, надо строрить таблицу дат и т.д. - нафиг
10 GenV
 
19.10.13
13:04
(9) Разность дат в днях, зная день недели первой даты?
11 Sibi-2
 
19.10.13
13:06
Разность дат - да, но тоже не слишком тривиально. Есть вот такой вариант, но ошибаемся на 1 день: ВЫБРАТЬ
ДЕНЬГОДА(КОНЕЦПЕРИОДА(&ДатаЗ, МЕСЯЦ)) - ДЕНЬГОДА(НАЧАЛОПЕРИОДА(&ДатаЗ, МЕСЯЦ))- (НЕДЕЛЯ(КОНЕЦПЕРИОДА(&ДатаЗ, МЕСЯЦ)) - НЕДЕЛЯ(НАЧАЛОПЕРИОДА(&ДатаЗ, МЕСЯЦ)))*2 КАК Поле1
12 GROOVY
 
19.10.13
13:06
(10) Угу.
13 Maxus43
 
19.10.13
13:11
(10) а кто сказал что ты её знаешь?
14 GROOVY
 
19.10.13
13:14
(13) Там же месяц как дата передается.
15 GenV
 
19.10.13
13:19
(13) Параметр дата, затем ДЕНЬНЕДЕЛИ(&НачалоПериода)
16 Maxus43
 
19.10.13
13:20
а, я думал без даты надо построить таблицу годов, учитывая високосные и т.д.)
17 Sibi-2
 
19.10.13
15:19
Это всё? :)
18 Rovan
 
гуру
19.10.13
16:07
(17) начинай сам писать запрос с учетом (15)
покажи что получилось
если не буде работать еще что-то посоветуем
19 Kaushly
 
19.10.13
16:56
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 0) КАК ДатаМесяца
ПОМЕСТИТЬ ДниМесяца

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 1)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 2)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 3)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 4)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 5)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 6)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 7)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 8)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 9)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 10)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 11)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 12)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 13)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 14)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 15)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 16)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 17)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 18)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 19)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 20)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 21)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 22)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 23)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 24)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 25)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 26)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 27)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 28)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 29)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 30)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ), ДЕНЬ, 31)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОЛИЧЕСТВО(ДниМесяца.ДатаМесяца) КАК ДатаМесяца
ИЗ
    ДниМесяца КАК ДниМесяца
ГДЕ
    НАЧАЛОПЕРИОДА(ДниМесяца.ДатаМесяца, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&ПараметрДата, МЕСЯЦ)
    И ДЕНЬНЕДЕЛИ(ДниМесяца.ДатаМесяца) <= 5
20 GenV
 
19.10.13
19:21
(19) Можно это все сделать в одном выражении
21 МихаилМ
 
20.10.13
11:51
хорошая задача на проверку профпригодности.
22 mrDSide
 
20.10.13
12:59
Високосный год?
В мае (условно) 2012 и 2013 разное кол-во рабочих дней (условно).

ДОБАВЬТЕ ПРОИЗВОДСТВЕННЫЙ КАЛЕНДАРЬ И НЕ ЗАНИМАЙТЕСЬ ЕРУНДОЙ.
23 hhhh
 
20.10.13
13:01
(22) в (19) всё это учтено
24 GenV
 
20.10.13
17:33
(22) Вообще то, производственный календарь для данной задачи совсем не нужен ...
25 Мимохожий Однако
 
20.10.13
19:49
Достаточно анализировать первые четыре дня, т.к. для 28 дней всегда будет 20 рабочих дней.
26 mrDSide
 
20.10.13
21:10
(25) а четыре для откуда Вы предлагаете анализировать? (10) с (24) - откуда Вы предлагаете брать день недели?
Представляю себе бухгалтера:
-введите первый день недели...
-введите количество "красных" дней календаря без учета обычных выходных...
-введите количество перенесенных рабочих дней (предпраздничный на пятницу следующей недели, а следующая неделя - это уже новый месяц; или такое бывает только у нас в РБ?).
Делайте нормальный производственный календарь, тем более что загрузить можно с гос. сайта какого-нибудь.
Пишите процедуры заполнения.
ВСЕ РАВНО К ЭТОМУ ПРИДЕТЕ.
27 GenV
 
20.10.13
22:00
(26) Читай условие задачи в (6) ...
28 mrDSide
 
20.10.13
22:59
(27) красные дни календаря и переносы как не крути учитывать надо. Думай головой.
29 GenV
 
20.10.13
23:05
(28) Про красные дни уже уточнили в самом начале - их не надо учитывать! Советую почитать начало обсуждения...
30 Aprobator
 
20.10.13
23:14
первое, что приходит в голову - отдать в запрос ТЗ с датами месяца. А там - дело техники.
31 mrDSide
 
20.10.13
23:41
(29) Любезный там ясно написано - "без выходных", а то что дальше "(суббота, воскресенье)" - это только в самом общем случае всегда только эти дни являются выходными.
32 GenV
 
20.10.13
23:45
(31) Не тупи. И в (0) и в (6) ясно написано что выкидывать только воскресенье. в (3) объяснили, что это не типовая конфа и производственного календаря нет. в (1) и поз же спросили про производственный календарь.
ЗЫ Но ты можешь решать свою задачу - я не против )
33 mrDSide
 
21.10.13
00:14
(32) вот именно, не тупи, там нигде не написано что не должно быть производственного календаря (писал я именно что надо добавить). ЧИТАЙ, ЧТО ЛЮДИ ПИШУТ.
34 GenV
 
21.10.13
00:26
(33) (33) Написано :))) "Выкидываем только субботу и воскресение". Про праздничные дни не слова. Или у тебя где-то обман зрения :)
35 GenV
 
21.10.13
00:35
43+ далее читаем обсуждение с моими высказываниями )
(24) Я календарь не нужен
(26) "-введите количество "красных" дней календаря без учета обычных выходных." - Зачем?? "ВСЕ РАВНО К ЭТОМУ ПРИДЕТЕ." - Зачем, если как я и на писал он не нужен и к нему !точно не придем!, т.к. уже выложили решение без него???
(28) красные дни календаря и переносы как не крути учитывать надо. - Зачем ???
ЗЫ Т.ч. я то читать умею )
36 mrDSide
 
21.10.13
00:35
а как тебе это, умник: "возвращает количество дней в месяце без выходных (субботы, воскресенья)". Работаешь по праздникам? Когда рабочий день переносят учитывать не надо это?
37 GenV
 
21.10.13
00:36
(36) Нет, по условию задачи праздники не учитываются, умник )
38 mrDSide
 
21.10.13
00:37
(37) Любезный, объясните мне - лоху такому - что такое рабочие дни, если пишу ересь.
39 GenV
 
21.10.13
00:39
(38) Где ты увидел слова "рабочие дни"? Задача "количество дней в месяце без выходных (субботы, воскресенья)" и еще раз "Выкидываем только субботу и воскресение".
40 mrDSide
 
21.10.13
00:57
ну да с учетом (6) вполне достаточно

Дни=0;КонМ=КонецМесяца(НужнаяДата);
Пока НужнаяДата<=КонМ Цикл

   Дни=Дни + ?(ДеньНедели(НужнаяДата)<6,1,0);
   НужнаяДата = НужнаяДата + 86400;

КонецЦикла;

Возврат Дни

если запихнуть в гл.модуль, то в СКД можно использовать. А вот для запроса придется просто создавать таблицу, как и было написано выше, и передавать в параметры.
41 mrDSide
 
21.10.13
00:58
(39) Просто смысла тогда нету в этом никакого, т.к. для реального учета это 100% не годиться.
42 mrDSide
 
21.10.13
01:00
(40) а еще лучше в параметры передавать возвращаемое значение функции с этим кодом. Тогда везде можно будет использовать))
43 mrDSide
 
21.10.13
01:01
(40) ну и дописать перед "Пока" следующее: "НужнаяДата=НачалоМесяца(НужнаяДата);"
=)
44 GenV
 
21.10.13
01:01
(41) Скорее всего это тестовая задача на знание запросов, т.к. решать её полностью в запросе тоже нет особого смысла
45 mrDSide
 
21.10.13
01:18
(44) Так в том и дело, что язык предназначен для получения данных из таблиц (ну или любых др. коллекций).
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.