комментариев 10 на “Базовый курс. Занятие №3”

  1. Aleksandr.nett 07.01.2016 в 09:49

    Домашнее задание № 3 Блок 0.

    <

    &НаСервере
    Функция РасчетРабочихДнейВГоду(ВыбПериод)
         Если НЕ  Найти(Строка(ВыбПериод/4),",")  ИЛИ НЕ Найти(Строка(ВыбПериод/400),",")  Тогда  
             Високосный = Истина;  
         ИначеЕсли  НЕ Найти(Строка(ВыбПериод/100),",")  Тогда
             Високосный = Ложь;
         Иначе;
             Високосный = Ложь;
         КонецЕсли;   
       
                  Месяцы = Новый СписокЗначений;
        Месяцы.Добавить(31,"Январь");
        Месяцы.Добавить(28,"Февраль");
            Месяцы.Добавить(31,"Март");
        Месяцы.Добавить(30,"Апрель");
        Месяцы.Добавить(31,"Май");
        Месяцы.Добавить(30,"Июнь");
        Месяцы.Добавить(31,"Июль");
            Месяцы.Добавить(31,"Август");
        Месяцы.Добавить(30,"Сентябрь");
        Месяцы.Добавить(31,"Октябрь");
        Месяцы.Добавить(30,"Ноябрь");
        Месяцы.Добавить(31,"Декабрь");
       
        МесяцыТЗ = Новый ТаблицаЗначений;
        МесяцыТЗ.Колонки.Добавить("ПорядковыйНомер");
        МесяцыТЗ.Колонки.Добавить("Наименование");
        МесяцыТЗ.Колонки.Добавить("ДнейВМесяце");
        МесяцыТЗ.Очистить();
           
        Для каждого Элемент Из Месяцы  Цикл
           
            НоваяСтрока = МесяцыТЗ.Добавить();
            НоваяСтрока.ПорядковыйНомер = Месяцы.Индекс(Элемент)+1;
            НоваяСтрока.Наименование      = Элемент.Представление;
            НоваяСтрока.ДнейВМесяце       = Элемент.Значение;
           
            Если Високосный  И Элемент.Представление = "Февраль" Тогда
                НоваяСтрока.ДнейВМесяце = 29;  
            КонецЕсли;            
        КонецЦикла;  
        ДнейВПериоде =  МесяцыТЗ.Итог("ДнейВМесяце");
       
        ДанныеПериода = Новый Структура("МесяцыТЗ, ДнейВПериоде, Праздники",МесяцыТЗ, ДнейВПериоде, Праздники);
        //Сообщить("Количество дней в"+Период+" году "+МесяцыТЗ.Итог("КоличествоДней"));

        Возврат  ДанныеПериода;
    КонецФункции // РасчетРабочихДнейВГоду()

    &НаСервере
    Процедура РасчитатьДниНаСервере()

    ДанныеПериода =    РасчетРабочихДнейВГоду(Период);
    ДанныеПериода.Свойство("ДнейВПериоде",ДнейВПериодеЗнач);
    ДанныеПериода.Свойство("Праздники",ПраздникиЗнач);

    Сообщить("В периоде-"+Период+"г."+" Рабочих дней -"+Строка(ДнейВПериодеЗнач-ПраздникиЗнач.Количество())+" .");  

    КонецПроцедуры // РасчитатьДниНаСервере()
    <
  2. &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        КоличествоДнейВГоду();  
    КонецПроцедуры

    // <Описание функции>
    //
    // Параметры
    //  <Параметр1>  - <Тип.Вид> - <описание параметра>
    //                 <продолжение описания параметра>
    //  <Параметр2>  - <Тип.Вид> - <описание параметра>
    //                 <продолжение описания параметра>
    //
    // Возвращаемое значение:
    //   <Тип.Вид>   - <описание возвращаемого значения>
    //
    &НаСервереБезКонтекста
    Функция КоличествоДнейВГоду()
       
        ТекущийГод=Год(ТекущаяДата());
        //ТекущийГод=Год('20100101');
        ПроверяемыйГод=ТекущийГод;
        ПоследнийГодПроверки=ТекущийГод+10;
        Пока ПроверяемыйГод<ПоследнийГодПроверки Цикл
            ПервыйДеньГода=Дата(ПроверяемыйГод, 1, 1);
            ПоследнийДеньГода=КонецГода(ПервыйДеньГода);
            ПроверяемаяДата= ПервыйДеньГода;
            КоличествоРабочихДней=0;
            НГ=ПервыйДеньГода;
            ВосьмоеМарта=Дата(ПроверяемыйГод, 3, 8);
            ДвадцатьТретьеФевраля= Дата(ПроверяемыйГод, 2, 23);
            Пока  ПроверяемаяДата<ПоследнийДеньГода  Цикл
                ПроверяемаяДатаДеньНедели=ДеньНедели(ПроверяемаяДата);
                Если    ПроверяемаяДатаДеньНедели<>6 И ПроверяемаяДатаДеньНедели<>7 и  ПроверяемаяДата<>НГ и ПроверяемаяДата<>ДвадцатьТретьеФевраля и ПроверяемаяДата<>ВосьмоеМарта
                    Тогда
                          КоличествоРабочихДней=КоличествоРабочихДней+1;
                КонецЕсли;
                ПроверяемаяДата=ПроверяемаяДата+86400;   
            КонецЦикла;
           
        Сообщить("В "+Строка(ПроверяемыйГод) + " году "+КоличествоРабочихДней+" рабочих дней.");
           
        ПроверяемыйГод=   ПроверяемыйГод+1;
        ПоследнийДеньГода=КонецГода(ПроверяемаяДата);

        КонецЦикла;
       
    КонецФункции // КоличествоДнейВГоду()

    Проходила курс Быстрый старт поэтому особо не испытывала затруднений при решении задачи. Повторила функции для работы с датами и циклы.

  3. Кирилл 17.10.2015 в 01:19
    &НаКлиенте
    Процедура ВыполнитьОбработку(Команда)
       
        ОчиститьСообщения();
        РассчитатьДни();
       
    КонецПроцедуры

    &НаСервере
    Процедура РассчитатьДни()
        //начальная дата
        Дата = '20100101';
        //цикл на 6 лет
        Для Счетчик=0 по 5 Цикл
        //добавляем дни праздников в структура 
        Праздники = Новый Структура("НГ,ЗО,ЖД", (Дата(Год(Дата),1,1)),(Дата(Год(Дата),2,23)),(Дата(Год(Дата),3,8)));
        //количество дней в текущем году
        ДнейВГоду = (КонецГода(Дата)+1 - НачалоГода(Дата)) / (3600 * 24);
        //обнуляем счётчик
        КолвоРабДней = 0;
        //проходим по всем дням сравнива сначала их на пренадлежность празднику
        Для День=1 по ДнейВГоду Цикл
            Для каждого Праздник из Праздники Цикл
                Если Дата = Праздник.Значение Тогда
                    Отдыхаем = Истина;                           
                КонецЕсли;
            КонецЦикла;
            //Если это вск или сбт или праздник, то скидываем значение праздника для следующего цикла
            Если (Дата = НачалоДня(КонецНедели(Дата))) или (Дата = НачалоДня(КонецНедели(Дата)-(24*60*60))) или Отдыхаем Тогда  
                Отдыхаем = Ложь;
            Иначе
                КолвоРабДней = КолвоРабДней+1;
            КонецЕсли;
            //жлюавдяем одну секудн к концу дня, чтобы получить следующий день
            Дата = КонецДня(Дата)+1;
        КонецЦикла;
        ТекГод = (Формат(Год(Дата-1), "ЧГ=0"));
        Сообщить(Строка(ТекГод)  + " год - " + КолвоРабДней + "рабочих дней");
    КонецЦикла;

    КонецПроцедуры

    Подтянул знания по работе с датой. Гугл помог найти ответы=)
    Проработал режим отладки кода. Табло, вычислить выражение и тд.

  4. Ответы:

    1. Узнал про обращение к объектам, использование и применение шаблонов и контекстной подсказки.
    2. Вынесение алгоритма в функцию из процедуры с переменными.
    3. О клиент-серверном взаимодействии.

    ТекущаяДата = '2015,01,01';
    День = 0;
    ТекущийДень = 0;
    КолвоРабочихДней = 0;
    Год = 2015;
           
       
    Пока Год &lt;= 2025 Цикл
           
        Если ДеньГода( КонецГода (Дата( Год,12,31 ))) = 366  Тогда
               
                ДнейВГоду = 366;
                           
            Иначе ДнейВГоду = 365;
                           
            КонецЕсли;
           
            Пока ТекущийДень &lt; ДнейВГоду Цикл
               
            День = ДеньНедели( Дата( ТекущаяДата ));
               
            Если ДеньНедели( Дата( ТекущаяДата )) &lt; 6 И
            Дата (ТекущаяДата)  ( Дата ( Год,1,1)) И
            Дата (ТекущаяДата)  ( Дата ( Год,2,23)) И
            Дата (ТекущаяДата)  ( Дата ( Год,3,8)) Тогда
                   
            КолвоРабочихДней = КолвоРабочихДней + 1;
                   
            КонецЕсли;
               
            ТекущийДень = ТекущийДень + 1;
            ТекущаяДата=Строка(Дата(ТекущаяДата) + 3600*24);
               
            КонецЦикла;
       
    Сообщить ("В"+ " " + Год + " " + "году" + " " + КолвоРабочихДней + " " + "рабочих дней");
               
            Год = Год + 1;
               
        КонецЦикла;
  5. Создал внешнюю обработку “ВычислениеРабочихДней”, форму обработки. Разместил на форме команду “ВыполнитьОбработку”.

    &НаКлиенте
    Процедура ВыполнитьОбработку(Команда)
       
        ОчиститьСообщения();
        ВыполнитьНаСервере();
       
    КонецПроцедуры

    &НаСервере
    Процедура ВыполнитьНаСервере()  
       
        Дата = '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. Виды учета, их взаимное влияние.

  6. Здравствуйте

    Не могу скачать домашнее задание для 3 занятия. При попытке скачать его открывается пустое окно и все.

    • Татьяна Гужавина 14.10.2015 в 08:09

      Доброго дня!
      Попробуйте повторно. Уточните, пожалуйста, сейчас у Вас возникает ошибка?

  7. Надежда 13.10.2015 в 12:36

    Добрый день!
    Подскажите, где и как настроить, чтобы при использовании шаблонов, например, при вводе “проц” и пробела, выскакивали не только окно для выбора вида процедуры, затем окно для ввода название процедуры, но и окно с выбором препроцессора – на сервере или на клиенте и т.д.?

    • Надежда 13.10.2015 в 12:54

      Имела в виду директиву компиляции :) Посмотрела шаблоны – в некоторых прописан вызов выбора директивы компиляции.

      • Татьяна Гужавина 13.10.2015 в 13:42

        Доброго дня, Надежда!
        Все вопросы по курсу и по домашним заданиям принимаются на email преподавателя — mg@spec8.ru.
        Пожалуйста, отправьте Ваш вопрос преподавателю в Мастер-группу и тренер поможет Вам в данной проблеме.