&НаСервере
Функция РасчетРабочихДнейВГоду(ВыбПериод)
Если НЕ Найти(Строка(ВыбПериод/4),",") ИЛИ НЕ Найти(Строка(ВыбПериод/400),",") Тогда
Високосный = Истина;
ИначеЕсли НЕ Найти(Строка(ВыбПериод/100),",") Тогда
Високосный = Ложь;
Иначе;
Високосный = Ложь;
КонецЕсли;
Месяцы = Новый СписокЗначений;
Месяцы.Добавить(31,"Январь");
Месяцы.Добавить(28,"Февраль");
Месяцы.Добавить(31,"Март");
Месяцы.Добавить(30,"Апрель");
Месяцы.Добавить(31,"Май");
Месяцы.Добавить(30,"Июнь");
Месяцы.Добавить(31,"Июль");
Месяцы.Добавить(31,"Август");
Месяцы.Добавить(30,"Сентябрь");
Месяцы.Добавить(31,"Октябрь");
Месяцы.Добавить(30,"Ноябрь");
Месяцы.Добавить(31,"Декабрь");
МесяцыТЗ = Новый ТаблицаЗначений;
МесяцыТЗ.Колонки.Добавить("ПорядковыйНомер");
МесяцыТЗ.Колонки.Добавить("Наименование");
МесяцыТЗ.Колонки.Добавить("ДнейВМесяце");
МесяцыТЗ.Очистить();
Если Високосный И Элемент.Представление = "Февраль" Тогда
НоваяСтрока.ДнейВМесяце = 29;
КонецЕсли;
КонецЦикла;
ДнейВПериоде = МесяцыТЗ.Итог("ДнейВМесяце");
ДанныеПериода = Новый Структура("МесяцыТЗ, ДнейВПериоде, Праздники",МесяцыТЗ, ДнейВПериоде, Праздники);
//Сообщить("Количество дней в"+Период+" году "+МесяцыТЗ.Итог("КоличествоДней"));
ТекущийГод=Год(ТекущаяДата());
//ТекущийГод=Год('20100101');
ПроверяемыйГод=ТекущийГод;
ПоследнийГодПроверки=ТекущийГод+10;
Пока ПроверяемыйГод<ПоследнийГодПроверки Цикл
ПервыйДеньГода=Дата(ПроверяемыйГод, 1, 1);
ПоследнийДеньГода=КонецГода(ПервыйДеньГода);
ПроверяемаяДата= ПервыйДеньГода;
КоличествоРабочихДней=0;
НГ=ПервыйДеньГода;
ВосьмоеМарта=Дата(ПроверяемыйГод, 3, 8);
ДвадцатьТретьеФевраля= Дата(ПроверяемыйГод, 2, 23);
Пока ПроверяемаяДата<ПоследнийДеньГода Цикл
ПроверяемаяДатаДеньНедели=ДеньНедели(ПроверяемаяДата);
Если ПроверяемаяДатаДеньНедели<>6 И ПроверяемаяДатаДеньНедели<>7 и ПроверяемаяДата<>НГ и ПроверяемаяДата<>ДвадцатьТретьеФевраля и ПроверяемаяДата<>ВосьмоеМарта
Тогда
КоличествоРабочихДней=КоличествоРабочихДней+1;
КонецЕсли;
ПроверяемаяДата=ПроверяемаяДата+86400;
КонецЦикла;
Сообщить("В "+Строка(ПроверяемыйГод) + " году "+КоличествоРабочихДней+" рабочих дней.");
&НаСервере
Процедура РассчитатьДни()
//начальная дата
Дата = '20100101';
//цикл на 6 лет
Для Счетчик=0 по 5 Цикл
//добавляем дни праздников в структура
Праздники = Новый Структура("НГ,ЗО,ЖД", (Дата(Год(Дата),1,1)),(Дата(Год(Дата),2,23)),(Дата(Год(Дата),3,8)));
//количество дней в текущем году
ДнейВГоду = (КонецГода(Дата)+1 - НачалоГода(Дата)) / (3600 * 24);
//обнуляем счётчик
КолвоРабДней = 0;
//проходим по всем дням сравнива сначала их на пренадлежность празднику
Для День=1 по ДнейВГоду Цикл
Для каждого Праздник из Праздники Цикл
Если Дата = Праздник.Значение Тогда
Отдыхаем = Истина;
КонецЕсли;
КонецЦикла;
//Если это вск или сбт или праздник, то скидываем значение праздника для следующего цикла
Если (Дата = НачалоДня(КонецНедели(Дата))) или (Дата = НачалоДня(КонецНедели(Дата)-(24*60*60))) или Отдыхаем Тогда
Отдыхаем = Ложь;
Иначе
КолвоРабДней = КолвоРабДней+1;
КонецЕсли;
//жлюавдяем одну секудн к концу дня, чтобы получить следующий день
Дата = КонецДня(Дата)+1;
КонецЦикла;
ТекГод = (Формат(Год(Дата-1), "ЧГ=0"));
Сообщить(Строка(ТекГод) + " год - " + КолвоРабДней + "рабочих дней");
КонецЦикла;
КонецПроцедуры
Подтянул знания по работе с датой. Гугл помог найти ответы=)
Проработал режим отладки кода. Табло, вычислить выражение и тд.
1. Узнал про обращение к объектам, использование и применение шаблонов и контекстной подсказки.
2. Вынесение алгоритма в функцию из процедуры с переменными.
3. О клиент-серверном взаимодействии.
ТекущаяДата = '2015,01,01';
День = 0;
ТекущийДень = 0;
КолвоРабочихДней = 0;
Год = 2015;
Пока Год <= 2025 Цикл
Если ДеньГода( КонецГода (Дата( Год,12,31 ))) = 366 Тогда
ДнейВГоду = 366;
Иначе ДнейВГоду = 365;
КонецЕсли;
Пока ТекущийДень < ДнейВГоду Цикл
День = ДеньНедели( Дата( ТекущаяДата ));
Если ДеньНедели( Дата( ТекущаяДата )) < 6 И
Дата (ТекущаяДата) ( Дата ( Год,1,1)) И
Дата (ТекущаяДата) ( Дата ( Год,2,23)) И
Дата (ТекущаяДата) ( Дата ( Год,3,8)) Тогда
// вычисляем кол-во дней в текущем месяце
ДнейВТекМесяце = (КонечноеЗначениеДаты - НачальноеЗначениеДаты) / (3600 * 24);
// обходим дни текущего месяца и определяем, который из них является рабочим
Для День = 1 По ДнейВТекМесяце Цикл
Праздник = Ложь;
// пробегаем массив праздников
Для каждого ПраздничныйДень Из Праздники Цикл
Если НачальноеЗначениеДаты = ПраздничныйДень Тогда
Праздник = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ДеньНедели(НачальноеЗначениеДаты) = 6 ИЛИ ДеньНедели(НачальноеЗначениеДаты) = 7 ИЛИ Праздник Тогда
// преходим на следующий день месяца
НачальноеЗначениеДаты = КонецДня(НачальноеЗначениеДаты) + 1;
Иначе
// увеличиваем кол-во рабочих дней
РабочиеДни = РабочиеДни + 1;
НачальноеЗначениеДаты = КонецДня(НачальноеЗначениеДаты) + 1;
КонецЕсли;
КонецЦикла; // конец цикла обхода месяца
// переходим на новый месяц
Дата = ДобавитьМесяц(Дата, 1);
КонецЦикла; // конец цикла обхода года
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Формат(ДобавитьМесяц(Дата, -1), "ДФ = гггг" ) + " год - " + РабочиеДни + " рабочих дней";
Сообщение.Сообщить();
// переходим на новый год
Дата = КонецГода(ДобавитьМесяц(Дата, -1)) + 1;
КонецЦикла; // конец цикла обхода количества лет
КонецПроцедуры
Ответы на вопросы
1. Познакомился с платформой, особенностями ее функционирования.
2. Клиент-серверное взаимодействие.
3. Виды учета, их взаимное влияние.
Добрый день!
Подскажите, где и как настроить, чтобы при использовании шаблонов, например, при вводе “проц” и пробела, выскакивали не только окно для выбора вида процедуры, затем окно для ввода название процедуры, но и окно с выбором препроцессора – на сервере или на клиенте и т.д.?
Доброго дня, Надежда!
Все вопросы по курсу и по домашним заданиям принимаются на email преподавателя — mg@spec8.ru.
Пожалуйста, отправьте Ваш вопрос преподавателю в Мастер-группу и тренер поможет Вам в данной проблеме.
Вход
Важно!
Для новых покупателей Базового курса - с чего начать
...........................................................
Все контакты Саппорта Spec8.ru
...........................................................
Как задавать вопросы по материалам курса и ДЗ
...........................................................
Что такое Мастер-группа
...........................................................
Все материалы этого сайта являются составной частью Базового / Продвинутого курсов по программированию - и являются объектами авторского и имущественного права.
Любое их распространение без письменного согласования с авторами запрещено.
Домашнее задание № 3 Блок 0.
<
Функция РасчетРабочихДнейВГоду(ВыбПериод)
Если НЕ Найти(Строка(ВыбПериод/4),",") ИЛИ НЕ Найти(Строка(ВыбПериод/400),",") Тогда
Високосный = Истина;
ИначеЕсли НЕ Найти(Строка(ВыбПериод/100),",") Тогда
Високосный = Ложь;
Иначе;
Високосный = Ложь;
КонецЕсли;
Месяцы = Новый СписокЗначений;
Месяцы.Добавить(31,"Январь");
Месяцы.Добавить(28,"Февраль");
Месяцы.Добавить(31,"Март");
Месяцы.Добавить(30,"Апрель");
Месяцы.Добавить(31,"Май");
Месяцы.Добавить(30,"Июнь");
Месяцы.Добавить(31,"Июль");
Месяцы.Добавить(31,"Август");
Месяцы.Добавить(30,"Сентябрь");
Месяцы.Добавить(31,"Октябрь");
Месяцы.Добавить(30,"Ноябрь");
Месяцы.Добавить(31,"Декабрь");
МесяцыТЗ = Новый ТаблицаЗначений;
МесяцыТЗ.Колонки.Добавить("ПорядковыйНомер");
МесяцыТЗ.Колонки.Добавить("Наименование");
МесяцыТЗ.Колонки.Добавить("ДнейВМесяце");
МесяцыТЗ.Очистить();
Для каждого Элемент Из Месяцы Цикл
НоваяСтрока = МесяцыТЗ.Добавить();
НоваяСтрока.ПорядковыйНомер = Месяцы.Индекс(Элемент)+1;
НоваяСтрока.Наименование = Элемент.Представление;
НоваяСтрока.ДнейВМесяце = Элемент.Значение;
Если Високосный И Элемент.Представление = "Февраль" Тогда
НоваяСтрока.ДнейВМесяце = 29;
КонецЕсли;
КонецЦикла;
ДнейВПериоде = МесяцыТЗ.Итог("ДнейВМесяце");
ДанныеПериода = Новый Структура("МесяцыТЗ, ДнейВПериоде, Праздники",МесяцыТЗ, ДнейВПериоде, Праздники);
//Сообщить("Количество дней в"+Период+" году "+МесяцыТЗ.Итог("КоличествоДней"));
Возврат ДанныеПериода;
КонецФункции // РасчетРабочихДнейВГоду()
&НаСервере
Процедура РасчитатьДниНаСервере()
ДанныеПериода = РасчетРабочихДнейВГоду(Период);
ДанныеПериода.Свойство("ДнейВПериоде",ДнейВПериодеЗнач);
ДанныеПериода.Свойство("Праздники",ПраздникиЗнач);
Сообщить("В периоде-"+Период+"г."+" Рабочих дней -"+Строка(ДнейВПериодеЗнач-ПраздникиЗнач.Количество())+" .");
КонецПроцедуры // РасчитатьДниНаСервере()
<
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КоличествоДнейВГоду();
КонецПроцедуры
// <Описание функции>
//
// Параметры
// <Параметр1> - <Тип.Вид> - <описание параметра>
// <продолжение описания параметра>
// <Параметр2> - <Тип.Вид> - <описание параметра>
// <продолжение описания параметра>
//
// Возвращаемое значение:
// <Тип.Вид> - <описание возвращаемого значения>
//
&НаСервереБезКонтекста
Функция КоличествоДнейВГоду()
ТекущийГод=Год(ТекущаяДата());
//ТекущийГод=Год('20100101');
ПроверяемыйГод=ТекущийГод;
ПоследнийГодПроверки=ТекущийГод+10;
Пока ПроверяемыйГод<ПоследнийГодПроверки Цикл
ПервыйДеньГода=Дата(ПроверяемыйГод, 1, 1);
ПоследнийДеньГода=КонецГода(ПервыйДеньГода);
ПроверяемаяДата= ПервыйДеньГода;
КоличествоРабочихДней=0;
НГ=ПервыйДеньГода;
ВосьмоеМарта=Дата(ПроверяемыйГод, 3, 8);
ДвадцатьТретьеФевраля= Дата(ПроверяемыйГод, 2, 23);
Пока ПроверяемаяДата<ПоследнийДеньГода Цикл
ПроверяемаяДатаДеньНедели=ДеньНедели(ПроверяемаяДата);
Если ПроверяемаяДатаДеньНедели<>6 И ПроверяемаяДатаДеньНедели<>7 и ПроверяемаяДата<>НГ и ПроверяемаяДата<>ДвадцатьТретьеФевраля и ПроверяемаяДата<>ВосьмоеМарта
Тогда
КоличествоРабочихДней=КоличествоРабочихДней+1;
КонецЕсли;
ПроверяемаяДата=ПроверяемаяДата+86400;
КонецЦикла;
Сообщить("В "+Строка(ПроверяемыйГод) + " году "+КоличествоРабочихДней+" рабочих дней.");
ПроверяемыйГод= ПроверяемыйГод+1;
ПоследнийДеньГода=КонецГода(ПроверяемаяДата);
КонецЦикла;
КонецФункции // КоличествоДнейВГоду()
Проходила курс Быстрый старт поэтому особо не испытывала затруднений при решении задачи. Повторила функции для работы с датами и циклы.
Процедура ВыполнитьОбработку(Команда)
ОчиститьСообщения();
РассчитатьДни();
КонецПроцедуры
&НаСервере
Процедура РассчитатьДни()
//начальная дата
Дата = '20100101';
//цикл на 6 лет
Для Счетчик=0 по 5 Цикл
//добавляем дни праздников в структура
Праздники = Новый Структура("НГ,ЗО,ЖД", (Дата(Год(Дата),1,1)),(Дата(Год(Дата),2,23)),(Дата(Год(Дата),3,8)));
//количество дней в текущем году
ДнейВГоду = (КонецГода(Дата)+1 - НачалоГода(Дата)) / (3600 * 24);
//обнуляем счётчик
КолвоРабДней = 0;
//проходим по всем дням сравнива сначала их на пренадлежность празднику
Для День=1 по ДнейВГоду Цикл
Для каждого Праздник из Праздники Цикл
Если Дата = Праздник.Значение Тогда
Отдыхаем = Истина;
КонецЕсли;
КонецЦикла;
//Если это вск или сбт или праздник, то скидываем значение праздника для следующего цикла
Если (Дата = НачалоДня(КонецНедели(Дата))) или (Дата = НачалоДня(КонецНедели(Дата)-(24*60*60))) или Отдыхаем Тогда
Отдыхаем = Ложь;
Иначе
КолвоРабДней = КолвоРабДней+1;
КонецЕсли;
//жлюавдяем одну секудн к концу дня, чтобы получить следующий день
Дата = КонецДня(Дата)+1;
КонецЦикла;
ТекГод = (Формат(Год(Дата-1), "ЧГ=0"));
Сообщить(Строка(ТекГод) + " год - " + КолвоРабДней + "рабочих дней");
КонецЦикла;
КонецПроцедуры
Подтянул знания по работе с датой. Гугл помог найти ответы=)
Проработал режим отладки кода. Табло, вычислить выражение и тд.
Ответы:
1. Узнал про обращение к объектам, использование и применение шаблонов и контекстной подсказки.
2. Вынесение алгоритма в функцию из процедуры с переменными.
3. О клиент-серверном взаимодействии.
День = 0;
ТекущийДень = 0;
КолвоРабочихДней = 0;
Год = 2015;
Пока Год <= 2025 Цикл
Если ДеньГода( КонецГода (Дата( Год,12,31 ))) = 366 Тогда
ДнейВГоду = 366;
Иначе ДнейВГоду = 365;
КонецЕсли;
Пока ТекущийДень < ДнейВГоду Цикл
День = ДеньНедели( Дата( ТекущаяДата ));
Если ДеньНедели( Дата( ТекущаяДата )) < 6 И
Дата (ТекущаяДата) ( Дата ( Год,1,1)) И
Дата (ТекущаяДата) ( Дата ( Год,2,23)) И
Дата (ТекущаяДата) ( Дата ( Год,3,8)) Тогда
КолвоРабочихДней = КолвоРабочихДней + 1;
КонецЕсли;
ТекущийДень = ТекущийДень + 1;
ТекущаяДата=Строка(Дата(ТекущаяДата) + 3600*24);
КонецЦикла;
Сообщить ("В"+ " " + Год + " " + "году" + " " + КолвоРабочихДней + " " + "рабочих дней");
Год = Год + 1;
КонецЦикла;
Создал внешнюю обработку “ВычислениеРабочихДней”, форму обработки. Разместил на форме команду “ВыполнитьОбработку”.
Процедура ВыполнитьОбработку(Команда)
ОчиститьСообщения();
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
Дата = '20100101'; // начинаем с 2010
// цикл по годам
Для НомерГода = 1 По 10 Цикл
РабочиеДни = 0;
Праздники = Новый Массив;
Праздники.Добавить(Дата(Год(Дата), 1, 1));
Праздники.Добавить(Дата(Год(Дата), 2, 23));
Праздники.Добавить(Дата(Год(Дата), 3, 8));
// цикл по году
Для НомерМесяца = 1 По 12 Цикл
НачальноеЗначениеДаты = НачалоМесяца(Дата);
КонечноеЗначениеДаты = КонецМесяца(Дата) + 1;
// вычисляем кол-во дней в текущем месяце
ДнейВТекМесяце = (КонечноеЗначениеДаты - НачальноеЗначениеДаты) / (3600 * 24);
// обходим дни текущего месяца и определяем, который из них является рабочим
Для День = 1 По ДнейВТекМесяце Цикл
Праздник = Ложь;
// пробегаем массив праздников
Для каждого ПраздничныйДень Из Праздники Цикл
Если НачальноеЗначениеДаты = ПраздничныйДень Тогда
Праздник = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ДеньНедели(НачальноеЗначениеДаты) = 6 ИЛИ ДеньНедели(НачальноеЗначениеДаты) = 7 ИЛИ Праздник Тогда
// преходим на следующий день месяца
НачальноеЗначениеДаты = КонецДня(НачальноеЗначениеДаты) + 1;
Иначе
// увеличиваем кол-во рабочих дней
РабочиеДни = РабочиеДни + 1;
НачальноеЗначениеДаты = КонецДня(НачальноеЗначениеДаты) + 1;
КонецЕсли;
КонецЦикла; // конец цикла обхода месяца
// переходим на новый месяц
Дата = ДобавитьМесяц(Дата, 1);
КонецЦикла; // конец цикла обхода года
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Формат(ДобавитьМесяц(Дата, -1), "ДФ = гггг" ) + " год - " + РабочиеДни + " рабочих дней";
Сообщение.Сообщить();
// переходим на новый год
Дата = КонецГода(ДобавитьМесяц(Дата, -1)) + 1;
КонецЦикла; // конец цикла обхода количества лет
КонецПроцедуры
Ответы на вопросы
1. Познакомился с платформой, особенностями ее функционирования.
2. Клиент-серверное взаимодействие.
3. Виды учета, их взаимное влияние.
Здравствуйте
Не могу скачать домашнее задание для 3 занятия. При попытке скачать его открывается пустое окно и все.
Доброго дня!
Попробуйте повторно. Уточните, пожалуйста, сейчас у Вас возникает ошибка?
Добрый день!
Подскажите, где и как настроить, чтобы при использовании шаблонов, например, при вводе “проц” и пробела, выскакивали не только окно для выбора вида процедуры, затем окно для ввода название процедуры, но и окно с выбором препроцессора – на сервере или на клиенте и т.д.?
Имела в виду директиву компиляции :) Посмотрела шаблоны – в некоторых прописан вызов выбора директивы компиляции.
Доброго дня, Надежда!
Все вопросы по курсу и по домашним заданиям принимаются на email преподавателя — mg@spec8.ru.
Пожалуйста, отправьте Ваш вопрос преподавателю в Мастер-группу и тренер поможет Вам в данной проблеме.