Домашнее задание №3 базового курса
Третье задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 11. Программный код
Глава 12. Примитивные типы данных
Глава 13. Контекст исполнения кода
Глава 14. Объектная техника
Глава 15. Сервисные средства по написанию кода
Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Выполнила раньше, отписываюсь только сейчас.
Сделано
Задание выполнил.
Выполнил
Задание выполнила успешно.
Задание выполнено давно. Но поскольку надо отчитаться, то отчитываюсь.
Подобные задачи и раньше приходилось решать (в семёрке). Отличия здесь: секунды; непереносимость праздников с выходных на будни.
Выполнено уже давно, но все забывал отписаться.
Особых сложностей не возникло
Выполнено
Выполнил. В основной части трудностей не возникло. Решение сделал очень близкое к авторскому по определению количества недель. За исключением: определение рабочих дней неполных недель учел отдельно для начала и для конца года (без циклов):
//для начала года
ДобавкаРабочихДней = ДобавкаРабочихДней + МАКС(6-ДеньНедели_ПервыйДеньГода,0);
//для конца года
ДобавкаРабочихДней = ДобавкаРабочихДней + МИН(ДеньНедели_ПоследнийДеньГода,5);
– так все-таки немножко попонятней, не так зашифровано как у авторов.
Реальную трудность вызвала Структура. ДЗ#3 – заявлено в НУЛЕВОМ блоке, а в нем работу со структурами вроде как не проходили, ну ладно, залез в синтакс-помощник, почитал, сделал – дает ошибку… потыкался еще… закомментил, решил посмотреть в решении, перед просмотром решения обычно читаю комментарии, в комментариях – решение нашел… был возмущен до глубины души! “самовольностью” платформы ;-) ладно, раз берет с настроек ОС – тогда уж надо не Символы.НПП заменять, а определять системный разделитель разрядов и его использовать для замены…
Выполнено.
Поздно конечно, но оно того стоит еще одна feAture платформы – неразрывный пробел – инструкция по применению..еще один штрих для skill’ов..
Задание выполнила
выполнено
Задание выполнено!, проблем не возникло
Домашнее задание №3 выполнила.
Дз №3 выполнил.
ДЗ 3 Выполнил….
Решено. Проблему с пробелом в году обошел использовав функцию Формат()
Решил. все получилось. Реализовавал прибавлением к обрабатываемой дате следующий день (в секундах) и вызыванием функций к этой дате для определения рабочей даты. Немного смутила опечатка в задании (количество дней), думал у меня ошибка, но ничего – разобрался)))
ДЗ 3 решил. Все получилось
Задачу решил. Спасибо.
Дом. задание №3 сделала.
Задание выполнено. оказалось интереснее чем на первый взгляд.
Сделал свой вариант.
Что то он не похож на выложенные варианты.
Интересно когда будет выложен правильный вариант?
Вторник то заканчиваеться…
Заканчивается, но не закончен.
В первую очередь выходит мастер-группа, потом решение домашнего задания..
Сделал
Решил таким образом:
Функция КолвоРабочих(Знач ТекГод)
Праздники = Новый Массив; // массив праздничных дней одного года
// Строка массива содержит номер праздничного дня в году
КалендГод = Прав(ТекГод, 4);
Праздники.Добавить(ДеньГода(Дата(КалендГод + “0101”)));
Праздники.Добавить(ДеньГода(Дата(КалендГод + “0223”)));
Праздники.Добавить(ДеньГода(Дата(КалендГод + “0308”)));
ТекДеньГода = 1;
ТекДеньНедели = ДеньНедели(Дата(КалендГод + “0101”));
РабочихДней = 0;
ДнейВГоду = ДеньГода(Дата(КалендГод + “1231”));
й = 0;
ПраздничныйДень = Праздники[й]; // первый праздник
Пока ТекДеньГода <= ДнейВГоду Цикл // перебираем дни года
Если ТекДеньГода = ПраздничныйДень Тогда // праздник
Если й < Праздники.ВГраница() Тогда // праздник еще не последний
й = й + 1;
ПраздничныйДень = Праздники[й]; // день в году следующего праздника
КонецЕсли;
Иначе // не праздник
Если ТекДеньНедели < 6 Тогда РабочихДней = РабочихДней + 1;
КонецЕсли;
КонецЕсли;
Если ТекДеньНедели = 7 Тогда ТекДеньНедели = 0;
КонецЕсли;
ТекДеньНедели = ТекДеньНедели + 1;
ТекДеньГода = ТекДеньГода + 1;
КонецЦикла;
Возврат(РабочихДней);
КонецФункции // КолвоРабочих()
ДЗ №3 сделано…
Задание выполнено.
&НаСервере
Функция ВычислитьКолРаб()
// Вставить содержимое обработчика.
ВыходныеДни=Новый Структура;
Для сч=2010 по 2019 Цикл
ВыходныеДни.Вставить(“Год”+Формат(Сч,”ЧГ=0=”),КолРабДней(сч));
Сообщить(Формат(Сч,”ЧГ=0=”)+” год – “+КолРабДней(сч)+” рабочих дней”);
КонецЦикла;
Возврат ВыходныеДни;
КонецФункции
&НаСервере
Функция КолРабДней(Гд)
КолРаб=0;
КолДобВых=?(ДеньНедели(Дата(ГД,1,1))<6,1,0)+?(ДеньНедели(Дата(ГД,2,23))<6,1,0)+?(ДеньНедели(Дата(ГД,3,8))<6,1,0); //количество "добавочных" выходных
ТекДень=Дата(ГД,1,1);
Пока ТекДень<=Дата(Гд,12,31) Цикл
КолРаб=КолРаб+?(ДеньНедели(ТекДень) <6,1,0);
ТекДень=ТекДень+86400;
КонецЦикла;
Возврат КолРаб-КолДобВых;
КонецФункции
ДЗ сделал, хотя, как и многие, сначала напоролся на НПП в ключе структуры.
Цикл один по датам
ТекДата = ТекущаяДата();
НачалоПериода = НачалоГода(ТекДата);
КонецПериода = КонецГода(ДобавитьМесяц(ТекДата, 10*12));
Празники через массив
Праздники = Новый Массив;
Праздники.Добавить(ДеньГода(Дата(“20100101”)));
Праздники.Добавить(ДеньГода(Дата(“20100223”)));
Праздники.Добавить(ДеньГода(Дата(“20100308”)));
функция день года позволяет избавиться от привязки к году.
а далее в цикле проверял день недели и еще далее (в том же цикле)
Если ДеньГода(тДата)=1 Тогда // т.е. если 1 января
Сообщить(“”+ТекГод+ ” год – “+ РабочихДнейВГоду+” рабочих дней”);
Результат – как и несколько приведенных выше.
ДЗ №3 выполнил
Смутило только несоответствие название структуры (ВыходныеДни) и содержимое (количество рабочих дней). Решил все таки что требовалось определять и количество выходных.
Решил тоже выложить свое решение.
На форму положил два реквизита ГодНачало и ГодКонец.
&НаКлиенте
Процедура Рассчитать(Команда)
ВыходныеДни = Новый Структура;
Для Сч=ГодНачало По ГодКонец Цикл
КоличествоВыходных=0;
КоличествоРабДней = ЧислоРабочихДнейВГоду(Сч,КоличествоВыходных);
Ключ = “Год”+Формат(Сч,”ЧГ=”);
ВыходныеДни.Вставить(Ключ,КоличествоВыходных);
Сообщить(“Год: “+Сч+”, рабочих дней: “+КоличествоРабДней+”, выходных: “+ВыходныеДни[Ключ]);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
&НаСервере
Функция ЧислоРабочихДнейВГоду(Год,КоличествоВыходныхДней) Экспорт
ПраздничныеДни = Новый Массив;
ПраздничныеДни.Добавить(Дата(Год,1,1));
ПраздничныеДни.Добавить(Дата(Год,2,23));
ПраздничныеДни.Добавить(Дата(Год,3,8));
НачалоГода = Дата(Год,1,1);
КонецГода = КонецГода(НачалоГода);
День = 86400; // 60*60*24
КоличествоРабДней = 0;
КоличествоВыходныхДней=0;
ТекущийДень = НачалоГода;
Пока ТекущийДень<КонецГода Цикл
Если ПраздничныеДни.Найти(ТекущийДень)Неопределено или ДеньНедели(ТекущийДень)>5 Тогда
КоличествоВыходныхДней=КоличествоВыходныхДней+1;
Иначе
КоличествоРабДней = КоличествоРабДней+1;
КонецЕсли;
ТекущийДень = ТекущийДень+День;
КонецЦикла;
Возврат КоличествоРабДней;
КонецФункции // ЧислоРабочихДней()
Формулировка задания предоставляла выбор.
Все ок!
ДЗ №3 выполнил.
В основной функции “ВычислитьКоличествоРабочихНеРабочихДней” сразу рассчитываю рабочие и нерабочие дни:
&НаКлиенте
Функция ВычислитьКоличествоРабочихНеРабочихДней(вхГод) Экспорт
ТекДата = Дата(вхГод, 1,1);
//КолВыходных = 0;
КолРабочих=0;КолВыходных=0;
Пока Год(ТекДата)=вхГод Цикл
ЭтоПраздник=Ложь;
Если День(ТекДата)=1 и Месяц(ТекДата)=1 Тогда
ЭтоПраздник=Истина;
ИначеЕсли День(ТекДата)=23 и Месяц(ТекДата)=2 Тогда
ЭтоПраздник=Истина;
ИначеЕсли День(ТекДата)=8 и Месяц(ТекДата)=3 Тогда
ЭтоПраздник=Истина;
КонецЕсли;
Если (ЭтоПраздник=Истина или ДеньНедели(ТекДата)=6 или ДеньНедели(ТекДата)=7) Тогда
КолВыходных = КолВыходных+1;
Иначе
КолРабочих = КолРабочих+1;
КонецЕсли;
ТекДата = ТекДата+60*60*24;
КонецЦикла;
Структура = Новый Структура;
Структура.Вставить(“РабочиеДни”, КолРабочих);
Структура.Вставить(“ВыходныеДни”, КолВыходных);
Возврат Структура;
КонецФункции
&НаКлиенте
Процедура Тест(Команда)
НачГод=2000;
Для инд=0 по 10 Цикл
ТекГод = НачГод+инд;
Результат = ВычислитьКоличествоРабочихНеРабочихДней(ТекГод);
Сообщить(Формат(ТекГод, “ЧРГ=”)+ ” год – ” + Результат.РабочиеДни + ” рабочих дней”);
КонецЦикла;
ВыходныеДни = Новый Структура;
Результат = ВычислитьКоличествоРабочихНеРабочихДней(2014);
ВыходныеДни.Вставить(“Год2014”, Результат.ВыходныеДни);
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
Сделал.
Без затей, двумя циклами.
Для определения выходного использовал функцию ДеньНедели().
ДЗ № 3 выполнил. Народ, покритикуйте код….. интересно узнать Ваше мнение.
&НаКлиенте
Процедура Сформировать(Команда)
ВыходныеДни = Новый Структура();
Для Н=2010 По 2020 Цикл
ВыходныеДни.Вставить(“Год” + Формат(Н,”ЧГ=0″), ВыходныеДниГода(Н));
КонецЦикла;
Для каждого ПараСтруктуры Из ВыходныеДни Цикл
Сообщить(СтрЗаменить(ПараСтруктуры.Ключ,”Год”,””) + ” год – “+ ПараСтруктуры.Значение+ ” рабочих дней.”);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция ВыходныеДниГода(Год)
ДнейВГоду = ДеньГода(КонецГода(Дата(Год,12,31)));
СчетчикРабочихДней = 0;
Для Н=0 По ДнейВГоду-1 Цикл
ТекДата = Дата(Год,1,1) + Н * 86400;
Если НЕ ЭтоВыходной(ТекДата) И НЕ ЭтоПраздник(ТекДата) Тогда
СчетчикРабочихДней = СчетчикРабочихДней + 1;
КонецЕсли;
КонецЦикла;
Возврат СчетчикРабочихДней;
КонецФункции
&НаКлиенте
Функция ЭтоВыходной(Дата)
Возврат (ДеньНедели(Дата)=6) ИЛИ (ДеньНедели(Дата)=7);
КонецФункции
&НаКлиенте
Функция ЭтоПраздник(Дата)
Возврат (День(Дата)=1) И (Месяц(Дата)=1) ИЛИ
(День(Дата)=23) И (Месяц(Дата)=2) ИЛИ
(День(Дата)=8) И (Месяц(Дата)=3);
КонецФункции
//Извиняюсь за приведенный ранее неполный текст
&НаКлиенте
Процедура СообщитьЧислоДней(Команда)
Сообщить(“Результат”);
ВыходныеДни = Новый Структура;
ДатаНачалаПроверки = КонецГода(ТекущаяДата()) + 1;
Для Год = Год(ДатаНачалаПроверки) По Год(ДатаНачалаПроверки) + 10 Цикл
ЧислоРабочихДней = 0;
СтрокаГод = СтрЗаменить(Формат(Год,”ЧРГ = _”),”_”,””);
СтрокаДаты = СтрокаГод + “0101”;
ДатаПроверки = Дата(СтрокаДаты);
Пока Год(ДатаПроверки) = Год Цикл
Если не(Формат(ДатаПроверки,”ДФ = “”дддд”””) = “суббота”
или Формат(ДатаПроверки,”ДФ = “”дддд”””) = “воскресенье”
или Формат(ДатаПроверки,”ДФ = “”дд ММММ”””) = “08 марта”
или Формат(ДатаПроверки,”ДФ = “”дд ММММ”””) = “01 января”
или Формат(ДатаПроверки,”ДФ = “”дд ММММ”””) = “23 февраля”) Тогда
ЧислоРабочихДней = ЧислоРабочихДней+1;
КонецЕсли;
ДатаПроверки = ДатаПроверки + 60*60*24;
КонецЦикла;
ВыходныеДни.Вставить(“Год” + СтрокаГод,ЧислоРабочихДней);
КонецЦикла;
Для Год = Год(ДатаНачалаПроверки) По Год(ДатаНачалаПроверки) + 10 Цикл
СтрокаГод = СтрЗаменить(Формат(Год,”ЧРГ = _”),”_”,””);
Сообщить(СтрокаГод + ” год – ” + ВыходныеДни[“Год” + СтрокаГод]);
КонецЦикла;
КонецПроцедуры
Немного повозился, пока не понял, что Строка(Год) выдает “2 011” т.е. строку с пробелом
Сделал с помощью двух циклов
Для Год = Год(ДатаНачалаПроверки) По Год(ДатаНачалаПроверки) + 10 Цикл
ЧислоРабочихДней = 0;
СтрокаГод = СтрЗаменить(Формат(Год,”ЧРГ = _”),”_”,””);
СтрокаДаты = СтрокаГод + “0101”;
ДатаПроверки = Дата(СтрокаДаты);
Пока Год(ДатаПроверки) = Год Цикл
Дз №3 сделано двумя способами. Быстрый и медленный. Привожу быстрый вариант основной функции.
&НаКлиенте
Функция РазобратьДатуГода(ГодРасчета)
НовыйГод = ДобавитьМесяц(ГодРасчета,12);
ЧислоДней = (НовыйГод – ГодРасчета)/60/60/24;
ПоследняяНеделя = НеделяГода(НовыйГод-1);
ЧислоПолныхНедель = Цел(ЧислоДней/7);
ЧислоДнейВГодуПоПолнымНеделям = ЧислоПолныхНедель*7;
РазницаДней = ЧислоДней – ЧислоДнейВГодуПоПолнымНеделям;
//Сколько полных суббот и воскресений, вместе с праздниками.
КоличествоСубботИВоскресений = ЧислоДнейВГодуПоПолнымНеделям/7*2;
КоличествоВвыходныхСКореектировкой =0;
Для i = 1 По РазницаДней Цикл
ПроверяемыйДень = НовыйГод – i*60*60*24;
Если ДеньНедели(ПроверяемыйДень) =6 или ДеньНедели(ПроверяемыйДень) = 7 Тогда
КоличествоВвыходныхСКореектировкой =КоличествоВвыходныхСКореектировкой +1;
КонецЕсли;
КонецЦикла;
КоличествоПраздников = 3;
МассивПраздничныхДат = Новый Массив;
МассивПраздничныхДат.Добавить(Дата(Год(ГодРасчета),1,1));
МассивПраздничныхДат.Добавить(Дата(Год(ГодРасчета),2,23));
МассивПраздничныхДат.Добавить(Дата(Год(ГодРасчета),3,08));
Для Каждого ЭлементМассива из МассивПраздничныхДат Цикл
Если ДеньНедели(ЭлементМассива)= 7 или ДеньНедели(ЭлементМассива)= 6 Тогда
КоличествоПраздников = КоличествоПраздников – 1;
КонецЕсли;
КонецЦикла;
Возврат ЧислоДней – КоличествоСубботИВоскресений – КоличествоВвыходныхСКореектировкой – КоличествоПраздников;
КонецФункции
:) Закон парных случаев . Утром делал Табель учета раб. времени на 7.7 там эту функцию писал.. пришлось повторить для 8.2 :) а вообще задания интересные, пока нравятся …
ДЗ №3 сделано.