Базовый курс. Занятие №3
Третье занятие по нулевому блоку базового курса.
Необходимо изучить следующие главы 0-го блока.
Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
напишите нам на e-mail поддержки.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
4 дня не работала сеть, поэтому посылаю решение с опозданием
<code>
&НаКлиенте
Процедура СообщитьКоличествоДней(Команда)
Для Год=2010 По 2020 Цикл
Сообщить(“”+год+” – “+КолДнейВГоду(Год));
КонецЦикла;
КонецПроцедуры
Функция ПраздничныйДень(День,Месяц)
Если (День=1 И Месяц=1) ИЛИ (День=23 И Месяц=2)
ИЛИ (День=8 И Месяц=3) Тогда
Возврат
Истина;
Иначе
Возврат
Ложь;
КонецЕсли;
КонецФункции
Функция Выходной(Дата)
Если ДеньНедели(Дата)=6 ИЛИ ДеньНедели(Дата)=7 Тогда
Возврат
Истина;
Иначе
Возврат
Ложь;
КонецЕсли;
КонецФункции //
Функция КолДнейВГоду(Год)
КДН=0; //Количество дней в заданном году
Для Месяц=1 По 12 Цикл
Для День=1 По 31 Цикл
Дата1 = Дата(Год,Месяц,День);
Если КонецМесяца(Дата1)=КонецДня(Дата1) Тогда
Прервать;
КонецЕсли;
Если Выходной(Дата1) ИЛИ ПраздничныйДень(День,Месяц) Тогда
Продолжить;
Иначе
КДН=КДН+1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат
КДН;
КонецФункции // КолДнейВГоду(Год)() <code>
Д/з № 3 Решил:
Код программы (описание чуть позже):
&НаКлиенте
Процедура OK(Команда)
Для Год=2010 По 2041 Цикл
Сообщить (Строка(Год)+” год – “+ПервоеЯнваря(Год));
КонецЦикла;
КонецПроцедуры
Функция ПервоеЯнваря(Год)
ДеньНедели1Янв = (Год-7*Цел(Год/7)+ Цел((Год-1)/4))- 7*Цел(((Год-7*Цел(Год/7)+ Цел((Год-1)/4)))/7);
Если ДеньНедели1Янв=0 или ДеньНедели1Янв=6 Тогда
Возврат 258
ИначеЕсли ДеньНедели1Янв=1 или ДеньНедели1Янв=2 Тогда
возврат ?(Цел(год/4)=год/4,259,258)
ИначеЕсли ДеньНедели1Янв=3 Тогда
возврат ?(Цел(год/4)=год/4,261,259)
ИначеЕсли ДеньНедели1Янв=4 Тогда
возврат ?(Цел(год/4)=год/4,261,260)
Иначе Возврат 259
КонецЕсли;
КонецФункции
&НаКлиентеПроцедура OK(Команда)
Для Год=2010 По 2041 Цикл Сообщить (Строка(Год)+” год – “+ПервоеЯнваря(Год));
КонецЦикла;
КонецПроцедуры
Функция ПервоеЯнваря(Год)
ДеньНедели1Янв = (Год-7*Цел(Год/7)+ Цел((Год-1)/4))- 7*Цел(((Год-7*Цел(Год/7)+ Цел((Год-1)/4)))/7);
Если ДеньНедели1Янв=0 или ДеньНедели1Янв=6 Тогда
Возврат 258
ИначеЕсли ДеньНедели1Янв=1 или ДеньНедели1Янв=2 Тогда
возврат ?(Цел(год/4)=год/4,259,258)
ИначеЕсли ДеньНедели1Янв=3 Тогда
возврат ?(Цел(год/4)=год/4,261,259)
ИначеЕсли ДеньНедели1Янв=4 Тогда
возврат ?(Цел(год/4)=год/4,261,260)
Иначе Возврат 259
КонецЕсли;
КонецФункции
Для ГодП = 2010 По 2020 Цикл
ДнейВгоду = ?(ГодП % 4 = 0, 366,365);
РабДней = 0;
Начало = НачалоГода(Дата(ГодП,1,1));
Для Пер = 1 По ДнейВгоду Цикл
ДеньГ = День(Начало);
МесяцГ = Месяц(Начало);
Если Не (ДеньНедели(Начало) > 5 или (ДеньГ = 23 и МесяцГ = 2) или (ДеньГ = 1 и МесяцГ = 1) или (ДеньГ = 8 и МесяцГ = 3)) Тогда
РабДней = РабДней + 1;
КонецЕсли;
Начало = Начало + 60*60*24;
Состояние(Пер);
КонецЦикла;
// Если
Сообщить(Строка(ГодП) + ” год ” +Строка(РабДней) + ” рабочих дней.”);
КонецЦикла;
Для ГодП = 2010 По 2020 Цикл ДнейВгоду = ?(ГодП % 4 = 0, 366,365); РабДней = 0; Начало = НачалоГода(Дата(ГодП,1,1)); Для Пер = 1 По ДнейВгоду Цикл ДеньГ = День(Начало); МесяцГ = Месяц(Начало); Если Не (ДеньНедели(Начало) > 5 или (ДеньГ = 23 и МесяцГ = 2) или (ДеньГ = 1 и МесяцГ = 1) или (ДеньГ = 8 и МесяцГ = 3)) Тогда РабДней = РабДней + 1; КонецЕсли; Начало = Начало + 60*60*24; Состояние(Пер); КонецЦикла; // Если Сообщить(Строка(ГодП) + ” год ” +Строка(РабДней) + ” рабочих дней.”); КонецЦикла;
Надеюсь, последнее задание, которое выполняю с запозданием…в решения, естественно не смотрел.
Функция подсчета рабочих дней:
начинаю сразу со 2 января, т.к. 1-е выходной и далее по тексту. Праздники храню как день*100 + месяц.
&НаКлиенте
Функция ПосчитатьКоличествоРабочихДней(Год)
Праздники = Новый Массив;
Праздники.Добавить(2302);
Праздники.Добавить(803);
КолВоДней = 0;
ТекДата = Дата(Год,1,2);
КонДата = КонецГода(ТекДата);
Пока ТекДата <= КонДата Цикл
Если (ДеньНедели(ТекДата) < 6) и Праздники.Найти(День(ТекДата)*100+Месяц(ТекДата)) = Неопределено Тогда
КолВоДней = КолВоДней + 1;
КонецЕсли;
ТекДата = ТекДата + 24 * 3600;
КонецЦикла;
Возврат КолВоДней;
КонецФункции // ПосчитатьКоличествоРабочихДней()
ну и вызываю ее в цикле:
Для Сч = 0 По Лет Цикл
Сообщить(“Год ” + Формат(2010+Сч,”ЧГ=0″) + ” – ” + ПосчитатьКоличествоРабочихДней(2010+Сч));
КонецЦикла;
1. Нового было очень мало, в деталях, нежели что-то крупное…Возникло ощущение, что 1С серьезно озадачилось оптимизацией работы, для снижения требований к ресурсам клиентам и каналов связи. На этом фоне пренебрегает некоторыми удобствами, например при создании интерфейса я не нашел как кроме конкретных цифр ширины и высоты менять размеры кнопок и прочих элементов.
2. Затруднений в водном блоке не было, подача материала достаточно хорошая, некоторые моменты через чур детально объяснялись. Понимаю, что курс рассчитан не только на тех, кто с 1С уже работал.
Пожалуй, неудобно было только искать нужный файл к нужной главе.
3. Сразу предвижу ответ, что “более подробно – в продвинутом курсе” :-). От мастер-группы жду темы по переводу с 8.1 на 8.2. Надеюсь на освещение вопроса: “Плюсы/минусы управляемого интерфейса, если сеть 1Гбит и комп пользователя минимум Core 2 Duo”
>Пожалуй, неудобно было только искать нужный файл к нужной главе.
Попробуйте воспользоваться конфигурацией для просмотра курса, она представлена в материалах 1-го блока.
>Плюсы/минусы управляемого интерфейса, если сеть 1Гбит и комп пользователя минимум Core 2 Duo
Управляемый интерфейс, а вернее тонкий клиент рассчитан на то, что можно будет работь с 1С на слабом оборудовании и на тонких каналах связи.
Поэтому говорить о плюсах/минусах управляемого интерфейса в зависимости от оборудования наверное неправильно.
&НаКлиенте
Процедура Команда1(Команда)
Для лет = 2011 По (2011+9) Цикл
_началоГода = Дата(лет,1,1);
_конецГода = Дата(лет,12,31);
_днейВгоду = ДеньГода(_конецГода);
_рабочихДней=0;
_текущийДень = _началоГода;
для _деньВгоду = 0 По _днейВгоду-1 Цикл // обход возможного числа дней в году
_текущийДень = Дата(Дата(лет,1,1)+86400*_деньВгоду);
Если (ДеньНедели(_текущийДень) = 6) или (ДеньНедели(_текущийДень) = 7) Тогда
Продолжить;
КонецЕсли;
Если (День(_текущийДень) = 1) и (Месяц(_текущийДень) = 1) Тогда
Продолжить;
КонецЕсли;
Если (День(_текущийДень) = 23) и (Месяц(_текущийДень) = 2) Тогда
Продолжить;
КонецЕсли;
Если (День(_текущийДень) = 8) и (Месяц(_текущийДень) = 3) Тогда
Продолжить;
КонецЕсли;
_рабочихДней = _рабочихДней + 1;
КонецЦикла;
Сообщить(“”+Формат(лет,”ЧГ=0″) + ” год – “+_рабочихДней+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
Принципиально было придумать самому, хоть и с опозданием. Не стал смотреть другие решения. Теперь внимательно посмотрю. Что касается обратной связи по нулевому блоку: у меня опыт работы только в 7.7, поэтому, конечно, очень непривычно, но очень интересно. Понятно, что есть и общее. В синтакс помощнике пока сложно ориентироваться.
На работе завал дел – выложу в понедельник, сразу оба задания и 3 и 4 – это критично?
Да, нормально.
Сдавала экзамен, догоняю…
1. Не понятно, когда оператор “=” воспринимается системой как оператор сравнения, а когда как оператор присваивания. Наверное, в данном случае, это оператор сравнения, так как значением выражения должен быть параметр метода “Добавить”
2. Разобралась
3.
Выплачено = Начислено + Выплачено;
Начислено = Выплачено – Начислено;
Выплачено = Выплачено – Начислено;
Ой… это к ДЗ №2
Ок.
&НаКлиенте
Процедура Расчитать(Команда)
ГодНачалаПериода=”2010″;
ГодКонецПериода=”2015″;
День=86400;
РабДней=0;
ГодНачала=Дата(ГодНачалаПериода,1,1);
ГодКонец=Дата(ГодКонецПериода,1,1);
Год=Год(ГодНачала);
пока Дата(год,1,1)<=КонецГода(ГодКонец) цикл
Нач=КонецДня(Дата(Год,1,1));
Пока Нач<=КонецГода(Дата(Год,1,1)) Цикл
Если ДеньНедели(Нач)>5 или НачалоДня(Нач)=Дата(год,1,1)
или НачалоДня(Нач)=Дата(год,2,23)или НачалоДня(Нач)=Дата(год,3,8)Тогда
Нач=Нач+День;
Продолжить;
КонецЕсли;
РабДней=РабДней+1;
Нач=Нач+День;
КонецЦикла;
Сообщить(Строка(Год)+” год “+РабДней+” РабДней “);
Год=Год+1;
РабДней=0;
КонецЦикла;
КонецПроцедуры
Вроде работает.
Так как нету опыта работы в 1с пришлось потратить много времени для задания. По поводу нулевого блока для меня всё новое.
Задание выполнено.
Процедура ПриОткрытии(Отказ)
Для СчетчикГодов = 2010 По 2020 Цикл
Праздники = Новый Массив;
Праздники.Добавить(Дата(СчетчикГодов, 1,1));
Праздники.Добавить(Дата(СчетчикГодов, 2,23));
Праздники.Добавить(Дата(СчетчикГодов, 3,8));
ТекущийДень = Дата(СчетчикГодов, 1, 1);
Процедура ПриОткрытии(Отказ)
Для СчетчикГодов = 2010 По 2020 Цикл
Праздники = Новый Массив;
Праздники.Добавить(Дата(СчетчикГодов, 1,1)); Праздники.Добавить(Дата(СчетчикГодов, 2,23)); Праздники.Добавить(Дата(СчетчикГодов, 3,8)); ТекущийДень = Дата(СчетчикГодов, 1, 1); …..
Результат:
2010 – 258 рабочих дней
2011 – 258 рабочих дней
2012 – 259 рабочих дней
2013 – 259 рабочих дней
2014 – 260 рабочих дней
2015 – 259 рабочих дней
2016 – 258 рабочих дней
2017 – 258 рабочих дней
2018 – 258 рабочих дней
2019 – 259 рабочих дней
2020 – 261 рабочий день
1) Узнал много нового, материал изложен очень понятно. Материал 0-блока изучен.
2)Наибольшие затруднения были в Циклах, повторный пересмотр и все встало на свои места.
А также были затруднения с последним домашним заданием, пришлось разбираться с ним целый день.
Может все затруднения из за того что нет опыта работы с 1С, но я стараюсь сложные моменты просматривать по несколько раз и пробовать применять на практике для закрепления знаний.
3)По моему мнению все темы раскрыты достаточно обширно для нулевого блока.
>Может все затруднения из за того что нет опыта работы с 1С
Да, так и есть. Все придет с опытом.
Выполнено
Для Г = 2010 по 2015 Цикл
РД = 0;
Сч = НачалоГода(Дата(Г,1,1));
Пока Сч<=КонецГода(Дата(Г,1,1)) Цикл
Если не ((ДеньНедели(Сч)=6) или (ДеньНедели(Сч)=7) или
(Месяц(сч)=1 и День(сч)=1) или (Месяц(сч)=2 и День(сч)=23)
или (Месяц(сч)=3 и День(сч)=8)) Тогда
Рд = Рд +1;
КонецЕсли;
Сч = Сч +86400;
КонецЦикла;
Сообщить(Строка(Г)+” ” + Строка(РД));
КонецЦикла;
Обратная связь:
1.Ранее работал в 7.7 и в 8.1. Все новое связано с особенностями 8.2 – управляемый интерфейс, обязательное разделение кода на клиенскую и серверную части и т.д.
2.особых затруднений пока не было.
3.Более четкое понимание того, какой код надо писать на клиенте, какой на сервере.
4.Пожелание. Есть описание глав блоков, но как их связать с номерами видео файлов уроков. Например: Глава 4. Общие сведения о платформе – видеофайлы – BlockO-023 — BlockO-29.
4. Скачайте обновленную версию “Просмотра курсов”.
Она теперь работает и с .avi файлами.
http://files.spec8.ru/mgroup/Player/Setup.zip
http://files.spec8.ru/mgroup/Player/Readme.zip
Результат расчета:
2 010 году -258 – рабочих дней
2 011 году -258 – рабочих дней
2 012 году- 260 – рабочих дней
2 013 году- 259 – рабочих дней
2 014 году- 260 – рабочих дней
2 015 году- 259 – рабочих дней
2 016 году- 258 – рабочих дней
2 017 году- 258 – рабочих дней
2 018 году- 258 – рабочих дней
2 019 году- 259 – рабочих дней
2 020 году- 261 – рабочих дней
В моем расчете отличие в 2012году – у меня 260 рабочих дней, у все остальных – 259. В чем ошибка не понимаю. 2012год-високосный. 52*5=260+2=262 – 2 праздника (23.02.12 и 08.03.12)=260.
Задание ДЗ-3 выполнил. Все делал на клиенте.
Метод решения ДЗ-3.
В году 365 или 366 дней, т.е. 365:7=52 недели и один или два дня в високосный год. Максимальное количество рабочих дней в году 52*5=260+1=261 день или 262 дня в високосный год. Из этого максимального количества рабочих дней надо вычесть праздничные дни 1.01; 23.02; 08.03, если они попадают на рабочие дни недели (т.е. день недели праздничного дня <=5).
Есть еще одна особенность. Если в обычном году последний день года выходной, т.е. день недели > 5, тогда количество рабочих дней уменьшается еще на один день. В високосном году если день недели последнего дня года – 6, тогда количество рабочих дней уменьшаем на один день, если день недели последнего дня года – 7, тогда количество рабочих дней уменьшаем на два дня.
<code>
&НаКлиенте
Функция КоличествоРабочихДней(Год)
Если Год%4=0 Тогда
МаксКолРабДней=262;
КолРабДней= МаксКолРабДней;
Если (ДеньНедели(Дата(Год,12,31)))=6 Тогда
КолРабДней=КолРабДней-1;
ИначеЕсли (ДеньНедели(Дата(Год,12,31)))=7 Тогда
КолРабДней=КолРабДней-2;
КонецЕсли;
Иначе
МаксКолРабДней=261;
КолРабДней= МаксКолРабДней;
Если (ДеньНедели(Дата(Год,12,31)))>5 Тогда
КолРабДней=КолРабДней-1;
КонецЕсли;
КонецЕсли;
Возврат КолРабДней
КонецФункции
Функция КоличествоПраздничныхДней(Год)
КолПраздДней=0;
Если (ДеньНедели(Дата(Год,1,1))) <6 Тогда
КолПраздДней=КолПраздДней +1;
КонецЕсли;
Если (ДеньНедели(Дата(Год,2,23))) <6 Тогда
КолПраздДней=КолПраздДней +1;
КонецЕсли;
Если (ДеньНедели(Дата(Год,3,8))) <6 Тогда
КолПраздДней=КолПраздДней +1;
КонецЕсли;
Возврат КолПраздДней
КонецФункции
</code>
В форме обработки создал два реквизита – ГодНачала и КрайнийГод – тип-Дата. Для последнего реквизита написал обработчик событий При Изменении.
<code>
Процедура КрайнийГодПриИзменении(Элемент)
Для ТекГод=Год(ГодНачала) По Год(КрайнийГод) Цикл
РабочиеДни=КоличествоРабочихДней(ТекГод);
Праздники=КоличествоПраздничныхДней(ТекГод);
РабочиеДни=РабочиеДни-Праздники;
Сообщить(Строка(ТекГод)+” год ” + “-” + Строка(РабочиеДни) + “-“+ “рабочих дней”);
КонецЦикла;
КонецПроцедуры
</code>
&НаСервере
Функция КоличествоРабочихДнейВГоду(Год)
НачалоГода = Дата(Год,1,1);
КонецГода = Дата(Год,12,31);
КолвоДнейВГоду = ДеньГода(КонецГода);
СписокПраздников = Новый Массив;
СписокПраздников.Добавить(Дата(Год,1,1));
СписокПраздников.Добавить(Дата(Год,2,23));
СписокПраздников.Добавить(Дата(Год,3,8));
КолвоДнейВПолныхНеделях = КолвоДнейВГоду;
РабочихДнейВПервойНеделе = 0;
Если ДеньНедели(НачалоГода) > 1 тогда
Если ДеньНедели(НачалоГода) < 6 тогда
РабочихДнейВПервойНеделе = 6 – ДеньНедели(НачалоГода);
Конецесли;
КолвоДнейВПолныхНеделях = КолвоДнейВПолныхНеделях – (7 – ДеньНедели(НачалоГода) + 1);
КонецЕсли;
РабочихДнейВПоследнейНеделе = 0;
Если ДеньНедели(КонецГода) < 7 тогда
РабочихДнейВПоследнейНеделе = Мин(5,ДеньНедели(КонецГода));
КолвоДнейВПолныхНеделях = КолвоДнейВПолныхНеделях – ДеньНедели(КонецГода);
КонецЕсли;
КолвоПолныхНедель = КолвоДнейВПолныхНеделях / 7;
КолвоРабочихДней = КолвоПолныхНедель * 5 + РабочихДнейВПервойНеделе + РабочихДнейВПоследнейНеделе;
Для каждого Элемент из СписокПраздников цикл
Если ДеньНедели(Элемент) > 5 тогда
продолжить;
КонецЕсли;
КолвоРабочихДней = КолвоРабочихДней – 1;
КонецЦикла;
возврат КолвоРабочихДней;
КонецФункции
&НаКлиенте
Процедура Тест(Команда)
Для Счетчик = 2010 по 2019 цикл
РабочихДнейВГоду = КоличествоРабочихДнейВГоду(Счетчик);
Сообщить(Строка(Счетчик) + ” год – ” + Строка(РабочихДнейВГоду) + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура КоличествоДней(Команда)
Праздники=3;
НГ=НачалоГода(Год);
КГ= КонецГода(Год)+1;
СекундВСудках= 60*60*24;
// Год – Реквизит формы
ЧислоДнейВГоду= (КГ-НГ)/СекундВСудках;
Счет=2*Окр(ЧислоДнейВГоду/7,0,0);
Счет=Счет+Праздники;
Праздник1 = ДеньНедели(Дата(Год(НГ),1,1));
Праздник2 = ДеньНедели(Дата(Год(НГ),2,23));
Праздник3 = ДеньНедели(Дата(Год(НГ),3,8));
Если Праздник1=6 ИЛИ Праздник1=7 Тогда
Счет=Счет-1;
КонецЕсли ;
Если Праздник2=6 или Праздник2=7 Тогда
Счет=Счет-1;
КонецЕсли ;
Если Праздник3=6 или Праздник3=7 Тогда
Счет=Счет-1;
КонецЕсли ;
Если НеделяГода(НГ)<> НеделяГода(НГ+СекундВСудках) Тогда
Счет=Счет+1;
КонецЕсли;
Если НеделяГода(КГ)<> НеделяГода(КГ+СекундВСудках) Тогда
Счет=Счет+1;
КонецЕсли;
РабочиеДни=ЧислоДнейВГоду-Счет;
Сообщить(Строка(Год(НГ))+” год – “+РабочиеДни+” рабочих дней”);
КонецПроцедуры
НаСервере
Функция ПолучитьКоличествоРабочихДнейВГоду(ТекГод)
Если ((ТекГод % 4 = 0) И (ТекГод % 100 <> 0)) ИЛИ (ТекГод % 400 = 0) Тогда
КоличествоДнейВГоду = 366;
Иначе
КоличествоДнейВГоду = 365;
КонецЕсли;
КоличествоРабочихДней = КоличествоДнейВГоду;
// Определяем количество суббот в году
Для ТекДень = 1 По 31 Цикл
ТекДата = Дата(ТекГод, 1, ТекДень);
НомерДняНедели = ДеньНедели(ТекДата);
Если (НомерДняНедели = 6) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КоличествоСуббот = 0;
Пока ТекДень <= КоличествоДнейВГоду Цикл
КоличествоСуббот = КоличествоСуббот + 1;
ТекДень = ТекДень + 7;
КонецЦикла;
//Определяем количество воскресеней в году
Для ТекДень = 1 По 31 Цикл
ТекДата = Дата(ТекГод, 1, ТекДень);
НомерДняНедели = ДеньНедели(ТекДата);
Если (НомерДняНедели = 7) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КоличествоВоскресений = 0;
Пока ТекДень <= КоличествоДнейВГоду Цикл
КоличествоВоскресений = КоличествоВоскресений + 1;
ТекДень = ТекДень + 7;
КонецЦикла;
КоличествоРабочихДней = КоличествоРабочихДней – КоличествоСуббот – КоличествоВоскресений;
// Проверяем попадание праздничных дней на субботу или воскресенье
Январь1 = Дата(ТекГод, 1, 1);
Если (ДеньНедели(Январь1) < 6) Тогда
КоличествоРабочихДней = КоличествоРабочихДней – 1;
КонецЕсли;
Февраль23 = Дата(ТекГод, 2, 23);
Если (ДеньНедели(Февраль23) < 6) Тогда
КоличествоРабочихДней = КоличествоРабочихДней – 1;
КонецЕсли;
Март8 = Дата(ТекГод, 3, 8);
Если (ДеньНедели(Март8) < 6) Тогда
КоличествоРабочихДней = КоличествоРабочихДней – 1;
КонецЕсли;
Возврат КоличествоРабочихДней
КонецФункции
&НаКлиенте
Процедура Сформировать(Команда)
ТекДата = ТекущаяДата();
НачалоГод = Год(ТекДата) + 1;
КонецГод = НачалоГод + 9;
Для ТекГод = НачалоГод По КонецГод Цикл
РабочиеДни = ПолучитьКоличествоРабочихДнейВГоду(ТекГод);
Сообщить(Строка(ТекГод) + ” год – ” + РабочиеДни + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
Результат:
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>
Процедура ПриОткрытии(Отказ)
Для СчетчикГодов = 2010 По 2020 Цикл
Праздники = Новый Массив;
Праздники.Добавить(Дата(СчетчикГодов, 1,1));
Праздники.Добавить(Дата(СчетчикГодов, 2,23));
Праздники.Добавить(Дата(СчетчикГодов, 3,8));
ТекущийДень = Дата(СчетчикГодов, 1, 1);
КолРабочихДней = 0;
Пока Год(ТекущийДень) = СчетчикГодов Цикл
Если ДеньНедели(ТекущийДень) < 6
и Праздники.Найти(ТекущийДень) = Неопределено Тогда
КолРабочихДней = КолРабочихДней+1;
КонецЕсли;
ТекущийДень = ТекущийДень+60*60*24;
КонецЦикла;
Сообщить(Формат(СчетчикГодов, “ЧГ=”)+ ” год-“+КолРабочихДней+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
</code>
1. Узнал много нового про сервисные функции, быстрые клавиши шаблонов, форматирования, наконец понял как работает Табло в 8.2 Так же появилось понимание неявных преобразований типов данных.
2. Больше всего было вопросов в теме Преобразования примитивных типов данных. Однако, здесь помогло повторное изучение материалов курса после проверочного задания. Т.е. после собственных попыток уже не просто слушаешь, а обращаешь внимание на основные принципы.
3. Трудно сказать, что интересует и относится к О-му блоку. Можно было бы более конкретно рассмотреть тему Терминирующие сообщения. И в частность объект СообщениеПользователю, поскольку в действующих базах применение этого метода сложнее, чем было рассмотрено на примере.
>И в частность объект СообщениеПользователю
С этим объектом мы будем работать далее по курсу.
Задача решена следующим образом:
Два цикла while один обходит года, которые передаются в процедуру как параметры, другой вложенный, дни года. Во вложеном цикле так-же выполняется проверка на выходные и праздничные дни.
Проверка праздничных дней выполняется в отдельной функции
&НаКлиенте
Процедура Посчитать(Команда)
КоличествоДней(2010, 2020);
КонецПроцедуры
&НаКлиенте
Процедура КоличествоДней(НачПериод, КонечПериод)
Пока НачПериод <= КонечПериод Цикл
НачГода = НачалоГода(Дата(НачПериод, 01, 01));
КонГода = КонецГода (Дата(НачПериод, 01, 01));
колДней = 0;
Пока НачГода < КонГода Цикл
ДеньНед = ДеньНедели(НачГода);
Если ДеньНед < 6 И ПразДата(НачПериод, НачГода) Тогда
КолДней = КолДней +1;
КонецЕсли;
НачГода = КонецДня(НачГода)+1;
КонецЦикла;
Сообщить(“В ” + НачПериод+” году ” + КолДней + ” рабочих дней”);
НачПериод = НачПериод+1;
КонецЦикла;
КонецПроцедуры
&НаКлиенте//проверка
Функция ПразДата(ЗначГода, ЗначДаты )
ПрзД1 = Дата(ЗначГода, 01, 01);
ПрзД2 = Дата(ЗначГода, 02, 23);
ПрзД3 = Дата(ЗначГода, 03, 08);
Если ЗначДаты = ПрзД1 ИЛИ ЗначДаты = ПрзД2 ИЛИ ЗначДаты = ПрзД3 Тогда
Возврат Ложь;
Иначе
Возврат истина;
КонецЕсли;
Обратная связь:
1. Новое: особенности в работе с примитивными типами данных, разделение блоков кода на клиентский и серверный
2. Контекст исполнения кода – возникли некоторые затруднения.
3. Хотелось бы подробнее раскрыть методы работы с примитивными типами данных(строки, дата) с использованием встроеных функций языка.
Задание выполнено. Решал через проход в цикле всех дней, определение для каждого дня рабочий он или нет, результат добавлял в таблицу, которую после цикла сворачивал по году. Судя по комментарием, если более быстрые алгоритмы.
Ответы по нулевому модулю:
1. Взгляды поменялись на использование автозамены. Не скажу, что узнал много нового, но 3 момента заставили удивиться.
2. Затруднений не возникло.
3. Хотелось бы раскрыть тему “Виды учета”. По объяснениям я не понял, чем конкретно оперативный учет отличается от управленческого; как соотносятся со временными границами виды учета (часто говорят, что управленческий учет используется для прогнозирования, а бухгалтерский для констатации факта) и т.д.
3. Эта тема будет подробнее раскрыта в блоках 2, 3, 4.
Если вопросы останутся – пишите в мастер-группу.
что нового: 1. горячие кнопки перемещения по циклам условиям и процедурам.
2. командный интерфейс 8.2
3. тонкости не типизированных преобразований, оператора присвоения, и оптимизации условий. конструкторы по строке, свойства и методы по строке…
наибольшие затруднения с 2дз, помогла думалка(=
чего охота: поделитесь опытом использования синтакс помошника(= как быстро найти то что хочешь не зная как оно называется….
>поделитесь опытом использования синтакс помошника(= как быстро найти то что хочешь не зная как оно называется
Пожелание записано.
Сейчас могу подсказать следующий прием: на закладке поиск в СП работает полнотекстовый поиск. Это означает, что система будет искать по части слова, причем не только в названии метода, но и в его описании.
Также применимы логические операторы: И, ИЛИ, НЕ, ()
Пожелание по нулевому блоку. Хотелось бы увидеть обзор аналогов платформы, плюсы-минусы, хотя бы кратко. Ну и мб анализ производительности разных в разных режимах работы и, возможно, по сравнению с другими системами, решающими аналогичные вопросы.
Это пожелание сложно реализовать.
Во-первых, функционал всех систем быстро развивается, и какая-либо сравнительная таблица будет быстро устаревать.
Во-вторых, такой анализ будет субъективным, поскольку я хорошо знаю платформу 1С, и плохо знаю другие ИС.
В- третьих, какой смысл от этого анализа? Полагаю, что платформа 1С является наиболее перспективной на территории СНГ и Восточной Европы.
ВисокосныйГод = НЕ( Год % 4 ) ;
КоличествоДнейВГоду = 365 + ВисокосныйГод ;
ДеньНеделиНачалаГода = ДеньНедели( Дата( Год, 1, 1 ) ) ;
Если ДеньНеделиНачалаГода = 6 Тогда
КоличествоВыходных = 105 + ВисокосныйГод ;
ИначеЕсли ДеньНеделиНачалаГода = 7 Тогда
КоличествоВыходных = 105 ;
Иначе
КоличествоВыходных = 104 ;
КонецЕсли ;
КоличествоПраздников = ( ДеньНедели( Дата( Год, 1, 1 ) ) < 6 ) +
( ДеньНедели( Дата( Год, 2, 23 ) ) < 6 ) +
( ДеньНедели( Дата( Год, 3, 8 ) ) < 6 ) ;
РабочиеДни = КоличествоДнейВГоду-КоличествоВыходных – КоличествоПраздников;
Сообщить(РабочиеДни);
1. Новое в основном в тонкостях работы с 8.2, о чем будет подробное ознакомленее далее
2. Проблем не возникло
3. Хочется подробнее узнать про работу 1с через web-приложением, настройка web – сервиса, тонкости работы
нашел первую ошибку в своем решении – второе янврая получил путем прибавления 1 к первому, а надо было + 60*60*24 или (Год,1,2)
Обратная связь по 0-му Блоку:
по Вашей рекомендации делаю пометки в книге, и правда очень помогает вспомнить моменты, которые фиксировал ранее.
не знал о возможности добавления реквизитов в пользовательском режиме.
еще в одном из уроков говорилось о возможности аутентификации средствами Windows, я так понял будет более подробно рассказываться об этой возможности?
>еще в одном из уроков говорилось о возможности аутентификации средствами Windows, я так понял будет более подробно рассказываться об этой возможности?
Да, у нас будет глава по администрированию в 1-ом блоке.
Сложностей с настройкой быть не должно.
Однако, если после просмотра 1-го блока останутся вопросы, обращайтесь.
Реализовал двумя разными способами: 1. Численный (из года выделяется количество полных рабочих недель выделяя пять рабочих дней, высчитываем количество рабочих дней для первой и последней неделях года, Отдельно проверяю праздничные дни). 2. Итерационный (в цикле считаю количество рабочих дней с проверкой праздничных дней). После замера производительности второй способ оказался почему-то быстрее, хотя прогнозировал наоборот. Геде засада???
<code>
&НаКлиенте
Функция КоличествоРабочихДнейЗаГод(Год)
Дата = Дата(Год,1,1);
НачГодаПерваяПолнаяНеделя = КонецНедели(Дата)+1;
КонГодаПоследняяПолнаяНеделя = НачалоНедели(КонецГода(Дата));
КоличествоРабочихДнейВПервойНеделиГода = Макс(НачГодаПерваяПолнаяНеделя – Дата – 172800, 0 )/86400;
КоличествоРабочихДнейВПоследнейНеделиГода = Мин((КонецГода(Дата)- КонГодаПоследняяПолнаяНеделя+1) /86400 , 5);
КоличествоРабочихДнейВГодуВПолныхРабочихНеделях = (КонГодаПоследняяПолнаяНеделя – НачГодаПерваяПолнаяНеделя)/120960;
ПразднечныеДниВРабочейНеделе = 0;
ПразднечныеДниВРабочейНеделе = ПразднечныеДниВРабочейНеделе + ?(ДеньНедели(Дата(Год,1,1)) < 6, 1, 0);
ПразднечныеДниВРабочейНеделе = ПразднечныеДниВРабочейНеделе + ?(ДеньНедели(Дата(Год,2,23)) < 6, 1, 0);
ПразднечныеДниВРабочейНеделе = ПразднечныеДниВРабочейНеделе + ?(ДеньНедели(Дата(Год,3,8)) < 6, 1, 0);
Возврат КоличествоРабочихДнейВГодуВПолныхРабочихНеделях
+ КоличествоРабочихДнейВПоследнейНеделиГода
+ КоличествоРабочихДнейВПервойНеделиГода
– ПразднечныеДниВРабочейНеделе;
КонецФункции
&НаКлиенте
Функция РабочихДнейВГоду(ТекГод)
ДатаКонцаГода = КонецДня(Дата(ТекГод, 12, 31))+1;
КолРабочихДней = 0;
ТекущаяДата = Дата(ТекГод, 1, 1);
Пока ТекущаяДата < ДатаКонцаГода Цикл
Если (ДеньНедели(ТекущаяДата) < 6) И (ТекущаяДата <> Дата(ТекГод,1,1) И
ТекущаяДата <> Дата(ТекГод,2,23) И
ТекущаяДата <> Дата(ТекГод,3,8)) Тогда
КолРабочихДней = КолРабочихДней + 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата + 24*3600;
КонецЦикла;
Возврат КолРабочихДней;
КонецФункции;
</code>
Некоторые детали материала стали более четкими.
Пока с большими трудностями не столкнулся.
Глава 8 Средства разработчика.
>Геде засада???
Об этом мы поговорим в решении ДЗ№3.
Вот решение ДЗ
&НаКлиенте
Функция УчитыватьПраздник(датаПраздника)
Возврат ?(ДеньНедели(датаПраздника) < 6, 1, 0);
КонецФункции
&НаКлиенте
Функция КоличествоРабочихДней(Год)
НачалоГода = Дата(Год,1,1);
КонецГода = КонецГода(НачалоГода);
КолвоНедель = НеделяГода(КонецГода);
_01_01 = НачалоГода;
_23_02 = Дата(Год, 02, 23);
_08_03 = Дата(Год, 03, 08);
КолВоРабДней = ((КолвоНедель-2) * 5)
+ Мин(5,ДеньНедели(КонецГода))
+ Макс(6-ДеньНедели(НачалоГода),0)
– УчитыватьПраздник(_01_01)
– УчитыватьПраздник(_23_02)
– УчитыватьПраздник(_08_03);
Возврат КолВоРабДней;
КонецФункции
&НаКлиенте
Процедура ВычислениеРабочихДней(Команда)
НачГод = 2010;//Год(ТекущаяДата());
Для Сч = 0 По 9 Цикл
ТекГод = НачГод + Сч;
КолВо_РД = КоличествоРабочихДней(ТекГод);
СтрокаСообщения = “” + ТекГод + ” год – ” + КолВо_РД;
Сообщить(СтрокаСообщения);
КонецЦикла;
КонецПроцедуры
По вопросам:
1. Взгляды не поменялись, но новое узнал по 2 ДЗ :)
2. Пока не небыло.
3. Вроде все что интересует будет дальше раскрываться.
P.S.: Пожелание только одно чтобы сайт мог и по горизонтали растягиваться
Пожелание веб-мастеру передали.
Для решения задачи организовал алгоритм, в котором использую 2 цикла. Первый цикл это цикл годам, т.к. нам необходимо получить результат за следующие 10 лет. Второй цикл это цикл по дням в году. Это цикл отрабатывает внутри цикла по годам. В цикл по дням ведется подсчет количества дней в году без выходных. Далее с помощью отдельной функции получаю количество праздничных не попавших в выходные дни и вычитаю это количество и ранее полученное количество дней в году без выходных. Решил не выискивать праздничные дни в цикле по дням т.к. проверка каждого дня на праздничный он или нет менее производительно, нежели определить это вне цикла отдельно. Код получился небольшой, поэтому прилагаю к комментарию если непонятно описал алгоритм.
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДатаНачальна = НачалоГода(ТекущаяДата());
Для Сч = 0 По 10 Цикл
лпДата = ДобавитьМесяц(ДатаНачальна, Сч*12);
лпКонецГода = КонецГода(лпДата);
КоличествоДней = 0;
Пока лпДата <= лпКонецГода Цикл
Если ДеньНедели(лпДата)<6 Тогда
КоличествоДней = КоличествоДней+1;
КонецЕсли;
лпДата = лпДата + (60*60*24);
КонецЦикла;
КоличествоДней = КоличествоДней – КоличествоПраздничныхДнейНеВВыходные(Год(лпКонецГода));
Сообщить( “” + Год(лпКонецГода) + ” год – ” + КоличествоДней + ” рабочих дней” );
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция КоличествоПраздничныхДнейНеВВыходные(Год)
Возврат (ДеньНедели(Дата(Год, 01, 01))<6)+(ДеньНедели(Дата(Год, 02, 23))<6) + (ДеньНедели(Дата(Год, 03, 08))<6);
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДатаНачальна = НачалоГода(ТекущаяДата());
Для Сч = 0 По 10 Цикл
лпДата = ДобавитьМесяц(ДатаНачальна, Сч*12); лпКонецГода = КонецГода(лпДата); КоличествоДней = 0;
Пока лпДата <= лпКонецГода Цикл
Если ДеньНедели(лпДата)<6 Тогда КоличествоДней = КоличествоДней+1; КонецЕсли; лпДата = лпДата + (60*60*24);
КонецЦикла;
КоличествоДней = КоличествоДней – КоличествоПраздничныхДнейНеВВыходные(Год(лпКонецГода));
Сообщить( “” + Год(лпКонецГода) + ” год – ” + КоличествоДней + ” рабочих дней” ); КонецЦикла;
КонецПроцедуры
&НаСервереФункция КоличествоПраздничныхДнейНеВВыходные(Год) Возврат (ДеньНедели(Дата(Год, 01, 01))<6)+(ДеньНедели(Дата(Год, 02, 23))<6) + (ДеньНедели(Дата(Год, 03, 08))<6);
КонецФункции
</code>
Почему у меня задваевается текст кода внутри <code></code>?
Забыл про обратную связь по Блоку 0:
1.Новое для меня это настройки при создании БД параметры и режимы запуска. Данный блок многое напомнил, освежил в памяти некоторые забытые вещи.
2. Так как имею некий опыт затруднений не было.
3.Создание файлового варианта БД был рассмотрен, а почему бы не рассмотреть клиент-серверный вариант установки. Например есть MS SQL Express он бесплатный, скачиваем, устанавливаем и вперед.
3. Подробно об архитектуре и использовании клиент-серверного варианта говорим в 0-вом блоке продвинутого.
Но есть одна проблема. Для работы серверного варианта можно использовать бесплатную СУБД, однако серверный ключ “1С:Предприятие” все равно нужен.
Такой эффект наблюдается при вставке из буфера обмена.
И возможно при этом вы вручную редактируете код, после вставки в комментарий.
Однако проблема до конца не изучена, работаем над ней..
Да так и было, вставил из буфера и кое что подредактировал.
Да про ключ я забыл…
Выполнено
<code>&НаКлиенте
Процедура Показать(Команда)
Для ЗнГод = 2011 По 2020 Цикл
Сообщить(Строка(ЗнГод) + ” год – ” + КолвоРабочихДней(ЗнГод) + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция КолвоРабочихДней(ТекГод)
МасПраздники = Новый Массив;
МасПраздники.Добавить(Дата(ТекГод,1,1));
МасПраздники.Добавить(Дата(ТекГод,2,23));
МасПраздники.Добавить(Дата(ТекГод,3,8));
НачГода = Дата(ТекГод,1,1);
КонГода = КонецГода(НачГода);
РабДни = 0; ТекДень = НачГода;
Пока ТекДень <= КонГода Цикл
Если РабДеньНедели(ТекДень) Тогда
РабДни = РабДни + 1;
КонецЕсли;
ТекДень = ТекДень + 86400;
КонецЦикла;
Для Каждого Праздник Из МасПраздники Цикл
Если РабДеньНедели(Праздник) Тогда
РабДни = РабДни – 1;
КонецЕсли;
КонецЦикла;
Возврат РабДни;
КонецФункции
&НаСервере
Функция РабДеньНедели(ТекДень)
Денек = ДеньНедели(ТекДень);
Если НЕ (Денек = 6 ИЛИ Денек = 7) Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции</code>
в 0-м блоке главы с 3 по 6 содержали достаточно много новой для меня информации: параметры запуска ИБ, архитектура приложений,приемы работы в пользовательском сеансе управляемого приложения. Также стал привыкать понемногу к использованию булевских выражений в циклах, условиях. Так как большей частью работал с 7.7, то поначалу несколько непривычно было, да и сейчас пока остается. Буду перестраиваться.
Затруднения особо не возникали, пересмотр урока снимал возникающие вопросы.
Хотелось бы наверное поподробнее узнать о различиях директив компиляции(&НаКлиенте,&НаСервере, &НаСервереБезКонтекста). В каких случаях какую применять.
>Хотелось бы наверное поподробнее узнать о различиях директив компиляции
Об этом будем говорить в первом блоке.
Год=Год(ТекущаяДата()); //на текущий год и следующие 10 лет
Для к=Год по (Год+10) цикл
Сообщить(Формат(Год,”ЧГ=0″)+” год – “+ПолучитьКоличествоРабочихДнейВГоду(Год)+” рабочих дней”);
Год=Год+1;
КонецЦикла;
Функция ПолучитьКоличествоРабочихДнейВГоду(Год) осуществляет перебор дней года с проверкой на нерабочие дни – по условию “ДеньНедели(ДеньГода)<=5 И Не ПраздничныйДень(ДеньГода)” добавляем значение счетчика количества дней.
Субботу и воскресенье исключаем по условию “ДеньНедели(ДеньГода)<=5”. Праздничные дни определяем функцией ПраздничныйДень(ДеньГода) (возвращает “истина”, если день входит в список праздничных дней типа Дата(Год(ДеньГода),1,1)).
Используем функции работы с датами Дата(), Год(), КонецГода(), ДеньНедели().
Вопросы:
1) Работа в пользовательском режиме 8.2. Создание двух и более ссылок на одну ИБ в списке баз. Не обращала внимания, что в режиме предприятия есть Табло.
2) Затруднения связаны с отличиями от 8.1.
3) –
Функция ПолучитьКоличествоРабочихДнейВГоду(Год)
//определим первый и последний дни года
ПервыйДеньГода = НачалоГода(Дата(Год,1,1));
ПоследнийДеньГода = КонецГода(Дата(Год,12,31));
//сформируем массив праздничных дней
МассивПраздников = Новый Массив;
МассивПраздников.Добавить(Дата(Год, 1, 1));
МассивПраздников.Добавить(Дата(Год, 2, 23));
МассивПраздников.Добавить(Дата(Год, 3, 8));
//цикл по дням года с 1 по 355(356)
СчётчикРабочихДней = 0;
Для к =ДеньГода(ПервыйДеньГода) по ДеньГода(ПоследнийДеньГода) Цикл
Дата = ПервыйДеньГода + (к-1)*86400;
Если МассивПраздников.Найти(Дата) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Если ДеньНедели(Дата) > 5 Тогда
Продолжить;
КонецЕсли;
СчётчикРабочихДней = СчётчикРабочихДней + 1;
КонецЦикла;
Возврат СчётчикРабочихДней;
КонецФункции
Процедура Команда(Команда)
Для Год = ГодНачало по ГодОкончание Цикл
КолвоДней = ПолучитьКолвоРабДней(Год);
Сообщить (“В ” + Формат(Год,”ЧГ=0″) + ” году рабочих дней: ” + КолвоДней);
КонецЦикла
КонецПроцедуры
Функция ПолучитьКолвоРабДней(Год)
//определим первый и последний дни года
ПервыйДеньГода = НачалоГода(Дата(Год,1,1));
ПоследнийДеньГода = КонецГода(Дата(Год,12,31));
//сформируем массив праздничных дней
МассивПраздников = Новый Массив;
МассивПраздников.Добавить(Дата(Год, 1, 1));
МассивПраздников.Добавить(Дата(Год, 2, 23));
МассивПраздников.Добавить(Дата(Год, 3, 8));
//цикл по дням года с 1 по 355(356)
СчётчикРабочихДней = 0;
Для к =ДеньГода(ПервыйДеньГода) по ДеньГода(ПоследнийДеньГода) Цикл
Дата = ПервыйДеньГода + (к-1)*86400;
Если МассивПраздников.Найти(Дата) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Если ДеньНедели(Дата) > 5 Тогда
Продолжить;
КонецЕсли;
СчётчикРабочихДней = СчётчикРабочихДней + 1;
КонецЦикла;
Возврат СчётчикРабочихДней;
КонецФункции
Результат:
2010 год – 258 рабочих дней
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
2020 год – 261 рабочих дней
Обратная связь
Работаю с 1с 8.1 достаточно давно, поэтому, большинство новшеств, которые удалось узнать, благодаря нулевому блоку курса, связаны с нововведениями 8.2. Но, быстрое перемещение по циклам и условиям, сворачивание и разворачивание кода, думаю, возьму на вооружение. Затруднений в 0-м блоке не возникало. Пожалуй, только вот эти ++ и — с толку сбивали :)
В одном из комментариев прочитал про просьбу подробнее рассмотреть про шаблоны. Присоединяюсь к просьбе, т.к. сейчас я их в работе не использую.
Веду конспект курса в тетради для закрепления материала, выписываю то, на что нашел для себя нового или на что следует обратить внимание в последствии. Если есть заинтересованность в такой информации то, по 0-му блоку готов выложить сюда, благо, что по нему всего 1.5 странички :)
Ведение конспекта – правильная форма обучения.
Только он должен быть у каждого свой, тогда от него будет польза.
О шаблонах поговорим, но я на практике использую типовые шаблоны 1С, этого достаточно.
<code>
Перем МассивПраздников;
Процедура КнопкаСформироватьНажатие(Кнопка)
СтартГод = 2010;
Для Год = СтартГод По СтартГод+10 Цикл
РабочиеДни = 0 ;
Для Месяц=1 По 12 Цикл
ДнейВМесяце = День(КонецМесяца(Дата(Год,Месяц,1)));
Для День=1 По ДнейВМесяце Цикл
тДата = Дата(Год, Месяц, День);
РабочиеДни = РабочиеДни + ?(ДеньНедели(тДата)<6,1,0);
КонецЦикла;
КонецЦикла;
Для каждого эл Из МассивПраздников Цикл
ДатаПраздника = эл;
РабочиеДни = РабочиеДни – ЭтоРабочийДень(ДатаПраздника, Год) ;
КонецЦикла;
сообщить(Формат(Год,”ЧГ=0″)+” год – “+РабочиеДни+” рабочих дней”);
КонецЦикла;
КонецПроцедуры
Функция ЭтоРабочийДень(ДеньПраздника, Год)
ДатаПраздника = Дата(Год, Месяц(ДеньПраздника), День(ДеньПраздника)) ;
Возврат ?(ДеньНедели(ДатаПраздника)<6,1,0);
КонецФункции
МассивПраздников = новый массив();
МассивПраздников.Добавить(Дата(2000, 1, 1));
МассивПраздников.Добавить(Дата(2000, 2, 23));
МассивПраздников.Добавить(Дата(2000, 3, 8));
</code>
<code>
&НаКлиенте
Процедура ПроверкаФункцийДаты(Команда)
Счетчик = 0;
ТекГод = Год(ТекущаяДата());
Для Счетчик = 1 По 10 Цикл
КолВоРабочихДней = ПрохождениеГода(ТекГод);
Сообщить(“”+ТекГод+” год – “+КолВоРабочихДней+” рабочих дней”);
ТекГод = ТекГод + 1;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПрохождениеГода(ТекГод)
РабочихДней = 0;
НачГода = Дата(ТекГод,1,1);
ШагДата = НачГода;
Пока ШагДата <= НачалоДня(КонецГода(НачГода)) Цикл
Если ДеньНедели(ШагДата) < 6 Тогда
РабочихДней = РабочихДней + 1;
КонецЕсли;
ШагДата = ШагДата+86400;
КонецЦикла;
Если ДеньНедели(Дата(ТекГод,1,1))< 6 Тогда
РабочихДней = РабочихДней – 1;
КонецЕсли;
Если ДеньНедели(Дата(ТекГод,2,23))< 6 Тогда
РабочихДней = РабочихДней – 1;
КонецЕсли;
Если ДеньНедели(Дата(ТекГод,3,8))< 6 Тогда
РабочихДней = РабочихДней – 1;
КонецЕсли;
Возврат РабочихДней;
КонецФункции
</code>
Задание Выполнено
&НаКлиенте
Процедура Сформировать(Команда)
Для Год=2011 По 2021 Цикл
Сообщить(Формат(Год,”ЧГ=0″)+”год-“+Строка(КолРабДней(Год))+” рабочих дней”);
КонецЦикла
КонецПроцедуры
&НаСервере
//Кол-во рабочих дней в году
Функция КолРабДней(Знач Год)
Пр1=Дата(Год,1,1); // 1 января
Пр2=Дата(Год,2,23);//23 феврая
Пр3=Дата(Год,3,8);//8 Марта
КолДнГода=ДеньГода(Дата(Год,12,31));//колво дней в году
//Кол Вых за 51 нед+Вых за первую нед+Вых за последнюю нед
КолВыхГода=51*2+ВыхПерваяНеделя(Год)+ВыхПоследняяНеделя(Год);
//Количество Выходных в году с учетом праздников
КолВыхГода=КолВыхГода+ДопВыхПраздник(Пр1)+ДопВыхПраздник(Пр2)+ДопВыхПраздник(Пр3);
ВОзврат КОлДнГода-КолВыхГода;
КонецФункции // КолРабДней()
//Функция определяет дается ли доп. выходной при переносе праздника
Функция ДопВыхПраздник(Дата)
Если (ДеньНедели(Дата)=6) или (ДеньНедели(Дата)=7)
Тогда Возврат 0;
Иначе Возврат 1;
КонецЕсли;
КонецФункции // ДопВыходной()
//Функция определяет количество выходных на первой недели года
Функция ВыхПерваяНеделя(Знач Год)
ПервыйДень=Дата(Год,1,1);
Если (ДеньНедели(ПервыйДень)=7)
Тогда Возврат 1;
Иначе Возврат 2;
КонецЕсли;
КонецФункции
//Функция определяет количество выходных на последней недели года
Функция ВыхПоследняяНеделя(Знач Год)
ПоследнийДень=Дата(Год,12,31);
ДНПоследнийДень=ДеньНедели(ПоследнийДень);
Если (ДНПоследнийДень=7)
Тогда Возврат 2;
ИначеЕсли (ДНПоследнийДень=6)
Тогда Возврат 1;
Иначе Возврат 0;
КонецЕсли;
КонецФункции
Изначально постулируем, что в году у нас 52 полных недели и еще один день который может выпасть на любой день недели, но будет при этом равен дню недели начала года.
Т.е. количество рабочих дней или 261 или 260. Если год високосный – 261 260 или 262
Получается нам нужно обработать всего три условия.
В начале определяем високосный ли год, после проверяем какой день недели 1 января, а потом в функцию отсылаем из списка на проверку праздники.
&НаКлиенте
Функция Перенос(ДеньПраздника,ВсегоДней)
Если (ДеньПраздника<6) тогда
ВсегоДней=ВсегоДней-1;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура Расчитатьдни()
Для Начало=2010 По 2020 Цикл
рабочие=261;
Високосный=?((Окр((Начало/4),2)=Цел(Начало/4)),1,0);
Если Високосный=1 тогда
Если ДеньНедели(Дата(Начало,01,01))=6 тогда
рабочие=260;
ИначеЕсли ДеньНедели(Дата(Начало,01,01))<5 тогда
рабочие=262;
КонецЕсли
ИначеЕсли ДеньНедели(Дата(Начало,01,01))>5 тогда
рабочие=260;
КонецЕсли;
Перенос(ДеньНедели(Дата(Начало,01,01)),рабочие);
Перенос(ДеньНедели(Дата(Начало,02,23)),рабочие);
Перенос(ДеньНедели(Дата(Начало,03,08)),рабочие);
Сообщить(Строка(Начало) + ” ” + Строка(рабочие));
КонецЦикла;
КонецПроцедуры
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. Более полно хотелось бы раскрыть воозможности по установке платформы, обновления разрабатываемых конфигураций (можно ли это делать в автоматическом режиме на серверах клиентов), настройке и управлению кластерами итд… т.е темы больше не для программиста а администратора.
Это достаточно не простые темы, чтобы их раскрыть нужно обладать определенным уровнем знаний.
Поэтому темы отражены в курсе продвинутом.
наберусь терпения – продвинутый курс у меня уже приобретен.
Ok
> кроме одного – когда писать «Справочник» а когда «Справочники» при обращении
В программном коде используете “Справочники”.
В запросах “Справочник”.
О сравнении типов см. соответствующий урок мастер-группы.
А вообще об иерархии классов мы говорим в 1-ом блоке, думаю все встанет на свои места после его изучения.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Для Пер = 2010 По 2019 Цикл
Сообщить(“” + Пер + ” год – ” + РабочиеДниГода(Пер) + ” рабочих дней”);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция РабочиеДниГода(ТекущийГод)
ТекущийДень = Дата(ТекущийГод, 1, 1);
КонецГода = НачалоДня(КонецГода(ТекущийДень));
Сутки = 24 * 60 * 60;
РабочихДнейВГоду = 0;
Пока ТекущийДень <= КонецГода Цикл
Если РабочийДень(ТекущийДень) Тогда
НомерДняНедели = ДеньНедели(ТекущийДень);
Если НомерДняНедели = 6 Или НомерДняНедели = 7 Тогда
// ничего не делаем, выходной день
Иначе
РабочихДнейВГоду = РабочихДнейВГоду + 1;
КонецЕсли;
КонецЕсли;
ТекущийДень = ТекущийДень + Сутки;
КонецЦикла;
Возврат РабочихДнейВГоду;
КонецФункции
&НаСервере
Функция РабочийДень(ДатаРаб)
ГодРаб = Год(ДатаРаб);
ДатаРаб = НачалоДня(ДатаРаб);
Если ДатаРаб = Дата(ГодРаб, 1, 1) // 1 января
ИЛИ ДатаРаб = Дата(ГодРаб, 2, 23) // 23 февраля
Или ДатаРаб = Дата(ГодРаб, 3, 8) Тогда // 8 марта
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции // РабочийДень(ДатаРаб)
В цикле вызывается функция, возвращающая количество рабочих дней в году:
<code>Функция РабочиеДниГода(ТекущийГод)
ТекущийДень = Дата(ТекущийГод, 1, 1);
КонецГода = НачалоДня(КонецГод(ТекущийДень));
Сутки = 24 * 60 * 60;
РабочихДнейВГоду = 0;
Пока ТекущийДень <= КонецГода Цикл
Если РабочийДень(ТекущийДень) Тогда
НомерДняНедели = ДеньНедели(ТекущийДень);
Если НомерДняНедели = 6 Или НомерДняНедели = 7 Тогда
// ничего не делаем, выходной день
Иначе
РабочихДнейВГоду = РабочихДнейВГоду + 1;
КонецЕсли;
КонецЕсли;
ТекущийДень = ТекущийДень + Сутки;
КонецЦикла;
Возврат РабочихДнейВГоду;
КонецФункции
РабочийДень(ДатаРаб)
ГодРаб = Год(ДатаРаб);
ДатаРаб = НачалоДня(ДатаРаб);
Если ДатаРаб = Дата(ГодРаб, 1, 1) // 1 января
ИЛИ ДатаРаб = Дата(ГодРаб, 2, 23) // 23 февраля
Или ДатаРаб = Дата(ГодРаб, 3, 8) Тогда // 8 марта
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции // РабочийДень(ДатаРаб)</code>
Я что-то не пойму, почему у меня текст дублируется. Вроде бы проверяю все перед отправкой, все в порядке, а сообщение получается с дублем.
Это известная проблема, мы над ней работаем..
В нулевом блоке очень интересной для меня была информация, связанная с новыми возможностями 8.2 по сравнению с 8.1, такими как, параллельная работа разных версий платформы, тонкий и толстый клиенты, параметры ИБ.
Затруднений не было.
Все темы были раскрыты очень хорошо.
Год можно условно разделить на 3 части:
1. Первая (не)полная неделя;
2. Полные недели года – это год за вычетом первой и последней недели;
3. Последняя (не)полная неделя года.
Исходя из этого анализируем:
1. Число рабочих дней первой недели года = ?(ЧислоДнейПервойНедели> 2, ЧислоДнейПервойНедели – 2, 0).
2. Число рабочих дней полных недель года = ЧислоДнейПолныхНедель / 7 * 5;
3. Число рабочих дней последней недели года = ?(ЧислоДнейПоследнейНедели > 5, 5, ЧислоДнейПоследнейНедели)
После этого необходимо сделать проверку на праздники, указанные в тексте задания, и при необходимости уменьшить получившееся число рабочих дней:
Если ДеньНедели(ДатаПраздника) < 6 Тогда
ЧислоРабочих = ЧислоРабочих – 1;
КонецЕсли;
Обратная связь:
1. Узнал много нового, в частности, стало понятно, зачем был придуман управляемый интерефейс; интересно было узнать о четком разделении контекста исполнения кода – на клиенте и на сервере; также много нового узнал в части программного кода.
2. Затруднений особых не возникло, разве что с выполнением второго д/з. Преодолеть затруднение помогло повторное обращение к видеоурокам.
3. Когда пытался сделать настройку списка, как это делается в соответствующем видеоуроке, то заметил интересную вещь: система запоминает одни настройки списка (напр., условное оформление) и не запоминает другие (напр., отбор и группировка). Чем вызвано такое поведение системы и можно ли как-то повлиять на это поведение?
>Чем вызвано такое поведение системы и можно ли как-то повлиять на это поведение?
Действительно такое поведение присутствует.
Сделано так, чтобы не запутать пользователя. Например, если бы система запоминала отбор, то возможно пользователь и не догадался бы, что в списке существуют и другие данные, кроме тех, что отображены сейчас. Ведь пользователь мог настроить отбор в списке, а второй раз к этому списку обратиться через месяц. Естественно он забудет, что настраивал отборы.
Переопределить стандартное поведение можно.
Но для этого придется вручную сохранять информацию об отборе и группировки в ИБ (в регистре сведений или в настройках пользователя).
Подробно об этом говорим в 0-вом блоке продвинутого.
Год=2010;
Пока ГОД < 2021 Цикл
РабочиеДни = 260 +
?(ДеньНедели(Дата(ГОД,2,23))<6,-1,0) +
?(ДеньНедели(Дата(ГОД,3,8))<6,-1,0) +
?((ДеньГода(Дата(ГОД,12,31))%7-1) и
ДеньНедели(Дата(ГОД,1,2))<6,1,0); //учитываем високосный
Сообщить(Формат(Год(Дата(ГОД,1,1)),”ЧГ=0″)+
” год – “+ РабочиеДни+” рабочих дней”);
ГОД = ГОД + 1;
КонецЦикла;
Спасибо за тему ” Сервисные средства”. Всегда не хватало времени про это прочитать.
Задание сделано. Из цикла по годам вызываем процедуру расчета дней
Функция РасчитатьКоличествоДнейВГоду(Год)
Праздники = Новый Массив;
Праздники.Добавить(Дата(Год,1,1));
Праздники.Добавить(Дата(Год,2,23));
Праздники.Добавить(Дата(Год,3,8));
НачалоГода = Дата(Год,1,1);
КалендарныхДней = ДеньГода(КонецГода(НачалоГода));
РабочихДней = 0;
Для НомерДня = 1 По КалендарныхДней Цикл
ВысчитываемаяДата = НачалоДня(НачалоГода + 86400 * (НомерДня – 1));
Если Праздники.Найти(ВысчитываемаяДата) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Если НЕ (ДеньНедели(ВысчитываемаяДата) = 6 ИЛИ ДеньНедели(ВысчитываемаяДата) = 7) Тогда // суббота и воскресенье
РабочихДней = РабочихДней + 1;
КонецЕсли;
КонецЦикла;
Возврат РабочихДней;
КонецФункции
Функция РасчитатьКоличествоДнейВГоду(Год)
Праздники = Новый Массив;
Праздники.Добавить(Дата(Год,1,1));
Праздники.Добавить(Дата(Год,2,23));
Праздники.Добавить(Дата(Год,3,8));
НачалоГода = Дата(Год,1,1);
КалендарныхДней = ДеньГода(КонецГода(НачалоГода));
РабочихДней = 0;
Для НомерДня = 1 По КалендарныхДней Цикл
ВысчитываемаяДата = НачалоДня(НачалоГода + 86400 * (НомерДня – 1));
Если Праздники.Найти(ВысчитываемаяДата) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Если НЕ (ДеньНедели(ВысчитываемаяДата) = 6 ИЛИ ДеньНедели(ВысчитываемаяДата) = 7) Тогда // суббота и воскресенье
РабочихДней = РабочихДней + 1;
КонецЕсли;
КонецЦикла;
Возврат РабочихДней;
КонецФункции
1) не знала пару быстрых клавиш, интересно было про управляемый интерфейс, т.к. с обычным знакома, здесь конечно интересно было. Сейчас уже работая в обычном режиме уже думаю что должно выполняться на сервере, что на клиенте.
2) не было сложностей
3) Хотелось бы знать больше про настройки пользовательского интерфейса именно со стороны программиста. Можно ли узнать какие настройки сделал пользователь в своем интерфейсе, отследить это как то программно и где сохраняются эти настройки, чтоб при желании их можно было б использовать как то.
Пользовательские настройки сохраняются в ИБ, с привязкой к пользователю.
Вообще к ним можно обратиться, и например, настройки пользователя Иванов скопировать Петрову.
Но это достаточно кропотливая работа, подробно эту тему рассматриваем в курсе продвинутом.
&НаКлиенте
Процедура ДЗ3(Команда)
янв = ‘20110101’;
фев = ‘20110223’;
март = ‘20110308’;
счет = 2011;
Пока счет < 2021 Цикл
Раб = 261 ;
Если ДеньГода(КонецГода(фев)) = 366 и ДеньНедели(фев) < 6 тогда
Раб = Раб – 1; КонецЕсли;
Если ДеньНедели(янв)<6 тогда Раб = Раб-1; КонецЕсли;
Если ДеньНедели(фев)<6 тогда Раб = Раб-1; КонецЕсли;
Если ДеньНедели(март)<6 тогда Раб = Раб-1; КонецЕсли;
Сообщить(Строка(счет)+ ” – ” + Раб + ” рабочих дней”);
янв = ДобавитьМесяц (янв,12);
фев = ДобавитьМесяц (фев,12);
март = ДобавитьМесяц (март,12);
Счет = Счет + 1;
КонецЦикла; КонецПроцедуры