Базовый курс. Домашнее задание №3
Третье задание по 0-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 0-го блока.
Глава 11. Программный код
Глава 12. Примитивные типы данных
Глава 13. Контекст исполнения кода
Глава 14. Объектная техника
Глава 15. Сервисные средства по написанию кода
Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Процедура сформировать(Команда)
Выходные = Новый Структура();
КолСекВДне=24*60*60;
Для нмргода=2010 По 2020 Цикл
СтрГод=СтрЗаменить(СТРОКА(нмргода),Символы.НПП,””);
НачГод=НачалоГода(Дата(строка(нмргода),”01″,”01″));
КонГод=КонецГода(Дата(строка(нмргода),”01″,”01″));
КОлДней=Окр((КонГод-НачГод)/КолСекВДне);
КолРабДней=0;
ТекДен=НачГод;
Для счдней=1 По колдней Цикл
ДДММ=Формат(ТекДен,”ДФ=””ддММ”””);
Если ддмм=”0101″ или ддмм=”2302″ или ддмм=”0803″ тогда
иначе
Если ДеньНедели(ТекДен)<6 тогда
КолРабДней=КолРабДней+1;
КонецЕсли;
КонецЕсли;
ТекДен=НачГод+счдней*КолСекВДне;
КонецЦикла;
Выходные.Вставить(“Год” + СтрГод,КолДней-КолРабДней);
Сообщить(Строка(СтрГод) + ” год – ” + КолРабДней+” рабочих дней”);
КонецЦикла;
Сообщить(Выходные.Год2014);
КонецПроцедуры
По поводу обратной связи : пока все устраивает, все понятно.
Актуально = Ложь;Колдней = 0;
Пока ГодДата <= ПослГод Цикл
ВсегоДней = (Дата(ГодДата,12,31,0,0,1) – Дата(ГодДата,1,1,0,0,1))/(3600* 24);
Если ВсегоДней = 364 и Актуально Тогда
Сообщить(“” + ГодДата + ” год-” + КолДней + ” рабочих дней”);
Иначе
Колдней = 260 – ?(ДеньНедели(Дата(ГодДата,2,23)) < 6,1,0)
– ?(ДеньНедели(Дата(ГодДата,3,8)) < 6,1,0)
– ?(ДеньНедели(Дата(ГодДата,1,1)) < 6,1,0)
+ ?(Колдней <> 364,?(ДеньНедели(Дата(ГодДата,12,31)) < 6,1,0),0);
Актуально = ВсегоДней <> 365;
Сообщить(“” + ГодДата + ” год-” + КолДней + ” рабочих дней”);
КонецЕсли;
ГодДата = ГодДата + 1;
КонецЦикла;
1. В основном систематизировались знания.
2.Пока без затруднений.
3. Пока таких тем не вижу.
ДЗ №3 не вызвала особых затруднений, единственное с чем пришлось немного покопаться, так это при присваивании ключа в структуре (наличие пробела при выведении года, никак не получалось убрать пока не посмотрела, что народ использует Формат(Год, “ЧГ=0”))
Код моей обработки:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ВыходныеДни = Новый Структура;
Для Год = 2010 По 2020 Цикл
РабДней = 0;
Для Месяц=1 По 12 Цикл
ТекДатаМесяца = Дата(Год,Месяц,1);
КонМес = КонецМесяца(ТекДатаМесяца);
КолДнейВМес = День(КонМес);
Для День = 1 По КолДнейВМес Цикл
ТекДатаМесяцаДень = Дата(Год,Месяц,День);
ДеньНедели = ДеньНедели (ТекДатаМесяцаДень);
Если ДеньНедели>=6 Тогда // суббота, воскресенье
Продолжить;
ИначеЕсли День = 1 и Месяц = 1 Тогда
Продолжить;
ИначеЕсли День = 23 и Месяц = 2 Тогда
Продолжить;
ИначеЕсли День = 8 и Месяц = 3 Тогда
Продолжить;
КонецЕсли;
РабДней = РабДней+1;
КонецЦикла;
КонецЦикла;
Сообщить(Строка(Год) + ” год – ” + РабДней + ” рабочих дней”);
Ключ = Строка(“Год”)+Формат(Год,”ЧГ=0″);
ВыходныеДни.Вставить(Ключ,РабДней);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
Результат :
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. Что нового:
-открыла для себя перемещение по конструкциям Если и Цикл с помощью клавиш CTRL+{} (очень удобно)
– разобралась со знаком =, когда это присвоение, а когда сравнение
– систематизировала общее представление о структуре построения базы 8-ки, размера ее таблиц, отличия файлового и клиент-серверного варианта
– много инетрессного узнала о настройке рабочего стола (ссылки на избранное, изменение форм в пользовательском режиме и т.п.)
2.Затруднений особых не возникло, все рассказано доступно и понятно.
3. Пока затрудняюсь ответить, так как с 8-й практически не работала и только начинаю ее изучение.
Задание выполнил
Функция ВисокосныйГод(Дата);
Если ((Дата % 4 = 0) и (Дата % 100 <> 0)) или (Дата % 400 = 0) Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция ВисокосныйГод(Дата); Если ((Дата % 4 = 0) и (Дата % 100 <> 0)) или (Дата % 400 = 0) Тогда Возврат Истина; КонецЕсли; Возврат Ложь;КонецФункции
Функция ЭтоВыходной(Дата)
День = ДеньНедели(Дата);
Возврат (День = 6) или (День = 7);
КонецФункции
Процедура Команда1(Команда)
ВыходныеДни = Новый Структура;
Дата = ТекущаяДата();
ДатаГод = Год(ТекущаяДата());
КонЦикла = ДатаГод + 10;
Пока ДатаГод < КонЦикла Цикл
Если ВисокосныйГод(ДатаГод) Тогда
РабочихДней = 262;
Иначе
РабочихДней = 261;
КонецЕсли;
Если НЕ ЭтоВыходной(Дата(ДатаГод,1,1)) Тогда
РабочихДней = РабочихДней – 1;
КонецЕсли;
Если НЕ ЭтоВыходной(Дата(ДатаГод,2,23)) Тогда
РабочихДней = РабочихДней – 1;
КонецЕсли;
Если НЕ ЭтоВыходной(Дата(ДатаГод,3,8)) Тогда
РабочихДней = РабочихДней – 1;
КонецЕсли;
ВыходныеДни.Вставить(“Год”+Формат(ДатаГод, “ЧГ=0”),РабочихДней);
Сообщить(ВыходныеДни[“Год”+Формат(ДатаГод, “ЧГ=0”)]);
ДатаГод = ДатаГод + 1;
КонецЦикла;
КонецПроцедуры
В 2011 году получилось 259 дней, 1 января выпадает на субботу его не переносим. или это только у меня так?
По поводу вопросов
1. Да для меня вообще все в новинку до этого программировал только на 7.7.
2. Затруднений небыло.
3. Примитивные типы данных а конкретно хотелось бы узнать основные функции для работы сними.
У меня в 2011 получилось 258 рабочих дней.
По такому алгоритму наверно изначальное количество рабочих дней в невисокосном году = 260. 52 недели по 5 дней в каждой. И отдельно проверять 1-е января.
А то получается 261 включает в себя 1-е января как рабочий. И дальнейшая проверка, если 1-е все-таки выходной ничего не изменяет.
что-то типа так:
Процедура Команда12(Команда)
Перем Датт, текгод, ВыходныеДни, День, Неделя, тмп_дней;
Датт=ТекущаяДата(); текгод=2010;
День=3600*24; Неделя=День*7;
ВыходныеДни = Новый Структура;
Для и1=1 По 10 Цикл
Датт=НачалоГода(Датт)+День;
тмп_дней=0;
Пр=ДеньНедели(Дата(текгод,2,23));
Если Пр<6 Тогда
тмп_дней=-1;
КонецЕсли;
Пр=ДеньНедели(Дата(текгод,3,8));
Если Пр<6 Тогда
тмп_дней=тмп_дней-1;
КонецЕсли;
// целиком недели
нед=Цел((1+ДеньГода(КонецГода(Датт))-ДеньГода(Датт))/7);
тмп_дней=тмп_дней+5*нед;
Датт1=КонецГода(Датт);
Датт=Датт+Неделя*нед;
// остатки последней недели
Пока Датт<=Датт1 Цикл
Если ДеньНедели(Датт)<6 Тогда
тмп_дней=тмп_дней+1;
КонецЕсли;
Датт=Датт+День;
КонецЦикла;
Предупреждение(“В “+текгод+”г. будет “+тмп_дней+” рабочих дней”);
Вых=ДеньГода(Датт-День) – тмп_дней;
тмп_ключ=Строка(“Год”+СокрЛП(Строка(текгод)));
// тмп_ключ=”ААА”;
ВыходныеДни.Вставить(тмп_ключ, Вых);
текгод=текгод+1;
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
по данным табло отладчика всё нормально но не даёт вставлять в структуру с именем содержащим цифры… проблемма не в релизе платформы(8.2.11.235)?
Нет, проблема не в релизе.
Ключ должен удовлетворять требованиям к идентификатору.
Действительно… если посмотреть внимательнее на табло то преобразование Строка() втыкает по умолчанию разделитель пробел между триатами… В 7.7 таких фокусов не было…
И по поводу дополнительных вопросов:
1. Было новое, да и старое хорошо систематизировалось. Про контекстные подсказки и шаблоны не знала некоторые вещи, которые делают жизнь проще.
2. По сути затруднений не было, только со временем… но это жизнь.
3. Все хорошо изложено. Может быть стоило бы приводить примеры обработок не только на управляемый формах тонкого клиента, но и на обычных толстого. Осталось непонимание, как в реальной жизни делается: по две разные формы на один объект, для тонкого и толстого, с разными элементами и алгоритмами их заполнения и обработки? Очень трудоемко… Или делят: этот объект для толстых, а этот для тонких? Смотрела типовую бухгалтерию, там на вид все формы обычные, а где ж управляемые? Возможно я бегу впереди паровоза, просто осталось непонимание по этому моменту.
3. В большинстве случаев сейчас рекомендуется создавать управляемые формы (они доступны и в обычном режиме запуска).
Исключением является создание специализированных форм, у которых жесткие требования к оформлению (в управляемых формах нельзя размещать элементы абсолютно произвольным образом).
Задание сделала следующим образом
Цикл по годам (2010 по 2020)
Через функцию Формат избавлюсь от пробела в годе при преобразовании в строку.
Вложенный цикл по месяца ( 1 по 12)
Определяю количество дней в месяце
Вложенный цикл по днем(1 по КолДнейМесяц)
Через функцию ДеньНедели определяю какой день недели. Если возвращаемое значение равно не равно 6 и не равно 7 и день не 0101 и не 0223 и не 0308 тогда увеличиваю количество рабочих дней иначе увеличиваю количество выходных дней.
После выхода из 2 цикла
ВыходныеДни.Вставить(“Год” + Год, КоличествоВыходныхДней);
С помощью метода Сообщить вывожу количество рабочих дней
Поле выхода из 3 цикла
Сообщить(ВыходныеДни.Год2014);
По вопросам:
1. С платформой 8.2 до начала изучения курса не работала, так что все что касалось отличий для меня ново. Да и вообще как то систематизировалось знания в голове.
2. Затруднения особых не было, если возникали вопросы обращалась к Синтаксис- помощнику и смотрела в Табло отладчика.
3. По текущему блоку пока вопросов нет
Задание выполнил,
2010 год – 258 рабочих дней
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
со структуре немного замялся, но потом заработала, в цикле по году заполняются значения с соответствующими ключами, потом выводит.
Сообщить(Формат(год,”ЧГ=0″)+ ” год – “+раб+” рабочих дней”);
//присвоение значений структуре с разными ключами
ВыходныеДни.Вставить(“Год”+формат(год,”ЧГ=0”),вых);
КонецЦикла;
Сообщить(ВыходныеДни.Год2012);
1) Для меня все ново т.к. осваиваю с 0.
2) первые два задания дались намного легче, на третьем пришлось повозиться
3) пока затрудняюсь ответить
Задание выполнил, небольшое затруднение вызвал неразрывный пробел при добавлении года в структуру.
Из нулевого блока узнал много новых горячих клавиш, которыми усердно начал пользоваться. Увидел, что при разработке под платформой 8 можно обходиться без мышки.
Затруднений не встретил, тк материал по большей части знаком.
Тем для мастер групп не нашел.
ДЗ выполнил:
ВыходныеДни = Новый Структура;
Для ТекГод=2010 По 2020 Цикл
Високосный = День(КонецМесяца(Дата(ТекГод,02,01)))%28;
ВидГода = ДеньНедели(Дата(ТекГод,01,01));
Если Високосный И (ВидГода=2 ИЛИ ВидГода=3) Тогда РабочихДней=261;
ИначеЕсли ВидГода=3 Тогда РабочихДней=260;
ИначеЕсли ВидГода=2 ИЛИ ВидГода=4 ИЛИ (Високосный И (ВидГода=7 ИЛИ ВидГода=1)) Тогда РабочихДней=259;
Иначе РабочихДней=258; КонецЕсли;
Сообщить (Формат(ТекГод,”ЧГ=4″)+” год – “+РабочихДней+” рабочих дней”);
ВыходныеДни.Вставить(“Год”+Формат(ТекГод,”ЧГ=4”), 365+Високосный-РабочихДней);
КонецЦикла;
Сообщить (ВыходныеДни.Год2014);
Угадываю количество рабочих дней по номеру дня недели 1-го января анализируемого года с учетом его высокосности. Считаю, что нет смысла в каждом рабочем цикле обработки просчитывать дни, если на этапе анализа задачи очевидно, что вариантов всего 4 и они легко описываются вышеназванными условиями.
Пробел в формате даты вызвал негативные эмоции в отношении мышки, клавиатуры и монитора, но был найден и побежден :)
Прошу прощения, за острым недостатком времени обратную связь сделаю на выходных.
Т.е. “…пробел в формате числа…” конечно, извиняюсь :)
Вот вариация решения, в ней более очевиден алгоритм, да и короче на пару строк :)
ТаблДней = Новый Структура (“Р01,Р02,Р03,Р04,Р05,Р06,Р07,Р11,Р12,Р13,Р14,Р15,Р16,Р17”,258,259,260,259,258,258,258,259,261,261,259,258,258,259);
ВыходныеДни = Новый Структура;
Для ТекГод=2010 По 2030 Цикл
Високосный = День(КонецМесяца(Дата(ТекГод,02,01)))%28;
ВидГода = “Р”+Високосный+ДеньНедели(Дата(ТекГод,01,01));
Сообщить (Формат(ТекГод,”ЧГ=4″)+” год – “+ТаблДней[ВидГода]+” рабочих дней”);
ВыходныеДни.Вставить(“Год”+Формат(ТекГод,”ЧГ=4”), 365+Високосный-ТаблДней[ВидГода]);
КонецЦикла;
Сообщить (ВыходныеДни.Год2014);
Обратная связь:
1. “Что нового я узнал в третьем блоке…?” Насколько я понял, речь о 0-м блоке?
Да практически все новое, с 8.х раньше не был знаком, а небольшой опыт с 7.7 сознательно стараюсь не вспоминать и не применять, чтобы не путать самого себя. Впечатлило удобство отладчика, табло, новый интерфейс пользователя. Очень интересными кажутся коллекции – если надо – через точку к реквизиту, а если надо – через индекс :), не помню в семерке чего-то подобного. Наконец внимательно изучил те азы, которые на семерке когда-то пробежал мимоходом: приоритеты операций, неявное преобразование типов (оттого, что “руки не доходили” на семерке с ними разобраться – писал обычно с миллионом скобок и функций приведения типов для подстраховки).
2. Честно говоря, затруднения возникли с созданием формы обработки для ДЗ. По привычке хотел подцепить на форму пару полей ввода значений (например “ВидТовара” “ВидКлиента” в ДЗ1) и вдруг понял, что теперь все очень непросто… Как обычно помогло преодолеть “метод научного тыка”, но как это работает и с какой именно ипостасью реквизита я работал, я так и не понял :(. Насколько я понимаю, формы еще впереди, поэтому не задавал по ним вопросов.
3. Теперь маленькое отступление, чтобы лучше донести причины моих предложений по курсу: каюсь, 0-й блок смотрел урывками в течение почти двух недель… по ходу просмотра все было понятно, беспокойства не возникало, а вот когда приступил к ДЗ, понял, что в одно ухо влетело, а в другое вылетело :(, и если с поисками вопросов, вынесенных в название уроков, все понятно, то например момент создания обработки, кнопки управления для нее, помещение ее в командный интерфейс рабочего стола, которые произошли как бы второстепенно, по ходу изложения материала, долго не мог найти. Евгений, вы конечно уделили целую главу сервисным возможностям конфигуратора, но мне показалось, что в процессе работы вы иногда применяете ранее незнакомые приемы, и даже если вы даете пояснения, такие вещи остаются разбросанными по тексту. Всвязи с этим мое первое предложение – провести мастер-группу по эффективной работе с конфигуратором, чтоб получилась этакая шпаргалка по нему.
Еще одно пожелание более общего плана. Понимаю, что если оно покажется вам дельным, то это скорее для будущих потоков. Думаю, после изучения, например, главы, было бы полезно ответить на список контрольных вопросов. Польза как в закреплении свежего материала в голове, так и в том, что по этим вопросам легче отделить ту информацию, которая носит обзорных характер, от той, в которой нужно действительно разобраться, прежде чем идти дальше, особенно это касается 0-го “обзорного” блока, т.к. весь курс еще впереди, и не всегда понятно, во что надо упереться и разобраться, а в чем “непонятность” пока можно потерпеть. Например, где-то вначале блока у меня возник вопрос по поводу работы тонкого клиента в файловом варианте: с одной стороны он работает непосредственно напрямую с файлом базы данных, лежащем где-то в локальной сети (к примеру), но с другой стороны, он работает с ним “по собственному протоколу”, что в моем понимании предполагает наличие на машине, где лежит файл базы данных как минимум приложения, обрабатывающего запросы тонкого клиента “по собственному протоколу”, плюс не совсем понятно – тонкий клиент при этом самостоятельно эмулирует серверный контекст? а в случае с web-клиентом серверный контекст эмулируется web-сервером? И вообще, нужно ли сейчас в это вдаваться и просить у вас уделить время на ответ? Или это полностью относится к продвинутому курсу и никакого значения для изучения материала базового иметь не будет? А в предлагаемом мною варианте – увидел среди контрольных вопросов – значит надо срочно разобраться, не увидел – значит “факультатив” :).
PS а еще очень понравилось решать задачки “на сообразительность” :), будет немного грустно, если по мере углубления в курс ДЗ будут все больше уходить в оттачивание профессионализма в выполнении рутинных операций, хотя подозреваю, что этого не избежать…
Ну вот и настал тот час :)
2. >Насколько я понимаю, формы еще впереди
Кроме этого по формам см. бонусный материал – https://mg.spec8.ru/?p=1404
3. > Всвязи с этим мое первое предложение – провести мастер-группу по эффективной работе с конфигуратором, чтоб получилась этакая шпаргалка по нему.
Предложение записали, но оно имеет не первый приоритет, поскольку все-таки этот материал есть в курсе.
>Думаю, после изучения, например, главы, было бы полезно ответить на список контрольных вопросов.
Предложение кажется дельным. Может быть даже тестирование на сайте повесить, но действительно это потребует некоторого времени, не успеем сделать с текущим потоком.
Отвечу по контекстам, чтобы расставить точки над i.
> он работает с ним «по собственному протоколу», что в моем понимании предполагает наличие на машине, где лежит файл базы данных как минимум приложения
Никакого приложения в файловом варианте нет. Файл может просто находиться на сетевом хранилище, а все клиенты к нему обращаются.
Вся эмуляция клиент-серверного взаимодействия происходит в рамках клиентского приложения.
> а в случае с web-клиентом серверный контекст эмулируется web-сервером?
Если продолжаем говорить о файловом варианте, то на веб-сервере, создается специальная среда, которая обрабатывает запросы.
При этом производительность этой среды очень низкая, и по сути она не позволит работать нескольким пользователям одновременно.
Евгений, скажите пожалуйста, если свой вчерашний комментарий вижу в форуме со статусом “ожидает модерации” – он к вам еще не попал или отклонен? :)
Он ожидает своего часа :)
Задание сделал.
Реализовал через три вложенных цикла – год/месяц/день, внутри последнего выбор заполнять ли структуру «ВыходныеДни» или увеличивать количество рабочих дней в году.
Обращение к данным структуры именно в виде «Сообщить(ВыходныеДни.Год2014)» возможно.
А как можно выполнить подобное в цикле? (пытался много раз, разными способами постоянно ловлю ошибки)
1. Лично для меня даже в завершившемся нулевом блоке большая часть в новинку.
2. Возникают затруднения при решении ДЗ. Приходиться тратить много времени. Даешь больше ДЗ :) !
3. Если объектная техника рассматривается подробнее в следующих главах, то хотелось бы вернуться еще раз к оператору присваивания, преобразованию примитивных типов и разобраться что можно и чего нельзя делать в(с) табло.
>А как можно выполнить подобное в цикле?
Можно организовать цикл Для Каждого … Из …
См. начало первого блока.
СтруктураКоличествоВыходныхДней = Новый Структура();
ТекущийГод = Год(ТекущаяДата());
Для Год = ТекущийГод По ТекущийГод + 9 Цикл
НачалоГода = Дата(Год, 01, 01);
НачалоСледующегоГода = Дата(Год+1, 01, 01);
ПродолжительностьДня = 3600 * 24;
ПродолжительностьНедели = 7 * ПродолжительностьДня;
КоличествоЦелыхНедель = Цел((НачалоСледующегоГода – НачалоГода) / ПродолжительностьНедели);
КоличествоВыходныхДней = КоличествоЦелыхНедель * 2;
//Начало последней недели
ДатаПоследнейНедели = НачалоГода + КоличествоЦелыхНедель * ПродолжительностьНедели;
Пока ДатаПоследнейНедели < НачалоСледующегоГода Цикл
Если ДеньНедели(ДатаПоследнейНедели) > 5 Тогда
КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
КонецЕсли;
ДатаПоследнейНедели = ДатаПоследнейНедели + ПродолжительностьДня;
КонецЦикла;
МассивПраздничныхДней = Новый Массив;
МассивПраздничныхДней.Добавить(Дата(Год, 1, 1));
МассивПраздничныхДней.Добавить(Дата(Год, 2, 23));
МассивПраздничныхДней.Добавить(Дата(Год, 3, 8));
Для каждого ПраздничныйДень Из МассивПраздничныхДней Цикл
Если ДеньНедели(ПраздничныйДень) > 5 Тогда
КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
КонецЕсли;
КонецЦикла;
КоличествоРабочихДней = (НачалоСледующегоГода – НачалоГода) / ПродолжительностьДня – КоличествоВыходныхДней – МассивПраздничныхДней.Количество();
Сообщить(“” + Год + ” год – ” + КоличествоРабочихДней + ” рабочих дней”);
//Получим представление года без пробелов
ПредставлениеГода = “Год” + Формат(Год,”ЧГ=”);
СтруктураКоличествоВыходныхДней.Вставить(ПредставлениеГода, КоличествоВыходныхДней);
КонецЦикла;
СтруктураКоличествоВыходныхДней = Новый Структура(); ТекущийГод = Год(ТекущаяДата()); Для Год = ТекущийГод По ТекущийГод + 9 Цикл НачалоГода = Дата(Год, 01, 01); НачалоСледующегоГода = Дата(Год+1, 01, 01); ПродолжительностьДня = 3600 * 24; ПродолжительностьНедели = 7 * ПродолжительностьДня; КоличествоЦелыхНедель = Цел((НачалоСледующегоГода – НачалоГода) / ПродолжительностьНедели); КоличествоВыходныхДней = КоличествоЦелыхНедель * 2; //Начало последней недели ДатаПоследнейНедели = НачалоГода + КоличествоЦелыхНедель * ПродолжительностьНедели; Пока ДатаПоследнейНедели < НачалоСледующегоГода Цикл Если ДеньНедели(ДатаПоследнейНедели) > 5 Тогда КоличествоВыходныхДней = КоличествоВыходныхДней + 1; КонецЕсли;
ДатаПоследнейНедели = ДатаПоследнейНедели + ПродолжительностьДня; КонецЦикла; МассивПраздничныхДней = Новый Массив; МассивПраздничныхДней.Добавить(Дата(Год, 1, 1)); МассивПраздничныхДней.Добавить(Дата(Год, 2, 23)); МассивПраздничныхДней.Добавить(Дата(Год, 3, 8)); Для каждого ПраздничныйДень Из МассивПраздничныхДней Цикл Если ДеньНедели(ПраздничныйДень) > 5 Тогда КоличествоВыходныхДней = КоличествоВыходныхДней + 1; КонецЕсли; КонецЦикла; КоличествоРабочихДней = (НачалоСледующегоГода – НачалоГода) / ПродолжительностьДня – КоличествоВыходныхДней – МассивПраздничныхДней.Количество(); Сообщить(“” + Год + ” год – ” + КоличествоРабочихДней + ” рабочих дней”); //Получим представление года без пробелов ПредставлениеГода = “Год” + Формат(Год,”ЧГ=”); СтруктураКоличествоВыходныхДней.Вставить(ПредставлениеГода, КоличествоВыходныхДней); КонецЦикла;
Функция ДанныеОДняхВГоду(ГодЧислом)
КоличествоРабочихДней = 0;
КоличествоВыходныхДней = 0;
ТекущаяДата = Дата(ГодЧислом, 1, 1);
КонечнаяДата = КонецГода(ТекущаяДата);
Пока ТекущаяДата < КонечнаяДата Цикл
Если ДеньНедели(ТекущаяДата) < 6 Тогда
КоличествоРабочихДней = КоличествоРабочихДней + 1;
Иначе
КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата + 86400;
КонецЦикла;
// теперь обработаем праздничные дни
Если ДеньНедели(Дата(ГодЧислом, 1, 1)) < 6 Тогда
КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
КоличествоРабочихДней = КоличествоРабочихДней – 1;
КонецЕсли;
Если ДеньНедели(Дата(ГодЧислом, 2, 23)) < 6 Тогда
КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
КоличествоРабочихДней = КоличествоРабочихДней – 1;
КонецЕсли;
Если ДеньНедели(Дата(ГодЧислом, 3, 8)) < 6 Тогда
КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
КоличествоРабочихДней = КоличествоРабочихДней – 1;
КонецЕсли;
СтруктураДат = Новый Структура(“КоличествоРабочихДней, КоличествоВыходныхДней”);
СтруктураДат.Вставить(“КоличествоРабочихДней”, КоличествоРабочихДней);
СтруктураДат.Вставить(“КоличествоВыходныхДней”, КоличествоВыходныхДней);
Возврат СтруктураДат;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
// 1. Выводим количество рабочих дней за последующие 10 лет
Для Год = 2010 По 2019 Цикл
Сообщить(СтрЗаменить(Год, Символы.НПП, “”) + ” год – ” + ДанныеОДняхВГоду(Год).КоличествоРабочихДней + ” дней”);
КонецЦикла;
// 2. Заполняем структуру “ВыходныеДни”
ВыходныеДни = Новый Структура();
Для Год = 2010 По 2019 Цикл
ВыходныеДни.Вставить(“Год” + СтрЗаменить(Год, Символы.НПП, “”), ДанныеОДняхВГоду(Год).КоличествоВыходныхДней);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
А задачка заставляет шевелиться серые клетки :)
Кодовое слово что задание выполнено можно не писать надеюсь? ))
Ну ладно, поехали:
В процессе поиска оптимального решения пришел к выводу, что может быть как минимум 2 подхода к решению данной задачи:
1) “Академический” подход, как большинство и сделало. Перебор всех дат за год и разложение по полочкам с поправкой на праздники. Привожу листинг своего варианта:
Функция ДанныеОДняхВГоду(ГодЧислом)
КоличествоРабочихДней = 0; КоличествоВыходныхДней = 0;
ТекущаяДата = Дата(ГодЧислом, 1, 1); КонечнаяДата = КонецГода(ТекущаяДата);
Пока ТекущаяДата < КонечнаяДата Цикл
Если ДеньНедели(ТекущаяДата) < 6 Тогда КоличествоРабочихДней = КоличествоРабочихДней + 1;
Иначе КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата + 86400; КонецЦикла;
// теперь обработаем праздничные дни
Если ДеньНедели(Дата(ГодЧислом, 1, 1)) < 6 Тогда КоличествоВыходныхДней = КоличествоВыходныхДней + 1; КоличествоРабочихДней = КоличествоРабочихДней – 1; КонецЕсли;
Если ДеньНедели(Дата(ГодЧислом, 2, 23)) < 6 Тогда КоличествоВыходныхДней = КоличествоВыходныхДней + 1; КоличествоРабочихДней = КоличествоРабочихДней – 1; КонецЕсли;
Если ДеньНедели(Дата(ГодЧислом, 3, 8)) < 6 Тогда КоличествоВыходныхДней = КоличествоВыходныхДней + 1; КоличествоРабочихДней = КоличествоРабочихДней – 1; КонецЕсли;
СтруктураДат = Новый Структура(“КоличествоРабочихДней, КоличествоВыходныхДней”); СтруктураДат.Вставить(“КоличествоРабочихДней”, КоличествоРабочихДней); СтруктураДат.Вставить(“КоличествоВыходныхДней”, КоличествоВыходныхДней);
Возврат СтруктураДат;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
// 1. Выводим количество рабочих дней за последующие 10 лет
Для Год = 2010 По 2019 Цикл
Сообщить(СтрЗаменить(Год, Символы.НПП, “”) + ” год – ” + ДанныеОДняхВГоду(Год).КоличествоРабочихДней + ” дней”); КонецЦикла;
// 2. Заполняем структуру “ВыходныеДни”
ВыходныеДни = Новый Структура();
Для Год = 2010 По 2019 Цикл ВыходныеДни.Вставить(“Год” + СтрЗаменить(Год, Символы.НПП, “”), ДанныеОДняхВГоду(Год).КоличествоВыходныхДней);
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
КонецПроцедуры
2) Назовем его “экспертный” подход:
Экспертный не потому, что до него додумался эксперт :)) , а в силу того , что его можно построить на принципе экспертной системы. Т.е. когда данные не вычисляются в процессе, а как бы извлекаются по соответствующим критериям.
В процессе “ковыряния” календаря пришла такая мысль в голову: если допустить, что все года не високосные, то их цикличность была бы равна 7, т.е. дни недели повторялись бы через 7 лет. Високосные увеличивают цикличность до 28 (7*4) лет, т.е. даты по дням недели в точности совпадают каждые 28 лет. В этом случае мы можем заранее подготовить таблицу для этих (назовем их базовыми) лет. Далее определяя смещение относительно базового года, можно сразу получать готовые значения для любого (!) года. Нетрудно догадаться, что если потребуется получить такую таблицу скажем за 1000 лет, второй способ отработает значительно быстрее.
P.S. Если вдруг опять задвоится, просьба “причесать”
P.S.S. По поводу нулевого блока напишу завтра, т.к. глаза уже слипаются ))
То что серые клетки шевелятся, это хорошо ))
Обратная связь по нулевому блоку и не только…
Программированием в среде 1С занимаюсь достаточно долго, но несмотря на это решил внять Вашим с Фаритом рекомендациям и пройти сперва базовый курс, о чем не жалею.
1) После “прогонки” 0-го блока взгляды конечно кардинально не поменялись, но…
Базовые знания в голове освежились и разложились по полочкам.
Какие-то моменты оказались новыми для меня
В результате сложилась целостная картина
2) Затруднения возможно будут на продвинутом курсе, жду с нетерпением ))
3) Что касается раскрытия интересующих тем – то с большой долей вероятности вы “пошлете” меня в продвинутый курс :)
P.S. В целом хочу отметить великолепную подачу материала, как говорится с чувством, с толком, с расстановкой :) Весьма “глубокое погружение” в материал даже в базовом курсе – для новичков настоящая находка! …Эх такие бы курсы, лет эдак 5 назад…
Хочу сказать вам огромное спасибо, за ту работу, которую вы делаете, так держать!!!
Спасибо, Юрий :)
Уберите плиз задвоенность из предудущего коммента(втавляла и не проверила)
И по обратной связи:
1. Новое для меня все что касается 8.2, до этого вообще не сталкивалась.Были новые моменты в некоторых уроках со звездочкой.
Операции преобразования со строками из 2го задания заинтересовали. Но у меня небольшой опыт в 8.1, пока больше 7.7.
2. Затруднений пока не было, есть опыт программирования на других языках,поэтому удобно что проводятся аналогии.
3. Понимаю что это пока основы, поэтому думаю раскрываться будут дальше.
Уберите плиз задвоенность из предудущего коммента(втавляла)
И по обратной связи:
1. Новое для меня все что касается 8.2, до этого вообще не сталкивалась.Были новые моменты в некоторых уроках со звездочкой. Операции преобразования со строками из 2го задания заинтересовали. Но у меня небольшой опыт в 8.1, пока больше 7.7.
2. Затруднений пока не было, есть опыт программирования на других языках,поэтому удобно что проводятся аналогии.
3. Понимаю что это пока основы, поэтому думаю раскрываться будут дальше.
Задание решила через подсчет рабочих дней в цикле по годам и дальнейшим исключением праздничных, содержащихся в массиве
Праздники = Новый Массив;
Праздники.Добавить(“0101”);
Праздники.Добавить(“0223”);
Праздники.Добавить(“0308″);
ВыходныеДни = Новый Структура;
текДата = НачалоГода(ТекущаяДата());
Для СчетчикЛет=1 По 11 Цикл
КолРабочихДней = 0;
текГод = Год(текДата);
Пока Год(текДата) = текГод Цикл
КолРабочихДней = КолРабочихДней + ?(ДеньНедели(текДата)<6, 1, 0);
текДата = текДата + 86400;
КонецЦикла;
// исключим праздники
Для СчетчикПраздник=0 По Праздники.Количество()-1 Цикл
КолРабочихДней = КолРабочихДней + ?(ДеньНедели(Дата(Формат(текГод,”ЧГ=0”)+Праздники[СчетчикПраздник]))<6, -1, 0);
КонецЦикла;
КолВыходныхДней = (КонецГода(текДата-1)-НачалоГода(текДата-1)+1)/86400 – КолРабочихДней;
ВыходныеДни.Вставить(“Год”+Формат(текГод,”ЧГ=0″), КолВыходныхДней);
Сообщить(Формат(текГод,”ЧГ=0″)+ ” год – “+КолРабочихДней+” рабочих дней”);
КонецЦикла;
ДЗ выполнила
Рабочие дни посчитала незамысловато – перебором
по годам и датам. Схема простая:
Если Не Выходной и Не Праздник Тогда
РабочихДней = РабочихДней +1;
КонецЕсли
Попутно выяснилось, что (Дата + 1) увеличение даты на 1 секунду-))
для цикла по дням ввела переменную Сутки = 60*60*24.
Дату праздников рассчитывала для каждого года внутри цикла:
ВосьмоеМарта = Дата(Год,3,8)
При выводе завозилась с пробелом появляющимся при преобразовании
числа в строку – оказывается это называется неразрывный пробел.
Там же где узнала об этом нашла и лекарство – Формат(СтрокаГод,”ЧГ=”)
Не сразу записались элементы в Структуру – всё тот же неразрывный
пробел, однако…
Может решение и не самое изящное, но зато отлично завершило для
меня 0-й блок: покопошилась вволю в Синтакс-помощнике, попробовала
в деле шаблоны и сочетания клавиш, потрогала табло и отладчик-))
1. Нового было достаточно, хотя и пробовала уже подбираться к 8.2.
Главное,только не смейтесь-))), исчез ступор перед конфигуратором –
после 7.7 всё было какое-то не такое, не там… К ДЗ№3 уже не думала
где что искать – всё-таки видео уроки это вещь!-))
2. Все темы прошли гладко без затруднений.
3. Мне как новичку пока информации достаточно
Мой алгоритм:
Имя=”Год”;
ВыходныеДни= Новый Структура;
Для Счетчик=2010 по 2019 Цикл
ПервыйДеньГода=НачалоГода(Дата(Счетчик,1,1,0,0,0));
ПоследнийДеньГода=КонецГода(ПервыйДеньГода);
ЧислоДнейВГоду=(ПоследнийДеньГода-ПервыйДеньГода+1)/(24*60*60);
НомерПоследнейНедели=НеделяГода(ПоследнийДеньГода);
Если ЧислоДнейВГоду<>365 Тогда
//год високосный
Если ДеньНедели(ПервыйДеньГода)<5 Тогда
ЧислоРабочих=261; //минус праздник 1 января
ИначеЕсли ДеньНедели(ПервыйДеньГода)<6 Тогда
ЧислоРабочих=260; //минус праздник 1 января
Иначе
ЧислоРабочих=261;
КонецЕсли;
Иначе
ЧислоРабочих=260;
//не в вискосный число постоянно, либо это 260 рабочих дней из-за одного лишнего выходного
//либо 260 из-за того, что 1 января не выходной
КонецЕсли;
//Если праздники попадают на будни убавим рабочие дни
Если ДеньНедели(Дата(Счетчик,2,23,0,0,0))<6 Тогда
ЧислоРабочих=ЧислоРабочих-1;
КонецЕсли;
Если ДеньНедели(Дата(Счетчик,3,8,0,0,0))<6 Тогда
ЧислоРабочих=ЧислоРабочих-1;
КонецЕсли;
ВыходныеДни.Вставить(Имя+Формат(Счетчик,”ЧГ=0″),ЧислоРабочих);
Сообщить(“”+Формат(Счетчик,”ЧГ=0″)+” год – “+ЧислоРабочих+” рабочих дней”);
КонецЦикла;
Построено на наблюдении, что год начинается и заканчивается одним и тем же днём недели (за исключением високосных), а значит если год начинается с выходного, значит выходных 105, а если нет, то 104, для високосного вносим поправку.
Честно говоря не уверен, что данный алгоритм будет работать быстрее перебора, но читаться будет хуже, это точно.
Результат:
2010 год – 258 рабочих дней
2011 год – 258 рабочих дней
2012 год – 259 рабочих дней
2013 год – 259 рабочих дней
2014 год – 260 рабочих дней
2015 год – 259 рабочих дней
2016 год – 258 рабочих дней
2017 год – 258 рабочих дней
2018 год – 258 рабочих дней
2019 год – 259 рабочих дней
По вопросам:
1. Нового скорее всякие мелочи, облегчающие жизнь, типа горячих клавиш, но вот некоторая систематизация знаний произошла
2. Затруднений пока нет
3. Ну пока тоже пожеланий нет
1.При написании функции подсчета количества рабочих дней праздники удобно записывать в массив с последующим их поиском там.
Для организации цикла по дням в году удобно использовать следующую конструкцию:
Пока ТекДата<=КонецГода(Дата(Год,1,1)) Цикл
Пока ТекДата<=КонецГода(Дата(Год,1,1)) Цикл
Для увеличения ТекДата в цикле нужно прибавлять не 1 как было в 7.7, а количество секунд в сутках т.е. 24*60*60 .
2. При работе со структурой при попытке сконструировать Ключ в виде “Год”+Счетчик получил сообщение об ошибке оказывается год представляется в вид “2 010”, т.е. с пробелом в качестве разделителя групп. Помогла избавиться от ненужного пробела функция Формат, конечное значение для ключа получилось следующее “Год”+Формат(Счетчик,”ЧГ=”).
Для определения количества дней в году для того, чтобы получить затем количество выходных дней использовал следующее выражение КолДнейВГоду = ДеньГода(Дата(Счетчик,12,31));
Обратная связь:
1. Нового узнал достаточно много, хотя меня нельзя отнести к новичкам. Достаточно много фишек которые теперь буду использовать. В целом понравилась системность и достаточная глубина изложения. Мои знания упорядочились, приобрели четкую структуру. Хорошо выделено положение языка 1С в общем сонме других языков программирования.
Теперь о недостатках. Считаю, что трех ДЗ на блок маловато. Задания необходимо больше ориентировать на решение типовых задач, фишки интересны и хорошо развивают, но в практической деятельности малопригодны.
Для новичков некоторые ДЗ чересчур сложны, возможно имеет смысл дифференцировать сложность заданий в зависимости от опыта обучаемого, постепенно выравнивая сложность в процессе обучения.
2.Затруднения не возникли.
3. Было бы интересно подробнее узнать об архитектуре приложения для файлового и клиент-серверного варианта ИБ.
3. Этот вопрос мы подробно рассматриваем в продвинутом.
Для решения задачи создал функцию ПолучитьИнформациюОДняхВГоду(Год), которая возвращает структуру с ключами “КоличествоРабочихДней” и “КоличествоВыходныхДней”. В качестве входящего параметра передается год в виде числа. Вывод результатов работы функции сделал так:
ВыходныеДни = Новый Структура;
Для Год=2010 По 2019 Цикл
ИнформацияОДняхВГоду = ПолучитьИнформациюОДняхВГоду(Год);
Сообщить(“” + Год + ” год – ” + ИнформацияОДняхВГоду.КоличествоРабочихДней + ” рабочих дней”);
ВыходныеДни.Вставить(“Год” + Формат(Год, “ЧГ=0”), ИнформацияОДняхВГоду.КоличествоВыходныхДней);
КонецЦикла;
Сообщить(“2010 год – ” + ВыходныеДни.Год2010 + ” выходных дней”);
Текст функции:
Функция ПолучитьИнформациюОДняхВГоду(Год)
ИнформацияОДнях = Новый Структура;
МассивПраздничныхДней = Новый Массив;
МассивПраздничныхДней.Добавить(Дата(Год, 1, 1));
МассивПраздничныхДней.Добавить(Дата(Год, 2, 23));
МассивПраздничныхДней.Добавить(Дата(Год, 3, 8));
КоличествоРабочихДней = 0;
КоличествоВыходныхДней = 0;
ТекущаяДата = Дата(Год, 1, 1);
Пока Год(ТекущаяДата) = Год Цикл
Если (ДеньНедели(ТекущаяДата) > 5) ИЛИ (МассивПраздничныхДней.Найти(ТекущаяДата) <> Неопределено) Тогда
КоличествоВыходныхДней = КоличествоВыходныхДней + 1;
Иначе
КоличествоРабочихДней = КоличествоРабочихДней + 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата + (24*60*60);
КонецЦикла;
ИнформацияОДнях.Вставить(“КоличествоРабочихДней”, КоличествоРабочихДней);
ИнформацияОДнях.Вставить(“КоличествоВыходныхДней”, КоличествоВыходныхДней);
Возврат ИнформацияОДнях;
КонецФункции
Обратная связь:
1. Новой информацией для меня было все то что касается отличий 8.2 от 8.1, т.к. нет опыта работы с 8.2.
2. Затруднений при изучений не возникло, материал подан доходчиво.
3. Насколько понимаю, многие темы 0-го блока будут подробнее раскрыты в 1-ом блоке.
Задание сделал перебором по годам и дням, в каждом году обращался к функции которая в зависимости от праздников корректировала количество рабочих дней (для каждого года вызывал один раз функцию). Что касается структуры то столкнулся с проблемой у Ключа структуры а именно “Год2_001” получался пробе в числе. данную проблему встречал ранее, обошел ее так: Ключ = “Год”+ Сред(Строка(ТекГод),7,4) ;
выполнил ДЗ.
ключевой цикл :
Пока НачГода<=КонГода Цикл
Если ДеньНедели(НачГода)<=5 Тогда
Если сзПраздничныеДни.НайтиПоЗначению(НачГода) = Неопределено Тогда
СчДней=СчДней+1;
Иначе
СчДнейВых=СчДнейВых+1;
КонецЕсли;
Иначе
СчДнейВых=СчДнейВых+1;
КонецЕсли;
НачГода= НачГода+86400;
КонецЦикла;
1 ctrl+{ или}, операции с двойным знаком(++)
2 затруднений особых не было, но все еще впереди :)
ДЗ № 3 Блок 0 Базового Курса
Задание выполнил. Рассмотрел два способа реализации требуемого механизма.
1) “Алгоритмический” способ. Стандартный цикл по перебору всех дней в году и анализ, является ли данный день рабочим днем с учетом праздников. Плюсы – код быстро пишется, легко понятен для последующего анализа, легко адаптируется к другому периоду (месяц, квартал). Минусы – цикл повторяется по каждому дню, т.е. 365 раз
2) “Математический” метод. В любом году есть 52 недели (364 дня). Количество рабочих (пн, вт, ср, чт, пт) дней и выходных (сб, вс) в них – стандартно и легко рассчитывается (260 и 104). Осталось проанализировать “хвостик года” – 365 и, возможно, 366 день. И затем проанализировать праздники – если праздник попадает на (Сб, Вс) – добавляем его к выходным дням. Плюс этого метода – анализ дня повторяется 4 – 5 раз (при расширении списка праздников – все равно, не более 15 раз). Минус – код сложнее для анализа и сложен для доработок (скажем, изменить период анализа с года на квартал).
С учетом изложенных плюсов и минусов в реальном проекте стал бы применять “алгоритмический” (1) способ.
При выводе в структуру меня, как и многих, расстроила особенность преобразования числа к строке с учетом пробелов между группами разрядов. Пришлось вводить функцию по очистке формируемой строки.
Обратная связь по нулевому блоку:
1. Все, что касается 8.1 я уже знал. Но, тем не менее, узнал “горячие клавиши” для навигации по блокам “Если” и циклам, ну и конечно, систематизировал свои знания. И совершенно новыми были особенности платформы 8.2.
2. Особых затруднений не было.
3. До сих пор нет “терминологической” ясности. Хотелось бы почётче разобраться с терминами: “Класс”, “объект” применительно к “конфигурации” и “информационной базе”. Например: Объект конфигурации и объект информационной базы – это одно и то же? Справочники – это класс. Спр.Номенклатура – экземпляр этого класса (= объект). А элемент номенклатуры “Холодильник Минск ХХХ” – это что (применительно к текущей связке класс – объект)???
3. Отвечу на вопросы.
>Объект конфигурации и объект информационной базы – это одно и то же?
Совершенно разные вещи.
Например, объект конфигурации – справочник “Клиенты”.
Объект ИБ – ИПБОЮЛ Белявкский Виктор Иванович, элемент справочника “Клиенты”.
А вот объект ИБ и объект БД это синонимы.
>Справочники – это класс. Спр.Номенклатура – экземпляр этого класса (= объект). А элемент номенклатуры «Холодильник Минск ХХХ» – это что (применительно к текущей связке класс – объект)???
Справочники – это класс (см. свойство глобального контекста).
Объект конфигурации справочник Номенклатура образует несколько классов (Менеджер, Ссылка, Объект, Выборка, Список).
Нельзя сказать, что справочник Номенклатура это экземпляр класса Справочники.
«Холодильник Минск ХХХ» это объект ИБ, который может быть представлен классами СправочникСсылка и СправочникОбъект.
Главное, не нужно переплетать программную модель работы и структуру базы данных.
Одни и теже сущности в разных контекстах играют разные роли..
Если тема не раскрыта – задавайте дополнительные вопросы.
Блок смортел еще в июне. Сейчас трудно даже и вспомнить, что нового я узнал. Помню, очень понравилось, особенно на фоне модных, в то время, вэбинаров. Но даже и в этот раз кое-что подметил и вчера уже применял (напр, ctri+shift+z). А глава 17 даже и в этом раз привела в восторг: так доходчиво и лаконично за несколько минут концептуально раскрыть тему.
Вопросы:
1.В теме о настройе списка ИБ, по-моему, не было сказано о списке общих ИБ и списке используемых версий в “Настройка диалога запуска”. Или я невнимательно смортел?
2.Обычное приложение (толстый клиент) – понятно, тонкий клиент- понятно, а толстый клиент (управляемое приложение) – ?
3. Стандартные шаблоны не редактируются? И почему? Где они хранятся?
Ответы на вопросы.
1. Об этом говорим в продвинутом.
2. толстый клиент (управляемое приложение) – означает, что приложение исполняется на клиенте, но имеет управляемый интерфейс.
Полное понимание должно прийти после знакомства с 1-вым блоком.
3. Хороший вопрос, многих интересует.
Рассмотрим в сегодняшней МГ.
Задание выполнено.
Идет цикл по годам, есть вложенный цикл по дням внутри года
Каждый день проверяется на выходной или праздник.
Праздники хранятся в таблице значений, поиск идет по отбору, описанному в структуре.
Что касается обратной связи)
1. Знания по 8.1 уже были, просто все по порядку улеглось в голове. Новое: механизм реализации списков справочников и документов в управляемом интерфейсе, быстрый ввод (Сочетания Ctrl+” ” и Ctrl+Q, Ctrl + { ), сообщения пользователю .
2. Особых затруднений нет, помогает синтакс-помощник.
3. Главы начиная с 16 показались сжатыми по сравнению с объемом остальных глав. Ну и десятую хотелось бы развернуть подробнее (например, как четвертую). Все-таки в остальных частях курса к таким темам, я думаю, вы возвращаться не будете).
10-я глава будет так или иначе затрагиваться в каждом из последующих блоков.
Цель 0-го блока – дать основы. Углубляться будем далее..
Вот что примерно получилось:
Основная процедура:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Для Г=2010 по 2020 Цикл
ДнейРабочих=ДнейВГоду(Г);
Сообщить(“Год “+Г+”-“+ДнейРабочих);
КонецЦикла;
КонецПроцедуры
Функция расчета рабочих и выходных дней:
Функция ДнейВГоду(НомерГода)
ДнейРаб=0;
выходные=0;
Для М=1 по 12 Цикл
колдней=День(КонецМесяца(Дата(НомерГода,М,01)));
Для Д=1 по колдней цикл
Если не(((м=1) и (д=1)) или ((м=2) и (д=23)) или ((м=3) и (д=8)) или (ДеньНедели(Дата(НомерГода,М,Д))>5)) тогда
ДнейРаб=ДнейРаб+1;
иначе
выходные=выходные+1;
конецесли;
конеццикла;
конеццикла;
годик=формат(НомерГода,”ЧГ=0”);
ВыходныеДни = новый структура;
ВыходныеДни.Вставить(“Год”+годик,выходные);
ГодДата=”Год”+НомерГода;
//Пример:
// Сообщить(ВыходныеДни.Год2010);
возврат ДнейРаб;
КонецФункции // ДнейВГоду()
А вообще по курсу! Само обучение мне нравится, узнал для себя полезную информацию, по булевым переменным и операциям с ними. Не очень нравятся вставки типа Сессии, т.к. при данном моем уровне, они просто не в тему, я их конечно просматриваю, но это занимает время и вносит и без того, дополнительный напряг.
Можете рассматривать дополнительные сессии как бонусы, которыми вы воспользуетесь позже.
Когда дойдете до определенного уровня..
1) Узнал про комбинации клавиш “ctl+{” или “ctl+}”
Узнал базовые вещи про 8.2. В остальном просто знания как то улеглись по полочкам в глове
2) Особых затруднений небыло
Для Год = 2010 По 2020 Цикл
ДеньГода = Дата(Год, 1, 1);
КолВоРабочихДней = 0;
КолВоВыходныхДней = 0;
Праздники = Новый Массив();
Праздники.Добавить(Дата(Год, 1, 1));
Праздники.Добавить(Дата(Год, 2, 23));
Праздники.Добавить(Дата(Год, 3, 8));
Пока Год(ДеньГода) = Год Цикл
Если ДеньНедели(ДеньГода) = 6 ИЛИ ДеньНедели(ДеньГода) = 7 Тогда
КолВоВыходныхДней = КолВоВыходныхДней + 1;
ИначеЕсли Праздники.Найти(ДеньГода) = Неопределено Тогда
КолВоРабочихДней = КолВоРабочихДней + 1;
КонецЕсли;
ДеньГода = ДеньГода + 86400;
КонецЦикла;
РабочиеДни.Вставить(Год, КолВоРабочихДней);
ВыходныеДни.Вставить(“Год” + Формат(Год, “ЧГ=0”), КолВоВыходныхДней);
КонецЦикла;
Конечно решение может показаться слишком грамоздким во всех отношениях по сравнению с решением от strh
Да, совсем забыл добавить ответы на 3 вопроса. Исправляюсь:
1. Узнал про табло (жаль в 8.2 в управляемом режиме упростили) и некоторые горячие клавиши :) Раньше не использовал.
2. Серьезных затруднений пока не было.
3. Хотелось бы разложить по полочкам все что связано с общими модулями. Когда какие галочки ставить, на что обращать внимание при разработке и т.д.
Модули и не только общие – тема 1-го блока :)
Задание сделала. Все даты получала с помощью встроенных функций работы с датой. Ключевой кусок кода:
Пока ТекДата<=ДатаКон Цикл
Если ДеньНедели( ТекДата ) <= 5 Тогда
Если Празд.НайтиПоЗначению( ТекДата ) = Неопределено Тогда
КолВоРаб=КолВоРаб+1;
КонецЕсли;
Иначе
КолВоВых=КолВоВых+1;
КонецЕсли;
ТекДата=ТекДата+24*3600;
КонецЦикла;
Столкнулась с багой (язык не поворачивается назвать это фичей) – при преобразовании числа в строку добавляется странный символ (не пробел) в качестве разделителя триад. Структура не принимает его в составе ключа. Пришлось сделать:
Атр=”Год”+Год(ДатаКон);
Атр=СтрЗаменить(Атр,” “,””);
ВыходныеДни.Вставить(Атр,КолВоВых);
Зачем сделали такое неудобство?
Нашла недочет в своем алгоритме: он не приплюсовывает к выходным праздники попадающие на будни, а, наверное, стоило бы. Но это легко решается добавлением “иначе” во внутреннее “если”.
это группировка триады
ДЗ №3 сделал.
//Основная процедура
Для СчетчикГода = ГодНачала По ГодОкончания Цикл
ВисГод = НЕ булево(СчетчикГода%4);
Количество = КолвоРабочихДнейВГоду(СчетчикГода,ВисГод);
КолвоВыходных=365+ВисГод-Количество;
Год = Формат(СчетчикГода…
ВыходныеДни.Вставить(“Год”+Год,КолвоВыходных);
Сообщить(Год+” – “+Количество+” рабочих дней”);
Сообщить(Год+” – “+ВыходныеДни[“Год”+Год]+” выходных дней”);
КонецЦикла;
//
Функция КолвоРабочихДнейВГоду(Год,ВисГод)
ПраздничныеДаты = Новый Массив;
ПраздничныеДаты.Добавить(Дата(Год,добавляем, по вкусу));
Количество=365+ВисГод-52*2-(ДеньНедели(НачалоГода)>5)-ВисГод*(ДеньНедели(КонецГода)>5);
Для каждого Счетчик Из ПраздничныеДаты Цикл
Количество = Количество – (ДеньНедели(Счетчик)<6);
КонецЦикла;
Возврат Количество;
P.S. По нулевому блоку вопросов нет, пока все понятно.
Задание сделал.
Особенности выполнения:
1. Определил переменные
МояТекущаяДата = НачалоГода(ТекущаяДата())
ТекущийГод = МояТекущаяДата
и ДатаОкончания = ДобавитьМесяц(ТекущийГод, 120) как раз добавил 10 лет.
2. В цикле Пока МояТекущаяДата < ДатаОкончания анализирую рабочий это день или нет и в зависимости от условия увеличиваю счетчик рабочих или выходных дней. Можно конечно считать только рабочие, а выходные определять как ДеньГода(КонецГода(ТекущийГод)) – КоличествоРабочихДней.
Полное условие проверки такое:
Если (ДеньНедели(МояТекущаяДата) <> 6 И ДеньНедели(МояТекущаяДата) <> 7) И Не (МояТекущаяДата = Дата(ЗначениеТекущегоГода, 01, 01) Или
МояТекущаяДата = Дата(ЗначениеТекущегоГода, 02, 23) Или МояТекущаяДата = Дата(ЗначениеТекущегоГода, 03, 08)) Тогда
Если (ДеньНедели(МояТекущаяДата) <> 6 И ДеньНедели(МояТекущаяДата) <> 7) И Не (МояТекущаяДата = Дата(ЗначениеТекущегоГода, 01, 01) Или МояТекущаяДата = Дата(ЗначениеТекущегоГода, 02, 23) Или МояТекущаяДата = Дата(ЗначениеТекущегоГода, 03, 08)) Тогда
где ЗначениеТекущегоГода = Год(ТекущийГод)
3. На каждом шаге цикла увеличиваю переменную МояТекущаяДата = МояТекущаяДата + 86400, т.е. ровно на сутки.
4. Также на каждом шаге цикла проверяю Если МояТекущаяДата > КонецГода(ТекущийГод) Тогда
сообщаем количество рабочих дней в году и заполняем структуру ВыходныеДни
ИмяКлюча = «Год» + СтрЗаменить(Строка(ЗначениеТекущегоГода), Символы.НПП, «»);
ВыходныеДни.Вставить(ИмяКлюча, КоличествоВыходныхДней);
ИмяКлюча = «Год» + СтрЗаменить(Строка(ЗначениеТекущегоГода), Символы.НПП, «»); ВыходныеДни.Вставить(ИмяКлюча, КоличествоВыходныхДней);
функцией СтрЗаменить воспользовался, чтобы не было пробела в значении года .
Про обратную связь:
1. По сути из нового узнал про операции вида ++, –, +-, контекстное сообщение (ПоказатьОповещениеПользователя), также не знал про разрядность числовых переменных. Остальное в общем знал, т.к. работаю и с 8.1 и с 8.2, но удалось систематизировать знания.
2. Затруднений не возникло.
3. Хотелось бы узнать особенности об управляемых формах в части интерфейса, но полагаю, что это будет дальше, а по этому блоку вопросов нет.
Спасибо за материал, очень интересно заниматься и что немаловажно очень хорошо все разъясняется.
P.S. Извиняюсь за повторный комментарий, но первый что-то уж больно долго в ожидании модерации.
Почему-то при копи-пасте задваивается код
Да, это проблема известна. Мы ее изучаем..
Присоединяюсь к strh. Каламбур в голове присутствует.
Задание выполнила.
Начала с конца – сформировала структуру ВыходныеДни. Для каждого года количество выходных дней рассчитала как
КоличествоПолныхСемидневок х 2 + КоличествоВыходныхВХвостикеПослеПоследнейСемидневки.
Далее добавила к общему количеству выходных 1янв, 23фев и 8 марта, при условии, что они не попадают на сб/вск.
Для вывода количества рабочих дней по каждому году получила из структуры ВыходныеДни количество выходных и вычла его из общего количества дней в году.
Столкнулась с трудностью при преобразовании числа (номера года) к строке. В строке появлялся символ неразрывного пробела в качестве разделителя групп разрядов. При попытке использовать эту строку как ключ, выдавалась ошибка “Задано неправильное имя атрибута структуры”. Придумала два способа борьбы: Формат(НомерГода, “ЧГ=0”) и СтрЗаменить(СтрНомерГода, Символы.НПП, “”).
На этом этапе возник вопрос об ограничениях, накладываемых на строку-ключ. Ответ уже увидела в обновленном варианте 1 модуля. Спасибо!
Теперь обратная связь :)
1. Что нового – у меня вообще нет практического опыта с восьмеркой, в активе только обучающий курс “Введение в конфигурирование” и Радченко, поэтому этот вопрос видимо не для меня;
2. Затруднения – по ходу изучения нулевого блока их не было. Но при переходе к первому, столкнулась с терминами “управляемое приложение (в режиме тонкого клиента), “управляемое приложение (в режиме толстого клиента)”, “обычное приложение”. Возвращалась к темам про управляемый/обычный интерфейсы, думала синонимы ли управляемый интерфейс и управляемый режим запуска. Не было понятно может ли конкретный пользователь работать в обоих режимах (и как он их тогда выбирает). Разобраться помог материал, изложенный чуть подальше в первом блоке.
3. Тем, которые нужно дополнительно раскрыть в мастер-группе, пока не вижу.
Символ про который вы пишете это так называемый неразрывный пробел Символы.НПП, его можно убать, воспользовавшись функцией СтрЗаменить()
ДЗ №3 Выполнил.
Некоторые трудности возникли при реализации структуры, в частности были проблемы с ключом структуры. Числовые данные (год) по умолчанию имеют формат с разделителем групп разрядов. Пришлось обращаться к Синтакс-помощнику и разбираться с функцией Формат для исключения разделителя разрядов. Ниже привожу решение задачи:
ВыходныеДни = Новый Структура();
Год = 2010; к=0;
Пока к<=10 Цикл
КоличествоРабочихДней=0;
НужнаяДата = Дата(Год,01,01);
Пока НужнаяДата <=Дата(Год,12,31) Цикл
Если (ДеньНедели(НужнаяДата)<=5) И НЕ
((НужнаяДата)=Дата(Год,01,01) ИЛИ (НужнаяДата)=Дата(Год,02,23) ИЛИ (НужнаяДата)=Дата(Год,03,08)) Тогда
КоличествоРабочихДней=КоличествоРабочихДней+1;
КонецЕсли;
НужнаяДата=НужнаяДата+86400;
КонецЦикла;
Сообщить(Строка(Год) + ” год – ” + Строка(КоличествоРабочихДней) + ” рабочих дней”);
ВыходныеДни.Вставить(“Год” + Формат(Год, “ЧГ=0”),КоличествоРабочихДней);
к=к+1;
Год=Год+1;
КонецЦикла;
Сообщить(ВыходныеДни.Год2014);
Количество рабочих дней:
258, 258, 259, 259, 260, 259, 258, 258, 258, 259, 261.
Проверил вручную – все правильно.
Ответы на 3 вопроса:
1. Нового узнал достаточно много, главное – не обязательно использовать английский при написании программ. Это необычно, но интересно.
2. Затруднений особых не испытал, но в Синтакс помощник периодически приходилось заглядывать при решении Дз№3.
3. Работа с функцией Формат, как я понял в ней достаточно много нюансов.
Задание выполнил
как считал рабочие дни:
1 января выходной, далее идет 364 дня или ровно 52 полных недели или 260 рабочих дней
остается вычесть дни если праздник выпал на рабочий день и добавить один день если год високосный и 31дек не выходной.
Функция Рабочий(дт)
Возврат 1-Цел(ДеньНедели(дт)/6);
КонецФункции
Функция Високосный(год)
Возврат ДеньГода(Дата(год,12,31))=366;
КонецФункции
Функция РабочихДней(год)
Возврат 260-Рабочий(Дата(Год,3,8))-Рабочий(Дата(Год,2,23))+Високосный(Год)*Рабочий(Дата(Год,12,31));
КонецФункции
Что касается структуры, сразу не понял, что требуется,пока не набрал Структура и не вызвал Синтакс-Помошник.
Если я правильно понял задание, то
ВыходныеДни=Новый Структура;
ВыходныеДни.Вставить(“Год2012”,РабочихДней(2012));
Сообщить(ВыходныеДни.Год2012);
По доп. вопросам:
Общее впечатление по блоку 0 – что-то кардинально нового для себя не узнал, но узнал о большом количестве всяких тонкостей как по настройке параметров ИБ, по использованию сервисных средств, затронутые отличие 8.1. от 8.2. по всему блоку и т.д.
Затруднений не возникло.
Единственное, что пока не нравится – это смешивание двух потоков и как следствие некоторая оторванность мастер-групп. Напр.мастер группа от 29.10.10 рассматривает запросы которых нет ни в 0 не в 1-ом блоках.
т.е. если предположить, что мои знания изначально близки к 0(а так оно и есть), то уловить смысл происходящего сейчас в мастер группах я смогу только к концу обучения (если повезет), когда обсуждение в мастер группе по сути уже будет завершено.
Можно было бы просто игнорировать непонятные вопросы, но неудобство в том, что приходится тратить значительную часть времени, чтобы понять что это не я что-то упустил, а так построено обучение, что потоки смешены.
p.s. это не смертельно просто высказал, то единственное, что пока мне не понравилось
Просто не стоит разбегаться во стороны сразу.
Материал выдается так, чтобы держать в тонусе участников с разным уровнем подготовки.
интересное решение
В Мастер-группе есть занятия разных видов:
а) занятия по текущему учебному блоку, которые сопровождаются ДЗ и решениями
б) свободные тематические занятия – они идут по своему циклу из 16 тем и никак не привязаны к текущему модулю курса
в) “разминка для ума” – это небольшие вставки для тех, кто идет быстрее графика – чтобы головной мозг не простаивал :)
г) “Осторожно, 1С” – эта тема еще не стала отдельной рубрикой, но это вопрос времени.
Поэтому ориентироваться нужно на то, что есть минимум и максимум.
Минимум – выложенные материалы 0-го, 1-го и т.д. модулей… + ДЗ… + решения.
Максимум – то же, плюс все параллельно выкладываемые дополнительные материалы..
Если “потерялись” – изучаете только то, что выкладывается как i-й модуль…
Задание выполнено :)
ВыходныеДни = Новый Структура;
Для ш = 2010 По 2020 Цикл
НомерГода = Формат(ш, “ЧЦ=4; ЧГ=0”);
КоличествоРабочихДней = ПолучитьКоличествоРабочихДнейВГоду(НомерГода);
ВыходныеДни.Вставить(“Год” + НомерГода, ДеньГода(КонецГода(Дата(Строка(НомерГода) + “0101”))) – КоличествоРабочихДней);
Сообщить(Строка(НомерГода) + ” год – ” + КоличествоРабочихДней + ” рабочих дней”);
КонецЦикла;
Для Каждого Элемент Из ВыходныеДни Цикл
Сообщить(Прав(Элемент.Ключ, 4) + ” год – ” + Элемент.Значение + ” выходных дней”);
КонецЦикла;
Обратная связь:
1. ctrl + } классная штука, не знал. И до конца раскрыл, что есть A=B=C.
2. Пока затруднений нет.
3. После просмотра видеоуроков нулевого блока создается впечатление, что подробней уже некуда :)
Сделал перебором. Хотя наверняка есть более изящное решение.
Цикл от 1 до 10 (по “годам”).
В цикле :
Инициализирую переменные ТекущийГод=2009+СчетчикЦикла,
ТекущийДень = Дата(ТекущийГод,1,1),
ОкончаниеГода = КонецГода(ТекущийДень),
обнуляю переменные РабочихДней и ВыходныхДней
Затем цикл, пока ТекущийДень < ОкончаниеГода. В цикле:
1. явная проверка на праздники по дню и месяцу, такие дни игнорируются (ТекущийДень сдвигается на начало следующего дня ТекущийДень + 86400). Затем проверка на день недели – ДеньНедели(ТекущийДень). Соответственно если день недели = 6 или 7, то увеличиваем на 1 переменную ВыходныхДней, иначе РабочихДней. После этого переменной ТекущийДень присваиваем начало следующего дня: ТекущийДень + 86400.
Закрываем цикл по дням.
Сообщаем о количестве рабочих дней в году.
Закрываем цикл по годам
Получился такой результат:
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 дней.
По поводу структуры – обращение ВыходныеДни.Год2014 возможно. Правда, т.к. ключ, это “Код”+ТекущийГод, где значение года это число, то пришлось переводить ТекущийГод в строку и через СтрЗаменить() выбрасывать пробел между 2 и 0. Если этого не сделать, платформа ругалась на недопустимое значение параметра, т.к. имя ключа получалось “Год2 014”
Ответы на вопросы:
1). 2-ой вариант синтаксиса оператора Новый – Новый(<Тип>[, <ПараметрыКонструктра>]), освежил знания по приведению типов и особенностями работы со ссылками на объекты “сложных” типов.
2). Больших затруднений не было, а для всех остальных есть отладчик.
3). Серверный и клиентский контекст, особенности передачи управления с клиента на сервер и т.д. Эта тема очень важна и актуальна особенно в свете платформы 8.2, но к сожалению раскрыта слабо.
Решение Д/З №3
<code><pre>
ВыходныеДни = Новый Структура;
Для СчетчикЛет=2010 По 2019 Цикл
КолРабДней = 0;
Ключ = “Год”+СтрЗаменить(СчетчикЛет,Символы.НПП,””);
ВыходныеДни.Вставить(Ключ, 0);
ТекДата = Дата(СчетчикЛет, 1, 1);
КолДнейВГоду = ДеньГода(КонецГода(ТекДата));
Для СчетчикДней=1 По КолДнейВГоду Цикл
Если ДеньНедели(ТекДата)>5
или ТекДата = Дата(СчетчикЛет, 1, 1)
или ТекДата = Дата(СчетчикЛет, 2, 23)
или ТекДата = Дата(СчетчикЛет, 3, 8) Тогда
ВыходныеДни[Ключ] = ВыходныеДни[Ключ] + 1;
Иначе
КолРабДней = КолРабДней + 1;
КонецЕсли;
ТекДата = КонецДня(ТекДата) + 1; // Следующий день
КонецЦикла;
Сообщить(“В ” + СтрЗаменить(СчетчикЛет,Символы.НПП,””) + ” году ” + КолРабДней + ” рабочих дней”);
КонецЦикла;
Для каждого Элемент Из ВыходныеДни Цикл
Сообщить(Элемент.ключ + ” = ” + Элемент.Значение);
КонецЦикла;</pre></code>
3. Не все же сразу в 0-вом блоке.
В 1-вом мы детально говорим о клиент-серверном взаимодействии.
ВыходныеДни= Новый Структура();
СледГод=Год(ТекущаяДата())+1;
Для ы=СледГод по (СледГод+10) Цикл
ДеньДляПроверки=Дата(ы,1,1)+52*7*24*60*60;
ВсегоВыходных=52*2;
Пока ДеньДляПроверки<=КонецГода(Дата(ы,1,1)) Цикл
Если (ДеньНедели(ДеньДляПроверки)>5)Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
ДеньДляПроверки=ДеньДляПроверки+24*60*60;
КонецЦикла;
Если ДеньНедели(Дата(ы,1,1))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
Если ДеньНедели(Дата(ы,2,23))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
Если ДеньНедели(Дата(ы,3,8))<6 Тогда
ВсегоВыходных=ВсегоВыходных+1;
КонецЕсли;
ВыходныеДни.Вставить(“Год”+Формат(ы,”ЧГ=”),ВсегоВыходных);
Сообщить(“”+ы+” год – “+(ДеньГода(КонецГода(Дата(ы,1,1)))-ВсегоВыходных)+” рабочих дней”);
КонецЦикла
Вроде я первый. В любом году полных 52 недели (104 выходных дня, 364 календарных). Осталось проверить 365 (и 366) день, ну и учесть три заданных дня.
ВыходныеДни=Новый Структура;
Для ТекГод=ГодНачало По ГодОкончание Цикл
колДней=0;
КолВыходныхДней=0;
Для НомерДня=1 По ДеньГода(дата(ТекГод,12,31)) Цикл
ТекДень=дата(ТекГод,1,1)+НомерДня*60*60*24;
Если (ДеньНедели(ТекДень)<6) и ((ТекДень<>Дата(ТекГод,1,1)) и (ТекДень<>Дата(ТекГод,2,23)) и (ТекДень<>Дата(ТекГод,3,8))) Тогда
колДней=колДней+1;
иначе
КолВыходныхДней=КолВыходныхДней+1;
КонецЕсли;
КонецЦикла;
ВыходныеДни.Вставить(“Год”+формат(ТекГод,”ЧГ=0”),КолВыходныхДней);
сообщить(“”+ТекГод+” год – “+колДней +” рабочих дней “);
КонецЦикла;
сообщить(“Выходные дни:”+ВыходныеДни.Год2010);
ВыходныеДни=Новый Структура;
Для ТекГод=ГодНачало По ГодОкончание Цикл
колДней=0;
КолВыходныхДней=0;
Для НомерДня=1 По ДеньГода(дата(ТекГод,12,31))
Цикл ТекДень=дата(ТекГод,1,1)+НомерДня*60*60*24;
Если (ДеньНедели(ТекДень)<6) и ((ТекДень<>Дата(ТекГод,1,1)) и (ТекДень<>Дата(ТекГод,2,23)) и (ТекДень<>Дата(ТекГод,3,8))) Тогда
колДней=колДней+1;
иначе КолВыходныхДней=КолВыходныхДней+1; КонецЕсли;
КонецЦикла;
ВыходныеДни.Вставить(“Год”+формат(ТекГод,”ЧГ=0”),КолВыходныхДней);
сообщить(“”+ТекГод+” год – “+колДней +” рабочих дней “);
КонецЦикла;
сообщить(“Выходные дни:”+ВыходныеДни.Год2010);