Домашнее задание №3 базового курса

Третье задание по 0-му блоку базового курса.

Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 11. Программный код
Глава 12. Примитивные типы данных
Глава 13. Контекст исполнения кода
Глава 14. Объектная техника
Глава 15. Сервисные средства по написанию кода
Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментариев 200 на “Домашнее задание №3 базового курса”

  1. ДЗ сделал. Циклом.

  2. gavrik-prog 05.07.2010 в 07:06

    Ну цикл то по годам конечно все равно нужен =)

  3. gavrik-prog 05.07.2010 в 07:04

    можно наверное без циклов решить

    КолвоДнейВГоду-КолвоПолныхНедель*2-ВНеполныхНеделяхСмотримВыходныеДни-УсловиеПоВхождениюНужныхДатВВыходные

  4. Задание выполнил. Но на 100% уверен, что Евгений предложит что-то совершенно другое.

  5. ДЗ 3 сделано.
    А что покажут мастера? ;)

  6. ДЗ№3 сделано. Проблем не было.

  7. ДЗ №3 сделано, интересное задание – с не терпение жду Ваше решения, Евгений.

  8. Елена 05.07.2010 в 04:32

    ДЗ №3 выполнено :)

  9. ДЗ №3 сделано

  10. Сергей Матченко 05.07.2010 в 01:50

    Проверку на праздничный день сделал так
    в начале цикла по годам
    М = Новый Массив;
    М.Добавить(Дата(ТекГод, 1, 1));
    М.Добавить(Дата(ТекГод, 2, 23));
    М.Добавить(Дата(ТекГод, 3, 8));

    и вцикле по дням
    ЭтоПраздник = М.Найти(ДеньГода);
    Если ЭтоПраздник = Неопределено Тогда
    КвоРабочихДней = КвоРабочихДней +1;
    КонецЕсли;

  11. Мой результат:
    2 010 год – 258 рабочих дней
    2 011 год – 258 рабочих дней
    2 012 год – 259 рабочих дней
    2 013 год – 259 рабочих дней
    2 014 год – 260 рабочих дней
    2 015 год – 259 рабочих дней
    2 016 год – 258 рабочих дней
    2 017 год – 258 рабочих дней
    2 018 год – 258 рабочих дней
    2 019 год – 259 рабочих дней

    думал, что я перемудрил в решении, но судя по другим комментариям, все мыслили примерно в одинаковом направлении ))

  12. Александр Горлов 05.07.2010 в 00:54

    Задание выполнено, результат – такой же, как у mtv911.

  13. Собрал Високосные года. В неделе 2 выходных. В году Х недель. Не забыл про 1 и последнюю неделю .
    Посмотрел на какой день недели выпали праздники.

  14. Все сделал, только повозился с ключом структуры

  15. Ilya Palatnikov 04.07.2010 в 23:19

    ДЗ выполнил

  16. Антон Шубин 04.07.2010 в 22:42

    При решении обошелся без перебора дней :)
    Для этого нужно проанализировать первую и последнюю неделю на предмет наличия в них выходных дней, все промежуточные недели имеют по два выходных. Ну и дополнительно посмотреть не выпадают ли праздники на выходные.

  17. В задании заинтересовала только возможность более компактной записи проверки даты на выходной. Написал так:

    Если ДеньНедели(ТекДата) > 5
    или (ДеньЧисло = 1 и МесяцЧисло = 1)
    или (ДеньЧисло = 23 и МесяцЧисло = 2)
    или (ДеньЧисло = 8 и МесяцЧисло = 3) Тогда

    Можно было конечно проверять МесяцЧисло отдельным условием (МесяцЧисло <= 3), но вышеприведенный пример посчитал более удобочитаемым.

    Из предыдущих постов не понял зачем нужно заморачиваться с ТЗ и как можно обойтись без циклов?

  18. ДЗ выполнил. Проблем не возникло.

  19. Александр Кононов 04.07.2010 в 22:25

    Домашнее задание выполнил.Мне нравиться построение ДЗ,чтобы эффективно его решить,нужно разобраться с предыдущим . Второе надо разобраться с некоторыми нюансами, на которых если их не знаешь теряешь кучу времени (Символы.НПП) ,особенно это актуально при переходе с 7.7 на 8х.

  20. Закончил … пришлось немножко подумать … в итоге все встало на свои места … интересное задание! )

  21. А можно давать задания со Звездочкой – повышенной сложности, по желанию?!..

    • Не будем забегать вперед, дождемся продвинутого курса : )

  22. Сергей Шульженко 04.07.2010 в 21:47

    Сделал функцию без циклов. Очень за себя рад.

    • Прикольно !..

      Наверняка – Гениально и просто?!.. ;))
      Надеюсь САМ – додумался..

      P.S.: Например 2 задание – уже знал решение БЕЗ промежуточной переменной..

      • Сергей Шульженко 04.07.2010 в 22:17

        В принципе просто. Полных недель в году одинаковое количество, остаются 1-2 дня в неполной неделе вот с ними думал.
        А без переменной существует проблема переполнения, поэтому это просто фокус))

    • Наверняка ч/з – рекурсию, а эт ведь МЫСЛЬ !..

    • Сделал ч/з рекурсию, БЕЗ циклов – нааМНОГО мееедленнее..

    • Может поделимся мыслями?

      • Сергей Шульженко 05.07.2010 в 10:52

        В году 52 полных недели. 104 выходных дня. Остается 2 дня неполной недели. 1 января либо выходной либо празник – значит нерабочий. Итого 105 дней. Високосный год добавляет еще один день, нужно понять это выходной или нет. Ну и оставшиеся в праздника если попадает на выходной не считать.

        • Константин Павленко 05.07.2010 в 13:07

          Нет, всё-таки без “честного” календаря это чревато. Слишком много “если” надо учитывать. Например, 1900, 2000 и 2100 год делятся на 4. Но из них только 2000 является високосным, остальные нет.

          • кратен 4 и (не кратен 100 или кратен 400). Все по честному.

          • Сергей Шульженко 05.07.2010 в 15:00

            Так количество дней в году можно определить разностью дат начала и конца года, че заморачиваться то?

    • Константин Павленко 05.07.2010 в 13:15

      Может поделитесь с коллегами? Посмотрим, сравним результаты. Но прогонять буду до 2100 года.

    • Сергей Шульженко 05.07.2010 в 20:13

      Функция КоличествоРабочихДнейвГоду2(аГод)
      тКолДнейВГоду = ДеньГода(Дата(аГод,12,31,0,0,0));
      тКоличествоВыходных=105;//52недели*2 + 1 января
      // Год високосный и 2 января тоже выходной
      Если (тКолДнейВГоду>365) и (ДеньНедели(Дата(аГод,1, 2,0,0,0))>5) Тогда
      тКоличествоВыходных=тКоличествоВыходных+1;
      КонецЕсли;

      тКоличествоВыходных=тКоличествоВыходных+?(ДеньНедели(Дата(аГод,2,23,0,0,0))>5,0,1);
      тКоличествоВыходных=тКоличествоВыходных+?(ДеньНедели(Дата(аГод,3, 8,0,0,0))>5,0,1);

      возврат тКолДнейВГоду-тКоличествоВыходных;
      КонецФункции // КоличествоРабочихДнейвГоду2()

  23. Чё – то рука не поднимается создать Структуру “ВыходныеДни” где ключем Год+номерГода, а значением РАБОЧИЕдни / их количество.
    Или я, что – то не понял.

    • Придется поднять руку )
      Абстрагируйтесь от названия.

    • Я здесь тоже не понял, подумал опечатка, поэтому в структуру ВЫХОДНЫЕдни помещал количество ВЫХОДНЫХ, а не РАБОЧИХ дней

  24. Михайлов Павел 04.07.2010 в 21:24

    ДЗ выполнил.

  25. Задание выполнил. Хочется сравнить с эталоном.

    • По плану решение будет выложено со следующим заданием. Т.е. во вторник.

  26. Домашнее задание выполнил. Проблем особых не было.

  27. Анатолий Белогорцев 04.07.2010 в 21:08

    Затруднений не возникло.
    Используется цикл по условию (НачПериода <= КонПериода) и в теле к НачПериода добавляем заветное 86 400.

    Ждем-с эталонного решения.

  28. Домашнее задание выполнила без затруднений.

  29. Проблем с решением не возникло. Создал функцию, в которую в цикле передавал год. Внутри в цикле по конецгода перебирал даты, проверяя их.В итоге функция возвращала число рабочих дней. Потом в цикле заполнил структуру так:
    ГодыСтруктура.Вставить(“Год”+Формат(Счетчик,”ЧГ=0”),КоличествоДней);

  30. Анцупов Андрей 04.07.2010 в 20:13

    Задание сделал.

  31. Сергей 04.07.2010 в 19:35

    Все ок, жду решения…

  32. Баранов Николай 04.07.2010 в 19:08

    пришлось чуток повозиться с ключом у структуры, а так все ок!)

    мое определение праздничных дней:

    Функция ЭтоПраздничныйДень(Месяц,День)

    Возврат (День=1)и(Месяц=1) или (День=23)и(Месяц=2) или (День=8)и(Месяц=3);

    КонецФункции // ЭтоПраздничныйДень()

    • Кучеров Дмитрий 04.07.2010 в 19:18

      В функцию не выносил, но решение аналогичное
      Праздник = (День = 1 и месяц = 1) или (День=23 и Месяц=2) или (День=8 и Месяц=3);

    • Александр Горлов 05.07.2010 в 00:52

      Можно немного красивее, что ли:

      ПраздничныеДни = Новый Массив;
      ПраздничныеДни.Добавить(101);
      ПраздничныеДни.Добавить(2302);
      ПраздничныеДни.Добавить(803);

      ДеньМесяцЧислом = День(АнализируемаяДата)*100 + Месяц(АнализируемаяДата);

      НеПраздничныйДень = (ПраздничныеДни.Найти(ДеньМесяцЧислом) = Неопределено);

    • Мне понравилось решение. Я не догадался так сделать, потому использовал Лев(ТекДата, 5) = “01.01” и т. д.

  33. ДЗ №3 – все ОК.
    В любом случае интересно, как решат эксперты – ждем-с :)

  34. Тимофей Житков 04.07.2010 в 18:33

    борьба от 2 010 функцией Формат возможна …)

  35. Столкнулся с ДВУМЯ – Трудностями..

    1. Простотой и Гениальностью.. ;))
    2. В 2011 – 258 раб. дн., а НЕ 260 – даже вручную Пересчиатл.. :((

    P.S.: Использовал ТЗ – вместо счетчика !..

    • Кучеров Дмитрий 04.07.2010 в 19:58

      У меня тоже получилось 258 раб дней в 2011 году.
      А на счет ТЗ, незнаю.
      С использованием ТЗ как миниму есть 2 варианта решения.
      1. Сувать все потом свернуть по году
      2. Искать в ТЗ строку с годом и увеличивать значение.

      В первом случае (мое мнение) при большом количестве строк – потеря памяти и производительности.

      Во втором – тот же счетчик, только больше хлопот.

      К томуже надо еще и вструктру все это засунуть. -))

      • ЗаСУНУЛ и свернул, без промежуточных переменных..

        В структуру, в любом случае – СУВАТЬ нуно !.. ;))

        • Роман Ильич, давайте не будем играть с русским языком, хорошо?
          Для этого есть другие сайты.

      • Константин Павленко 05.07.2010 в 11:09

        Я конечно не “гуру”, но ТЗ лучше не использовать без особой необходимости. Вроде бы использование ТЗ достаточно ресурсоёмкое дело и снижает производительность приложения. Если я не прав, готов выслушать комментарии экспертов.

  36. У меня получилось:
    2010 год – 258 рабочих дней
    2011 год – 258 рабочих дней
    2012 год – 259 рабочих дней
    2013 год – 259 рабочих дней
    2014 год – 260 рабочих дней
    2015 год – 259 рабочих дней
    2016 год – 258 рабочих дней
    2017 год – 258 рабочих дней
    2018 год – 258 рабочих дней
    2019 год – 259 рабочих дней
    2020 год – 261 рабочих дней

  37. Сергей Калмыков 04.07.2010 в 17:49

    При заполнении структуры была проблемма:
    Ключ структуры вычислялся как “Год”+Строка(ТекГод),
    а ТекГод : 2010 по 2020. При преобразовании в строку получался “2 010” год ( с разделителем триад) . Пришлось ТекГод сделать от 10 до 20, а ключ структуры вычислять как”Год20″+Строка(ТекГод)

    • Кучеров Дмитрий 04.07.2010 в 17:56

      Вместо Строка(ТекГод) я сделал Формат(ТекГод,”ЧГ=”)
      т.е.
      ВыходныеДни.Вставить(“Год_” + Формат(ТекГод,”ЧГ=”), РабочихДней)

    • Илья Алексеевич 04.07.2010 в 18:08

      Чтобы получилось как надо, надо у преобразованной строки удалить символ “Неразрывный пробел”.

      будет нечто вроде «Год»+СтрЗаменить(Год(ТекДата), Символы.НПП, “”)

      • Александр Горлов 05.07.2010 в 00:48

        Зачем городить один костыль на другой. Лучше воспользоваться функцией Формат(), как подсказано в комментарии выше.

    • Формат(Год(ТекДата), “ЧГ = 0”)

  38. Кудрявцев Олег 04.07.2010 в 17:27

    //Для текущего года считаем количество рабочих дней
    //Для простоты без праздников
    //Определим последний день предыдущего года
    ТекДата=НачалоГода(ТекущаяДата())-60*60*24;
    КоличествоРабочихДней=0;
    Пока ТекДата<=КонецГода(ТекущаяДата()) Цикл
    //Прибавляем 1 день
    ТекДата=ТекДата+60*60*24;
    //Если день недели сб или вос, кол-во рабочих дней не меняем
    Если ДеньНедели(ТекДата)6 И ДеньНедели(ТекДата)7 Тогда
    КоличествоРабочихДней=КоличествоРабочихДней+1;
    КонецЕсли;
    КонецЦикла;

    • Кучеров Дмитрий 04.07.2010 в 17:54

      Я думаю ДеньНедели(ТекДата)>5 Тогда …..

      • Кудрявцев Олег 04.07.2010 в 18:04

        Да, действительно…
        Можно упростить условие
        Если ДеньНедели(ТекДата)<6 Тогда увеличиваем количество рабочих дней

        • Кучеров Дмитрий 04.07.2010 в 19:10

          К тому же
          Если ДеньНедели(ТекДата)6 И ДеньНедели(ТекДата)7 Тогда
          наверное пропущен знак
          ;-)

    • У вас более экономичное решение… 1 цикл.

  39. Михайлов Сергей 04.07.2010 в 17:13

    Все ОК.
    //ТекДата = КонецДня(ТекДата) + 1;

  40. Проблем с ДЗ №3 не было.
    Вначале просто решил перебрать дни с 1 до 365 (366), но нет функции, которая вычисляет ДеньНедели по номеру дня в году.Пошел просто: два вложенных цикла и счетчик.
    Не забываем о секундах при работе с датой() :-)))

    • про секунды всегда надо помнить. особенно про 23:59:59

      • При чем здесь 23:59:59?!..

        Моно и начало дня использовать – главное увеличивать на 60*60*24..

    • Илья Алексеевич 04.07.2010 в 18:13

      а я перебирал дни начиная с Дата(“20100101”) и прибавлял по 86400 секунд.

      • Александр Горлов 05.07.2010 в 00:46

        В задаче стоял вопрос об отсчете 10 лет от текущей, а не жестко заданной строкой дате!

    • Александр Горлов 05.07.2010 в 00:44

      День недели прекрасно определяется процедурой ДеньНедели() в независимости от порядкового номера дня в году.