Базовый курс. Домашнее задание №3
Третье задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 11. Программный код
Глава 12. Примитивные типы данных
Глава 13. Контекст исполнения кода
Глава 14. Объектная техника
Глава 15. Сервисные средства по написанию кода
Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Насчет обратной связи:
1. Новыми были методы работы с булевской логикой, но это наверное не третий блок. Сложно говорить по существу каша в голове, после работы, сложно все сообрать воедино что изучалось и где возникали вопросы, решил что отпишу почтой, когда смогу оформить во что то внятное.
2. Затруднений не было, задания не сложные.
3. : не знаю
Точно не третий! Ошибку исправил :)
ДЗ сделал, как то все получилось без “заумства”
ПервыйЦикл ТекущийГод По ТекущийГод +10
Потом получаем ДатуНачалаГода и ДатуОкончанияГода по ним цикл
Во втором цикле проверяем на праздники, выходные и рабочие дни:
СтрокаПраздника = “”+День(Дата1)+”.”+Месяц(Дата1);
Если СписокПраздников.НайтиПоЗначению(СтрокаПраздника) <> Неопределено Тогда
//ничего не делаем, нас не просили учитывать праздники, посему их выкидываем
ИначеЕсли ДеньНедели(Дата1) > 5 Тогда
ВыходныхДней = ВыходныхДней + 1;
Иначе
РабочихДней = РабочихДней + 1;
КонецЕсли;
СтрокаПраздника = “”+День(Дата1)+”.”+Месяц(Дата1); Если СписокПраздников.НайтиПоЗначению(СтрокаПраздника) <> Неопределено Тогда ИначеЕсли ДеньНедели(Дата1) > 5 Тогда ВыходныхДней = ВыходныхДней + 1; Иначе РабочихДней = РабочихДней + 1; КонецЕсли;
по выходу из цикла делаем сообщить()
и добавляем значение в Структуру, все.
Выполнено.
К сожалению прикрепить внешнюю обработку нельзя :(
На форме вводится год и в список значений даты праздников.
При нажатии на кнопку.
&НаКлиенте
Процедура Расчитать(Команда)
АнализируемыйГод = Год;
Структура = Новый Структура(“Год”, НачалоГода(АнализируемыйГод));
КоличествоДнейВГоду = (КонецГода(АнализируемыйГод) – НачалоГода(АнализируемыйГод) + 1)
//—————————————————————-
/(24*60*60) ;
// Количество секунд в сутках
Структура.Вставить(“КоличествоДнейВГоду”, КоличествоДнейВГоду);
// 1. Выходные определены на 6 и 7 день недели, пятидневка
Итератор = 0;
НачалоГода = НачалоГода(АнализируемыйГод);
РабочиеДни = КоличествоДнейВГоду;
Пока НЕ Итератор = КоличествоДнейВГоду-1 Цикл
АнализируемыйДень = НачалоГода + Итератор * 24*60*60;
ДеньНеделиЗначение = ДеньНедели(АнализируемыйДень);
// Проверяем, входит ли данная дата в выходной
Если ДеньНеделиЗначение = 6 ИЛИ ДеньНеделиЗначение = 7 Тогда
РабочиеДни = РабочиеДни – 1;
ИначеЕсли НЕ Праздники.НайтиПоЗначению(АнализируемыйДень) = Неопределено Тогда
РабочиеДни = РабочиеДни – 1;
КонецЕсли;
Итератор = Итератор + 1;
КонецЦикла;
Структура.Вставить(“КоличествоРабочихДней”, РабочиеДни);
// Выводим сообщение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “За ” + Формат(Структура.Год, “ДФ=yyyy”) + ” год, ” + Структура.КоличествоДнейВГоду
+ ” календарных дней и из них ” + Структура.КоличествоРабочихДней + ” рабочих дней”;
Сообщение.Сообщить();
КонецПроцедуры
Ответы на вопросы ДЗ:
1. В данном блоке ничего координально нового не узнал, однако некоторые приятные мелочи, особенно те, которые ранее просто не замечал, но в процессе работы которые очень сильно ускоряют написание кода, за это отдельное спасибо, выделил для себя определенный алгоритм работы, остальное на заметку :).
2. Особых затруднений не было, тема развернута подробно, + у меня есть опыт работы с платформами 8.Х, кроме 8.2.
3. На данный момент больше всего интерисует корректное написание кода программы для выполния в разных клиентах, на сервере и внешнем соединении, как человеку пришедшему с 8.1 разделение клиентов пока новинка.
Функция ВычислениеРабочихДней(год)
р = 0;
началоГода = Дата(год,1,1);
конецГода = Дата(год,12,31);
д = началоГода;
ПОка д <= конецГода цикл
номерДня = ДеньНедели(д);
Если (номерДня%6)<>0 и (номерДня%7)<>0 тогда
//это не сб и не вс
Если д <> Дата(год,1,1) и д <> Дата(год,3,8) и д <> Дата(год,2,23) тогда
//это не праздник
р = р + 1;
КонецЕсли;
КонецЕсли;
д = КонецДня(д) + 1;
КонецЦикла;
возврат р;
КонецФункции
&НаКлиенте
Процедура Команда1(Команда)
РабДни = Новый Структура();//(“Год”,”КолРабДней”);
Для г = 2010 По 2020 Цикл
колРабДней = ВычислениеРабочихДней(г);
ключ = “Год”+ Формат(г,”ЧГ=0”);//строка(г); //Формат(Год, «ЧГ = 10″);
РабДни.Вставить(ключ,колРабДней);
КонецЦикла;
сообщ = НОвый СообщениеПользователю();
сообщ.Текст = строка(“2010 ” + РабДни.Год2010);
Сообщить(“2011 ” + РабДни.Год2011);
Сообщить(“2012 ” + РабДни.Год2012);
Сообщить(“2013 ” + РабДни.Год2013);
Сообщить(“2014 ” + РабДни.Год2014);
Сообщить(“2015 ” + РабДни.Год2015);
Сообщить(“2016 ” + РабДни.Год2016);
Сообщить(“2017 ” + РабДни.Год2017);
Сообщить(“2018 ” + РабДни.Год2018);
Сообщить(“2019 ” + РабДни.Год2019);
Сообщить(“2020 ” + РабДни.Год2020);
КонецПроцедуры
результат:
2011 258
2012 259
2013 259
2014 260
2015 259
2016 258
2017 258
2018 258
2019 259
2020 261
Принципиально нового для меня материала не было, кроме нового типа сообщений пользователю.
Трудности в основном были связаны с освоением нового интерфейса платформы.
Понравился способ реализации исключающего ИЛИ в одной строке.
Чего хотелось бы – чтобы ДЗ более соответствовали материалу видеоуроков. Например, о работе со структурами в уроках ничего не было рассказано.
Задание выполнил
// 1. Кол-во раб. дней без первой и последней недели, без учета праздников
КолДней = (НеделяГода(КонецГода(ДатаГода))-2)*5;
// 2. Кол-во раб. дней в первой недели
РабДнейНедНач = 6-ДеньНедели(НачалоГода(ДатаГода));
РабДнейНедНач = ?(РабДнейНедНач>0, РабДнейНедНач, 0);
// 3. Кол-во раб. дней в последней недели
РабДнейНедКон = ДеньНедели(КонецГода(ДатаГода));
РабДнейНедКон = ?(РабДнейНедКон>5,5,РабДнейНедКон);
// 4. Кол-во праздников в раб. день
ГодДопВыходных = Число(ДеньНедели(Дата(Год(ДатаГода),1,1))<6);//1 января
ГодДопВыходных = ГодДопВыходных + Число(ДеньНедели(Дата(Год(ДатаГода),2,23))<6);//23 февраля
ГодДопВыходных = ГодДопВыходных + Число(ДеньНедели(Дата(Год(ДатаГода),3,8))<6);//8 марта
// 5. Вычисляем раб дней в году
КолДней = КолДней + РабДнейНедНач + РабДнейНедКон – ГодДопВыходных;
Задание выполнил.
сделал обработку с тремя полями чтобы точечно за год можно было определить и за период лет.
весь код приводить не буду, а условие вышло такое :
Если не (ДеньНедели(ТекДень) = 6) и не ( ДеньНедели(ТекДень) = 7)
и НЕ( День(ТекДень)= 8 И Месяц(ТекДень)=3)
и НЕ( День(ТекДень)= 23 И Месяц(ТекДень)=2)
и НЕ( День(ТекДень)= 1 И Месяц(ТекДень)=1) Тогда
СчДней = СчДней +1;
КонецЕсли;
Если не (ДеньНедели(ТекДень) = 6) и не ( ДеньНедели(ТекДень) = 7) и НЕ( День(ТекДень)= 8 И Месяц(ТекДень)=3) и НЕ( День(ТекДень)= 23 И Месяц(ТекДень)=2) и НЕ( День(ТекДень)= 1 И Месяц(ТекДень)=1) Тогда СчДней = СчДней +1; КонецЕсли;
Просто видел что некоторые делаю по нескольку и не понял смысла. На работоспособности заметно это не повлияет в условиях данной задачи… Хотел сделать табл часть в обработке с праздниками(из за нее по сути так долго и не отвечал=) ) , но решил, что в этой табл части надо указывать число , т.к. полностью дата будет вызывать сомнения у пользователя, хоть это и обрабатываемо. При вводе числа хотел сделать проверку на соответствие конкретной дате чтобы не ввели 22.54 (22 число 54 месяца), например и в случае ошибки привязать к конкретной строке в таб части, но к сожалению не получилось =(
будет ли более подробно рассмотрен вывод сообщений пользователю??
PS
Кардинально ничего нового не узнал в принципе. Но что то полезное из мелочей для себя подхватил. Очень жалею что не было такого курса когда только начинал писать, многие вещи на которые у меня уходили недели тут объясняются за 2 занятия.
Привязку сообщений к элементам формы рассмотрим во втором блоке.
Задание выполнено.
В цикле пробегаем по годам, с текущего по текущий+10. Для каждого года вычисляем значение функции КоличествоРабочихДней. Содержание функции:
1. Определяем количество дней в году
2. Определяем день недели 1-го января
3. По умолчанию выходных дней 104. Если год не високосный и начинается в субботу или воскресенье, то количество выходных дней 105. Если год високосный и начинается в пятницу или воскресенье, то количество выходных дней 105. Если високосный начинается в субботу – 106.
4. Определяем дни недели праздников. Если они <6, то увеличиваем количество выходных дней.
5. Определяем количество рабочих дней как количество дней в году – количество выходных дней.
Можно было и в цикле пробегать по всем дням года и определять рабочий/выходной. Кода меньше бы получилось. Но не интересно.
По структуре.
Столкнулся с интересным моментом. Чтобы получить ключ в нужном виде, нужно преобразовать число (год) в строку, но т. к. в региональных настройках выставлен разделитель триад ” “, то получаемая строка имеет вид “2 010″, что нельзя использовать для ключа. Причем СтрЗаменить(Строка(Год), ” “, “”) почему-то не срабатывало :(. Пришлось использовать “Лев” и “Сред”.
Ответы на вопросы.
1. Новым было всё, что касается отличий 8.2 от 8.1
2. Сильных затруднений не было.
3. Все темы рассмотрены отлично и очень подробно.
Почитал комменты, понял, что надо СтрЗаменить(Строка(Год), Символы.НПП, “”).
Однако, вопрос: почему срабатывает СтрЗаменить(“2 010″, ” “, “”)?
Потому что неразрывный пробел и обычный пробел это разные вещи.
В этом можно убедится по коду символов.
Всё понял, спасибо
Хм, сразу поправка по пункту второму вопросов =)
Затруднения с применением системных перечислений, не правильно пока мышление работает (в основном программирую на 7.7).
Системные перечисления наизусть помнить вовсе не требуется, необходимость их применения описана в синтакс-помощнике.
А вот какие существует системные наборы значений желательно знать..
Решение ДЗ:
СпПраздников.Добавить(“01.01”);
СпПраздников.Добавить(“23.02”);
СпПраздников.Добавить(“08.03″);
ВыходныеДни = Новый Структура();
Для ТекГод = 2011 По 2020 Цикл
ТекущийГод = Дата(ТекГод,01,01);
ТекДата = НачалоГода(ТекущийГод); КвоРабДней = 0; КвоВыходныхДней = 0;
//обход года
Пока ТекДата<=КонецГода(ТекущийГод) Цикл
//проверка даты на выходной день
Если ДеньНедели(ТекДата)<>6 И ДеньНедели(ТекДата)<>7 Тогда
//проверка на праздники
Праздник = Ложь;
Если СпПраздников.НайтиПоЗначению(Лев(Строка(ТекДата),5))<>Неопределено Тогда
КвоВыходныхДней = КвоВыходныхДней + 1;
Праздник = Истина;
Иначе
КвоРабДней = КвоРабДней + 1;
КонецЕсли;
Иначе
КвоВыходныхДней = КвоВыходныхДней + 1;
КонецЕсли;
ТекДата = КонецДня(ТекДата)+1;
КонецЦикла;
Год = СтрЗаменить(Строка(ТекГод),Символы.НПП,””);
Сообщить(“”+Год+” год – “+КвоРабДней);
ВыходныеДни.Вставить(“Год”+Год,КвоВыходныхДней);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
СпПраздников = Новый СписокЗначений; СпПраздников.Добавить(“01.01”); СпПраздников.Добавить(“23.02”); СпПраздников.Добавить(“08.03″);
ВыходныеДни = Новый Структура();
Для ТекГод = 2011 По 2020 Цикл
ТекущийГод = Дата(ТекГод,01,01);
ТекДата = НачалоГода(ТекущийГод);
КвоРабДней = 0; КвоВыходныхДней = 0;
//обход года
Пока ТекДата<=КонецГода(ТекущийГод) Цикл
//проверка даты на выходной день
Если ДеньНедели(ТекДата)<>6 И ДеньНедели(ТекДата)<>7 Тогда
//проверка раб. дней на праздники
Если СпПраздников.НайтиПоЗначению(Лев(Строка(ТекДата),5))<>Неопределено Тогда
КвоВыходныхДней = КвоВыходныхДней + 1;
Иначе КвоРабДней = КвоРабДней + 1;
КонецЕсли;
Иначе КвоВыходныхДней = КвоВыходныхДней + 1; КонецЕсли;
ТекДата = КонецДня(ТекДата)+1;
КонецЦикла;
Год = СтрЗаменить(Строка(ТекГод),Символы.НПП,””);
Сообщить(“”+Год+” год – “+КвоРабДней);
ВыходныеДни.Вставить(“Год”+Год,КвоВыходныхДней);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
Результат:
2011 год – 258
2012 год – 259
2013 год – 259
2014 год – 260
2015 год – 259
2016 год – 258
2017 год – 258
2018 год – 258
2019 год – 259
2020 год – 261
Обратная связь:
1. Материал не нов для меня, но и сказать, что все это я знала раньше не могу. Большинство уже где-то читала, но знания не были систематизированными.
2. Особых затруднений пока не было. Они появляются, когда нужно применить прослушанное на практике :). Думаю, большее количество домашних заданий позволило бы выявить больше затруднений. :)
3. Пока нет пожеланий.
Создаем структуру выходных дней, цикл по годам (даты введены из реквизитов формы), в нем создаем массив с праздников. Далее – цикл по дням. Если ДеньНедели(ТекДень) < 6, то проверяем на «Неопределено» поиск даты в массиве праздников. Не нашли – счетчик рабочих дней +1, иначе счетчик выходных дней +1.
Все обращения к номеру года – по Формат(ТекущийГод,”ЧГ=0″). И кому в голову пришел этот неразрывный пробел во всех числах?
Обратная связь.
1. Т.к. ранее работал с 7.7, то новое – всё, что связано с 8-кой. Полезностей и нюансов очень много узнал, даже о приоритетах выполнения арифметических операций пожалел что не прочитал до выполнения ДЗ №2 – прокололся. Кроме начальных глав – все полезное.
2. В принципе затруднения были только с выделением времени на ознакомление с материалом. Если б было в печатном виде – можно было бы и в транспорте почитать, и перед сном… А так – все доступно, и очень внятно рассказано, спасибо.
3. Пока я еще не готов переваривать дополнительную информацию, эту не успеваю просмотреть. Но если есть новые материалы – с удовольствием ознакамливаюсь.
Повторно привожу решение домашнего задания.
Задание выполнил с помощью таблицы значений, поскольку работаю с ней в 7.7.
1. В модуле формы обработки создаем процедуру ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) и функцию Праздник(ТекДата), возвращающую Истина, если текущая дата является праздничным днем, и Ложь – в противном случае.
2. В процедуре создаем таблицу значений с колонками: “Год”,”РабочиийДень”,ВыходнойДень” и структуру “ВыходныеДни”.
3. В процедуре организовываем цикл с начальной даты периода:2010.01.01 по конечную 2019.12.31.
На каждом витке цикла создаем строку таблицы значений с указанием года текущей даты в колонке “Год” и 1 в колонке “РабочийДень”, если день недели текущей даты меньше 6 и не Праздник, для других дат – в колонке “ВыходнойДень”. При преобразовании года текущей даты в строку используем форматирование “ЧГ=0”.
4. Далее в процедуре сворачиваем таблицу значений по колонке группировки: “Год” и колонкам суммирования “РабочийДень,ВыходнойДень”.
5. В процедуре организовываем цикл по строкам таблицы значений. Внутри цикла, согласно задания, выводим сообщения от количестве рабочих дней по годам и вставляем в структуру значения количества выходных дней с ключом года.
6. В процедуре согласно задания выводим сообщение о количестве выходныхдней в 2014 году по ключу структуры.
P.S.
1. Ввиду того, что платформа 8.2 для меня является новой, начальные знания о ней упорядочились.
2. Каких-то особых затруднений пока не возникало.
3. Темы, требующей особого раскрытия, пока не определил.
Теперь прошел комментарий :)
День добрый! Катастрофически не хватает времени, поэтому выкладываю далеко не оптимальное решение, ну пока отчитываюсь по тому, что есть:
&НаКлиенте
Процедура Вывод2(Команда)
НачальнаяДата=’20100101000000′;
ВыходныеДни = Новый Структура;
Для НомерГода=2010 По 2019 Цикл
ТДень = НачалоГода(НачальнаяДата);
СтрокаГод=Формат(Год(ТДень),”ЧГ=0″);
КоличествоВыходных=0;
КоличествоРабочих=0;
Для СчетчикДней=1 По ДеньГода(КонецГода(НачальнаяДата)) Цикл
Если ДеньНедели(ТДень)=6 ИЛИ ДеньНедели(ТДень)=7
ИЛИ ТДень=Дата(СтрокаГод,01,01) ИЛИ ТДень=Дата(СтрокаГод,02,23)
ИЛИ ТДень=Дата(СтрокаГод,03,08)
Тогда КоличествоВыходных=КоличествоВыходных+1
Иначе
КоличествоРабочих=КоличествоРабочих+1;
КонецЕсли;
ТДень=ТДень+86400;
КонецЦикла;
Сообщить(“Количество рабочих в “+НомерГода+ ” году”+” = “+КоличествоРабочих);
Ключ=”Год”+Формат(НомерГода,”ЧГ=0”);
ВыходныеДни.Вставить(Ключ,КоличествоВыходных);
КоличествоВыходных=0;
КоличествоРабочих=0;
НачальнаяДата=НачальнаяДата+(86400*ДеньГода(КонецГода(НачальнаяДата)));
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
Ответ:
Количество рабочих в 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
105
По поводу обратной связи, времени очень мало поэтому даже четко сформулировать свои пожелания сейчас не могу, однако материал очень качественный и информативный, в следующих отчетах постараюсь написать что-то более конкретное, спасибо!
Определила количество полных недель в году (*2 выходных), определила количество выходных в остатке
ПервыйДень = ДеньНедели(Дата(Год, 1, 1));
Остаток = ПервыйДень – 1 + ДнейВГоду%7;
Если Остаток < 6 Тогда
ИначеЕсли Остаток < 7 Тогда
КолВых = КолВых + 1;
ИначеЕсли Остаток >= 7 Тогда
КолВых = КолВых + 1;
КонецЕсли;
Определила не приходятся ли праздничные дни на выходные, если нет КолВых = КолВых+1;
Этими данными заполнила структуру в цикле
Далее выводДля Год = 2010 По 2019 Цикл
Ключ = “Год” + Формат(Год, “ЧГ = 10”);
Сообщить(ВыходныеДни[Ключ]);
КонецЦикла;
Обратная связь
1. Новое: существование оператора %
2. Наибольшие затруднения были при решение дом.заданий
3. Вопросы установки, например в 8.1 есть административная установка, есть ли она в 8.2
3. Нет в 8.2 такой установки нет.
Но существует возможность автоматического обновления платформы, об этом мы говорим в продвинутом..
Из дистрибутива административная установка запускается, однако в книге по 8.2 написано что административная установка отключена, и, если не изменяет память, то отключена из-за изменения принципа запуска платформ.
&НаКлиенте
Процедура Команда1(Команда)
ПраздничныеДни = Новый Массив;
ПраздничныеДни.Добавить(“0101”);
ПраздничныеДни.Добавить(“0223”);
ПраздничныеДни.Добавить(“0308″);
ВыходныеДни = Новый Структура;
Для НомерГода=2010 По 2019 Цикл
//Преобразуем номер года в строку, чтобы убрать разделитель разрядов
НомерГодаСтрока=Формат(НомерГода,”ЧГ=0″);
//Определяем первый и последние дни года
ПервыйДеньГода=Дата(НомерГодаСтрока+”0101”);
ПоследнийДеньГода=КонецГода(ПервыйДеньГода);
//Определяем количество календарных дней года
КоличествоДнейГода=ДеньГода(ПоследнийДеньГода);
//Определяем количество выходных в году
КоличествоВыходныхПервойНедели=Мин(2,7-ДеньНедели(ПервыйДеньГода)+1);
КоличествоВыходныхПоследнейНедели=Макс(0,ДеньНедели(ПоследнийДеньГода)-5);
КоличествоВыходныхВОстальныеНедели=(НеделяГода(ПоследнийДеньГода)-2)*2;
КоличествоНеРабочихДней=КоличествоВыходныхПервойНедели+КоличествоВыходныхПоследнейНедели+КоличествоВыходныхВОстальныеНедели;
//Записываем количество выходных дней в структуру
ВыходныеДни.Вставить(“Год”+НомерГодаСтрока,КоличествоНеРабочихДней);
//Теперь добавим праздники, если они не выпадают на выходные
Для каждого Праздник Из ПраздничныеДни Цикл
Если ДеньНедели(Дата(НомерГодаСтрока+Праздник))<6 Тогда
КоличествоНеРабочихДней=КоличествоНеРабочихДней+1;
КонецЕсли;
КонецЦикла;
Сообщить(НомерГодаСтрока+” год – “+(КоличествоДнейГода-КоличествоНеРабочихДней)+” рабочих дней”);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
Решение без Циклов внутри годов (перебор праздничных дней не в счет – ввел для универсальности)
&НаКлиенте
Процедура Команда1(Команда)
ПраздничныеДни = Новый Массив;
ПраздничныеДни.Добавить(“0101”);
ПраздничныеДни.Добавить(“0223”);
ПраздничныеДни.Добавить(“0308″);
ВыходныеДни = Новый Структура;
Для НомерГода=2010 По 2019 Цикл
//Преобразуем номер года в строку, чтобы убрать разделитель разрядов
НомерГодаСтрока=Формат(НомерГода,”ЧГ=0″);
//Определяем первый и последние дни года
ПервыйДеньГода=Дата(НомерГодаСтрока+”0101”); ПоследнийДеньГода=КонецГода(ПервыйДеньГода);
//Определяем количество календарных дней года КоличествоДнейГода=ДеньГода(ПоследнийДеньГода);
//Определяем количество выходных в году КоличествоВыходныхПервойНедели=Мин(2,7-ДеньНедели(ПервыйДеньГода)+1);
КоличествоВыходныхПоследнейНедели=Макс(0,ДеньНедели(ПоследнийДеньГода)-5);
КоличествоВыходныхВОстальныеНедели=(НеделяГода(ПоследнийДеньГода)-2)*2;
КоличествоНеРабочихДней=КоличествоВыходныхПервойНедели+КоличествоВыходныхПоследнейНедели+КоличествоВыходныхВОстальныеНедели;
//Записываем количество выходных дней в структуру
ВыходныеДни.Вставить(“Год”+НомерГодаСтрока,КоличествоНеРабочихДней);
//Теперь добавим праздники, если они не выпадают на выходные
Для каждого Праздник Из ПраздничныеДни Цикл
Если ДеньНедели(Дата(НомерГодаСтрока+Праздник))<6 Тогда
КоличествоНеРабочихДней=КоличествоНеРабочихДней+1;
КонецЕсли;
КонецЦикла;
Сообщить(НомерГодаСтрока+” год – “+(КоличествоДнейГода-КоличествоНеРабочихДней)+” рабочих дней”);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
Обратная связь.
1) Более четкое понимание логики системы при преобразовании типов, производимых по умолчанию;
2) Особых затруднений не было, но главный помощник любопытство и Табло :)
3) Подводные камни/действия системы по умолчанию.
Было бы здорова выставить для Базового курса. 1-ый блок слайды. С слайдами легче работать.
Хорошо, сегодня выложим.
При решений Д.З. возникли проблемы с незнанием, к решению пришел через работу с комментариями и разборкой кода в отладчике. Также помогла глава1. Типы данных, первого блока.
ВыходныеДни= Новый Структура();
Год=Год(ТекущаяДата());
Для РасщГод=Год по (Год+9) Цикл
ДеньДляПроверки=Дата(РасщГод,1,1)+52*7*24*60*60;
ВсегоВыходных=52*2;
Пока ДеньДляПроверки<=КонецГода(Дата(РасщГод,1,1)) Цикл
Если (ДеньНедели(ДеньДляПроверки)>5)Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
ДеньДляПроверки=ДеньДляПроверки+24*60*60;
КонецЦикла;
Если ДеньНедели(Дата(РасщГод,1,1))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
Если ДеньНедели(Дата(РасщГод,2,23))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
Если ДеньНедели(Дата(РасщГод,3,8))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
ВыходныеДни.Вставить(“Год”+Формат(РасщГод,”ЧГ=”),ВсегоВыходных);
Сообщить(“”+РасщГод+” год – “+(ДеньГода(КонецГода(Дата(РасщГод,1,1)))-ВсегоВыходных)+” рабочих дней”);
КонецЦикла
Ответ :
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 рабочих дней
Обратная связь :
1.В нулевой блок для меня оказался новым, больше половины я не знал.
2.Материал доступный и интересный. Наибольшее затруднение вызвало Д.З №3, чему помогли темы первого блока. С МГ и Бонусами голова кругом и времени нет.
3.Глава11. Программный год хотелось бы по подробней (операторы, циклические операторы, процедуры и функций).
При решений Д.З. возникли проблемы с незнанием, к решению пришел через работу с комментариями и разборкой кода в отладчике. Также помогла глава1. Типы данных, первого блока.
ВыходныеДни= Новый Структура();
Год=Год(ТекущаяДата());
Для РасщГод=Год по (Год+9) Цикл
ДеньДляПроверки=Дата(РасщГод,1,1)+52*7*24*60*60;
ВсегоВыходных=52*2;
Пока ДеньДляПроверки<=КонецГода(Дата(РасщГод,1,1)) Цикл
Если (ДеньНедели(ДеньДляПроверки)>5)Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
ДеньДляПроверки=ДеньДляПроверки+24*60*60;
КонецЦикла;
Если ДеньНедели(Дата(РасщГод,1,1))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
Если ДеньНедели(Дата(РасщГод,2,23))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
Если ДеньНедели(Дата(РасщГод,3,8))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
ВыходныеДни.Вставить(“Год”+Формат(РасщГод,”ЧГ=”),ВсегоВыходных);
Сообщить(“”+РасщГод+” год – “+(ДеньГода(КонецГода(Дата(РасщГод,1,1)))-ВсегоВыходных)+” рабочих дней”);
КонецЦикла
Ответ :
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 рабочих дней
Обратная связь :
1.В нулевой блок для меня оказался новым, больше половины я не знал.
2.Материал доступный и интересный. Наибольшее затруднение вызвало Д.З №3, чему помогли темы первого блока. С МГ и Бонусами голова кругом и времени нет.
3.Глава11. Программный год хотелось бы по подробней (операторы, циклические операторы, процедуры и функций).
Решение ДЗ: взять самое начало периода, потом прибавлять по 86400(24*60*60) к дате и проверять на перескок в новый год – перескочили, вывести результат для прошедшего года, добавить в структуру, обнулить счетчики. Каждый день проверять на ДеньНедели и принадлежность к праздничным из задания (как развлечение можно по совпадению дня года). Если ДеньНедели 6 или 7 или праздник – увеличиваем выходной, иначе рабочий. Цикл пока с условием выхода текдата <= конечнаядата.
1. Надеюсь, в вопросе спрашивается пока о 0-м блоке… Поскольку не имел большого опыта с 8.2 – много нового об интерфейсных особенностях – познавательно. П.1 из ДЗ2 использовал для “издевательств” над коллегами, ссылка на авторство прилагалась, копирайт не нарушен :)
2. Пока затруднений нет.
3. Как следствие п.2 и ответов на вопросы остальных – предложения отсутствуют.
Процедура КоличествоРабочихДней(Команда)
Массив = Новый Массив;
Массив.Добавить(2010);
Массив.Добавить(2011);
Массив.Добавить(2012);
Массив.Добавить(2013);
Массив.Добавить(2014);
Массив.Добавить(2015);
Массив.Добавить(2016);
Массив.Добавить(2017);
Массив.Добавить(2018);
ВыходныеДни = Новый Структура;
СекундВДень = (24*60*60);
Для каждого текЭлемент Из Массив Цикл
текГод = СтрЗаменить(строка(текЭлемент),Символы.НПП,””);
РабочихДней = 0;
ВыходныхДней = 0;
НачалоГода = НачалоГода(Дата(текЭлемент,1,1));
КонецГода = КонецДня(КонецГода(Дата(текЭлемент,1,1)));
ВсегоДней = ДеньГода(КонецГода);
Счетчик = НачалоГода;
для СчетчикДней = 1 по ВсегоДней цикл
Выходной = (ДеньНедели(Счетчик)>5) или (Счетчик=Дата(текЭлемент,1,1))
или (Счетчик=Дата(текЭлемент,2,23)) или (Счетчик=Дата(текЭлемент,3,8));
РабочихДней = ?(Выходной,РабочихДней,(РабочихДней+1));
ВыходныхДней = ?(Выходной,(ВыходныхДней+1),ВыходныхДней);
Счетчик = НачалоДня(Счетчик+СекундВДень);
конецЦикла;
сообщить(“В “+текЭлемент+” – “+РабочихДней+” раб.дней”);
ВыходныеДни.Вставить(“Год”+текГод,ВыходныхДней);
КонецЦикла;
Сообщить(ВыходныеДни.Год2012);
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
При разработке процедуры столкнулся с незнакомой проблемой при заполнении структуры. При задании ключа номер года первоначально задавался с пробелом. Странно но ведь я не использую ни каких разделителей на триады? Или платформа сама по умолчанию так работает? Интересно где устанавливаются данные опции по форматированию (если они конечно есть).
Обратная связь: Хотелось бы получше узнать про контексты выполнения модулей, что выполняется на сервере а что на клиенте (но может надо просто еще раз просмотреть материал :) ). Конечно я понимаю что мы используем файловый вариант, но было бы интересно какие отличия появляются при работе с web-сервером (и есть ли они вообще).
Региональные установки задаются в конфигураторе: Администрирование – Региональные установки ИБ.
Про клиент-серверное взаимодействие – в 1-вом блоке.
А подробную работу клиент-серверного варианта изучаем в продвинутом.
Задание выполнено:
Для ТекГод = НачГод по КонГод цикл
Ключ = “Год” + Формат(ТекГод,”ЧГ=0″);
Календарь = ПолучитьКалендарь(ТекГод);
РабочиеДни.Вставить(Ключ, Календарь.КоличествоРабочихДней);
ВыходныеДни.Вставить(Ключ, Календарь.КоличествоВыходныхДней);
Сообщить(строка(ТекГод) + ” год – ”
+ РабочиеДни[Ключ] + ” рабочих дней, ”
+ ВыходныеДни[Ключ] + ” выходных дней”);
КонецЦикла;
Подсчет количества рабочих дней реализовал “в лоб” перебором дат (для надежности).
Обратная связь:
1. Новая информация:
1) Все, что связано с управляемыми формами.
2) Тонкости преобразования типов данных и приоритеты выполнения.
3) Ограничения на размер таблиц БД.
2. Проблем не возникло, за материал спасибо.
3. Для нулевого блока все темы раскрыты достойно.
Обратная связь.
В основном, материал уже знакомый.
Скорее, менее привычен материал, где идёт речь не о работе в конфигураторе, т.е. начало курса о взаимодействии клиентской и серверной части для различных видов клиентов.
Кроме того, конечно, интересны материалы со звездочкой, т.к. там действительно часто встречались новые.
Понятно, что годы перебираем в цикле. Начало года задаем как Дата(ТекГод, 1, 1).
1. Во многих комментариях в цикле перебирались дни года. Мне кажется, можно поступить более эффективно. Год делим на три части: неполная неделя в начале (возможно отсутствует), полные недели, неполная неделя в конце (возможно отсутствует). Определяем границы частей. Начало первой полной недели:
КонецНедели(НачалоТекГода – 1) + 1;
(нельзя использовать КонецНедели(НачалоТекГода)), т.к. в случае отсутствия первой неполной недели получим не 1января, а 8января).
Конец последней полной недели: НачалоНедели(КонецТекГода + 1) – 1
(замечание аналогичное предыдущему).
По количеству дней в неполных неделях и по количеству полных недель определяем количество рабочих и выходных дней без учета праздников. Например, для первой неполной недели:
РабочихДней1 = Макс(ДнейНеполнойНеделиВНачалеГода – 2, 0)
2. Организовал отдельную функцию, которая возвращает праздики в виде массива, в элементах которого есть информация о дне праздника, например: “0101”, “0223”, “0308” (как бы предполагая, что возможны варианты, какой день назначитьпраздничным).
Для каждого элемента Праздник определяем день недели праздника:
ДеньНедели(Дата(ТекГод, Число(Лев(Праздник, 2)), Число(Прав(Праздник, 2))))
Суммируем количество праздников, попадающих на рабочие дни, вычитаем полученную сумму из количества рабочих и прибавляем к количеству выходных дней.
3. (Обнаружил, что это есть, пожалуй, в каждом комментарии). При организации структуры ВыходныеДни надо правильно преобразовать в строку номер года, т.к. в случае Строка(ТекГод) появляется неразрывный пробел в качестве разделителя. Надо использовать Формат(ТекГод, “ЧГ=0”).
Выполнил ДЗ №3
2010 год – 258 рабочих дней107 выходных дней 2011 год – 258 рабочих дней107 выходных дней 2012 год – 259 рабочих дней107 выходных дней 2013 год – 259 рабочих дней106 выходных дней 2014 год – 260 рабочих дней105 выходных дней 2015 год – 259 рабочих дней106 выходных дней 2016 год – 258 рабочих дней108 выходных дней 2017 год – 258 рабочих дней107 выходных дней 2018 год – 258 рабочих дней107 выходных дней 2019 год – 259 рабочих дней106 выходных дней 2020 год – 261 рабочих дней105 выходных дней 105
Мой вариант реализации:
&НаСервере
Функция КоличествоДнейВГоду(НомерГода)
ДатаГода = Дата(НомерГода,1,1);
НачалоГода = НачалоГода(ДатаГода);
КонецГода = КонецГода(ДатаГода);
ДнейВГоду = Окр(((КонецГода – НачалоГода)/86400),0,1);
Возврат ДнейВГоду;
КонецФункции // КоличествоДнейВГоду()
&НаСервере
Функция КоличествоВыходныхДнейВГоду(НомерГода)
ДатаГода = Дата(НомерГода,1,1);
ДеньГода = НачалоГода(ДатаГода);
КонецГода = КонецГода(ДатаГода);
КоличествоВыходныхДней = 0;
Пока ДеньГода <= КонецГода Цикл
Если ДеньНедели(ДеньГода)=6 или ДеньНедели(ДеньГода) = 7 Тогда
КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
КонецЕсли;
ДеньГода = ДеньГода + 86400;
КонецЦикла; КонецГода = КонецГода(ДатаГода);
Возврат КоличествоВыходныхДней;
КонецФункции // КоличествоВыходныхДнейВгоду()
&НаСервере
Функция КоличествоПраздничныхДнейВГоду(НомерГода)
КоличествоПраздников = 0;
ПраздничныйДень = Новый Массив();
ПраздничныйДень.Добавить(Дата(НомерГода,1,1));
ПраздничныйДень.Добавить(Дата(НомерГода,2,23));
ПраздничныйДень.Добавить(Дата(НомерГода,3,8));
Для сч=0 по ПраздничныйДень.Количество()- 1 Цикл
Если ДеньНедели(ПраздничныйДень[сч]) < 6 Тогда
КоличествоПраздников = КоличествоПраздников + 1;
КонецЕсли;
//КоличествоПраздников = КоличествоПраздников + 1;
КонецЦикла;
Возврат КоличествоПраздников;
КонецФункции // КоличествоПраздничныхДнейВГоду()
&НаКлиенте
Процедура Расчитать(Команда)
ВыходныеДни = Новый Структура;
Для НомерГода = 2010 по 2020 Цикл
НерабочиеДни = КоличествоПраздничныхДнейВГоду(НомерГода)+ КоличествоВыходныхДнейВГоду(НомерГода);
КоличествоРабочихДней = КоличествоДнейВГоду(НомерГода) – НерабочиеДни;
Ключ = “год” + Формат(НомерГода, “ЧГ=0”);
ВыходныеДни.Вставить(Ключ, НерабочиеДни);
Сообщить(Формат(НомерГода, “ЧГ=0″) + ” год – ” + КоличествоРабочихДней + ” рабочих дней” + НерабочиеДни + ” выходных дней” );
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
Я давал решение вечером 05.11.2010, но сейчас его не вижу?
Я тоже не вижу..
Видимо комментарий не отправился (может быть были проблемы с сервером).
Напишите еще раз..
Задание выполнил.
вот результат (не такой как у всех :):
2010 год – 261 рабочих дней
2011 год – 260 рабочих дней
2012 год – 261 рабочих дней
2013 год – 261 рабочих дней
2014 год – 261 рабочих дней
2015 год – 261 рабочих дней
2016 год – 261 рабочих дней
2017 год – 260 рабочих дней
2018 год – 261 рабочих дней
2019 год – 261 рабочих дней
104
Все задания сделал в одной процедуре, вот текст:
Процедура КнВывестиРабДни(Команда)
ВыходныеДни = Новый Структура;
Для ТекущийГод = 2010 По 2019 Цикл
РабочихДней = 0;
ВыходныхДней = 0;
НачДата = Дата(Формат(ТекущийГод,”ЧГ=0″)+
“0101”);
ТекДата = НачДата;
Пока ТекДата <= КонецГода(НачДата) Цикл
Если День(ТекДата) =
Дата(Формат(ТекущийГод,”ЧГ=0″)+ “0101”) ИЛИ
День(ТекДата) =
Дата(Формат(ТекущийГод,”ЧГ=0″)+ “0223”) ИЛИ
День(ТекДата) =
Дата(Формат(ТекущийГод,”ЧГ=0″)+ “0308”) ИЛИ
День(ТекДата) =
Дата(Формат(ТекущийГод,”ЧГ=0″)+ “0223”) ИЛИ
ДеньНедели(ТекДата) = 6 ИЛИ
ДеньНедели(ТекДата) = 7 Тогда
ТекДата = ТекДата + 86400;
ВыходныхДней = ВыходныхДней +
1;
Продолжить;
КонецЕсли;
РабочихДней = РабочихДней + 1;
ТекДата = ТекДата + 86400;
КонецЦикла;
Сообщить(Формат(ТекущийГод,”ЧГ=0″) + ” год –
” + РабочихДней + ” рабочих дней”);
Ключ = “Год”+Формат(ТекущийГод,”ЧГ=0”);
ВыходныеДни.Вставить(Ключ,ВыходныхДней);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
ТЕПЕРЬ ОБРАТНАЯ СВЯЗЬ:
1. По платформе 8.2 для меня почти все ново, но особенно
понравились приемы работы с текстом модуля.
Раскрылась тема по операторам присваивания и сравнения.
2. Затруднения испытал при преобразовании значений (помог
разобраться видеоматериал по решению домашнего задания)
3. Тут сложно прокомментировать, так как пока спешу успеть за
основной группой…
а для чего “День(ТекДата)”, чтобы “не как у всех”? :)
Rusja, благодарю! Действительно, День(ТекДата) – это чего-то я перемудрил :).
Спасибо еще раз, поправил – теперь “как у всех” !
Задание сделано.
2010 год – 258 рабочих дней
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
Небольшая заминка возникла с пробелом в году – воспользовался Формат(,).
Обратная связь.
1. Что нового узнал:
а)операции вида: ++; +- и т.п.
б)знак = в каких случаях это присвоение, а в каких
сравнение.
2. Всё рассказано доступно, так что затруднений не было.
3. Думаю, что возможно такая потребность возникнет при
изучении последующих блоков.
Добрый вечер!
Мое решение ДЗ №3:
СтруктураВыходныеДни = Новый Структура;
Для НомерГода=2010 по 2019 Цикл
ВсегоДнейВГоду = ДеньГода(КонецГода(Дата(НомерГода,1,1)));
ВыходныхДней = 0;
РабочихДнейВГоду = 0;
ПраздничныеДни = 0;
ДеньГода = НачалоГода(Дата(НомерГода,1,1));
Пока ДеньГода <= КонецГода(Дата(НомерГода,1,1)) Цикл
Если ДеньНедели(ДеньГода)=6 или ДеньНедели(ДеньГода)=7 Тогда
ВыходныхДней = ВыходныхДней + 1;
КонецЕсли;
ДеньГода=ДеньГода+86400;
КонецЦикла;
ПраздничныеДни = ПраздничныеДни + ?(ДеньНедели(Дата(НомерГода,1,1))=6 или ДеньНедели(Дата(НомерГода,1,1))=7,0,1);
ПраздничныеДни = ПраздничныеДни + ?(ДеньНедели(Дата(НомерГода,2,23))=6 или ДеньНедели(Дата(НомерГода,2,23))=7,0,1);
ПраздничныеДни = ПраздничныеДни + ?(ДеньНедели(Дата(НомерГода,3,8))=6 или ДеньНедели(Дата(НомерГода,3,8))=7,0,1);
РабочихДнейВГоду = ВсегоДнейВГоду – ВыходныхДней – ПраздничныеДни;
Сообщить(“”+СтрЗаменить(НомерГода,Символы.НПП,””)+” год – “+РабочихДнейВГоду+” рабочих дней”);
КлючСтруктуры=”Год”+СтрЗаменить(НомерГода,Символы.НПП,””);
СтруктураВыходныеДни.Вставить(КлючСтруктуры,ВыходныхДней);
КонецЦикла;
Для каждого ЭлементВыходныеДни из СтруктураВыходныеДни Цикл
Сообщить(Прав(ЭлементВыходныеДни.Ключ,4) + ” год – “+ЭлементВыходныеДни.Значение+” выходных дней”);
КонецЦикла;
Обратная связь по 0-му блоку:
1. а) Двойной знак ++ в 1С; б) Открыл для себя навигацию по циклам и ветвям оператора «Если» с помощью комбинации Ctrl + скобочка. Реально очень не хватало и очень удобно; в) Про выбор между операцией «+» и конкатенацией строк в зависимости от типа первого операнда; г) Про то, что можно делать несколько ссылок на одну и ту же базу в стартере.
2. Наибольшие затруднения были в теме с приоритетами арифметических, булевых и операций сравнения. Помогло самостоятельное экспериментирование в табло конфигуратора.
3. Пока, вроде, всё понятно.
Обратная связь по 0-му блоку:
1) по поводу нового – скорее правильнее будет сказать, что ликвидировал пробелы в знаниях (например, приведение типов, приоритеты выполнения операторов);
2) затруднений, достойных внимания, не было
3) по поводу темы, которая мне интересна – возможность управления “сборкой мусора“: действительно имеет смысл “очищать” значения переменных (т.е. были ли замечены реальные улучшения в производительности?)? имеет ли смысл это делать для переменных, живущих внутри процедуры(функции)?
3. Вообще не имеет. Но есть ситуация, когда не очистка приводит к серьезным утечкам памяти на сервере.
Но это скорее исключение, чем правило.
Однако, на этот счет мы записали отдельное видео в серии “13-ть ошибок”. В скором времени его выложим.
Мое решение:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
&НаКлиенте
Процедура КомандаВыполнить(Команда)
ГодОт = 2010;
ГодДо = 2019;
ВыходныеДни = Новый Структура;
Для Год = ГодОт По ГодДо Цикл
РасчетВыходныхДней(ВыходныеДни, Год);
КонецЦикла;
Для Год = ГодОт По ГодДо Цикл
СтрГод = Формат(Год,”ЧГ=0″);
РабочиеДни = ДеньГода(Дата(СтрГод + “1231”)) – ВыходныеДни[“Год”+СтрГод];
Сообщить(СтрГод + ” год – ” + РабочиеДни + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура РасчетВыходныхДней(ВыходныеДни, Год)
СтрГод = Формат(Год,”ЧГ=0″);
Праздники = Новый Массив;
Праздники.Добавить(Дата(СтрГод+”0101″));
Праздники.Добавить(Дата(СтрГод+”0223″));
Праздники.Добавить(Дата(СтрГод+”0308″));
ПослДеньГода = Дата(Дата(Формат(Год,”ЧГ=0″) + “1231”));
ДнейВГоду = ДеньГода(ПослДеньГода);
КоличествоВыходных = Цел(ДнейВГоду/7) * 2 + ?(ДеньНедели(Дата(СтрГод+”0101″))>5,1,0);
Для Каждого Праздник Из Праздники Цикл
КоличествоВыходных = КоличествоВыходных + ?(ДеньНедели(Праздник) < 6, 1, 0);
КонецЦикла;
ВыходныеДни.Вставить(“Год”+СтрГод, КоличествоВыходных);
КонецПроцедуры
&НаКлиенте
Процедура КомандаВыполнить(Команда)
ГодОт = 2010;
ГодДо = 2019;
ВыходныеДни = Новый Структура;
Для Год = ГодОт По ГодДо Цикл
РасчетВыходныхДней(ВыходныеДни, Год);
КонецЦикла;
Для Год = ГодОт По ГодДо Цикл
СтрГод = Формат(Год,”ЧГ=0″);
РабочиеДни = ДеньГода(Дата(СтрГод + “1231”)) – ВыходныеДни[“Год”+СтрГод];
Сообщить(СтрГод + ” год – ” + РабочиеДни + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура РасчетВыходныхДней(ВыходныеДни, Год)
СтрГод = Формат(Год,”ЧГ=0″);
Праздники = Новый Массив; Праздники.Добавить(Дата(СтрГод+”0101″)); Праздники.Добавить(Дата(СтрГод+”0223″)); Праздники.Добавить(Дата(СтрГод+”0308″));
ПослДеньГода = Дата(Дата(Формат(Год,”ЧГ=0″) + “1231”));
ДнейВГоду = ДеньГода(ПослДеньГода);
КоличествоВыходных = Цел(ДнейВГоду/7) * 2 + ?(ДеньНедели(Дата(СтрГод+”0101″))>5,1,0);
Для Каждого Праздник Из Праздники Цикл КоличествоВыходных = КоличествоВыходных + ?(ДеньНедели(Праздник) < 6, 1, 0);
КонецЦикла;
ВыходныеДни.Вставить(“Год”+СтрГод, КоличествоВыходных);
КонецПроцедуры
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
PS очень интересно посмотреть решения других, но с такими “особенностями” сохранения пользовательского форматирования текста в комментариях – одно мучение
Задание выполнено, результат:
2010 год – 258 рабочих дней
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
Кол-во выходных в 2014 году = 105
Несколько вопросов не по самому ДЗ:
1) Почему, если я запускаю конфигурацию в режиме отладки «Толстый клиент (обычное приложение)», то моя внешняя обработка не открывается в пользовательском режиме?
2) Как в конфигураторе, при редактировании текста модуля можно удалить сразу целиком строку (в платформе 7.7 для этого предназначена комбинация Ctrl+Y)?
Ответы на вопросы в конце ДЗ №3:
1) Новый материал по концепции платформы 8.2 (по сранвению с 7.7). Изменился взгляд на процесс написания кода, как было сказано в 0-м блоке, платформа 8.2 объектно-ориентированная, в отличии от 7.7. Тем, кто знаком с языками программирования высокого уровня (включая и меня, Delphi, VisualBasic) будет легче освоить программирование на платформе 8.2.
2) Особых затруднений в материалах 0-го блока не было, возникающие вопросы решались с помощью ответов авторов курса на сайте и практике в конфигураторе.
3) В мастер-группе хотелось бы увидеть материалы, по настройке платформы при работе в клиент-серверном варианте, вчастности настройки сервера 1С, самого SQL сервера в части работы с 8.2. Лично меня, этот вопрос интересует с точки зрения практики перехода с версии платформы 7.7 под SQL на версию 8.2 в клиент-серверном варианте.
Спасибо авторам курса, материал изложен доступно, а возникающие вопросы решаются достаточно быстро.
1. Видимо у нее нет обычной формы. И скорее всего обработка отрывается, но с формой по умолчанию.
Так и задумано.
2. А для чего нужно выделение? Если удалить, то есть хоткей Ctrl+L.
Если скопировать то придется нажимать: Home + (Shift + End)
3. Подробное изложение клиент-серверной архитектуры представлено в продвинутом курсе.
1) Возможно ли сделать одну и ту же форму обычной и для управляемого интерфейса или необходимо делать две отдельные формы?
2) Мне нужно не выделить строку, а сразу удалить строку, на которой находится курсор. Зачем мне лишние движения по выделению и т.д., когда в 7.7 нажал Ctrl+Y и строка, на которой находится курсор, сразу удалилась. Очень удобно, часто использую эту возможность, поэтому и спрашиваю)
1. Создать можно, но обычные формы будут доступны только в толстом клиенте.
Поэтому правильнее создавать управляемую форму, которая в свою очередь может быть доступна в обычном интерфейсе.
2. Я ведь ответил ранее – Ctrl + L.
Каким образом указывается, что управляемая форма может открываться и в обычном интерфейсе? (Я так понимаю какие то настройки формы)
См. флаг “Использовать обычные формы в толстом клиенте в управляемом режиме” в свойствах корневого узла конфигурации..
Об этом скоро выпустим отдельное бонусное видео..
К решению 3-го задания еще не приступал (пытаюсь догнать). У меня вопрос:
Задание касается ведь нулевого блока ? (так написано в задании). Но там есть задание на создание Структуры… в видеоуроках нулевого блока она не рассматривается, но, посмотрев темы 1-го блока вижу, что структура рассматривается там. Значит ли это, что перед выполнением Задания №3 нужно изучить некоторые темы 1-го блока?
Почему тогда нет этих указаний в теме этой ветки? Или предполагается, что у обучаемого уже должны быть знания (в данном случае об объекте “структура”), полученные из других источников?
Действительно, работу со структурой логичнее вынести в 4-ое домашнее задание.
Сейчас для успешного выполнения ДЗ №3 можно изучить первую главу 1-го блока.
Отзыв
1.В 0 блоке меня заинтересовало окно списка баз. С интересом слушал про возможность запуска версий 8.0 и 8.1 из окна 8.2. Ранее я видел это поле, но не думал, что у него такое предназначение.
2. Работа с управляемыми формами далась не сразу, только спустя несколько дней занятий.
3. Поэтому, думаю. что работа с управляемыми формами. реквизитами заслуживает мастер-группы.
3. В 1-ом блоке мы подробнее касаемся этого вопроса :)
Процедура Сформировать(Команда)
ВыходныеДни= Новый Структура;
Для Год=2010 По 2019 Цикл
ТекДата=Дата(Формат(Год,”ЧГ=0″)+”0101″);
КонецГ=КонецГода(ТекДата);
КоличествоВыходных=0;
КоличествоРабочих=0;
Пока ТекДата<=КонецГ Цикл
Если ДеньНедели(ТекДата)=6 или ДеньНедели(ТекДата)=7 тогда
КоличествоВыходных=КоличествоВыходных+1;
Иначе
КоличествоРабочих=КоличествоРабочих+1;
КонецЕсли;
ТекДата=ТекДата+86400;
КонецЦикла;
М= Новый Массив;
М.Добавить(Формат(Год,”ЧГ=0″)+”0101″);
М.Добавить(Формат(Год,”ЧГ=0″)+”0223″);
М.Добавить(Формат(Год,”ЧГ=0″)+”0308″);
Для каждого Эл Из М Цикл
Если НЕ (ДеньНедели(Эл)=6 или ДеньНедели(Эл)=7) Тогда
КоличествоВыходных=КоличествоВыходных+1;
КоличествоРабочих=КоличествоРабочих-1;
КонецЕсли;
КонецЦикла;
ВыходныеДни.Вставить(“Год”+Формат(Год,”ЧГ=0″),КоличествоВыходных);
Сообщить(Формат(Год,”ЧГ=0″) +” год – ” +КоличествоРабочих+” рабочих дней”);
Сообщить(Формат(Год,”ЧГ=0″) +” год – ” +КоличествоВыходных+” выходных дней”);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
1.Поскольку с 8.2 совсем не работала, все относящееся к новой платформе было интересно. Заодно систематизировались некоторые знания, относящиеся и к 8.1 тоже. Горячими клавишами не пользовалась раньше, теперь буду :)
2. При решении ДЗ№3 строка(2010)=”2 010″. Способ решения проблемы нашла в яндексе. Непонятно, почему 8-ка ведет себя таким образом. Если бы я хотела отформатировать число с разделением триад, я бы использовала форматирование. А используя функцию Строка логично было бы получить целую строку. Получается все наоборот. Какие еще способы борьбы с этим пробелом посоветуете?
3.Универсальные коллекции значений (особенно новые) и практическое их применение. Или они будут рассмотрены в 1-м блоке?
3. Да, в 1-ом блоке мы их все рассматриваем..
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Период = 10;
ТекДата = ТекущаяДата();
ВыходныеДни = Новый Структура;
Пока Период > 0 Цикл
НачПериода_ = НачалоГода(ТекДата);
КонПериода_ = КонецГода(ТекДата);
Праздники = 0;
Рабочие = 0;
Пока КонПериода_ > НачПериода_ Цикл
Если ДеньНедели(НачПериода_) = 6 ИЛИ
ДеньНедели(НачПериода_) = 7 ИЛИ
День(НачПериода_) = 1 И Месяц(НачПериода_) = 1 ИЛИ
День(НачПериода_) = 23 И Месяц(НачПериода_) = 2 ИЛИ
День(НачПериода_) = 8 И Месяц(НачПериода_) = 3 Тогда
Праздники = Праздники + 1;
Иначе
Рабочие = Рабочие + 1;
КонецЕсли;
НачПериода_ = НачалоДня(НачПериода_+86400);
КонецЦикла;
Сообщить(“”+Год(ТекДата)+” год – “+Рабочие+” рабочих дней”);
Ключ = “Год”+Год(КонПериода_);
Ключ = СтрЗаменить(Ключ,Сред(Ключ,5,1),””);
ВыходныеДни.Вставить(Ключ,Праздники);
ТекДата = НачалоГода(КонПериода_+1);
Период = Период – 1;
КонецЦикла;
КонецПроцедуры
мое решение :
==================
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ВыходныеДни = Новый Структура();
Для х=2010 по 2020 Цикл
Кол_Выходных = 0;
Кол_Рабочих = 0;
ДатаГода = Дата(х,01,01);
хх=НачалоГода(ДатаГода);
Пока хх < КонецГода(ДатаГода) Цикл
Если ДеньНедели(хх)>=6 или хх=Дата(х,01,01) или хх=Дата(х,02,23) или хх=Дата(х,03,08) Тогда
Кол_Выходных = Кол_Выходных + 1;
Иначе
Кол_Рабочих = Кол_Рабочих + 1;
КонецЕсли;
хх=хх+60*60*24;
КонецЦикла;
ВыходныеДни.Вставить(“Год” + СтрЗаменить(х, Символы.НПП, “”), Кол_Выходных);
сообщить(”
| “);
Сообщить(” “+х+” год- “+ Кол_Рабочих + ” рабочих дней”);
КонецЦикла;
сообщить(”
| “);
Сообщить(ВыходныеДни.Год2018);
КонецПроцедуры
==========================
– думаю должно быть более простое решение …
– пока смог сделать обычным перебором …
– надо подумать …
Добавлю еще один вариант, более правильной с точки зрения условий задачи:
ВыходныеДни = Новый Структура;
ТекущийГод = Год(ТекущаяДата());
Для НомерГода = 0 По 10 Цикл
КолвоВыходныхДней = 0;
ДнейВГоду = ДеньГода(Дата(ТекущийГод + НомерГода, 12, 31));
ДатаВГоду = Дата(ТекущийГод + НомерГода – 1, 12, 31);
Для ДеньГода = 1 По ДнейВГоду Цикл
ДатаВГоду = ДатаВГоду + 24*60*60;
Если ДеньНедели(ДатаВГоду) > 5 ИЛИ ДатаВГоду = Дата(ТекущийГод + НомерГода, 1, 1) ИЛИ ДатаВГоду = Дата(ТекущийГод + НомерГода, 2, 23) ИЛИ ДатаВГоду = Дата(ТекущийГод + НомерГода, 3, 8) Тогда
КолвоВыходныхДней = КолвоВыходныхДней + 1;
КонецЕсли;
КонецЦикла;
КоличествоРабочихДней = ДнейВГоду – КолвоВыходныхДней;
НомерГодаБезНПП = Формат(ТекущийГод + НомерГода, “ЧГ=0″);
Сообщить(НомерГодаБезНПП + ” год – ” + КоличествоРабочихДней);
ВыходныеДни.Вставить(“Год” + НомерГодаБезНПП, КолвоВыходныхДней);
КонецЦикла;
ВыходныеДни = Новый Структура; ТекущийГод = Год(ТекущаяДата()); Для НомерГода = 0 По 10 Цикл
КолвоВыходныхДней = 0; ДнейВГоду = ДеньГода(Дата(ТекущийГод + НомерГода, 12, 31)); ДатаВГоду = Дата(ТекущийГод + НомерГода – 1, 12, 31); Для ДеньГода = 1 По ДнейВГоду Цикл ДатаВГоду = ДатаВГоду + 24*60*60; Если ДеньНедели(ДатаВГоду) > 5 ИЛИ ДатаВГоду = Дата(ТекущийГод + НомерГода, 1, 1) ИЛИ ДатаВГоду = Дата(ТекущийГод + НомерГода, 2, 23) ИЛИ ДатаВГоду = Дата(ТекущийГод + НомерГода, 3, 8) Тогда КолвоВыходныхДней = КолвоВыходныхДней + 1; КонецЕсли; КонецЦикла; КоличествоРабочихДней = ДнейВГоду – КолвоВыходныхДней; НомерГодаБезНПП = Формат(ТекущийГод + НомерГода, “ЧГ=0″); Сообщить(НомерГодаБезНПП + ” год – ” + КоличествоРабочихДней); ВыходныеДни.Вставить(“Год” + НомерГодаБезНПП, КолвоВыходныхДней);
КонецЦикла;
Домашнее задание сделал с помощью таблицы значений, поскольку работаю с ней в 7.7.
1.В модуле формы внешней обработки создаем процедуру ПриСозданииНаСервере(Отказ,СтандартнаяОбработка) и функцию Праздник(ТекДата), возвращающую- Истина, если текущая дата праздник.
2.В процедуре создаем таблицу значений с колонками:”Год”,”РабочийДень”,”ВыходнойДень” и структуру “ВыходныеДни”.
3. В процедуре организовываем цикл с начальной даты периода: 2010.01.01 по конечную: 2019.12.31. Внутри цикла создаем новую строку таблицы значений с заполнением года текущей даты и заполнением 1 в колонке рабочего дня, если день недели меньше 6 и не праздник, или в колонке выходного дня, при несоблюдении этого условия, которое проверяет функция Праздник.Учитываем формат значения в колонке “Год”, чтобы не было проблемы с ключами в структуре.
4.В процедуре сворачиваем таблицу значений по колонке группировки “Год” и колонкам суммирования “РабочийДень,ВыходнойДень”.
5.В процедуре организовываем цикл по строкам таблицы значений с выводом сообщений о количестве рабочих дней года,согласно задания, и заполнением структуры с указанием ключа и значения.
6.В процедуре согласно задания выводим в сообщение количество выходных дней в 2014 году через обращение к ключу структуры.
P.S.
1.Поскольку 8.2 для меня новая платформа, изложенный материал позволил упорядочить начальные знания о ней.
2.Каких-то особых затруднений не было.
3.Темы, требующей подробного рассмотрения, на мой взгляд пока не было, ведь это только начало…
Задание решила через 2 цикла
1 обход по годам
2 перебор дней года, и в конце цикла проверка на праздники
По вопросам:
Есть некоторые детали которыми редко пользуешься поэтому они либо не известны, либо забыты. Но в общем пока все знакомо.
Хотелось бы по подробнее по Структурам.
Подробнее о структурах в самом начале 1-го блока.
ВыходныеДни = Новый Структура;
ТекущийГод = 2010;
Для НомерГода = 1 По 10 Цикл
ДнейВГоду = ДеньГода(Дата(ТекущийГод + НомерГода, 12, 31));
КолвоВыходныхДней = Цел(ДнейВГоду / 7) * 2 + 3;
КоличествоРабочихДней = ДнейВГоду – КолвоВыходныхДней;
НомерГодаБезНПП = Формат(ТекущийГод + НомерГода, “ЧГ=0″);
Сообщить(НомерГодаБезНПП + ” год – ” + КоличествоРабочихДней);
ВыходныеДни.Вставить(“Год” + НомерГодаБезНПП, КолвоВыходныхДней);
КонецЦикла;
Сообщить(“”+ ВыходныеДни.Год2012);
Почти догнал.
ВыходныеДни = Новый Структура; ТекущийГод = 2010; Для НомерГода = 1 По 10 Цикл
ДнейВГоду = ДеньГода(Дата(ТекущийГод + НомерГода, 12, 31)); КолвоВыходныхДней = Цел(ДнейВГоду / 7) * 2 + 3; КоличествоРабочихДней = ДнейВГоду – КолвоВыходныхДней; НомерГодаБезНПП = Формат(ТекущийГод + НомерГода, “ЧГ=0″); Сообщить(НомерГодаБезНПП + ” год – ” + КоличествоРабочихДней); ВыходныеДни.Вставить(“Год” + НомерГодаБезНПП, КолвоВыходныхДней);
КонецЦикла; Сообщить(“”+ ВыходныеДни.Год2012);
Обратная связь: нового не узнал ничего, неожиданно понравились задача №1 и №2.2 (про слияние строк) – что указывает что Вы внимательны к мелочам и даже в известных предметах находите новые стороны.
Какой то бардак с ковычками…
НомерГодаБезНПП + » год – »
«ЧГ=0″
Это “Хром” так колбасит? Или copy/paste из 1С 8.2 на Windows7 ?
Это особенность нашего блога :)
КолвоВыходныхДней = Цел(ДнейВГоду / 7) * 2 + 3;
выражение всегда эквивалентно:
КолвоВыходныхДней =107;
Вас это не настораживает? :)…
Сейчас осознала, что 1е 2 строчки моего кода -рудимент.
И на всякий случай окончание:
годстрокой=”Год”+Формат(г,”ЧГ=0″);
сообщить(годстрокой+” рабочих дней “+рдней);
ВыходныеДни.Вставить(годстрокой,вдней);
Сообщить(годстрокой+” выходных дней “+ВыходныеДни[годстрокой]);
1. Никогда не использовала “=” так, как предлагается в решении 1 задания. В процессе выполнения 3 го задания осознала, что строка ключа структуры не может начинаться с цифры). И т.п. Вобщем, определенное количество мелких фенечек я нашла.
Про взгляды.
До сих пор программирование в 1С было для меня только интересной, но напряженной работой, со стоящим с секундомером за плечом клиентом. Воспринимать программирование, как зарядку для мозгов – это полезно.
2. Затруднения пока только с моим временем. Впрочем, еще не совсем понимаю методологию работы и использования мастер-групп.
3. В каждом блоке меня интересуют любые отличия 8.1-8.2.
рд1=Цел(365/7)*5;
вд1=Цел(365/7)*2;
ВыходныеДни=Новый Структура;
для г=2010 по 2020 цикл
рдней=0;
вдней=0;
НачГода=дата(г,01,01);
конгода=дата(г,12,31);
количестводнейвгоду=деньгода(конгода);
д1=ДеньНедели(НачГода);
пока д1<=7 цикл// до 1 вс
Если д1<=5 тогда
рдней=рдней+1;
иначе
вдней=вдней+1;
конецесли;
д1=д1+1;
КонецЦикла;
д2=ДеньНедели(конгода);
пока д2>=1 цикл// до посл. пн
Если д2<=5 тогда
рдней=рдней+1;
иначе
вдней=вдней+1;
конецесли;
д2=д2-1;
КонецЦикла;
полныхнедельвгоду=(количестводнейвгоду-рдней-вдней)/7;
рдней=рдней+полныхнедельвгоду*5;
вдней=вдней+полныхнедельвгоду*2;
праздники=новый Массив;
праздники.Добавить(дата(г,01,01));
праздники.Добавить(дата(г,02,23));
праздники.Добавить(дата(г,03,08));
для Каждого пр из праздники цикл
Если ДеньНедели(пр)<=5 тогда
рдней=рдней-1;
вдней=вдней+1;
КонецЕсли;
КонецЦикла;