Базовый курс. Занятие №3
Третье занятие по нулевому блоку базового курса.
Необходимо изучить следующие главы 0-го блока.
Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
напишите нам на e-mail поддержки.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Функция КоличествоРабочихДней(Год)
РабочихДней = 257; //52*5 – 3 праздника
ВсегоДней = ДеньГода(Дата(Год,12,31));
ПоследнийДень = 31;
сч = 364;
Пока сч < ВсегоДней цикл //проверим 1(для високосного – 2)последних дня
Если ДеньНедели(Дата(Год,12,ПоследнийДень)) < 6 Тогда //рабочий день
РабочихДней = РабочихДней + 1;
КонецЕсли;
ПоследнийДень = ПоследнийДень – 1;
сч = сч + 1;
КонецЦикла;
Если ДеньНедели(Дата(Год,1,1)) > 5 Тогда //проверим 1 января на выходной
РабочихДней = РабочихДней + 1;
КонецЕсли;
Если ДеньНедели(Дата(Год,2,23)) > 5 Тогда //проверим 23 февраля на выходной
РабочихДней = РабочихДней + 1;
КонецЕсли;
Если ДеньНедели(Дата(Год,3,8)) > 5 Тогда //проверим 8 марта на выходной
РабочихДней = РабочихДней + 1;
КонецЕсли;
Возврат РабочихДней;
КонецФункции // КоличествоРабочихДней()
По материалу курса замечаний нет, пока на мой взгляд нужно побольше заданий, приближенных к “реальным”.
Такие задания будут в следующих блоках.
<code>
&НаКлиенте
Процедура Нажми(Команда)
Для ТекГод = 2010 По 2020 Цикл
//Считаем праздники в текущем году
Праздники=0;
Если ДеньНедели(Дата(ТекГод,1,1))< 6 Тогда
Праздники=Праздники+1;
КонецЕсли;
Если ДеньНедели(Дата(ТекГод,2,23))< 6 Тогда
Праздники=Праздники+1;
КонецЕсли;
Если ДеньНедели(Дата(ТекГод,3,8))< 6 Тогда
Праздники=Праздники+1;
КонецЕсли;
//Считаем выходные
НачГода = Дата(ТекГод,1,1);
КонГода = КонецГода(НачГода);
ДнейВсего = ДеньГода(КонГода);
Недель = Цел(ДнейВсего/7);
Выходные = Недель*2 + Праздники;
Рабочие = ДнейВсего – Выходные;
Сообщить (Строка(ТекГод) +” год – ” +Строка(Рабочие) +” рабочих дней”);
КонецЦикла;
КонецПроцедуры
</code>
Не оптимальное решение, но свое:
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ГодМ = ‘20100101’;
ГодЧисло= Год(ГодМ);
НачалоГода=НачалоГода(ГодМ);
РабДней=0;
День = НачалоГода;
НомерДня = 1;
Пока ГодЧисло < 2021 Цикл
НачалоГода=НачалоГода(ГодМ);
КонецГода= КонецГода(ГодМ);
ДнейВсего= Окр((КонецГода-НачалоГода)/(60*60*24));
Пока НомерДня <= ДнейВсего Цикл
Если (НЕ ДеньНедели(День)=6) И (НЕ ДеньНедели(День)=7) Тогда
// рабочие дни
Если Не (Сред(Строка(День),1,5)=”01.01″) И Не (Сред(Строка(День),1,5)=”23.02″) И (Не Сред(Строка(День),1,5)=”08.03″) Тогда
РабДней = РабДней + 1;
КонецЕсли;
КонецЕсли;
День = День + (60*60*24);
НомерДня = НомерДня+1;
КонецЦикла;
Сообщить(“”+ГодЧисло+ ” году “+ Строка(РабДней) + ” – рабочих дней”);
ГодЧисло = ГодЧисло + 1;
ГодМ = ГодМ + 365* (60*60*24);
НомерДня = 1;
РабДней=0;
КонецЦикла;
КонецПроцедуры</code>
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 – рабочих дней
2 020 году 261 – рабочих дней
Ответы на вопросы:
1. Для меня очень много нового, я с 8-кой не работал.
2. еще путаюсь с поиском нужного в синтакс-помощнике.
3. идем от простого к сложному, материала хватает.
Задание выполнено.
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НачальныйГод = 2010;
КонечныйГод = НачальныйГод+10;
Для ТекущийГод = НачальныйГод По КонечныйГод Цикл
Если ГодВисокосный(ТекущийГод) Тогда
КоличествоДнейВГоду = 366;
Иначе
КоличествоДнейВГоду = 365;
КонецЕсли;
НачальнаяДата = Дата(ТекущийГод, 1, 1);
КонечнаяДата = НачальнаяДата+КоличествоДнейВГоду*60*60*24-1;
КоличествоРабочихДней = 0;
ТекущаяДата = НачальнаяДата;
Пока ТекущаяДата <= КонечнаяДата Цикл
Если НЕ ДеньПраздничный(ТекущаяДата) Тогда
КоличествоРабочихДней = КоличествоРабочихДней + 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата+60*60*24;
КонецЦикла;
Сообщить (Формат(ТекущийГод, “ЧГ=0″)+” год – “+КоличествоРабочихДней+” рабочих дней.”);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ГодВисокосный(Год)
Возврат ((Год%4=0)И(Год%100<>0))ИЛИ(Год%400=0);
КонецФункции
&НаСервере
Функция ДеньПраздничный(Дата)
Если ДеньНедели(Дата)=6 ИЛИ ДеньНедели(Дата)=7 Тогда
Возврат Истина;
ИначеЕсли (День(Дата) = 1 И Месяц(Дата) = 1)
ИЛИ (День(Дата) = 23 И Месяц(Дата) = 2)
ИЛИ (День(Дата) = 8 И Месяц(Дата) = 3) Тогда
Возврат Истина;
Иначе
Возврат ложь;
КонецЕсли;
КонецФункции
</code>
Без отладке не было очевидно, что вот в этой строке НачальнаяДата+КоличествоДнейВГоду*60*60*24-1; надо -1 писать.
Функция ВычисленияРабочихДней() Экспорт Счетчик=0; год=2010; Пока Счетчик<>10 Цикл ПраздничныеНеВыходныеДни=?(ДеньНедели(Дата(Год, 1,1))<6,1,0) +?(ДеньНедели(Дата(Год,2,23))<6,1,0)+?(ДеньНедели(Дата(Год, 3,8))<6,1,0); ВисокосныйГод=(год%4)=0; КоличествоДнейВгоду=365+?(ВисокосныйГод, 1,0); Если (ДеньНедели(Дата(Год,1,1))>5) или (ДеньНедели(Дата(Год,1,1) )= 5 и ВисокосныйГод) Тогда ВыходныхДней=105; Иначе ВыходныхДней=104; КонецЕсли; КоличествоРабочихДнейВгоду=КоличествоДнейВгоду-ПраздничныеНеВыходныеДни-ВыходныхДней; Счетчик=Счетчик+1; сообщить(строка(Год) + “год -“+КоличествоРабочихДнейВгоду); Год=Год+1; КонецЦикла; КонецФункции // ВычисленияРабочихДней()
Новым было некоторые моменты в преобразовании типов,
Затруднения вызывают особенности платформы 8.2, управляемый интерфейс. Методом проб и ошибок преодолеваю их.
Подробнее хотелось бы рассмотреть принцип работы директив на клиенте и на сервере,
функция нечитаемая получилась. Результат такой
2 010год -258,
2 011год -258,
2 012год -259,
2 013год -259,
2 014год -260 и т.д.
>Подробнее хотелось бы рассмотреть принцип работы директив на клиенте и на сервере
Это будет сделано в первом блоке.
Сначала было в условии ТекДата<>Дата(Нач,1,1) – подсмотрел и сделал без одного условия.
А=2011;
Б=2021;
Для Нач=А по Б Цикл
РабДней = 0;
ТекДата = Дата(Нач,1,2);
Пока Год(ТекДата)=Нач Цикл
Если ДеньНедели(ТекДата)<6 и ТекДата<>Дата(Нач,2,23) и ТекДата<>Дата(Нач,3,8) Тогда
РабДней = РабДней +1;
КонецЕсли;
//86400 – количество секунд в сутках, то есть прибавляем к “ТекДата” один день.
ТекДата = ТекДата + 86400;
КонецЦикла;
Сообщить(Строка(Нач)+” – “+ РабДней + ” Рабочих Дней”);
КонецЦикла;
Результат:
2 021 – 258 Рабочих Дней
2 020 – 261 Рабочих Дней
2 019 – 259 Рабочих Дней
2 018 – 258 Рабочих Дней
2 017 – 258 Рабочих Дней
2 016 – 258 Рабочих Дней
2 015 – 259 Рабочих Дней
2 014 – 260 Рабочих Дней
2 013 – 259 Рабочих Дней
2 012 – 259 Рабочих Дней
2 011 – 258 Рабочих Дней
1. Узнал как подключиться к другому пользователю через конфигуратор, +- интересная тема, перемещение с помощью ctrl+[
2. Затруднений не было
3. В целом, все темы 0-го курса раскрыты. Интересные Дом. задания.
Ответы на вопросы.
1. «++», «+-». Как то неожиданно .
2. Затруднений пока не возникло.
3. Все разжевано. Если все темы дальше такие же – то супер.
Сначала определил текущую системную дату ДатаНачала = ТекущаяДата(). Затем, исходя из задания “за следующие 10 лет”, решил что выдавать нужно начиная с 2012 года.
Далее организую цикл по счетчику
Для Счетчик = 1 По 10 Цикл
ДатаНачала = КонецГода(ДатаНачала) + 1;
Сообщить(Формат(Год(ДатаНачала),”ЧГ=0″) + ” год – ” + ВычислитьКоличествоРабочихДней(ДатаНачала) + ” рабочих дней”);
КонецЦикла;
Код функции:
&НаКлиенте
Функция ВычислитьКоличествоРабочихДней(НачалоГода)
ТекущийГод = Год(НачалоГода);
_1января = ДеньГода(Дата(ТекущийГод, 1, 1));
_23Февраля = ДеньГода(Дата(ТекущийГод, 2, 23));
_8марта = ДеньГода(Дата(ТекущийГод, 3, 8));
КонецГода = КонецГода(НачалоГода);
КоличествоДнейВГоду = ДеньГода(КонецГода);
КоличествоРабочихДней = 0;
Для Счетчик = 1 По КоличествоДнейВГоду Цикл
Если (Счетчик = _1января) или (Счетчик = _23Февраля) или (Счетчик = _8марта) Тогда
Продолжить;
КонецЕсли;
ТекДата = НачалоГода + (Счетчик-1)*24*3600;
ТекДеньНедели = ДеньНедели(ТекДата);
Если (ТекДеньНедели = 6) или (ТекДеньНедели = 7) Тогда
Продолжить;
КонецЕсли;
КоличествоРабочихДней = КоличествоРабочихДней + 1;
КонецЦикла;
Возврат КоличествоРабочихДней;
КонецФункции // ВычислитьКоличествоРабочихДней()
Результат:
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
2021 год – 258 рабочих дней
До начала обучения, программировать на платформе 8.х не приходилось, хотя имеется некоторый опыт на 7.7.
С одной стороны все было знакомо и узнаваемо, однако встретились и такие моменты, которые стали откровением. Один из таких моментов – это “Сервисные средства по написанию кода”.
Например, форматирование текста, система закладок и навигации по модулю, циклу и т.п. Сколько раз приходилось искать нужную строку в коде.
Спрашивается, чего я столько лет без них делал?
Еще что поразило, так это то, что теперь пользователь сам может настраивать видимость, порядок расположения и группировку нужных ему реквизитов на форме.
Затруднений в изучении не возникло. Более подробно хотелось бы рассмотреть тему “Шаблоны текста”, а в частности создание собственных шаблонов.
>Затруднений в изучении не возникло. Более подробно хотелось бы рассмотреть тему «Шаблоны текста», а в частности создание собственных шаблонов.
Ок, рассмотрим в ближайшей мастер-группе.
Для ы=2010 по 2020 Цикл
Сообщить(Строка(ы) +”год – “+ РабочихДнейВГоду(ы) +” рабочих дней”);
КонецЦикла
Для ы=2010 по 2020 Цикл
Сообщить(Строка(ы) +”год – “+ РабочихДнейВГоду(ы) +” рабочих дней”);
—–РабочихДнейВГоду(ы)—–
Если (ДеньНедели(ТекДат) <> 6) И (ДеньНедели(ТекДат) <> 7) И (НЕ Выходной(ТекДат)) Тогда Счетчик = Счетчик +1;……..
ТекДат = ТекДат + 60*60*24;
—-Выходной(дат)—–
(ИначеЕсли (Месяц(дат) = 2) и (День(дат)=23) тогда Возврат Истина;
короче говоря сделал….
НачалоПериода = 2010;
Пока НачалоПериода <= 2020 Цикл
НачалоГода = Дата(Строка(Формат(НачалоПериода,”ЧГ=0″))+”0101″);
СчетчикРабочихДнейВГоду = 0;
КонецЭтогоГода = КонецГода(НачалоГода);
Пока НачалоГода <= КонецЭтогоГода Цикл
Если ДеньНедели(НачалоГода) = 6 или ДеньНедели(НачалоГода) = 7
или Дата(Строка(Формат(НачалоПериода,”ЧГ=0″))+”0223″) = НачалоГода
или Дата(Строка(Формат(НачалоПериода,”ЧГ=0″))+”0101″) = НачалоГода
или Дата(Строка(Формат(НачалоПериода,”ЧГ=0″))+”0308″) = НачалоГода тогда
Иначе
СчетчикРабочихДнейВГоду = СчетчикРабочихДнейВГоду + 1;
КонецЕсли;
НачалоГода = НачалоГода + 60*60*24;
КонецЦикла;
Сообщить(Строка(НачалоПериода)+ ” год – “+Строка(СчетчикРабочихДнейВГоду)+” рабочих дней”);
НачалоПериода = НачалоПериода + 1;
КонецЦикла;
2010 год – 258 рабочих дней
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
Идей простая – в году 365 или 366 дней. 364 дня это ровно 52недели, т.е. 52*5 рабочих дней, соответственно если последний день в году рабочий прибавляем 1, в високосном дополнительно если предпоследний рабочий то ещё +1. затем просто отнимаем кол-во праздничных дней выпавших на будни
<code>
Перем мПраздников;
&НаСервере
Функция Праздники(Год)
КоличествоПраздниковВБудни=0;
Для Каждого ДеньПраздника Из мПраздников Цикл
КоличествоПраздниковВБудни=КоличествоПраздниковВБудни+(ДеньНедели(Дата(Год,Месяц(ДеньПраздника),День(ДеньПраздника)))<6);
КонецЦикла;
Возврат КоличествоПраздниковВБудни;
КонецФункции // Праздники(Год)()
&НаСервере
Функция КоличествоРабочихДней(Год)
КонецГода=Дата(Год,12,31);
Возврат (260+(ДеньНедели(КонецГода)<6)+?(Год%4=0,ДеньНедели(КонецГода-86400)<6,0)-Праздники(Год));
КонецФункции // КолРабДней(Год)()
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Для год=2011 По 2020 Цикл
Сообщить(“”+Год+” – “+””+КоличествоРабочихДней(Год));
КонецЦикла;
КонецПроцедуры
мПраздников=Новый Массив;
мПраздников.Добавить(Дата(1,1,1));
мПраздников.Добавить(Дата(1,2,23));
мПраздников.Добавить(Дата(1,3,8));
</code>
1.навигация по условиям/циклам. Принципы приоритетов сложения операторов
2.затруднения скорее не в темах, а в общей моей загруженности работой – сложно находить время (всё таки отчетный период с сырой бух2.0). Пока спасает немногочисленность новых тем, но дальше, надеюсь, с личным временем станет лучше
3. блок “коротко о главном”, из программы курсов видно, что практически все темы позже рассматриваются подробнее. Там уже и надо будет решать о необходимости подробностей.
Решено. Перебирал по дням.
1. Особенности платформы 8.2, да вся информация была полезной. Не жалею о потраченном на изучение времени.
2. Мало опыта программирования, затруднения возникали при реализации задуманного.
3. Пока все интересно.
Для ИндексГода = 10 по 20 Цикл
ТекГод = “20”+ИндексГода;
Янв_1 = Дата(ТекГод+”0101″);
Февр_23 = Дата(ТекГод +”0223″);
Март_8 = Дата(ТекГод +”0308″);
ТекДата = КонецДня(Янв_1)+1;
СчРД = 0;
Пока ТекДата<КонецГода(Янв_1) Цикл
Если ДеньНедели(ТекДата)<6 и ТекДата <>Февр_23 и ТекДата<>Март_8 Тогда
СчРД = СчРД + 1;
КонецЕсли;
ТекДата = КонецДня(ТекДата)+1;
КонецЦикла;
Сообщить(ТекГод+” – “+СчРД+”рабочих дней”);
КонецЦикла;
1) новое было про параметры установки и запуска, все про командный интерфейс, про шаблоны.
2) таких тем в этом блоке не было.
3)считаю, что темы достаточно хорошо раскрыты.
<code>
Функция ПолучитьКоличествоПраздников(Год)
ПраздничныхДней = 0;
Праздники = Новый Массив;
Праздники.Добавить(Дата(Год,1,1)); // 1 января
Праздники.Добавить(Дата(Год,2,23)); // 23 февраля
Праздники.Добавить(Дата(Год,3,8)); // 8 марта
// праздники увеличивают нерабочие дни, если попадают на рабочей неделе
Для каждого Праздник Из Праздники Цикл
ДН = ДеньНедели(Праздник);
Если НЕ (ДН=6 ИЛИ ДН=7) Тогда // рабочий день -> увеличиваем праздники
ПраздничныхДней = ПраздничныхДней+1;
КонецЕсли;
КонецЦикла;
Возврат ПраздничныхДней
КонецФункции
Функция ПолучитьКоличествоРабочихДней(Год)
НачГода = Дата(Год,1,1);
КонГода = КонецГода(НачГода);
ВсегоДней = ДеньГода(КонГода);
ПолныхНедель = НеделяГода(КонГода);
РабочихДней = 0;
НерабочихДней = 0;
ДН1 = ДеньНедели(НачГода); // день недели первого числа года
ДН2 = ДеньНедели(КонГода); // день недели последнего числа года
// Анализ на полноту первой и последней недели
// Первая неделя не полная?
Если ДН1>1 Тогда
ПолныхНедель = ПолныхНедель-1;
Если ДН1<7 Тогда
НерабочихДней = НерабочихДней+2;
Иначе
НерабочихДней = НерабочихДней+1;
КонецЕсли;
КонецЕсли;
// Последняя неделя не полная?
Если (ДН2<7) Тогда
ПолныхНедель = ПолныхНедель-1;
Если (ДН2=6) Тогда
НерабочихДней = НерабочихДней+1;
КонецЕсли;
КонецЕсли;
//Добавим выходные в полных неделях
НерабочихДней = НерабочихДней + ПолныхНедель*2;
ПраздничныхДней = ПолучитьКоличествоПраздников(Год);
РабочихДней = ВсегоДней-НерабочихДней-ПраздничныхДней;
Возврат РабочихДней
КонецФункции
</code>
Выход:
2010 год – 258 рабочих дней
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
——
Комментарий по блоку:
1. Всё Ок. Для себя отметил про оптимизацию сложных условий с И ( уже использую в работе :) )
2. Затруднений не было.
3. Темы раскрыты итак очень подробно :) ДОбавить нечего.
//Посчитал дни по годам с помощью таблицы значений и свернул.
Т = Новый ТаблицаЗначений;
Т.Колонки.Добавить(“Год”,Новый ОписаниеТипов(“Строка”));
Т.Колонки.Добавить(“РабДень”,Новый ОписаниеТипов(“Число”));
Дат=’20100101′;
Пока Дат<‘20200101’ Цикл
//Вычислим, рабочий ли день
Если (ДеньНедели(Дат)>5) или
((Месяц(Дат)=2) и (День(Дат)=23)) или
((Месяц(Дат)=3) и (День(Дат)=8)) тогда
Иначе
НовСтр=Т.Добавить();
НовСтр.Год=Строка(Год(Дат));
НовСтр.РабДень=1;
КонецЕсли;
Дат=Дат+3600*24;
КонецЦикла;
Т.Свернуть(“Год”, “РабДень”);
Для Каждого ТекСтрока из Т Цикл
Сообщить(Строка(ТекСтрока.Год)+ “Год “+Строка(ТекСтрока.РабДень)+” рабочих дней”);
КонецЦикла;
По нулевому блоку ответы на вопросы:
1) Начала складываться система в голове по пройденному материалу, мне нравится методика изложения, и нового для меня немало, многих полезных вещей не замечал
2) Конткретных затруднений в изложенном материале пока нет, все излагается доходчиво, конечно, для закрепления неплохо было бы сборничек упражнений по каждой главе для самоконтроля с решениями, но и так все довольно здорово.
3) Нулевой блок раскрыт достаточно.
Создал внешнюю обработку. Создал команду и разместил кнопку команды на форме. Также разместил на форме поле флажка для выбора варианта: с переносом праздников или без.
В модуле формы реализовал процедуру обработки команды. Эта процедура использует две функии:
ПосчитатьКоличествоРабочихДнейВГоду(Год) – из названия понятно её назначение; параметр Год должен иметь тип Число; функция возвращает значение типа Число;
Рабочий(ТекущаяДата) – определяет является ли день рабочим; параметр ТекущаяДата должен иметь тип Дата; функция возвращает значение типа Булево.
Обработка выводит количество рабочих дней с учетом или без учета переноса праздничных дней (в зависимости от флажка на форме).
Использую глобальную переменную, имеющую тип Массив, в котором храню список праздников.
1. Было интересно узнать возможности управляемого интерфейса 8.2. Также познавательным был раздел по сервисным средствам написания кода.
2. Затруднений не было.
3. Таких тем нету.
сделал типа универсальный механизм.
но скорее всего он не оптимальный.
Процедура Команда1(Команда)
//выходные дни
НомераВыходныхДней = Новый Массив;
НомераВыходныхДней.Добавить(6);
НомераВыходныхДней.Добавить(7);
//праздники ММДД
Праздники = Новый Массив;
Праздники.Добавить(“01.01.”);
Праздники.Добавить(“23.02.”);
Праздники.Добавить(“08.03.”);
КоличествоЛет = 10;
ПосчитатьДни(НомераВыходныхДней, Праздники, КоличествоЛет);
КонецПроцедуры
Процедура Команда1(Команда) //выходные дни НомераВыходныхДней = Новый Массив; НомераВыходныхДней.Добавить(6); НомераВыходныхДней.Добавить(7); //праздники ММДД Праздники = Новый Массив; Праздники.Добавить(“01.01.”); Праздники.Добавить(“23.02.”); Праздники.Добавить(“08.03.”);
КоличествоЛет = 10;
ПосчитатьДни(НомераВыходныхДней, Праздники, КоличествоЛет);
КонецПроцедуры
Процедура ПосчитатьДни(Выходные, Праздники, КоличетвоЛет = 1)
КоличествоДнейВсего = 0;//будем считать дни
СекундВДне = 60*60*24;
Для А = 1 По КоличетвоЛет 1 Цикл
НачалоГода = НачалоГода(ТекущаяДата())+КоличествоДнейВсего*СекундВДне;
День = НачалоГода;
КоличествоДней = 0;
Пока Год(День) = Год(НачалоГода) Цикл
День = НачалоДня(День);
ДеньНедели = ДеньНедели(День);
КоличествоДнейВСего = КоличествоДнейВСего+1; //считаем всего дней
Если Выходные.Найти(ДеньНедели) <> Неопределено Тогда //если выходной, пропускаем
День = День+СекундВДне;
Продолжить;
КонецЕсли;
СтрокаДень = Сред(Строка(День),1,6); //если праздник, пропускаем
Если Праздники.Найти(СтрокаДень) <> Неопределено Тогда
День = День+СекундВДне;
Продолжить;//таким образом если праздник попадает на выходной день. то мы его учитываем как не рабочий
КонецЕсли;
День = День+СекундВДне;
КоличествоДней = КоличествоДней+1;
КонецЦикла;
Сообщить(Строка(Год(День-1))+” – дней “+КоличествоДней);
КонецЦикла;
КонецПроцедуры
Результат
2011 – дней 258
2012 – дней 259
2013 – дней 259
2014 – дней 260
2015 – дней 259
2016 – дней 258
2017 – дней 258
2018 – дней 258
2019 – дней 259
2020 – дней 261
Комментарий к блоку. До этого опыт работы на 1С 8.1 1 год, 8.2 пол года, и то не разработка, а так изучение
1. Нового узнал много. Все перечислить с трудом.
В основном касается типов данных, и архитектуры работы клиент-серверной базы. Параметры запуска ИБ на 8.2. Подробно про контексты выполнения модулей.
2. Затруднений пока не было.
3.Подробнее хотел бы раскрыть тему “Скорость получения отчетов”.
>Подробнее хотел бы раскрыть тему «Скорость получения отчетов».
Это не простая тема, отчасти мы будем ее касаться в базовом курсе.
Однако, более детально вопросы производительности рассматриваются в курсе продвинутом.
Выполнено. Так как праздников мало и 1 января можно исключить сразу, то коллекцию с праздниками не стал делать. Код процедуры:
<code>
Для Год=2011 по 2020 Цикл
РабочихДней=0;
ТекДата=Дата(Год,1,2); //сразу исключаем 1 января
Пока Год(ТекДата)=Год Цикл
Если ДеньНедели(ТекДата)<6 и ТекДата<>Дата(Год,2,23) и ТекДата<>Дата(Год,3,8) Тогда
РабочихДней=РабочихДней+1;
КонецЕсли;
ТекДата=ТекДата+86400;
КонецЦикла;
Сообщить(Строка(Год)+” – “+РабочихДней+” рабочих дней”);
КонецЦикла;
</code>
Результат:
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 рабочих дней
2 020 – 261 рабочих дней
По поводу 0-го блока. Т.к. еще до курса у меня был некоторый контакт с платформой 8.2, то материал в основном знакомый, трудностей освоения не было. Так как основные темы, которых коснулись в 0-вом блоке будут, я думаю, рассмотреных более подробно в следующих блоках, то каких-то дополнительных мастер-групп не требуется.
Немного подумав, написал сделал решение без цикла по дням года. В последних 364 днях года всегда 260 раб. дней (без учета праздников), 1 янв. всегда выходной, может добавиться еще 1 день, если год високосный и 2 янв. не выходной. Ну и надо отнять 23 фев. и 8 марта, если они не приходятся на выходные.
<code>
Для Год=2011 По 2020 Цикл
Если День(КонецМесяца(Дата(Год,2,1)))=29 и ДеньНедели(Дата(Год,1,2))<6 Тогда
РабочихДней=261;
Иначе
РабочихДней=260;
КонецЕсли;
Если ДеньНедели(Дата(Год,2,23))<6 Тогда
РабочихДней=РабочихДней-1;
КонецЕсли;
Если ДеньНедели(Дата(Год,3,8))<6 Тогда
РабочихДней=РабочихДней-1;
КонецЕсли;
Сообщить(Формат(Год,”ЧГ=0″)+” – “+РабочихДней+” рабочих дней”);
КонецЦикла;
</code>
Результат совпал с предыдущим решением.
Очень много полезного для себя вынесла. В книгах обычно читаешь то, что нужно сейчас и срочно, а здесь все в очень доступной и интересной форме с кучей примеров.
Трудности возникли по второму заданию из ДЗ2 и судя по комментам не у меня одной – может более раскрыть эту тему.
Мастер-классы пока не смотрю, т.к. информации много нужно просмотреть и попробывать из основного блока.
<code>
Процедура Тест(Команда)
НачГод=Год(ТекущаяДата());
КонГод=НачГод+10;
Для сч=НачГод по КонГод Цикл
НачДата=Дата(сч,1,1);
КонДата=Дата(сч,12,31);
РабДень=0;
ТекДень=НачДата;
Пока ТекДень <= КонДата Цикл
Если ДеньНедели(ТекДень)>5 Тогда
ИначеЕсли ТекДень=Дата(сч,1,1) или ТекДень=Дата(сч,02,23) или ТекДень=Дата(сч,03,08) Тогда
Иначе
РабДень=РабДень+1;
КонецЕсли;
ТекДень=ТекДень+86400;
КонецЦикла;
Сообщить(“Год: “+сч+” – “+РабДень+” дней”);
КонецЦикла;
КонецПроцедуры
</code>
Получилось:
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
2021 год – 258 рабочих дней
<code>
Для Год = 2011 по 2020 Цикл
ГодВисокосный = 29 = День(КонецМесяца(Дата(Год,2,1)));
Работаем2гоЯнв = 6 > ДеньНедели(Дата(Год,1,2));
ДопРабДень = ?(ГодВисокосный,Число(Работаем2гоЯнв ),0);
ЧислоДней = 260 + ДопРабДень –
Число(ДеньНедели(Дата(Год,2,23))<6) –
Число(ДеньНедели(Дата(Год,3,8))<6);
Сообщить (“” + Год+” год – “+ЧислоДней + ” рабочих дней”);
КонецЦикла;
<code>
задание сделал
использую первый цикл по годам – с 2010 по 2020 год, в нем определяю дату начала года: НачалоГода = Дата(Год, 1, 1).
во вложенном цикле перебираю все даты этого года, прибавляя к ТекущейДате один день, т.е. 24*60*60. Для каждой даты года с помощью функций ДеньНедели определяю, суббота это или воскресенье а также с помощью фун-й День и Месяц анализирую является ли эта дата праздником (например, 23 февраля: День(ТекДата)=23 И Месяц(ТекДата) = 2).
если не СБ, не ВС, не праздник, увеличиваю КолРабочихДней на один.
в нулевом блоке очень интересная тема, как 1 разделить на 3, потом снова умножить на 3, чтобы получилась снова единица.
узнал, как подключиться отладчиком к любому пользователю.
затруднений вроде не было.
хотелось бы подробнее рассмотреть про исполняемые файлы – про все особенности и события, которые происходят, когда запускается общая программа запуска, когда интерактивная, когда тонкий и толстый клиент…
упс… почитал другие комментарии, кол. рабочих дней не со всеми совпало
привожу свой вариант:
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 рабочих дней
2 020 год – 261 рабочих дней
Задание выполнил.
_______________________________________
Цикл<code>
Пока ТекДата <> Дата(‘20211231’) Цикл
ТекДата = ТекДата + 86400; КонецЦикла; </code>
Фильтр внутри цикла <code>
ЭтоНеПраздник = 0 = Найти(“01.01;23.02;08.03”, Лев(ТекДата,5));
ЭтоНеВыходной = 6 > ДеньНедели(ТекДата);
Если ЭтоНеПраздник И ЭтоНеВыходной Тогда
ЧислоДней = ЧислоДней +1; КонецЕсли;</code>
Группировка внутри цикла<code>
Если ТекДата = НачалоДня(КонецГода(ТекДата)) Тогда
Сообщить (“” + Год(ТекДата)+” год – “+ЧислоДней + ” рабочих дней”); ЧислоДней = 0; КонецЕсли;</code>
______________________________________________
Изменился мой подход к работе в 1С, благодаря тому, что появилось абсолютно точное понимание некоторых весьма тонких нюансов. Огромное Вам спасибо за это!
Первое задание, вероятно, самое интересное и трудное. Тем более красивым оказалось то решение, которое Вы нам показали.
Правила, способы и инструментарий для быстрого написания кода. Более детально, более подробно и полно.
Без цикла по дням года:
<code>
&НаСервереБезКонтекста
Функция УчитыватьПраздник(датаПраздника)
Возврат ?(ДеньНедели(датаПраздника) < 6, 1, 0);
КонецФункции
&НаСервереБезКонтекста
Функция КоличествоРабочихДней1(год)
январь1 = Дата(год, 1, 1);
февраль23 = Дата(год, 2, 23);
март8 = Дата(год, 3, 8);
началоГода = Дата(год, 1, 1);
Если ДеньНедели(НачалоГода) < 6 Тогда
рабДнейВПервойНеделе = 5 – ДеньНедели(началоГода) + 1;
Иначе
рабДнейВПервойНеделе = 0;
КонецЕсли;
конецГода = КонецГода(началоГода);
рабДнейВПоследнейНеделе = Мин(5, ДеньНедели(конецГода));
колПолныхНедель = (НачалоДня(НачалоНедели(конецГода)-1) – (КонецНедели(началоГода) + 1) + 24*3600) / (24 * 3600 * 7);
колРабДней = рабДнейВПервойНеделе + колПолныхНедель * 5 + рабДнейВПоследнейНеделе;
колРабДней = колРабДней – УчитыватьПраздник(январь1) – УчитыватьПраздник(февраль23) – УчитыватьПраздник(март8);
Возврат колРабДней;
КонецФункции
&НаКлиенте
Процедура ВычислениеРабочихДней(Команда)
Для год = 2011 По 2020 Цикл
Сообщить(Строка(год) + ” год – ” + КоличествоРабочихДней(год));
КонецЦикла;
КонецПроцедуры
</code>
1. Данное обучение – эффективный метод узнать о приемах работы, которые не всегда удобно находить в книгах. Кстати, не подскажите как сделать чтобы окно с сообщениями об ошибках при синтаксическом контроле автоматически очищалось.
2, 3. Пока таких тем нет.
>при синтаксическом контроле автоматически очищалось.
К сожалению, такой опции нет.
Сам использую Ctrl+Shift+Z & Ctrl+F7.
Можно использовать Ctrl+Alt+Z & Ctrl+F7.
Ответы на вопросы:
1. Поведение системы при операциях “++” или “+-“.
2. Особых затруднений не было.
3.Для 0-го блока , информации достаточно.
Задание выполнено.
Решил , первым способом который пришел в голову, обходом дней года в цикле и сравнении со значениями праздников в массиве и номерами дней недели, исключая выходные и праздничные дни.
<code>
&НаКлиенте
Функция КоличествоРабочихДней(Год)
МассивПраздничныхДней = Новый Массив;
МассивПраздничныхДней.Добавить(Дата(Год,1,1));
МассивПраздничныхДней.Добавить(Дата(Год,2,23));
МассивПраздничныхДней.Добавить(Дата(Год,3,8));
ДеньКоличествоСекунд = 60*60*24;
ПервыйДеньГода = Дата(Год,01,01);
НачалоГодаЗначение = НачалоГода(ПервыйДеньГода);
КонецГодаЗначение = КонецГода(ПервыйДеньГода);
КоличествоДнейВсего = (КонецГодаЗначение – НачалоГодаЗначение)/ДеньКоличествоСекунд;
КоличествоДнейРабочих = 0;
Для День = 1 По КоличествоДнейВсего Цикл
ТекущийДень = ПервыйДеньГода + ДеньКоличествоСекунд*День;
Если ДеньНедели(ТекущийДень) > 5
или МассивПраздничныхДней.Найти(ТекущийДень) <> Неопределено Тогда
Продолжить;
КонецЕсли;
КоличествоДнейРабочих = КоличествоДнейРабочих + 1;
КонецЦикла;
Возврат КоличествоДнейРабочих;
КонецФункции
</code>
а если высокосный год тогда КоличествоДнейВсего = 365 все равно
угу , ошибку заметил, исправил , спасибо
При решении ДЗ использовал 3 цикла, по годам, по месяцам, по количеству дней в месяце и функции
День(КонецМесяца(Дата(ТекГод, ТекМесяц, 1, 0, 0, 0))) количество дней в месяце
ДеньНедели(Дата(ТекГод, ТекМесяц, ТекДень, 0, 0, 0))
Решение влоб (оганичен во времени) думаю изящество будет в решении)
1. Оператор присваивания “=”, заинтересовал(непривычно). Разделение контекста на клиенте и на сервере, Параметры командной строки, управляемый интерфейс.
2. Оператор присваивания “=”, практика с ним в табло или в отладчике помогла , помогает и будет помогать.
3. Параметры командной строки хотелось бы глубже.
результат:
2011 год – 258 дней в году
2012 год – 259 дней в году
2013 год – 259 дней в году
2014 год – 260 дней в году
2015 год – 259 дней в году
2016 год – 258 дней в году
2017 год – 258 дней в году
2018 год – 258 дней в году
2019 год – 259 дней в году
2020 год – 261 дней в году
2021 год – 258 дней в году
Уточню 3 вопрос: Тема “Список информационных баз” подтема “Пвраметры ИБ”, пункт ключи командной строки – “Дополнительные параметры запуска” где можно просмотреть список всех ключей?, или это будет долше в курсе?
Далее о ключах будем говорить в курсе продвинутом.
Все ключи можно просмотреть:
Открываете справку в конфигураторе, содержание справки. Раздел “Запуск 1С:Предприятие 8 и параметры запуска”, глава “Общие параметры запуска”.
Я надеюсь этот вариант будет работать правильно лет 100 (то что годы кратные 100 и 400 – не високосные я не учитывал), если я нигде не ошибся. Если год не високосный, то 52 недели плюс один “двойной” доп.день, определяемый по первому дню года, если год високосный – то таких дня два – первый и второй. Очень любопытно, какие будут решения.
Большое спасибо за “разминку”. И нового узнал много и систематизировал, повторил много и ДЗ прикольные. Пока все более или менее понятно. Интересно было бы узнать о процессе инсталляции по линукс, понять что работает, а что не работает на web клиентах.
Для Год=2010 по 2020 Цикл
Сообщить (Строка(Год) + ” – ” + Строка(КолДней(Год)) );
КонецЦикла;
Функция КолДней( Год )
Возврат( 52*5 +
Число(Не Булево(Окр(ДеньНедели(НачалоГода( Дата(Год,1,1) ))/6,0) )) +
Число(Не Булево(Окр(ДеньНедели(НачалоГода( Дата(Год,1,1)+1 ))/6,0) ))*Число((Не Булево(Год%4))) –
Окр(ДеньНедели( Дата(Год,1,1)+1 ) /6,0) –
Окр(ДеньНедели( Дата(Год,2,23)+1 ) /6,0) –
Окр(ДеньНедели( Дата(Год,3,8)+1 ) /6,0)
);
КонецФункции
>Интересно было бы узнать о процессе инсталляции по линукс
Эту тему мы не затрагиваем, ни в базовом, ни в продвинутом.
Но пожелание записали.
&НаКлиенте
Процедура ЗаполнитьКалендарь(Команда)
НачГода = НачалоГода(ТекущаяДата());
Выходных = 0;
Для у = 0 по 9 цикл
Год = Дата(Год(НачГода)+у,1,1);
КалДней = ДеньГода(КонецГода(Год));
ДатаГода = НачалоДня(НачалоГода(Год))-86400;// 24*3600
Для К = 1 По КалДней Цикл // подсчитаем выходные
ДатаГода = ДатаГода + 86400;
ДеньНед = ДеньНедели(ДатаГода);
Если ДеньНед > 5 тогда
Выходных = Выходных + 1;
КонецЕсли;
КонецЦикла;
РабочихДней = КалДней-Выходных-3;//3 это – 1 января,23 февраля,8 марта;
Сообщить (Строка(Год(Год))+” год – “+Строка(РабочихДней) + ” Рабочих дней”);
РабочихДней = 0;
КалДней = 0;
Выходных =0;
КонецЦикла;
КонецПроцедуры
&НаКлиентеПроцедура ЗаполнитьКалендарь(Команда) НачГода = НачалоГода(ТекущаяДата()); Выходных = 0; Для у = 0 по 9 цикл Год = Дата(Год(НачГода)+у,1,1); КалДней = ДеньГода(КонецГода(Год)); ДатаГода = НачалоДня(НачалоГода(Год))-86400;// 24*3600 Для К = 1 По КалДней Цикл // подсчитаем выходные ДатаГода = ДатаГода + 86400; ДеньНед = ДеньНедели(ДатаГода); Если ДеньНед > 5 тогда Выходных = Выходных + 1; КонецЕсли; КонецЦикла; РабочихДней = КалДней-Выходных-3;//3 это – 1 января,23 февраля,8 марта; Сообщить (Строка(Год(Год))+” год – “+Строка(РабочихДней) + ” Рабочих дней”); РабочихДней = 0; КалДней = 0; Выходных =0; КонецЦикла; КонецПроцедуры
Все ОК.
<code>
Функция НачалоГодаСУчетомЛокализации(ДатаИзГода, ОбластьЛокализации = “ru”)
ДатаначалаГода = НачалоГода(ДатаИзГода);
Возврат(ДатаначалаГода);
КонецФункции
Функция ЕстьДеньНеделиВИнтервалеНомеров(НачНомерИнтервала, КонНомерИнтервала, НомерДняНедели)
ТекРезультат = ?((НачНомерИнтервала <= НомерДняНедели) И (НомерДняНедели <= КонНомерИнтервала), 1, 0);
Возврат (ТекРезультат);
КонецФункции
Функция КоличествоВыходныхВИнтервале(НачНомерИнтервала, КонНомерИнтервала, ОбластьЛокализации = “ru”)
ТекРезультат = 0;
Если ОбластьЛокализации = “ru” Тогда
ТекРезультат = ЕстьДеньНеделиВИнтервалеНомеров(НачНомерИнтервала, КонНомерИнтервала, 6)
+ ЕстьДеньНеделиВИнтервалеНомеров(НачНомерИнтервала, КонНомерИнтервала, 7);
КонецЕсли;
Возврат(ТекРезультат);
КонецФункции
Функция МассивПраздничныхДнейГода(НомерГода, ОбластьЛокализации = “ru”)
МассПраздничныеДни = Новый Массив;
Если ОбластьЛокализации = “ru” Тогда
МассПраздничныеДни.Добавить(Дата(НомерГода,1,1));
МассПраздничныеДни.Добавить(Дата(НомерГода,2,23));
МассПраздничныеДни.Добавить(Дата(НомерГода,3,8));
КонецЕсли;
Возврат (МассПраздничныеДни);
КонецФункции
Функция КоличествоПраздничныхДнейВРабочиеДниНедели(НомерГода, ОбластьЛокализации = “ru”)
ТекРезультат = 0;
МассПраздничныхДней = МассивПраздничныхДнейГода(НомерГода, ОбластьЛокализации);
Для каждого Эл Из МассПраздничныхДней Цикл
// например принятая последовательность дней недели других областях локализации может отличаться
// sunday, monday, …
// поэтому явно выделена область локализации
Если ОбластьЛокализации = “ru” Тогда
ТекРезультат = ТекРезультат + ?(ДеньНедели(Эл) < 6, 1, 0);
КонецЕсли;
КонецЦикла;
Возврат(ТекРезультат);
КонецФункции
Функция КоличествоРабочихДнейВГоду(ДатаИзГода, ОбластьЛокализации = “ru”)
Попытка
ДатаНачалаГода = НачалоГодаСУчетомЛокализации(ДатаИзГода, ОбластьЛокализации);
Исключение
Возврат (Неопределено);
КонецПопытки;
НомерГода= Год(ДатаНачалаГода);
ЧислоКалендарныхДнейВГоду = ?((НомерГода % 4) = 0, 366, 365);
КоличествоПолныхНедельныхЦиклов = Цел(ЧислоКалендарныхДнейВГоду / 7);
//вычислим количество не рабочих дней в полных недельных циклах года без учета праздников
НеРабочихДнейВПолныхНедельныхЦикловБезУчетаПраздников = КоличествоПолныхНедельныхЦиклов * 2;
// вычислим количество не рабочих дней в неполном недельном цикле года без учета праздников
КоличествоДнейВНеПолномНедельномЦикле = ЧислоКалендарныхДнейВГоду – КоличествоПолныхНедельныхЦиклов*7;
НачНомерИнтервала = ДеньНедели(ДатаНачалаГода);
КонНомерИнтервала = НачНомерИнтервала + КоличествоДнейВНеПолномНедельномЦикле – 1;
НеРабочихДнейВНеПолномНедельномЦиклеБезУчетаПраздников = КоличествоВыходныхВИнтервале(НачНомерИнтервала, КонНомерИнтервала, ОбластьЛокализации);
// количество дней праздников учитываемых отдельно по условиям задачи
КоличествоПраздничныхДнейКВычету = КоличествоПраздничныхДнейВРабочиеДниНедели(НомерГода, ОбластьЛокализации);
// итого
ВсегоНеРабочихДней = НеРабочихДнейВПолныхНедельныхЦикловБезУчетаПраздников
+ НеРабочихДнейВНеПолномНедельномЦиклеБезУчетаПраздников
+ КоличествоПраздничныхДнейКВычету;
ВсегоРабочихДней = ЧислоКалендарныхДнейВГоду – ВсегоНеРабочихДней;
Возврат(ВсегоРабочихДней);
КонецФункции
&НаКлиенте
Процедура КоличествоДнейвГоду(Команда)
Для НомерГода = 2010 По 2015 Цикл
Сообщить(“” + СтрЗаменить(НомерГода, Символы.НПП, “”) + ” год – ” + КоличествоРабочихДнейВГоду(Дата(НомерГода,1,1)) + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
</code>
Решено. На самом деле все просто :)
&НаКлиенте
Процедура ВычислитьРабочиеДни(Команда)
//1 января 2011 года это вторник, 2-й день недели
День01012011 = 2;
Поправка = 0;
Для Год=2011 По 2020 Цикл
//вычислить высокосный год
КолДней = ?(Год/4 = Окр(Год/4,0),366,365);
//1 января текущего года это Х день недели
День0101ТекГод = День01012011+Поправка;
//вычислить кол-во недель
КолНедель = (КолДней-7+День0101ТекГод)/7+1;
//вычислить на какой день приходится праздничный день
КолПраздничных=?(ДеньНедели(Дата(Год,1,1))<6,1,0); //1 января
КолПраздничных=КолПраздничных+?(ДеньНедели(Дата(Год,2,23))<6,1,0); //23 февраля
КолПраздничных=КолПраздничных+?(ДеньНедели(Дата(Год,3,8))<6,1,0); //8 марта
//вычислить общее кол-во рабочих дней
КолВыходных = КолДней-КолНедель*2-КолПраздничных;
Сообщить(Строка(Год)+” год – “+Окр(КолВыходных,0)+” рабочих дней”);
//52 недели это 364 дня, соответственно из года в год
//неделя смещается на 1 день или 2 дня в высокостном году
Поправка = Поправка+?(КолДней=365,1,2);
Поправка = ?(Поправка=7,0,Поправка);
КонецЦикла;
КонецПроцедуры
:) можно еще сократить (кроме того в предыдущем коде где-то есть ошибка):
//1 января 2011 года это вторник, 2-й день недели
Для Год=2011 По 2020 Цикл
//вычислить высокосный год
КолДней = ?(Год/4 = Окр(Год/4,0),366,365);
//1 января текущего года это Х день недели
День0101ТекГод = ДеньНедели(Дата(Год,1,1));
//вычислить на какой день приходится праздничный день
КолПраздничных=?(ДеньНедели(Дата(Год,1,1))<6,1,0); //1 января
КолПраздничных=КолПраздничных+?(ДеньНедели(Дата(Год,2,23))<6,1,0); //23 февраля
КолПраздничных=КолПраздничных+?(ДеньНедели(Дата(Год,3,8))<6,1,0); //8 марта
//вычислить общее кол-во рабочих дней
КолВыходных = КолДней-52*2-КолПраздничных-?(День0101ТекГод>5,1,0)-?(КолДней=365,0,?(ДеньНедели(Дата(Год,1,2))>5,1,0));
Сообщить(Строка(Год)+” год – “+Окр(КолВыходных,0)+” рабочих дней”);
КонецЦикла;
Суть вот в чем: в году 52 полных недели (364 дня) плюс один или два (в высокостном году) дня. Соответственно за 52 недели у нас получается 52*2 дня выходных плюс нужно выяснить какие дни 365-й и 366-й и сколько праздничных дней попадают не на выходные.
Итог:
2011 год – 258 рабочих дней
2012 год – 258 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 259 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
И еще: в задании для 2012 года указано 259 дней, на самом деле 258.
Интересно, а у других участников какое количество рабочих дней получилось?
Да, извиняюсь, 259, год высокосный :)
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
В следующий раз буду внимательнее и лучше проверять (скопировался текст из предыдущей неправильной обработки)
а что бы народ не путать можно почистить ветку от моих сообщений?
Ничего страшного в ошибке нет, тем более уже разобрались.
Кто не ошибается, то не достигает результата ;)
Ок
259 считая с днем конца света, с одной стороны последний день считается рабочим :)
:)
Ответы на вопросы:
1. единственное пожалуй это передвижение по условию и циклу с помощью горячих клавишь.
2. не было.
3. ничего.
1 января 2011 года это суббота
<code>&НаКлиенте
Функция ЭтоНерабочийДень(Дата)
Если ДеньНедели(Дата) = 6 или ДеньНедели(Дата) = 7 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
&НаКлиенте
Функция ЭтоПраздник(Дата)
Если (День(Дата) = 1 и Месяц(Дата) = 1)
или (День(Дата) = 23 и Месяц(Дата) = 2)
или (День(Дата) = 8 и Месяц(Дата) = 3) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции // Праздник()
&НаКлиенте
Функция КоличествоРабочихДней(Год)
ТекущаяДата = Дата(Год,1,1);
КоличествоРабочихДней=0;
Пока Год(ТекущаяДата) <> Год+1 Цикл
Если НЕ (ЭтоНерабочийДень(ТекущаяДата) или ЭтоПраздник(ТекущаяДата)) Тогда
КоличествоРабочихДней = КоличествоРабочихДней+1;
КонецЕсли;
ТекущаяДата = КонецДня(ТекущаяДата)+1;
КонецЦикла;
Возврат КоличествоРабочихДней;
КонецФункции // КоличествоРабочихДней()
&НаКлиенте
Процедура Рассчитать(Команда)
Год = НачальныйГод;
Для гг=Год по Год+10 Цикл
Сообщить(СокрЛП(гг)+” год – “+СокрЛП(КоличествоРабочихДней(гг))+” рабочих дней”);
КонецЦикла;
КонецПроцедуры</code>
1. Новые темы для меня были:
* Параметры информационной базы
* Настройки запуска 1С:Предприятия
* Механизм оповещений в платформе 1С 8.2
* Использование шаблонов в конфигураторе при написании кода, в частности, комбинация клавиш Ctrl+Q.
* почти все, что касается управляемого интерфейса
2. Пока особых затруднений не возникало
3. На мой взгляд, все темы нулевого блока раскрыты. Есть интересующие меня темы, но они выходят за рамки нулевого блока.
Создал форму, на ней два реквизита
первый год
последний год
и действие в виде кнопки
Два события
При создании записывает два года.
</code>
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭтаФорма.ПервыйГод = 2000;
ЭтаФорма.ПоследнийГод = 2020;
КонецПроцедуры
</code>
При нажатии на кнопку:
1. проверяет год, от 1 до 3000
2. меняет местами, если обратный порядок годов
3. считает количество дне без учета 3 праздников.
<code>
&НаКлиенте
Процедура РабочиеДни(Команда);
ПервыйГод = ЭтаФорма.ПервыйГод;
ПоследнийГод = ЭтаФорма.ПоследнийГод;
Если ПервыйГод < 1 Тогда
ПервыйГод = 1;
КонецЕсли;
Если ПервыйГод > 3000 Тогда
ПервыйГод = 3000;
КонецЕсли;
Если ПоследнийГод < 1 Тогда
ПоследнийГод = 1;
КонецЕсли;
Если ПоследнийГод > 3000 Тогда
ПоследнийГод = 3000;
КонецЕсли;
Если ПервыйГод > ПоследнийГод Тогда
ПервыйГод = ПервыйГод + ПоследнийГод;
ПоследнийГод = ПервыйГод – ПоследнийГод;
ПервыйГод = ПервыйГод – ПоследнийГод;
КонецЕсли;
Для Год = ПервыйГод По ПоследнийГод Цикл
НачалоГода = Дата(Год, 1, 1);
КонецГода = КонецГода(НачалоГода);
День = НачалоГода;
КоличествоДней = 0;
Пока День < КонецГода Цикл
У1 = ДеньНедели(День) < 6;
У2 = НачалоДня(День) <> Дата(Год, 1, 1);
У3 = НачалоДня(День) <> Дата(Год, 2, 23);
У4 = НачалоДня(День) <> Дата(Год, 3, 8);
Условие = У1 и У2 и У3 и У4;
Если Условие Тогда
КоличествоДней = КоличествоДней + 1;
КонецЕсли;
День = КонецДня(День) + 1;
КонецЦикла;
Сообщить(Строка(Год) + ” год – ” + Строка(КоличествоДней) + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
</code>
ВнешняяОбработка
https://www.dropbox.com/s/83drafna836y0sc/HomeWork03.epf
Теперь немного о вопросах во второй части задания,..
1. С условием того, что я минимально владел 1С, я узнал много нового…
2. Затруднений особых не было, все достаточно просто объясняется…
Если что-то непонятно, повторный просмотр решает проблему.
3. Я вот думаю не помешало бы побольше раскрыть 13 главу.
Я как начинающий особо не знаю о горячих клавишах, да и не помешало бы рассказать как эффективно пользоваться с синтаксис помощником.
Решение ДЗ-3:
<code>
&НаКлиенте
Процедура ВыполнитьДЗ (Команда)
Год = Год(ТекущаяДата());
// Цикл по кол-ву лет
Для й = Год По (Год + 10) Цикл
Янв1 = Дата(Формат(й, “ЧГ=0”) + “0101”);
Фев23 = Дата(Формат(й, “ЧГ=0”) + “0223”);
Мар8 = Дата(Формат(й, “ЧГ=0”) + “0308”);
КолвоРабДней = 0;
Дата = КонецДня(Янв1) + 1;
// Цикл по кол-ву дней в году
Пока ДеньГода(Дата) <> 1 Цикл
// Проверяем на суб., воскр. и праздники
Если (ДеньНедели(Дата) <> 6) И (ДеньНедели(Дата) <> 7) И (Дата <> Фев23) И (Дата <> Мар8) Тогда
КолвоРабДней = КолвоРабДней + 1;
КонецЕсли;
Дата = КонецДня(Дата) + 1;
КонецЦикла;
Сообщить(Формат(й, “ЧГ=0″) + ” год – ” + КолвоРабДней + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Нулевой блок был для меня закреплением и повторением того, что уже я знал.
Затруднений не было, но были интересные моменты. Так, мне понравились задачи с логическими операторами, что заставило вспомнить оператор XOR, и операции со строками “++”, которые раньше я не использовал.
1.В году 365 (366) дней или 52 полные недели и еще 1 (2) день. За 52 недели без учета праздников набирается 52*5=260 рабочих дней.
2. Учтем дополнительные дни (2 для високосного года и 1 для обычного). Будем считать их с начала года(1,2 января).Если эти дни выпадают на понедельник-пятницу, то добавим их к рабочим дням.
3.Отдельно учтем праздники. Если они выпадают на понедельник-пятницу, то количество рабочих дней уменьшается.(Так как 1 января праздничный день и мы решили считать его дополнительным, то проверку на него можно убрать из пунктов 2 и 3)
4.В итоге получим функцию:
Функция ЧислоРабочихДнейВГоду(Год)//год как число
КолРабДней=260;
Если ГодВисокосный(Год) Тогда
Дата=Дата(Год,1,2);//2 января
Если ДеньНедели(Дата)<6 Тогда
КолРабДней=КолРабДней+1;
КонецЕсли;
КонецЕсли;
Дата=Дата(Год,2,23);//23 февраля
Если ДеньНедели(Дата)<6 Тогда
КолРабДней=КолРабДней-1;
КонецЕсли;
Дата=Дата(Год,3,8);//8 марта
Если ДеньНедели(Дата)<6 Тогда
КолРабДней=КолРабДней-1;
КонецЕсли;
Возврат КолРабДней;
КонецФункции
5.Вызовем эту функцию в цикле:
Для Год=2011 По 2020 Цикл
Сообщить(“В “+Год+” году “+ЧислоРабочихДнейВГоду(Год)+” рабочих дней”);
КонецЦикла;
6.Возникшие проблемы:
-я не знаю встроенной функции для определения високосного года(пришлось написать самому)
-так как год это число то он выводится с разделением по разрядам ( 2 011), как можно избавится от лишнего пробела
PS В ДЗ вы просили оставить обратную связь по 0 блоку.Куда ее отправляь ?
>я не знаю встроенной функции для определения високосного года
Такой функции действительно нет.
>так как год это число то он выводится с разделением по разрядам ( 2 011), как можно избавится от лишнего пробела
Можете посмотреть описание для функции глобального контекста Формат()
>В ДЗ вы просили оставить обратную связь по 0 блоку.Куда ее отправляь ?
Прям в этой записи. Отдельным комментарием.
<code>
&НаКлиенте
Процедура Команда1(Команда)
Для Счетчик = 2010 По 2019 Цикл
сообщить(Строка(Счетчик)+” год – ” + ПолучитьКоличествоРабочихДнейВГоду(Счетчик)+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
//
//
&НаСервереБезКонтекста
Функция ПолучитьКоличествоРабочихДнейВГоду(НомерГода)
//Число рабочих дней в году без первой недели января
// и последней недели декабря (51 неделя)
БазовоеКоличествоРабочихДней = 51*5;
//Число рабочих дней в первую неделю января
// с учетом что 1 января праздник
НомерДняНеделиДля02Января = ДеньНедели(Дата(НомерГода,1,2));
КоличествоРабочихДнейВПервойНеделеГода = Макс(0,(6-НомерДняНеделиДля02Января));
НомерДняНеделиДля31Декабря = ДеньНедели(Дата(НомерГода,12,31));
КоличествоРабочихДнейВПоследнейНеделеГода = Мин(5,НомерДняНеделиДля31Декабря);
КоличествоРабочихДней = БазовоеКоличествоРабочихДней + КоличествоРабочихДнейВПервойНеделеГода+КоличествоРабочихДнейВПоследнейНеделеГода;
НомерДняНеделиДля23Февраля = ДеньНедели(Дата(НомерГода,02,23));
КоличествоРабочихДней = КоличествоРабочихДней – ?(НомерДняНеделиДля23Февраля>5,0,1);
НомерДняНеделиДля8Марта = ДеньНедели(Дата(НомерГода,03,8));
КоличествоРабочихДней = КоличествоРабочихДней – ?(НомерДняНеделиДля8Марта>5,0,1);
Возврат КоличествоРабочихДней;
КонецФункции
</code>
Ответы на дополнительные вопросы.
1. Новое – множество мелочей из раздела сервисных средств при написании , которые в силу технологии нельзя передать в книге.
2. Наибольшие затруднения как и при изучении любой новой дисциплины в силу нетерпеливоси вызывает раздел Вступление, который всегда хочется перемотать и заглянуть, что же там в конце. Преодолеть помогло желание все же перейти на платформу 8.2 после двух лет попыток самостоятельного изучения не как обычно квадратно-гнездовым методом (то знаю – это не читал), а как то более систематизировано и фундаментально и желание преодолеть страх перед сменой 7.7 на 8.x
3. Выбор тем в нулевом блоке не большой – поэтому либо сервис, либо встроенные язык либо типы данных
Процедура ПередНачаломРаботыСистемы(Отказ)
Год = 2011;
ДниВГоду = ДеньГода(Дата(Год,12,31));
КолНед = Цел(ДниВГоду/7);
НеРаб = КолНед*2;
НеОбр = ДниВГоду%7;
Итог = ДниВГоду-НеРаб+НеОбр;
Праз1 = Дата(Год, 1, 1);
Праз2 = Дата(Год, 2, 23);
Праз3 = Дата(Год, 3, 8);
Итог = Итог – Праздники(Праз1) – Праздники(Праз2) – Праздники(Праз3);
Сообщить(Строка(Год) + ” год – “+Итог+” рабочих дней”);
КонецПроцедуры
Функция Праздники(Праз)
Если ДеньНедели(Праз)<=5 Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции // Праздники()
Определить количество недели с помощью НеделяГода() не получилось:
КолНед = НеделяГода(Дата(Год,12,31));
Возможно ли разместить праздники в одну массив и потом с помощью foreach (Для каждого) использовать? Я не смог!
Возможен алгоритм без цикла по дням года.
Приведу пример в решении задания.
&НаКлиенте
Процедура Выполнить1(Команда)
Для Год = 2010 По 2019 Цикл
Сообщить( Строка(Год) + ” год – ” + КолиествоРабочихДнейВГоду(Год) + ” рабочих дней” );
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция КолиествоРабочихДнейВГоду( ВыбранныйГод )
НачалоВыбранногоГода = НачалоГода( Дата(ВыбранныйГод,1,1) );
КонецВыбранногоГода = КонецГода( Дата(ВыбранныйГод,1,1) );
КоличествоРабочихДней = 0;
Для ВыбрДеньГода = 0 По (КонецВыбранногоГода-НачалоВыбранногоГода)/60/60/24 Цикл
КоличествоРабочихДней = КоличествоРабочихДней + ЭтоРабочийДень(НачалоВыбранногоГода+ВыбрДеньГода*60*60*24);
КонецЦикла;
Возврат КоличествоРабочихДней;
КонецФункции
&НаСервере
Функция ЭтоРабочийДень( ВыбранныйДень )
МесяцВыбранногоДня = Месяц(ВыбранныйДень);
ДеньВыбранногоДня = День(ВыбранныйДень);
ДеньНеделиВыбранногоДня = ДеньНедели(ВыбранныйДень);
Если ( (МесяцВыбранногоДня=1 И ДеньВыбранногоДня=1)
ИЛИ (МесяцВыбранногоДня=2 И ДеньВыбранногоДня=23)
ИЛИ (МесяцВыбранногоДня=3 И ДеньВыбранногоДня=8) ) Тогда
Возврат Ложь;
ИначеЕсли ДеньНеделиВыбранногоДня>=1 И ДеньНеделиВыбранногоДня<=5 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
И ещё хотел добавить, что праздники можно загнать в глобальный массив и пользоваться функцией Массив.Найти для выявления праздников
Выполнено. В процедуру передаем год. Например, ПолучитьРабочиеДни(“2010”);
Процедура ПолучитьРабочиеДни(Год)
ДатаГода = Дата(Год, 1, 1);
КонецГода = КонецГода(ДатаГода);
КоличествоДней = 0;
Пока ДатаГода < КонецГода Цикл
Если ДеньНедели(ДатаГода) > 5 Тогда
//выходные
ИначеЕсли ДатаГода = Дата(Год,1,1) или ДатаГода = Дата(Год,2,23) или ДатаГода = Дата(Год,3,8) Тогда
//праздники
Иначе
КоличествоДней = КоличествоДней + 1;
КонецЕсли;
ДатаГода = ДатаГода + 24*3600;
КонецЦикла;
Сообщить(“” + Год + ” год – ” + КоличествоДней + ” рабочих дней”);
КонецПроцедуры // ПолучитьРабочиеДни()
Ответы на вопросы.
1. Некоторые вещи были довольно новы для меня. Например, “++”, “+-“. Довольно интересные эффекты.
2. Затруднений пока не возникло. Скорее влияла некоторая торопливость. :)
3. Если честно, я думаю, пока тем для мастер-групп на данном этапе не надо. Все разжевано. Остается только проглотить :) Но это мое мнение. Может, кому-то надо более углубленное изучение каких-то моментов.
P.S. А вообще, все супер!