Базовый курс. Занятие №3
Третье занятие по нулевому блоку базового курса.
Необходимо изучить следующие главы 0-го блока.
Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
напишите нам на e-mail поддержки.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
&НаКлиенте
Функция ПроверкаВисокосного(ГодОбрабатываемый)
Если (ГодОбрабатываемый % 4) =0 Тогда
Если (ГодОбрабатываемый % 100) =0 Тогда
Если (ГодОбрабатываемый % 400) =0 Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Иначе
Возврат Истина;
КонецЕсли;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура Сформировать(Команда)
Перем ГодСтарта, ГодФинишаРасчета, ВсегоДней;
Перем ДеньНеделиДеньПослеНГ, РабДнейКолво, ДеньНеделиПраздник;
ГодСтарта = 2010;
ГодФинишаРасчета = ГодСтарта + 10;
Пока ГодСтарта<ГодФинишаРасчета Цикл
ФлагВисокосного=ПроверкаВисокосного(ГодСтарта);
Если ФлагВисокосного Тогда
ВсегоДней = 366;
Иначе
ВсегоДней = 365;
КонецЕсли;
ДеньНеделиДеньПослеНГ = ДеньНедели(Дата(ГодСтарта, 1, 1));
РабДнейКолво=ВсегоДней – 2*52;
Если ДеньНеделиДеньПослеНГ=1 или ДеньНеделиДеньПослеНГ=2 или ДеньНеделиДеньПослеНГ=3 или ДеньНеделиДеньПослеНГ=4 Тогда
ИначеЕсли ДеньНеделиДеньПослеНГ=5 Тогда
Если ФлагВисокосного Тогда
РабДнейКолво=РабДнейКолво – 1;
КонецЕсли;
ИначеЕсли ДеньНеделиДеньПослеНГ=6 Тогда
Если ФлагВисокосного Тогда
РабДнейКолво=РабДнейКолво – 2;
Иначе
РабДнейКолво=РабДнейКолво – 1;
КонецЕсли;
ИначеЕсли ДеньНеделиДеньПослеНГ=7 Тогда
РабДнейКолво=РабДнейКолво – 1;
КонецЕсли;
//
Если НЕ (ДеньНеделиДеньПослеНГ=6 или ДеньНеделиДеньПослеНГ=7) Тогда
РабДнейКолво=РабДнейКолво – 1;
КонецЕсли;
ДеньНеделиПраздник = ДеньНедели(Дата(ГодСтарта, 2, 23));
Если НЕ (ДеньНеделиПраздник=6 или ДеньНеделиПраздник=7) Тогда
РабДнейКолво=РабДнейКолво – 1;
КонецЕсли;
ДеньНеделиПраздник = ДеньНедели(Дата(ГодСтарта, 3, 8));
Если НЕ (ДеньНеделиПраздник=6 или ДеньНеделиПраздник=7) Тогда
РабДнейКолво=РабДнейКолво – 1;
КонецЕсли;
Сообщить(Строка(ГодСтарта)+” “+Строка(РабДнейКолво));
ГодСтарта=ГодСтарта+1;
КонецЦикла;
КонецПроцедуры
обратная связь –
1. ограничение по размеру для таблицы в файле CD, особенности тонкого, толстого клиента.
2.вычитание строк
3.обновление конфигурации “Просмотр курсов spec8.ru”
P.S.
1. Многое из “Сервисные средства по написанию кода”. Конструкторы по строковому имени. Обращение к свойствам по индексу. Деструкторы. Расширение кругозора по работе с примитивными типами. Освежение и упорядочение информации по всем темам.
2. Пока затруднений не ощутил.
3. Мне кажется, что все отлично, спасибо за Вашу работу.
Исходя из того, что в году 365 дней – это 52 полные недели + один день (например – первое января)
<code>
&НаКлиенте
Процедура Вывести(Команда)
Для Сч =0 По 9 Цикл
ВывестиКоличествоВыходныхИБуднейВГоду(ДобавитьМесяц(Объект.Дата,Сч*12));
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВывестиКоличествоВыходныхИБуднейВГоду(ГодДатой)
ГодЧислом = Год(ГодДатой);
КоличествоНедель = 52;
КоличествоВыходных = КоличествоНедель * 2;
КоличествоБудней = КоличествоНедель * 5;
ГодВисокосный = ГодЧислом % 4 = 0;
//первое января всегда выходной
КоличествоВыходных = КоличествоВыходных + 1;
Если ГодВисокосный Тогда
Если ДеньВыходной(Дата(ГодЧислом,1,2)) Тогда
КоличествоВыходных = КоличествоВыходных + 1;
Иначе
КоличествоБудней = КоличествоБудней + 1;
КонецЕсли;
КонецЕсли;
Если НЕ ДеньВыходной(Дата(ГодЧислом,2,23)) Тогда
КоличествоБудней = КоличествоБудней – 1;
КоличествоВыходных = КоличествоВыходных + 1;
КонецЕсли;
Если НЕ ДеньВыходной(Дата(ГодЧислом,3,8)) Тогда
КоличествоБудней = КоличествоБудней – 1;
КоличествоВыходных = КоличествоВыходных + 1;
КонецЕсли;
СообщениеПользователю = Новый СообщениеПользователю;
//СообщениеПользователю.Текст = “Количество выходных: ” + КоличествоВыходных;
СообщениеПользователю.Текст = Формат(ГодДатой,”ФЧ=гггг”) + ” год – ” + КоличествоБудней + ” рабочих дней”;
СообщениеПользователю.Сообщить();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДеньВыходной(Дата)
Возврат ДеньНедели(Дата)> 5;
КонецФункции
</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 рабочих дней
//с
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
год = 2010;
Пока год < 2021 Цикл
ПоказатьС(год) ;
год = год +1;
КонецЦикла;
КонецПроцедуры
Функция показатьС(год)
Праздники = Новый Массив;
Праздники.Добавить(Дата(Год,1,1));
Праздники.Добавить(Дата(Год,2,23));
Праздники.Добавить(Дата(Год,3,8));
а= НачалоГода(Дата (год,1,1)) ;
РабочихДней = 0;
пока а<= КонецГода(Дата (год,12,31))Цикл;
РабочихДней = РабочихДней + ?(ВычислитьРД(а, Праздники), 1, 0);
а=(а+ 60*60*24);
КонецЦикла;
Сообщить(” ” + год + ” год – ” + РабочихДней + ” рабочих дней “) ;
КонецФункции // показатьС()
Функция ВычислитьРД(а, Праздники)
Если ДеньНедели(а) > 5 Тогда Возврат Ложь;
ИначеЕсли Праздники.Найти(а) <> Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
//-с
1)
Процедура ВыводКалендарныхРабДней(ГодНачало,КоличествоЛет)
ДниНеВходящие = Новый СписокЗначений;
ДниНеВходящие.Добавить(6);
ДниНеВходящие.Добавить(7);
Для Индекс = 0 по КоличествоЛет-1 Цикл
КоличествоДней = 0;
ТекГод = ГодНачало + Индекс;
ПраздничныеДни = Новый СписокЗначений;
ПраздничныеДни.Добавить(Дата(ТекГод,1,1));
ПраздничныеДни.Добавить(Дата(ТекГод,2,23));
ПраздничныеДни.Добавить(Дата(ТекГод,3,8));
ТекДень = Дата(ТекГод,1,1);
КонГода = КонецГода(ТекДень);
Пока ТекДень<КонГода Цикл
Если ДниНеВходящие.НайтиПоЗначению
(ДеньНедели(ТекДень)) <> Неопределено Тогда
ТекДень = ТекДень + 86400;
Продолжить;
КонецЕсли;
Если ПраздничныеДни.НайтиПоЗначению
(ТекДень) <> Неопределено Тогда
ТекДень = ТекДень + 86400;
продолжить;
КонецЕсли;
КоличествоДней = КоличествоДней + 1;
ТекДень = ТекДень + 86400;
КонецЦикла;
Сообщить(Формат(ТекГод,”ЧГ=0″) + ” год – ”
+ КоличествоДней + ” дней”);
КонецЦикла;
КонецПроцедуры
2)
Процедура Команда1(Команда)
ГодНачало = 2010;
КоличествоЛет = 10;
Для ИндексЛет = 0 по КоличествоЛет-1 Цикл
КоличествоДней = 0;
КоличествоПраздничных = 0;
ТекГод = ГодНачало + ИндексЛет;
КоличествоПраздничных = КоличествоПраздничных + ПроверкаПраздника(Дата(ТекГод,1,1));
КоличествоПраздничных = КоличествоПраздничных + ПроверкаПраздника(Дата(ТекГод,2,23));
КоличествоПраздничных = КоличествоПраздничных + ПроверкаПраздника(Дата(ТекГод,3,8));
ТекДень = Дата(ТекГод,1,1);
КонГода = КонецГода(ТекДень);
ДнейВГоду = Окр((КонГода-ТекДень)/86400);
КолНедель = Цел(ДнейВГоду/7);
КолРабДней = КолНедель*5;
РазницаСверхДней = ДнейВГоду-КолНедель*7;
Для ИндДней = 0 по РазницаСверхДней-1 Цикл
КоличествоПраздничных = КоличествоПраздничных – ПроверкаПраздника(Дата(ТекГод,12,31-ИндДней));
КонецЦикла;
КоличествоДней = КолРабДней – КоличествоПраздничных;
Сообщить(Формат(ТекГод,”ЧГ=0″) + ” год – ”
+ КоличествоДней + ” дней”);
КонецЦикла;
КонецПроцедуры
Функция ПроверкаПраздника(ДеньПроверки)
Если ДеньНедели(ДеньПроверки)<>6 И
ДеньНедели(ДеньПроверки)<> 7 Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
1.Узнал много новых полезных возможностей в плане программирования (Навигация,Преобразование примитивных типов,Использование логического равно с оператором присваивания и т.д.)
2.До этого работал только с 8.1, хочется отметить что 8.2 оставляет пока только положительные отзывы для меня, запомнилась работа с Видами сообщений для пользователя.
На 10 годах не заметно, но вот на 100 годах видно что 2-ой вариант работает быстрее
Задание выполнила. Решение, по ошибке выложила в комментарий 2 задания 8 апреля. Извиняюсь, поторопилась :)
Не сильно страшно :)
2010 : 258
2011 : 258
2012 : 259
2013 : 259
2014 : 260
2015 : 259
2016 : 258
2017 : 258
2018 : 258
2019 : 259
2020 : 261
&НаКлиенте
Процедура ПосчитатьКоличествоРабочихДней(Команда)
Для i=10 по 20 Цикл
Год = Дата(“20″+Формат(i,”ЧЦ=2; ЧВН=”)+”0101″);
РабочихДней = КоличествоРабочихДнейВГоду(Год);
Сообщить(“”+Формат(Год,”ДФ=yyyy”)+” : “+Формат(РабочихДней,”ЧДЦ=0; ЧРГ=””));
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция КоличествоРабочихДнейВГоду(Год)
СекундВДне = 24*60*60;
//количество рабочих дней в первую неделю года
ПерваяНеделяГода = (НачалоДня(КонецНедели(Год))-Год)/СекундВДне-1;
ПерваяНеделяГода = ?(ПерваяНеделяГода<0,0,ПерваяНеделяГода);
//Количество рабочих дней в последнюю неделю года
ПоследнийДеньГода = НачалоДня(КонецГода(Год));
ПоследняяНеделяГода = (ПоследнийДеньГода-НачалоНедели(ПоследнийДеньГода))/СекундВДне+1;
ПоследняяНеделяГода = ?(ПоследняяНеделяГода>5,5,ПоследняяНеделяГода);
//Количество дней в середине года
СерединаГода = Окр((НачалоНедели(ПоследнийДеньГода)-КонецНедели(Год))*5/(СекундВДне*7));
//Общее количество рабочих дней
КоличествоРабочихДней = ПерваяНеделяГода+СерединаГода+ПоследняяНеделяГода;
ВычитаемыеПразники = 0;
ВычитаемыеПразники = ВычитаемыеПразники+?(ДеньНедели(Год)<6,1,0); //01.01
ВычитаемыеПразники = ВычитаемыеПразники+?(ДеньНедели(Формат(Год,”ДФ=yyyy”)+”0223″)<6,1,0); //02.23
ВычитаемыеПразники = ВычитаемыеПразники+?(ДеньНедели(Формат(Год,”ДФ=yyyy”)+”0308″)<6,1,0); //03.08
КоличествоРабочихДней = КоличествоРабочихДней-ВычитаемыеПразники;
Возврат КоличествоРабочихДней;
КонецФункции
Касаемо вопросов:
1. Особенности файлового варианта работы, рабочий стол и еще куча приятных “мелочей” интерфейсной работы
2. затруднений небыло
3. нет
ДЗ3 выполнил двумя способами: 1) с перебором во вложенном цикле всех дней в году и подсчета рабочих с учетом праздника
2) способ без перебора всех дней с использованием функции НеделяГода и учитывая возможные неполные первую и последнюю недели года. По производительности, конечно возможно это более выигрышный вариант. Все зависит от производительности выполнения функции НеделяГода.
Результаты по обеим функциям сошлись. Поэтому в правильности сомнений не возникло.
Обратная связь:
1. Спасибо огромное, Евгений, за ваш труд. Очень необычно было видеть видео-ответы на свои вопросы. Очень понравилась конфигурация “Просмотр курсов”. С 8-ой уже был знаком. Больше узнал про горячие клавиши, особенности ввода шаблонов, систематизировал основные понятия…
2. Особенных затруднений не было
3. Хотелось бы узнать больше по измерению производительности, правильной настройки СУБД (Mssql как наиболее распространенной) для повышения производительности. Многое, конечно, еще впереди, но побольше бы по администрированию:)
P.S. По ходу записывал пожелания и не знаю в какой пункт их вписать.
При выполнении ДЗ2 в нулевом блоке возник вопрос а как же в табло посмотреть подробное содержание массива. Хотя поиск по конфигурации и выдал нужный результат, но он оказался в Блоке 1. Таким образом хотелось бы, чтобы материал был более упорядочен, что уменьшает количество поступающих вопросов.
Перенести главы по использованию Синтакс-Помощника из первого блока в нулевой. Особенно это будет актуально для тех, кто только начинает разработку на 1С 8.
Про производительность, клиент-сервеный вариант и MS SQL говорим в продвинутом.
Все-таки это не темы базового курса :)
>Таким образом хотелось бы, чтобы материал был более упорядочен, что уменьшает количество поступающих вопросов.
В этом случае придется сильно много дублировать. Поскольку вся информация каким-то образом связана.
>Перенести главы по использованию Синтакс-Помощника из первого блока в нулевой.
Предложение рассмотрим.
Привет, тезка!
Я выполнил только одним способом – перебором всех дней. Мое решение сейчас проходит модерацию, надеюсь, вскорости появится в этой теме.
Второй способ, о котором вы упомянули, тоже “вертелся на языке”, но в код я его не перенес – не мог в памяти раскидать проблему хвостовой недели – точнее, не видел красивого ее решения. Интересно бы было взглянуть на ваш код.
Может, опубликуете?
Или в личку? Можно тут писать в личку?
С уважением Константин, aka Cos
Зачем же в личку, можно опубликовать прямо здесь.
Честно говоря, немного напрягает оговорка организаторов (ваша?) о том, что, при ответе на ДЗ, нет необходимости приводить весь код решения. Константин, в отличие от меня, так и поступил. И я боюсь его спровоцировать по этому вопросу.
Если код интересен, то можно попросить опубликовать его.
Ничего страшного в этом нет.
2 005 – 258
2 006 – 258
2 007 – 258
2 008 – 261
2 009 – 259
2 010 – 258
2 011 – 258
2 012 – 259
2 013 – 259
2 014 – 260
2 015 – 259
2 005 – 258
2 006 – 258
2 007 – 258
2 008 – 261
2 009 – 259
2 010 – 258
2 011 – 258
2 012 – 259
2 013 – 259
2 014 – 260
2 015 – 259
Евгений, на какой е-мейл можно написать чтобы уточнить условия по 4 домашнему заданию, кое-что не понятно?
mg.spec8ru@gmail.com.
Либо подождать когда будет выложено ДЗ№4 и спросить в комментариях.
Приведу функцию, которая рассчитывает количество дней в конкретном году. Сначала поленился, сделал обычным перебором дней, но потом решил немного оптимизировать. :0)
&НаСервере
Функция ПолучитьКоличествоРабочихДнейВГоду(Год)
//ТекДата = Дата(Год,1,1);
//КонецГода = КонецГода(ТекДата);
//
//КоличествоРабочихДней = 0;
//Пока ТекДата <= КонецГода Цикл
// ТекМесяц = Месяц(ТекДата);
// ТекЧисло = День(ТекДата);
// ТекДеньНедели = ДеньНедели(ТекДата);
//
// Если ТекДеньНедели = 6 ИЛИ ТекДеньНедели = 7
// ИЛИ (ТекМесяц = 1 И ТекЧисло = 1)
// ИЛИ (ТекМесяц = 2 И ТекЧисло = 23)
// ИЛИ (ТекМесяц = 3 И ТекЧисло = 8) Тогда
//
// ТекДата = ТекДата + 24*3600;
// Продолжить;
// КонецЕсли;
//
// КоличествоРабочихДней = КоличествоРабочихДней + 1;
// ТекДата = ТекДата + 24*3600;
//КонецЦикла;
//
//Возврат КоличествоРабочихДней;
НачалоГода = Дата(Год,1,1);
КонецГода = Дата(Год,12,31);
КоличествоДнейВГоду = ДеньГода(КонецГода);
КонецПервойНедели = КонецНедели(НачалоГода);
ДнейВПервойНеделе = ДеньГода(КонецПервойНедели);
КоличествоРабочихДнейВПервойНеделе = ДнейВПервойНеделе – 2 – ?(ДеньНедели(НачалоГода) = 6 ИЛИ ДеньНедели(НачалоГода) = 7, 0, 1);
КоличествоРабочихДнейВПервойНеделе = ?(КоличествоРабочихДнейВПервойНеделе < 0, 0, КоличествоРабочихДнейВПервойНеделе);
ДнейВПоследнейНеделе = ДеньНедели(КонецГода);
КоличествоРабочихДнейВПоследнейНеделе = ?(ДнейВПоследнейНеделе = 7 ИЛИ ДнейВПоследнейНеделе = 6, 5, ДнейВПоследнейНеделе);
КорличествоРабочихДнейВОставшемсяГоду = ((КоличествоДнейВГоду – ДнейВПервойНеделе – ДнейВПоследнейНеделе)/7)*5;
КорличествоРабочихДнейВГоду = КоличествоРабочихДнейВПервойНеделе + КоличествоРабочихДнейВПоследнейНеделе + КорличествоРабочихДнейВОставшемсяГоду
– ?(ДеньНедели(Дата(Год,2,23)) = 6 ИЛИ ДеньНедели(Дата(Год,2,23)) = 7, 0, 1)
– ?(ДеньНедели(Дата(Год,3,8)) = 6 ИЛИ ДеньНедели(Дата(Год,3,8)) = 7, 0, 1);
Возврат КорличествоРабочихДнейВГоду;
КонецФункции
&НаСервере
Функция ПолучитьКоличествоРабочихДнейВГоду(Год)
НачалоГода = Дата(Год,1,1);
КонецГода = Дата(Год,12,31);
КоличествоДнейВГоду = ДеньГода(КонецГода);
КонецПервойНедели = КонецНедели(НачалоГода);
ДнейВПервойНеделе = ДеньГода(КонецПервойНедели);
КоличествоРабочихДнейВПервойНеделе = ДнейВПервойНеделе – 2 – ?(ДеньНедели(НачалоГода) = 6 ИЛИ ДеньНедели(НачалоГода) = 7, 0, 1);
КоличествоРабочихДнейВПервойНеделе = ?(КоличествоРабочихДнейВПервойНеделе < 0, 0, КоличествоРабочихДнейВПервойНеделе);
ДнейВПоследнейНеделе = ДеньНедели(КонецГода);
КоличествоРабочихДнейВПоследнейНеделе = ?(ДнейВПоследнейНеделе = 7 ИЛИ ДнейВПоследнейНеделе = 6, 5, ДнейВПоследнейНеделе);
КоличествоРабочихДнейВОставшемсяГоду = ((КоличествоДнейВГоду – ДнейВПервойНеделе – ДнейВПоследнейНеделе)/7)*5;
КоличествоРабочихДнейВГоду = КоличествоРабочихДнейВПервойНеделе + КоличествоРабочихДнейВПоследнейНеделе + КоличествоРабочихДнейВОставшемсяГоду
– ?(ДеньНедели(Дата(Год,2,23)) = 6 ИЛИ ДеньНедели(Дата(Год,2,23)) = 7, 0, 1)
– ?(ДеньНедели(Дата(Год,3,8)) = 6 ИЛИ ДеньНедели(Дата(Год,3,8)) = 7, 0, 1);
Возврат КоличествоРабочихДнейВГоду;
КонецФункции
Извиняюсь. Попало, что надо и не надо.
Это особенность вставки комментариев.
Обратная связь:
Узнал много нового. Организм больше не отторгает 8.2, как что-то новое, навороченное и непонятное. :0)
Материал изложен предельно понятно. Затруднений не возникло.
В следующих блоках наверняка есть ответы на многие мои вопросы, поэтому пока воздержусь.
Домашнее задание № 3
Результат работы обработки:
В году 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
В году 2 021 количество рабочих дней 258
Текст обработки
&НаКлиенте
Процедура Запуск(Команда)
Сообщить(“Обработка:Вычисление рабочих дней”);
Для Счетчик=0 По 10 Цикл
ГодРасчета=2011+Счетчик;
ДатаТекущая=НачалоГода(Дата(ГодРасчета,01,01));
КоличествоРабочихДней=0;
Порог=НачалоДня(КонецГода(ДатаТекущая));
Пока НачалоДня(ДатаТекущая)<= Порог Цикл
Если РабочийДень(ДатаТекущая) Тогда
КоличествоРабочихДней=КоличествоРабочихДней+1;
КонецЕсли;
ДатаТекущая=ДатаТекущая+86400;
КонецЦикла;
Сообщить(“В году ” + Год(Порог)+ ” количество рабочих дней “+КоличествоРабочихДней);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция РабочийДень(П1)
Возврат
ДеньНедели(П1)<>6 и ДеньНедели(П1)<>7
и НЕ(День(П1)=1 и Месяц(П1)=1)
и НЕ(День(П1)=23 и Месяц(П1)=2)
и НЕ(День(П1)=8 и Месяц(П1)=3);
КонецФункции //
Возникшие трудности
Долго промучился с условием выхода из цикла Пока…
(который обходит все дни заданного года)
Если ставил условие так
ДатаТекущая < КонецГода(ДатаТекущая) цикл превращался в БЕСКОНЕЧНЫЙ
(по моему предположению из-за разницы сравниваемых дат по ВРЕМЕНИ)
При такой записи
НачалоДня(ДатаТекущая)< НачалоДня(КонецГода(ДатаТекущая)) цикл нормально завершался
Но стоило поставить вместо <, условие <= цикл опять уходил в бесконечность.
Разумного обьяснения этому не нашел.
Но далее вспомнил по тексту видеоуроков, что нет смысла вычислять границу условия на КАЖДОМ витке цикла . Вынес расчет Порога за пределы цикла
Порог=НачалоДня(КонецГода(ДатаТекущая))
Тогда условие НачалоДня(ДатаТекущая)<=Порог
заработало правильно))).
Обратная связь
В целом, формат занятий считаю огромной находкой. По моему мнению, потенциал у таких занятий гораздо выше очных курсов.
Из 0 блока узнал, наконец, возможности платф. 8 .2 по работе со списком информационных баз
Новое для меня (и очень полезное для практики!!!)
Возможность запуска стартером 8.2 баз под 8.0 и 8.1 (в период массового перехода на 8.2 )
Возможность в интерфейсе запуска указывать параметр командной строки (особенно ключ /UC в период массового обновления)
Возможность принудительно запрашивать имя пользователя
И вообще, стала более понятна логика разработчиков новой платформы. До этого логики было не видно вообще, а были какие-то бессистемные обрывки знаний…
2. Так как до этого не программировал, сложности возникали при практической работе в конфигураторе. Например, при выполнении ДЗ № 2, где требовалось с помощью отладчика проанализировать программный код. При этом в пройденном материале про работу с отладчиком напрямую не рассказывалось. Пришлось обращаться к более опытным коллегам по работе за помощью… Считаю необходимым в 0 блоке или отдельно, выложить хотя бы минимальную инструкцию по отладке. Понятно, что потом это более глубоко рассматривается в отдельной теме 1 блока Базового курса.
3. Для 0 блока все темы раскрыты достаточно полно. Более подробное рассмотрение, надеюсь, нас ждет в следующих блоках. Спасибо за замечательный формат занятий, очень грамотное и доступное изложение материала.
>ДатаТекущая < КонецГода(ДатаТекущая) цикл превращался в БЕСКОНЕЧНЫЙ Это действительно бесконечный цикл, если ДатаТекущая последовательно увеличивается. Можно смоделировать поведение программы на листке. Допустим, изначально ДатаТекущая = 01.01.2011, на каждой итерации цикла ДатаТекущая увеличивается на день. Цикл будет выполняться для всех дней 2011 года, так как каждый из них меньше конца 2011 года. Рассмотрим итерацию, когда ДатаТекущая = 31.12.2011, если мы не определяли время, то оно установлено на начало дня. То есть в условии цикла будет идти сравнение 31.12.2011 0:00:00 < 31.12.2011 23:59:59. Это условие истинно, то есть цикл выполняется дальше. На следующей итерации будет выполняться условие 01.01.2012 0:00:00 < 31.12.2012 23:59:59 И так далее.. Надеюсь, логика ясна..
Да, спасибо за ответ. Теперь понятно)
1. Хотя и есть опыт и на 7.7 и на 8.2 , но курс вносит упорядоченность в знания
2. Пока затруднений нет
3.Интересует тема дальнейшего пути развития платформы
Дальнейший путь – наращивание функционала текущей версии платформы.
В частности выйдет релиз 8.2.14, где будет существенно улучшена среда разработки и реализованы многие важные опции конфигуратора.
получил
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 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
Запросом получаем количество дней в году
А далее ходим по дням года, суммируем выходные (“ДеньНедели()>5”) и проверяем по праздникам (“ДеньНедели()<6”)
По поводу обратной связи:
1. Из нулевого блока очень
помогли знания по поводу управляемых интерфейсов в целом. А так же моменты администрирования 1С 8.2 с разъяснениями по версификационностью.
2.Затруднения были в понятийности какую процедуру/функцию творить на Клиенте или на Сервере. А так же по поводу отчетов на СКД. Преодолевается есесьно с помощью самоличного набора руками кода и разбирательства Справки, однако справка сама по себе написана ИМХО не совсем корректно и не всегда очевидно.
3. При существовании такого понятия как Best Practics – существует ли он для программирования/проектирования в 1с – если да – то какие приемы не допустимы (кроме самых очевидных)
>существует ли он для программирования/проектирования в 1с
В контексте 1С такого понятия я не встречал. Но в этом направлении можно поработать. Возможно выпустим что-то подобное.
Опишу только функцию, которая возвращает на печать кол-во раб дней, в функцию передается параметр “Коллет” – счетчик 10 лет.
Функция ПодсчетРабДней (КолЛет)
НачГод = Формат((2010+КолЛет), “ЧГ=0”);
НачДата=Дата(“”+НачГод+”0101”);
КонДата=НачДата;
КолДней=0;
ПЯ = НачДата;
ДФ = Дата(“”+НачГода+”0223”);
ВМ = Дата(“”+НачГода+”0308”);
Пока Кондата <= КонецГода(НачДата) Цикл
Если (КонДата<>ПЯ) и (КонДата<>ДФ) и (КонДата<>ВМ) Тогда
НомерДня = ДеньНедели(КонДата);
Если (НомерДня<>6) и (НомерДня<>7) Тогда
КолДней = КолДней+1;
КонецЕсли;
КонецЕсли;
КонДата = КонДата +86400;
КонецЦиккла;
Возврат КолДней;
КонецФункции
2010 – 258
2011 – 258
2012 – 259
2013 – 259
2014 – 260
2015 – 259
2016 – 258
2017 – 258
2018 – 258
2019 – 259
Ответы на вопросы:
1) общие принципы работы платформы 8.2, так же было интересно узнать про горячие клавиши для заметок и т.п.
2) Проблем никаких не было в усвоении материала
3) Все темы подробно описаны, вопросов не возникло.
<code>
&НаСервере
Функция КолРабочихДнейВГоду(Год)
Праздники = Новый СписокЗначений;
Праздники.Добавить(Дата(Год,1,1),”1-е января”);
Праздники.Добавить(Дата(Год,2,23),”23 февраля”);
Праздники.Добавить(Дата(Год,3,8),”8-е марта”);
КолРабДней = 0;
ТекДата = Дата(Год,1,1);
КонДата = КонецГода(ТекДата);
Пока ТекДата <= КонДата Цикл
Если ДеньНедели(ТекДата) < 6 Тогда
Если Праздники.НайтиПоЗначению(ТекДата) = Неопределено Тогда
КолРабДней = КолРабДней + 1;
КонецЕсли;
КонецЕсли;
ТекДата = КонецДня(ТекДата) + 1; //плюс секунда = начало следующего дня
КонецЦикла;
Возврат КолРабДней;
КонецФункции
//нажатие кнопки-команды
&НаКлиенте
Процедура КолРабДнейЗа10Лет(Команда)
Огр = Год + 9; //за 10 лет начиная с указанного года
Для Сч = Год По Огр Цикл
Сообщить(“”+Формат(Сч,”ЧГ=0″)+” год – “+ КолРабочихДнейВГоду(Сч)+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
<code>
2010 – 258
2011 -258
2012 – 259
2013 – 259
2014 – 260
2015 – 259
2016 – 258
2017 – 258
2018 – 258
2019 – 259
В восторге от Вашего формата ведения курсов, ну и конечно от профессинализма подготовки – наверное основное впечатление от нулевого блока ))
Большой опыт программирования в 7.7, тем не менее в каждом уроке обязательно находишь что-то новое… Особенно хотел бы подметить те “недокументированные” МЕЛОЧИ, с которыми Вы щедро делитесь с нами. Думаю программисты понимают, о чем речь… Узнать как работает “та или иная фишка” – порой требуется немалые временные и эмоциональные затраты на опыт.
Затруднений пока нет.
<code>
Функция КоличествоРабочихДней(Год)
НеРабДень1 = Дата(Год, 1, 1);
НеРабДень2 = Дата(Год, 2, 23);
НеРабДень3 = Дата(Год, 3, 8);
КоличРабДней = 0;
ТекущаяДата = Дата(Год, 1, 1);
ДатаКонецГода = КонецГода(ТекущаяДата);
Пока ТекущаяДата <= ДатаКонецГода Цикл
Выходной = ТекущаяДата = НеРабДень1 ИЛИ
ТекущаяДата = НеРабДень2 ИЛИ
ТекущаяДата = НеРабДень3;
Если НЕ Выходной И ДеньНедели(ТекущаяДата) < 6 Тогда
КоличРабДней = КоличРабДней + 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата + 86400;
КонецЦикла;
Возврат КоличРабДней;
КонецФункции
</code>
1. Очень пригодилось описание работы с конфигуратором (настройки, описание доп. сервисов, работа с кодом и т.д.).
Описание файлов и структуры программы.
2. Булевые операции и приоритеты операций. Преодолевается только вниманием и опытом. Толстый и тонкий клиенты, режимы работы.
3. Посмотрел прайс-лист фирмы 1С и не нашел в нем отдельно дистра ТонкогоКлиента (гл.3 п.2). Есть Технологическая Платформа, но какие права она дает? Лицензирование не относится напрямую к программированию, но любая инфа в этом направлении будет очень полезной. Как и вместе с чем распространять то, что напишешь?
Платформа позволяет запускать клиенты любого вида.
Лицензирование идет не по клиентам.
Вообще тема лицензирования вызывает много вопросов, поэтому, скорее всего, по ней будет отдельная тематическая сессия. Где все разложим “по полочкам”.
1)Признаюсь, что опыт в 8-кой есть. Нового узнал не много, но есть кое-какие мелочи… Систематизация знаний. Кроме того немного поменялось представление об 1С. Это именно учетная платформа. Более понятны ограничения по сравнению с другими средами разработки.
2)В силу особенности мышления, попыток писать универсальный код и невнимательности при прочтении условий задачи, долго решал ДЗ№2 с обменом значений переменных. Помогло внимательное прочтение условия задачи. Спасибо Евгению за красоту логических построений в изложении материалов и при решениях ДЗ.
3)Отличие примитивных типов в традиционных языках и 1С. Их преобразования. Столкнулся с тем, что получая в запросе по ODBCE из базы данных MySQL данные, 1С не поняла тип “VARCHAR” или “number”, точно не помню.
Задание выполнил.
Получился вот такой вот симпатичный код:
<code>
ДатаНачалаРассчетов=НачалоГода(ТекущаяДата());
ДатаОкончанияРассчетов=ДобавитьМесяц(КонецГода(ДатаНачалаРассчетов), 108);
Пока ДатаНачалаРассчетов<=ДатаОкончанияРассчетов Цикл
ДатаРассчетов=ДатаНачалаРассчетов;
КоличествоДней=0;
Пока ДатаРассчетов<=КонецГода(ДатаНачалаРассчетов) Цикл
Если ДеньНедели(ДатаРассчетов)<>6 И ДеньНедели(ДатаРассчетов)<>7 Тогда
Если ДеньГода(ДатаРассчетов)<>1 И ДеньГода(ДатаРассчетов)<>54 Тогда
Если Формат(ДатаРассчетов, “ДФ=dd.MM”)<>”08.03″ Тогда
КоличествоДней=КоличествоДней+1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ДатаРассчетов=ДатаРассчетов+60*60*24;
КонецЦикла;
Текст=Формат(ДатаНачалаРассчетов, “ДФ=yyyy”)+” год – “+Строка(КоличествоДней)+” рабочих дней”;
Сообщить(Текст);
ДатаНачалаРассчетов=ДобавитьМесяц(ДатаНачалаРассчетов,12);
КонецЦикла;
</code>
Результат:
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
Обратная связь по 0-му блоку:
1) Для себя открыл новые сочетания клавиш, теперь постоянно использую:) Понравилось как изложен материал по управляемому интерфейсу, весьма доходчиво. Мои знания по 1С теперь упорядочены и находятся по “полочкам”.
2) У меня все темы прошли на “ура”.
3) Я считаю очень мало информации было сказано про СУБД, но наверно для 0-ого блока это не критично. В развитии линейки “1С:Предприятие 8” ничего не было сказано, куда дальше идёт развитие платформы, скорее всего эта информация является закрытой, но всё же;)
А вообще проект классный, мне очень нравится. Спасибо, создателям проекта;)
Про СУБД и клиент-серверный вариант мы подробно говорим в продвинутом :)
ответы на 3 вопроса:
1.Особенности и ньюансы именно 8’ки;
2. Особенных затруднений не было;
3. До сих пор не понимаю, как решать такой вопрос: Необходимо разработать форму с каким-то функционалом. Как выбирать в каком клиенте, каким интерфейсом и по какому протоколу будет работать такая форма.
В 1-ом блоке будем работать с формами, подождем его.
Также обратите внимание на бонус “Управляемые и обычные формы” (есть у Вас на диске).
&НаКлиенте
Процедура КолвоРабДней(Команда)
Сообщить(“Рабочих дней:”+РасчитатьРабДни01(Год));
КонецПроцедуры
&НаСервере
Функция РасчитатьРабДни01(Год)
Праздники=Новый Массив;
Праздники.Добавить(Дата(Год,1,1));
Праздники.Добавить(Дата(Год,2,23));
Праздники.Добавить(Дата(Год,3,8));
Результат=0;
й=НачалоГода(Дата(Год,1,1));
ф=КонецГода(Дата(Год,12,31));
Пока й<ф Цикл
я=ДеньНедели(й);
Если Неопределено=Праздники.Найти(й) Тогда
Если я<6 Тогда
Результат=Результат+1;
КонецЕсли;
КонецЕсли;
й=й+86400; // добавим день
КонецЦикла;
Возврат Результат;
КонецФункции
Трудностей не возникло.
&НаКлиенте
Процедура ВыполнитьНажатие(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
НачДата = НачалоГода(ТекущаяДата());
Сч = 1;
//по годам
Пока Сч<=10 Цикл
ТекДата = НачалоГода(НачДата);
КонГода = КонецГода(НачДата);
КолРабочихДней = 0;
//по дням
Пока ТекДата<=КонГода Цикл
Если ДеньНедели(ТекДата)<6 И НЕ ЭтоПраздник(ТекДата) Тогда
КолРабочихДней = КолРабочихДней + 1;
КонецЕсли;
ТекДата = ТекДата+86400;
КонецЦикла;
Сообщить(“”+Год(НачДата)+” – “+КолРабочихДней+” рабочих дней”);
НачДата = ДобавитьМесяц(НачДата, 12);
Сч = Сч + 1;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЭтоПраздник(ТекДата)
Возврат (День(ТекДата)=1 И Месяц(ТекДата)=1)
ИЛИ(День(ТекДата)=8 И Месяц(ТекДата)=3)
ИЛИ(День(ТекДата)=23 И Месяц(ТекДата)=2);
КонецФункции
ДеньГодаОбр = Дата(“20100101″);
ГодРасч = Год(ДеньГодаОбр);
Для Счетчик = 0 По 10 Цикл
ДеньГодаОб = ДеньГодаОбр;
Год = Формат(ГодРасч,”ЧГ=0”);
НовГод = Дата(Год + “0101”);
МужДень = Дата(Год + “0223”);
ЖенДень = Дата(Год + “0308”);
Счет = 0;
Пока ДеньГодаОбр <= КонецГода(ДеньГодаОб) Цикл
ДеньНед = ДеньНедели(ДеньГодаОбр);
Если ДеньНед <> 6 И ДеньНед <> 7 И ДеньГодаОбр <> НовГод
И ДеньГодаОбр <> МужДень И ДеньГодаОбр <> ЖенДень Тогда
Счет = Счет + 1;
КонецЕсли;
ДеньГодаОбр = ДеньГодаОбр + 86400; //+1 день
КонецЦикла;
Сообщить(Год + ” год – количество рабочих дней ” + Счет);
ГодРасч = ГодРасч+1;
КонецЦикла;
ДеньГодаОбр = Дата(“20100101″); ГодРасч = Год(ДеньГодаОбр); Для Счетчик = 0 По 10 Цикл ДеньГодаОб = ДеньГодаОбр; Год = Формат(ГодРасч,”ЧГ=0”); НовГод = Дата(Год + “0101”); МужДень = Дата(Год + “0223”); ЖенДень = Дата(Год + “0308”);
Счет = 0; Пока ДеньГодаОбр <= КонецГода(ДеньГодаОб) Цикл ДеньНед = ДеньНедели(ДеньГодаОбр); Если ДеньНед <> 6 И ДеньНед <> 7 И ДеньГодаОбр <> НовГод И ДеньГодаОбр <> МужДень И ДеньГодаОбр <> ЖенДень Тогда Счет = Счет + 1; КонецЕсли; ДеньГодаОбр = ДеньГодаОбр + 86400; КонецЦикла; Сообщить(Год + ” год – количество рабочих дней ” + Счет); ГодРасч = ГодРасч+1; КонецЦикла;
Задание выполнено.
&НаКлиенте
Процедура Рассчитать(Команда)
НачГода = НачалоГода(ДатаГода); // из реквизита
Для г=0 по 9 Цикл
КонГода = ДобавитьМесяц(НачГода,12)-1;
ТекГод = Год(НачГода);
ТекДата = НачГода;
ЧислоРабДней = 0;
Пока ТекДата <= КонГода Цикл
ДеньТекДата = ДеньНедели(ТекДата);
Если ДеньТекДата < 6 Тогда
ЧислоРабДней = ЧислоРабДней+1;
КонецЕсли;
ТекДата = ТекДата + 86400;
КонецЦикла;
ПроверитьПраздник(ТекГод,ЧислоРабДней);
Сообщить(“”+ТекГод+” год – “+ЧислоРабДней+”рабочих дней”);
НачГода = ДобавитьМесяц(НачГода,12);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция ПроверитьПраздник(ТекГод,ЧислоРабДней)
январь1 = Дата(ТекГод,1,1);
ЧислоРабДней = ЧислоРабДней – ?(ДеньНедели(январь1)<6,1,0);
февраль23 = Дата(ТекГод,2,23);
ЧислоРабДней = ЧислоРабДней – ?(ДеньНедели(февраль23)<6,1,0);
март8 = Дата(ТекГод,3,8);
ЧислоРабДней = ЧислоРабДней – ?(ДеньНедели(март8)<6,1,0);
Возврат ЧислоРабДней
КонецФункции
1-процедура
организовывается цикл 2011-2021, внутри вызывается процедура расчет РабДни
2-процедура
А=?(ДеньНедели(Парам)<6,1,0)
Р=Р+А – количество рабочих дней в определенном году
Далее вызывается функция подсчета праздников
3-Функция
Праздник1=?(ДеньНедели(Дата(НачалоПериода,1,1))<6,1,0);
Праздник2=?(ДеньНедели(Дата(НачалоПериода,2,23))<6,1,0);
Праздник3=?(ДеньНедели(Дата(НачалоПериода,3,8))<6,1,0);
Возврат Итого
Далее во второй процедуре из общих дней вычитаем кол-во праздников и выводим посредством сообщить в нужном виде
Сообщить(Строка(НачалоПериода)+” год- “+Строка(РабДни)+” рабочих дней”);
Новое общие сведения о платформе, параметры ИБ
Наиболее трудно оператор присваивания, никак не отвыкнуть от стереотипов
Хочется больше практических примеров как в дом.зад.
Перем Праздники,Выходные;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Перем КолвоРабочихДней ;
КолвоРабочихДней=0;
ДатаПроверки=НачалоГода(ТекущаяДата());
Год=Год(ДатаПроверки);
Пока Год<Год(ТекущаяДата())+9 Цикл
Если ПроверкаВыходныхДней(ДатаПроверки)=0 тогда
КолвоРабочихДней=КолвоРабочихДней+1;
конецЕсли;
Если КонецДня(ДатаПроверки)=КонецГода(ДатаПроверки)тогда
Год=Год(ДатаПроверки);
сообщить(“”+Год+” год -“+КолвоРабочихДней+” рабочих дней”);
КолвоРабочихДней=0;
конецЕсли;
ДатаПроверки=ДобавитьДень(ДатаПроверки,1);
КонецЦикла;
КонецПроцедуры
Функция ДобавитьДень(ДатаДень,к)
Возврат ДатаДень+к*60*60*24;
конецФункции
Функция ПроверкаВыходныхДней(ТекДата)
МесяцДень=Лев(ТекДата,5);
возврат Найти(Выходные,ДеньНедели(ТекДата))>0 или Найти(Праздники,МесяцДень)>0
КонецФункции;
Праздники=”01.01,08.03,23.02″;
Выходные=”67″;
Вопрос: Во время работы над заданием возник вопрос:
1. Усл1 или Усл2, где Усл1=истина
2. Усл1 и Усл2, где Усл2 = ложь
Будет ли система проверять Усл2? Аналогично при работе с запросами к БД
Пожелание: Если возможно в рамках курсах получить информацию по тестированию кода, а так же как замерять время работы.
Во втором примере сделал уточнение?
1. Усл1 или Усл2, где Усл1=истина
2. Усл1 и Усл2, где Усл1 = ложь
В этих случаях система не будет проверять второе условие, поскольку в этом нет смысла.
>Пожелание: Если возможно в рамках курсах получить информацию по тестированию кода, а так же как замерять время работы.
Такая информация будет в 1-ом блоке нашего курса.
2010-258
2011-258
2012-259
2013-259
2014-260
2015-259
2016-258
2017-258
2018-258
2019-259
2020-261
2021-258
2022-258
<code>
Для Сч = 2010 По 2022 Цикл
КолРабочихДней = 0;
Дата1 = Дата(сч,01,01);
Пока Дата1<НачалоДня(КонецГода(Дата1)) Цикл
ЕСли ДеньНедели(Дата1)=7 ИЛИ ДеньНедели(Дата1)=6 Тогда
Дата1 = Дата1 + 60*60*24;
Продолжить;
КонецЕсли;
Если (День(Дата1) = 1 И Месяц(Дата1) = 1) Или
(День(Дата1) = 23 И Месяц(Дата1) = 2) Или
(День(Дата1) = 8 И Месяц(Дата1) = 3) Тогда
Дата1 = Дата1 + 60*60*24;
Продолжить;
КонецЕсли;
КолРабочихДней = КолРабочихДней+1;
Дата1 = Дата1 + 60*60*24;
КонецЦикла;
ЕСли ДеньНедели(Дата1) = 6 Или ДеньНедели(Дата1) = 7 Тогда
Сообщить(Строка(Сч) + “год – ” + КолРабочихДней + ” рабочих дней!”);
Иначе
Сообщить(Строка(Сч) + “год – ” + (КолРабочихДней+1) + ” рабочих дней!”);
КонецЕсли;
КонецЦикла;
</code>
вот Вариат1
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НомерСледующегоГода = Год(ТекущаяДата())+1;
НомерПоследнегоГода = НомерСледующегоГода +9;
Для Год = НомерСледующегоГода По НомерПоследнегоГода Цикл
КоличествоРабочихДней = 0;
Для Месяц = 1 По 12 Цикл
Для НомерДня = 1 По День(КонецМесяца(Дата(Год, Месяц, 1))) Цикл
Дата = Дата(Год, Месяц, НомерДня);
Если ДеньНедели(Дата) = 6 Или ДеньНедели(Дата) = 7 Тогда
Продолжить;
КонецЕсли;
Если Месяц <= 3
И (Дата = Дата(Год, 1, 1) Или Дата = Дата(Год, 2, 23) Или Дата = Дата(Год, 3, 8)) Тогда
Продолжить;
КонецЕсли;
КоличествоРабочихДней = КоличествоРабочихДней + 1;
КонецЦикла;
КонецЦикла;
Сообщить( Формат(Год, “ЧГ=0″) +” год – ” +Строка(КоличествоРабочихДней)+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
</code>
или так Вариатн 2 (изготовил функции ДобавитьДень( Дата, ЧислоДней))
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НомерСледующегоГода = Год(ТекущаяДата())+1;
НомерПоследнегоГода = НомерСледующегоГода +9;
Для Год = НомерСледующегоГода По НомерПоследнегоГода Цикл
КоличествоРабочихДней = 0;
Дата = КонецГода(Дата(Год-1, 1, 1));
ДатаКон = КонецГода(Дата(Год, 1, 1));
Пока Дата < ДатаКон Цикл
Дата = КонецДня(ДобавитьДень( Дата, 1));
Если ДеньНедели(Дата) = 6 Или ДеньНедели(Дата) = 7
Или Дата = КонецДня(Дата(Год, 1, 1)) Или Дата = КонецДня(Дата(Год, 2, 23)) Или Дата = КонецДня(Дата(Год, 3, 8)) Тогда
Продолжить;
КонецЕсли;
КоличествоРабочихДней = КоличествоРабочихДней + 1;
КонецЦикла;
Сообщить( Формат(Год, “ЧГ=0″) +” год – ” +Строка(КоличествоРабочихДней)+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
Функция ДобавитьДень( Знач Дата, Знач ЧислоДней)
ДеньСледующегоМесяца = День(Дата) + ЧислоДней – День(КонецМесяца(Дата));
Если ДеньСледующегоМесяца > 0 Тогда
НоваяДата = ДобавитьМесяц(Дата, 1);
Возврат Дата(Год(НоваяДата), Месяц(НоваяДата), ДеньСледующегоМесяца);
КонецЕсли;
Возврат Дата(Год(Дата), Месяц(Дата), День(Дата) + ЧислоДней);
КонецФункции // ДобавитьДень()
</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 рабочих дней
2 021 год – 258 рабочих дней
Если провел небольшое исследование можно заметить что:
<code>Если ДнейВГоду = 365 Тогда
Если ДеньНедели(ДатаНачалаГода) = 6 ИЛИ ДеньНедели(ДатаНачалаГода) = 7 Тогда
ВыходныхВГоду = ВыходныхВГоду + 104 + 1;
Иначе
ВыходныхВГоду = ВыходныхВГоду + 104;
КонецЕсли;
Иначе //Год високосный
Если ДеньНедели(ДатаНачалаГода) = 5 ИЛИ ДеньНедели(ДатаНачалаГода) = 7 Тогда
ВыходныхВГоду = ВыходныхВГоду + 104 + 1;
ИначеЕсли ДеньНедели(ДатаНачалаГода) = 6 Тогда
ВыходныхВГоду = ВыходныхВГоду + 104 + 2;
Иначе
ВыходныхВГоду = ВыходныхВГоду + 104;
КонецЕсли;
КонецЕсли;
</code>
Далее идет проверка на совпадение выходных и праздников.
Все это можно оформить в виде функции и вызывать ее в цикле:
<code>
Для ТекущийГод=Год(ТекущаяДата()) По ТекущийГод+10 Цикл
Сообщить(” ” + ТекущийГод + ” год – ” + РабочихДнейВГоду(ТекущийГод)+ ” рабочих дней”);
КонецЦикла;
</code>
Перем Праздники; //””+День+Месяц
Перем Выходные; //НомераДнейВыходных
&НаСервере
Функция НЕПраздникВыходной(ДатаДень)
ДеньН = ДеньНедели(ДатаДень);
ДеньМес = “”+День(ДатаДень)+Месяц(ДатаДень); //””+День+Месяц
ЗнВыходные = Выходные.Найти(ДеньН);
ЗнПраздник = Праздники.НайтиПоЗначению(ДеньМес);
Если ЗнВыходные = Неопределено и ЗнПраздник = Неопределено Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура РасчетРабочихДней(Команда)
День = Дата(Объект.Год,1,1);
КонГода = Дата(Объект.Год,12,31);
ВсегоДней = 0;
Пока День <= КонГода Цикл
ВсегоДней = ВсегоДней + НЕПраздникВыходной(День);
День = День + 24*60*60;
КонецЦикла;
Сообщить(“Год: “+Объект.Год+”, Количество рабочих дней: “+ ВсегоДней);
КонецПроцедуры
Праздники = Новый СписокЗначений;
Праздники.Добавить(“11”); // 1 января
Праздники.Добавить(“232”); // 23 февраля
Праздники.Добавить(“83”); // 8 марта
Выходные = Новый Массив;
Для инд = 6 по 7 Цикл
Выходные.Добавить(инд);
КонецЦикла;
Перем Праздники; //””+День+МесяцПерем Выходные; //НомераДнейВыходных
&НаСервереФункция НЕПраздникВыходной(ДатаДень) ДеньН = ДеньНедели(ДатаДень); ДеньМес = “”+День(ДатаДень)+Месяц(ДатаДень); //””+День+Месяц ЗнВыходные = Выходные.Найти(ДеньН); ЗнПраздник = Праздники.НайтиПоЗначению(ДеньМес); Если ЗнВыходные = Неопределено и ЗнПраздник = Неопределено Тогда Возврат 1; Иначе Возврат 0; КонецЕсли; КонецФункции
&НаКлиентеПроцедура РасчетРабочихДней(Команда) День = Дата(Объект.Год,1,1); КонГода = Дата(Объект.Год,12,31); ВсегоДней = 0; Пока День <= КонГода Цикл ВсегоДней = ВсегоДней + НЕПраздникВыходной(День); День = День + 24*60*60; КонецЦикла; Сообщить(“Год: “+Объект.Год+”, Количество рабочих дней: “+ ВсегоДней); КонецПроцедуры
Праздники = Новый СписокЗначений;Праздники.Добавить(“11”); // 1 январяПраздники.Добавить(“232”); // 23 февраляПраздники.Добавить(“83”); // 8 марта
Выходные = Новый Массив;Для инд = 6 по 7 Цикл Выходные.Добавить(инд); КонецЦикла;
Про результаты:
2010 – 258; 2011 – 258; 2012 – 259; 2013 – 259; 2014 – 260; 2015 – 259; 2016 – 258; 2017 – 258; 2018 – 258; 2019 – 259; 2020 – 261 (2020 в принципе не нужен был).
Ответы на поставленные вопросы:
1). “Преобразование примитивных данных” (по сравнению с 7.7 версией 1С есть значительные улучшения, что порадовало) и “Точность математических операций” (уже пригодилось на практике).
2). В принципе все темы 0-го блока были пройдены без затруднений, т.к. уже есть опыт работы с 1С предприятие 7.7 – 8.2
3). Виды учета, но предполагаю, что их более детальное изучение пройдет в следующих блоках
3. Совершенно верно.
А если еще подумать – можно функцию чуть изменить…
<CODE>
Функция РабочийДень(Год,Месяц,День,Праздники)
РеалДата = Дата(год,Месяц,День);
Возврат ( (Праздники.Найти(РеалДата) = Неопределено) и (ДеньНедели(РеалДата)<6) );
КонецФункции // РабочийДень()
</CODE>
По вопросам:
1. Новое по операциям сравнения – не придавал раньше особого внимания. Также сложение переменных разного типа – не думал что всё так интересно.
2. Без особых затруднений. А лечит всё практика :)
3. Типовые алгоритмы проверки на действия с переменными различного типа данных.
<CODE>
&НаКлиенте
Перем ДнейВМесяце;
&НаКлиенте
Процедура СообщитьРезультат(Команда)
// Вставить содержимое обработчика.
Для Год = 2010 по 2015 Цикл
КоличествоРабочихДней = СообщитьКоличествоРабочихДнейВГоду(Год);
Сообщить(“”+Год+” год – “+КоличествоРабочихДней+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция СообщитьКоличествоРабочихДнейВГоду(Год)
ДнейВМесяце[1] = ?(Год%4=0,29,28); //февраль
Праздники = Новый Массив;
Праздники.Добавить(Дата(Год,1,1));
Праздники.Добавить(Дата(Год,2,23));
Праздники.Добавить(Дата(Год,3,8));
КоличествоРабочихДней = 0;
Для Месяц = 1 По ДнейВМесяце.Количество() Цикл
КолДнейВТекМес = ДнейВМесяце[Месяц-1];
Для День = 1 По КолДнейВТекМес Цикл
КоличествоРабочихДней = КоличествоРабочихДней + РабочийДень(Год,Месяц,День,Праздники);
КонецЦикла;
КонецЦикла;
Возврат КоличествоРабочихДней;
КонецФункции // СообщитьКоличествоРабочихДнейВГоду()
Функция РабочийДень(Год,Месяц,День,Праздники)
РеалДата = Дата(год,Месяц,День);
Если (Праздники.Найти(РеалДата) = Неопределено) и (ДеньНедели(РеалДата)<6) Тогда
Возврат 1;
КонецЕсли;
Возврат 0;
КонецФункции // РабочийДень()()
ДнейВМесяце = Новый Массив;
ДнейВМесяце.Добавить(31); // январь
ДнейВМесяце.Добавить(0); // февраль
ДнейВМесяце.Добавить(31); // март
ДнейВМесяце.Добавить(30); // апрель
ДнейВМесяце.Добавить(31); // май
ДнейВМесяце.Добавить(30); // июнь
ДнейВМесяце.Добавить(31); // июль
ДнейВМесяце.Добавить(31); // август
ДнейВМесяце.Добавить(30); // сентябрь
ДнейВМесяце.Добавить(31); // октябрь
ДнейВМесяце.Добавить(30); // ноябрь
ДнейВМесяце.Добавить(31); // декабрь
</CODE>
Для ТекущийГод = 2010 По 2020 Цикл
РабочихДней = 0;
ПервоеЯнваряТекущегоГода = Дата(ТекущийГод,1,1);
СекундВТекущемГоду = НачалоДня(КонецГода(ПервоеЯнваряТекущегоГода)) – ПервоеЯнваряТекущегоГода;
Для Сек = 0 По СекундВТекущемГоду Цикл
ТекущаяДата = ПервоеЯнваряТекущегоГода + Сек;
Если ДеньНедели(ТекущаяДата) <> 6
И ДеньНедели(ТекущаяДата) <> 7
И ТекущаяДата <> Дата(ТекущийГод,1,1)
И ТекущаяДата <> Дата(ТекущийГод,2,23)
И ТекущаяДата <> Дата(ТекущийГод,3,8)
Тогда
РабочихДней = РабочихДней + 1;
КонецЕсли;
Сек = Сек + 86400 – 1;
КонецЦикла;
Сообщить(“Количество рабочих дней в ” + ТекущийГод + ” году: ” + РабочихДней);
КонецЦикла;
Ответы на вопросы к блоку:
1) До этого работал на 7.7 так что интересного было много. :)
2) Затруднений особых не было, все разъяснено доходчиво.
3) Т.к. в основном конфигурации сейчас еще на обычном интерфейсе хотелось бы побольше информации по обычному интерфейсу.
>Т.к. в основном конфигурации сейчас еще на обычном интерфейсе хотелось бы побольше информации по обычному интерфейсу
Это очень временное явление.
Массовый переход на управляемый интерфейс пожалуй будет этой осенью.
Поэтому упираться в изучение обычного интерфейса считаю нерациональным.
Да, кстати, сравнение обычного и управляемого интерфейса есть на бонусном диске (входит в физическую поставку курса).
Евгений, вы правда верите, что
а)на управляемом интерфейсе можно решить все реальные задачи;
б)пользователи захотят переходить, в особенности упр. учет и опер.?
А. Есть ряд специфических задач, для которых можно использовать обычный интерфейс.
В основном они связаны со специальным оборудованием: радио-терминалы, кассы и т.д.
Конечно обычная форма позволит более компактно разместить элементы.
В остальных случаях управляемые формы можно применить ко многим задачам. Исключение – особые требования пользователя к размещению элементов.
Зачастую эти требования можно снять.
Б. Здесь нужна психологическая работа с пользователями :)
А если серьезно, то можно организовать постепенный переход. Ведь можно в управляемом приложении могут легко вместе жить обычные и управляемые формы.
Управляемый ЗУП тоже осенью ждать?
По ЗУПу не могу сказать..
&НаСервере
Процедура РасчетНаСервере()
Праздники = Новый ТаблицаЗначений;
Праздники.Колонки.Добавить(“Месяц”);
Праздники.Колонки.Добавить(“День”);
НовСтр = Праздники.Добавить();
НовСтр.Месяц = 1;
НовСтр.День = 1;
НовСтр = Праздники.Добавить();
НовСтр.Месяц = 2;
НовСтр.День = 23;
НовСтр = Праздники.Добавить();
НовСтр.Месяц = 3;
НовСтр.День = 8;
Для Год = 2010 По 2019 Цикл
РабочихДнейВГоду = 0;
Для Мес = 1 По 12 Цикл
РабочихДнейВМесяце = 0;
МассивПраздников = Праздники.НайтиСтроки(Новый Структура(“Месяц”, Мес));
КолПраздников = 0;
Для каждого Стр Из МассивПраздников Цикл
Если ДеньНедели(Дата(Год,Мес,Стр.День))< 6 Тогда
КолПраздников = КолПраздников+1;
КонецЕсли;
КонецЦикла;
РабочихДнейВМесяце = РабочихДнейВМесяце – КолПраздников;
ДнейВМесяце = День(КонецМесяца(Дата(Год, Мес, 1)));
Для День = 1 По ДнейВМесяце Цикл
Если ДеньНедели(Дата(Год,Мес,День))< 6 Тогда
РабочихДнейВМесяце = РабочихДнейВМесяце+1;
КонецЕсли;
КонецЦикла;
РабочихДнейВГоду = РабочихДнейВГоду+РабочихДнейВМесяце;
КонецЦикла;
Сообщить(Строка(Год)+ ” год – “+Строка(РабочихДнейВГоду)+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
&НаСервереПроцедура РасчетНаСервере()
Праздники = Новый ТаблицаЗначений; Праздники.Колонки.Добавить(“Месяц”); Праздники.Колонки.Добавить(“День”);
НовСтр = Праздники.Добавить();
НовСтр.Месяц = 1;
НовСтр.День = 1;
НовСтр = Праздники.Добавить();
НовСтр.Месяц = 2;
НовСтр.День = 23;
НовСтр = Праздники.Добавить();
НовСтр.Месяц = 3;
НовСтр.День = 8;
Для Год = 2010 По 2019 Цикл
РабочихДнейВГоду = 0;
Для Мес = 1 По 12 Цикл
РабочихДнейВМесяце = 0;
МассивПраздников = Праздники.НайтиСтроки(Новый Структура(“Месяц”, Мес));
КолПраздников = 0;
Для каждого Стр Из МассивПраздников Цикл
Если ДеньНедели(Дата(Год,Мес,Стр.День))< 6 Тогда
КолПраздников = КолПраздников+1;
КонецЕсли;
КонецЦикла;
РабочихДнейВМесяце = РабочихДнейВМесяце – КолПраздников;
ДнейВМесяце = День(КонецМесяца(Дата(Год, Мес, 1)));
Для День = 1 По ДнейВМесяце Цикл
Если ДеньНедели(Дата(Год,Мес,День))< 6 Тогда РабочихДнейВМесяце = РабочихДнейВМесяце+1; КонецЕсли;
КонецЦикла;
РабочихДнейВГоду = РабочихДнейВГоду+РабочихДнейВМесяце;
КонецЦикла;
Сообщить(Строка(Год)+ ” год – “+Строка(РабочихДнейВГоду)+” рабочих дней”); КонецЦикла;
КонецПроцедуры
Функция ЭтоРабочийДень(АнализируемаяДата, СписокПраздников)
Если ДеньНедели(АнализируемаяДата) > 5 Тогда
Возврат Ложь;
ИначеЕсли СписокПраздников.НайтиПоЗначению(АнализируемаяДата) <> Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции // ЭтоРабочийДень()
Процедура ВычислениеРабочихДней()
СуткиСек = 60*60*24;
Для Сч = 0 По 10 Цикл
ТекГод = 2010 + Сч;
ТекДата = Дата(2010 + Сч, 1, 1);
КонДата = КонецГода(ТекДата);
СписокПраздников = Новый СписокЗначений;
СписокПраздников.Добавить(Дата(ТекГод, 1, 1));
СписокПраздников.Добавить(Дата(ТекГод, 2,23));
СписокПраздников.Добавить(Дата(ТекГод, 3, 8));
РабочихДней = 0;
Пока ТекДата <= КонДата Цикл
РабочихДней = РабочихДней + ?(ЭтоРабочийДень(ТекДата, СписокПраздников), 1, 0);
ТекДата = ТекДата + СуткиСек;
КонецЦикла;
Сообщить(Строка(ТекГод) + ” – ” + РабочихДней + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры // ВычислениеРабочихДней()
<code>
Функция ЭтоРабочийДень(АнализируемаяДата, СписокПраздников)
Если ДеньНедели(АнализируемаяДата) > 5 Тогда Возврат Ложь;
ИначеЕсли СписокПраздников.НайтиПоЗначению(АнализируемаяДата) <> Неопределено Тогда Возврат Ложь;
Иначе Возврат Истина; КонецЕсли;
КонецФункции
Процедура ВычислениеРабочихДней()
СуткиСек = 60*60*24;
Для Сч = 0 По 10 Цикл
ТекГод = 2010 + Сч;
ТекДата = Дата(2010 + Сч, 1, 1);
КонДата = КонецГода(ТекДата);
СписокПраздников = Новый СписокЗначений; СписокПраздников.Добавить(Дата(ТекГод, 1, 1)); СписокПраздников.Добавить(Дата(ТекГод, 2,23)); СписокПраздников.Добавить(Дата(ТекГод, 3, 8));
РабочихДней = 0;
Пока ТекДата <= КонДата Цикл
РабочихДней = РабочихДней + ?(ЭтоРабочийДень(ТекДата, СписокПраздников), 1, 0);
ТекДата = ТекДата + СуткиСек;
КонецЦикла;
Сообщить(Строка(ТекГод) + ” – ” + РабочихДней + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
</code>
А можно инструкцию по размещению комментариев на форуме? а то у меня хронически “двоится” :(
Постараемся сделать faq.
1.Получил всего дней в году (учитывая високосный год)
2.Получил число не рабочих дней по условию
3. Получил разницу между всего дней в году и нерабочими днями.
4. Дополнительно результат вывел в таб.поле
2010 год – 258
2011 год – 258
2012 год – 259
2013 год – 259
2014 год – 260
2015 год – 259
2016 год – 258
2017 год – 258
2018 год – 258
2019 год – 259
<code>&НаКлиенте
Процедура Рассчитать(Команда)
РассчитатьнаСервере();
КонецПроцедуры
&НаСервере
Процедура РассчитатьНаСервере()
НерабочиеДниНедели = “6,7”;
РассчитываемыйГод = 2010;
ПраздничныеДни = Новый Массив;
ТабЗнач = Новый ТаблицаЗначений;
ТабЗнач.Колонки.Добавить(“Год”);
ТабЗнач.Колонки.Добавить(“КоличествоДней”);
Для Сч = 1 По 10 Цикл //Рассчитываемый год плюс 10 лет
ПраздничныеДни.Добавить(Дата(РассчитываемыйГод,01,01));
ПраздничныеДни.Добавить(Дата(РассчитываемыйГод,02,23));
ПраздничныеДни.Добавить(Дата(РассчитываемыйГод,03,08));
РассчитываемыйГодСтрока = Формат(Дата(РассчитываемыйГод,1,1),”ДФ=гггг”);
КоличествоРабочихДней = РассчитатьГод(РассчитываемыйГодСтрока,НерабочиеДниНедели,ПраздничныеДни);
НоваяСтрока = ТабЗнач.Добавить();
НоваяСтрока.Год = РассчитываемыйГодСтрока;
НоваяСтрока.КоличествоДней = КоличествоРабочихДней;
РассчитываемыйГод = РассчитываемыйГод + 1;
Сообщить(РассчитываемыйГодСтрока + ” год – ” + Строка(КоличествоРабочихДней));
КонецЦикла;
ЗначениеВДанныеФормы(ТабЗнач,РабочиеДниВГоду);
КонецПроцедуры
&НаСервере
Функция РассчитатьГод(РассчитываемыйГод,НерабочиеДниНедели,ПраздничныеДни)
ВсегоДнейВГоду = ДеньГода(РассчитываемыйГод + “1231”);
Сутки = 60*60*24;
ТекущаяДата = Дата(РассчитываемыйГод + “0101”);
КолНерабДней = 0;
// Посчитаем количество нерабочих дней в году
Для Сч = 1 По ВсегоДнейВГоду Цикл
НомерДняНедели = Строка(ДеньНедели(ТекущаяДата));
Если Найти(НерабочиеДниНедели,НомерДняНедели) <> 0 Тогда
КолНерабДней = КолНерабДней + 1;
ИначеЕсли ПраздничныеДни.Найти(ТекущаяДата) <> Неопределено Тогда
КолНерабДней = КолНерабДней + 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата + Сутки;
КонецЦикла;
Возврат ВсегоДнейВГоду – КолНерабДней;
КонецФункции</code>
При решении задания, все – таки, показывать код или ограничиваться пояснениями. Длинный код для комментария – это сколько символов (строк)?
Можно ограничиться пояснениями.
Тот код, который Вы привели можно считать “длинным”. А следующие задания будут более объемными.
Для начала приведу результат (проверял по календарю только 2020 и 2011 года)
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
единственное, что не очень понравилось в результате – окончания “рабочих дней” в последнем результате, но писать отдельную функцию для проверки окончаний было уже лень. )))
Весь код здесь приводить не буду – конфигуратор подсказывает, что там 53 строки. Расскажу кратко об алгоритме и покажу вывод результата.
Может быть конечно и можно было сделать легче и проще, но у меня получилось так:
Два цикла (второй – вложенный).
Первый по количеству лет. (от 1 до 10)
Второй по количеству календарных дней в году.
В начале первого цикла я объявлял три переменные для праздников, по типу:
<code>
ВосьмоеМарта = Дата(Строка(Формат(Год(НачалоГода), “ЧГ=0″)+”0308”));
</code>
далее определял количество секунд в (текущем для цикла) году и устанавливал “ТекущиеСутки” на 00:00:00 начала этого года.
Во втором цикле я рассматривал текущие сутки, если номер дня недели текущих суток совпадал с субботой или воскресеньем – увеличивал переменную “Выходные” на 1,
ИначеЕсли текущие сутки совпадали с праздником – снова увеличивал количество выходных.
Потом в конце первого цикла выводил результат:
<code>
Сообщить((Формат(Год(НачалоГода), “ЧГ=0″)) + ” год – ” + (КоличествоДней – Выходные) + ” рабочих дней”);
</code>
и обнулял количество выходных.
Если смотреть на готовый код – вроде и не так сложно, но я немного “потоптался” с позиционированием текущих суток на 00:00:00.
В первоначальном варианте, счётчик второго цикла увеличивал текущие сутки на шаг в 86400 по количество секунд в году, но потом я пересмотрел решение в целях оптимизации кода. (сократил целых 8 строк)
При необходимости – готов ответить на вопросы (в виде комментариев к моей записи)
Готово
<code>
Функция ВыходнойДень(ткДата)
Возврат ?(ДеньНедели(ткДата)>5,1,0);
КонецФункции
&НаКлиенте
Функция КоличествоРабочихДней(Год)
МассивПраздников = Новый Массив;
МассивПраздников.Добавить(Дата(Год,1,1));
МассивПраздников.Добавить(Дата(Год,2,23));
МассивПраздников.Добавить(Дата(Год,3,8));
ДнейВсего = ?(Год%4 = 0,366,365);
КоличествоНедель = Цел(ДнейВсего/7);
ЧислоВыходных = КоличествоНедель*2 ;
ОстатокДней = ДнейВсего%7;
Для ном = 1 по ОстатокДней Цикл
ЧислоВыходных = ЧислоВыходных + ВыходнойДень(Дата(Год,1,ном));
КонецЦикла;
Для каждого Элемент из МассивПраздников Цикл
ЧислоВыходных = ЧислоВыходных + (НЕ ВыходнойДень(Элемент)) ;
КонецЦикла;
Возврат ДнейВсего – ЧислоВыходных;
КонецФункции
</code>
Год:2011 – 258 дней
Год:2012 – 259 дней
Год:2013 – 259 дней
Год:2014 – 260 дней
Год:2015 – 259 дней
Год:2016 – 258 дней
Год:2017 – 258 дней
Год:2018 – 258 дней
Год:2019 – 259 дней
Год:2020 – 261 дней
По обратной связи: нового было мало, но это связано с тем, что я только что сдала Проф по платформе, получилось некое дублирование . Но в схему все складывается прекрасно после Ваших видео! Замечательная подача материала, все так подробно, доступно и систематизировано!
Затруднений не было. По темам пока доп. вопросов не возникло.
Выполнил. Алгоритм следующий. Программа состоит из трех модулей, в первом берется текущий год и для текущего + 10 лет выполняется указанная операция. Отдельная процедура – проверка дня на праздничность. Если день недели от 0 до 6 – из рабочих дней вычитаем 1.
Процедура проверки текущего года. Смотрим первую неделю, если день первой недели от 0 до 6 (рабочий), тогда РабочиеДни = 6 – ДеньПервойНедели, т.е. рабочие дни от текущего до пятницы этой недели.
Для последней недели – если день недели от 0 до 6 (или от 1 до 5 включительно) – порядковый номер прибавляем к рабочим дням.
Смотрим кол-во дней в текущем году, отнимаем дни первой и последней недель, / 7 * 5 (чтобы получить только рабочие дни).
Касаемо вопросов:
1. Узнал много нового т.к. в 1С никогда не программировал до этого курса. Да и вообще не программировал, только в вузе. Ничего не поменялось, все изучаю с нуля :)
2. Все темы прорабатываю с ручкой, заполняю выданные распечатки слайдов. Сначала просто смотрел кино, когда смотришь – все понятно, а потом ничего не можешь вспомнить. Стал конспектировать и прорабатывать примеры. Все примерно одинаковой сложности.
3. Все возникающие вопросы отсылал в МГ, очень рад что так оперативно отвечаете.
Ах да.
2011 – 253 (в задании 258). у меня ошибка?
2012 – 259
2013 – 259
2014 – 260
2015 – 259
2016 – 253
2017 – 253
2018 – 258
2019 – 259
2020 – 261
2021 – 258
Скорее всего, в задании указана верная цифра.
Возможно в вашем алгоритме закралась небольшая ошибка.
Подождем решения других участников.
Потерял 5 дней в процедуре обработки последней недели, то бишь если день недели 6 или 7 – тогда к рабочим прибавляем 5. Так что там где 253 – должно быть 258 :)
Отлично :)
меньше 258 очень трудно получить, учитывая, что 365 – (52 недели * 2 выходных + 3 праздника (не выходные)). Это если упрощать задачу )))