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

Третье занятие по нулевому блоку базового курса.

Необходимо изучить следующие главы 0-го блока.

Глава 16. Основные объекты конфигурации.
Глава 17. Виды учета.

Также нужно выполнить домашнее задание, текст которого доступен на странице.

ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

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

  1. Наконец опять нашел время на учебу. Хочу указать на мою ошибку в предыдущем комментарии. Я начал смотреть решение ДЗ  и увидел, что второпях забыл учесть в решении учет обычных выходных дней. Я честно,  не смотрел как выглядит реализация задания в ролике и решил  выложить еще раз мое решение, уже думаю окончательное. Подскажите, мой последний релиз решения :-)  можно считать оптимальным (реализация алгоритма понятна со стороны)?
    Перем ДнейВГоду, СледущийГод, ГодПоказа, ТекГод;
    ТекГод=Год(ТекущаяДата());
    Для СледущийГод=1 По 10 Цикл

    ДеньГодаПоказа = ДобавитьМесяц(ТекущаяДата(), СледущийГод*12);
    ГодПоказа = Год(ДеньГодаПоказа);
    ПоследняяДатаГода=КонецГода(ДеньГодаПоказа);
    ПерваяДатаГода=НачалоГода(ДеньГодаПоказа);
    ДнейВГоду = ДеньГода(ПоследняяДатаГода);
    НедельВГоду=НеделяГода(ПоследняяДатаГода);

    ДнейВГоду=ДнейВГоду-НедельВГоду*2;

    Если ДеньНедели(ПоследняяДатаГода)<6 Тогда
    ДнейВГоду=ДнейВГоду+2;
    ИначеЕсли ДеньНедели(ПоследняяДатаГода)=6 Тогда
    ДнейВГоду=ДнейВГоду+1;
    // ИначеЕсли ДеньНедели(ПоследняяДатаГода)=7 //Тогда   Ничего не меняем :-)
    КонецЕсли;

    Если ДеньНедели(ПерваяДатаГода)=7 Тогда
    ДнейВГоду=ДнейВГоду+1;
    ИначеЕсли ДеньНедели(ПерваяДатаГода)<6 Тогда
    ДнейВГоду = ДнейВГоду – 1;
    КонецЕсли;

    Если ДеньНедели(ДобавитьМесяц(ПерваяДатаГода,1)+86400*22)>5 Тогда
    ДнейВГоду = ДнейВГоду – 1;
    КонецЕсли;

    Если ДеньНедели(ДобавитьМесяц(ПерваяДатаГода,2)+86400*7)>5 Тогда
    ДнейВГоду = ДнейВГоду – 1;
    КонецЕсли;

    Сообщить(“”+ГодПоказа+”Год – “+ ДнейВГоду+” рабочих дней.”);
    КонецЦикла;
    ОТВЕТ:
    2 012Год – 261 рабочих дней.
    2 013Год – 259 рабочих дней.
    2 014Год – 258 рабочих дней.
    2 015Год – 259 рабочих дней.
    2 016Год – 260 рабочих дней.
    2 017Год – 260 рабочих дней.
    2 018Год – 260 рабочих дней.
    2 019Год – 259 рабочих дней.
    2 020Год – 259 рабочих дней.
    2 021Год – 260 рабочих дней.

    • Реализация алгоритма предельно понятна со стороны, но есть одна проблема – решение не верное.
      Если Вы посмотрите результат, приведенный в решении, то он отличается от Вашего.
      И вот в чем дело, Вы используете функцию НеделяГода(), оно возвращает некоторое число. Важно понимать, что это число может не соответствовать количеству недель в году. Это именно порядковая неделя года. Единственный шанс, когда функция вернет количество недель в году, это если 01 января – понедельник, а 31 декабря – воскресенье. Но по моему такого никогда не бывает.

      • Исправил ошибку.  Возможно данный алгоритм работает быстрее, чем алгоритмический метод в решении задачи?
        ТекГод=Год(ТекущаяДата());
        Для СледущийГод=1 По 10 Цикл

        Год=ТекГод+СледущийГод;
        ПоследняяДатаГода=Дата(Год,12,31);
        ПерваяДатаГода=Дата(Год,1,1);
        НедельВГоду=НеделяГода(ПоследняяДатаГода);
        НеполныхНедель=0;
        РабочихДней=0;
        ПослДатаДеньНедели=ДеньНедели(ПоследняяДатаГода);
        ПервДатаДеньНедели=ДеньНедели(ПерваяДатаГода);

        Если ПослДатаДеньНедели<7 Тогда
        НеполныхНедель=НеполныхНедель+1;
        РабочихДней=РабочихДней+?(ПослДатаДеньНедели<6,ПослДатаДеньНедели,5);
        КонецЕсли;

        Если  ПервДатаДеньНедели>1 Тогда
        НеполныхНедель=НеполныхНедель+1;
        РабочихДней=РабочихДней+?(ПервДатаДеньНедели<6,6-ПервДатаДеньНедели,0);
        КонецЕсли;

        РабочихДнейВГоду=(НедельВГоду-НеполныхНедель)*5+РабочихДней;

        Если ДеньНедели(Дата(Год,1,1))<6 Тогда
        РабочихДнейВГоду = РабочихДнейВГоду – 1;
        КонецЕсли;

        Если ДеньНедели(Дата(Год,2,23))<6 Тогда
        РабочихДнейВГоду = РабочихДнейВГоду – 1;
        КонецЕсли;

        Если ДеньНедели(Дата(Год,3,8))<6 Тогда
        РабочихДнейВГоду = РабочихДнейВГоду – 1;
        КонецЕсли;

        Сообщить(“”+Год+”Год – “+ РабочихДнейВГоду+” рабочих дней.”);
        КонецЦикла;

      • ответ:
        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 рабочих дней.

  2. После долгих мытарств все случилось!
    кстати у вас ошибка в обработке, неправильный заголовок у реквизита КонечныйГод

  3. 1. Платформа 8.2 теперь предстала в виде простого, понятного  и очень удобного инструмента для конфигурирования. Что раньше с первого взгляда казалось очень трудным и запутанным :-).
    2. Затруднения возникли в полном понимании объектной системы,  после опыта работы с процедурной ситемой (1с 7.7)…Паралельно по работе пришлось изучить главу книги Троеснэна “Философия .Net”, после чего просмотрев еще раз главу 9 “Объекты” все представилось в более ясном, оформленном виде.
    3. Ответ думаю был раскрыт  во 2-м пункте :-).

  4. ДЗ №3
    Решение задания оказалось все гораздо проще, чем представлялось сначала :-):
    Перем ДнейВГоду, СледущийГод, ГодПоказа, ТекГод;
    ТекГод=Год(ТекущаяДата());
    Для СледущийГод=1 По 10 Цикл
    ДеньГодаПоказа = ДобавитьМесяц(ТекущаяДата(), СледущийГод*12);
    ГодПоказа = Год(ДеньГодаПоказа);
    ДнейВГоду = ДеньГода(КонецГода(ДеньГодаПоказа));

    Если ДеньНедели(НачалоГода(ДеньГодаПоказа))>5 Тогда

    ДнейВГоду = ДнейВГоду – 1;

    КонецЕсли;

    Если ДеньНедели(ДобавитьМесяц(НачалоГода(ДеньГодаПоказа),1)+86400*22)>5 Тогда

    ДнейВГоду = ДнейВГоду – 1;

    КонецЕсли;

    Если ДеньНедели(ДобавитьМесяц(НачалоГода(ДеньГодаПоказа),2)+86400*7)>5 Тогда

    ДнейВГоду = ДнейВГоду – 1;

    КонецЕсли;

    Сообщить(“”+ГодПоказа+”Год – “+ ДнейВГоду+” рабочих дней.”);
    КонецЦикла;

  5. Dmitrij_Brohoveckij 28.05.2011 в 13:43

    <code>
    Праздники = Новый Массив;
    Праздники.Добавить(“0101”);
    Праздники.Добавить(“0223”);
    Праздники.Добавить(“0308″);

    Для Год = 2010 по 2020 Цикл
    КоличествоНедель = НеделяГода(Дата(Строка(Год),12,31));
    КоличествоРабочихДней = КоличествоНедель * 5;

    //С циклом можно легко добавить новые праздники
    Для А = 0 По Праздники.Количество()-1 Цикл
    //Если праздничный день попадает на рабочий день то вычитаем этот день из общего кол-ва
    Если ДеньНедели(Дата(Год, Лев(Праздники[А],2), Прав(Праздники[А],2))) < 6 Тогда
    КоличествоРабочихДней = КоличествоРабочихДней – 1;
    КонецЕсли;
    КонецЦикла;

    //Теперь узнаем с какого дня недели начался год и каким днем закончился
    //все лишнии дни вычтем
    НомерДня = ДеньНедели(Дата(Год, 01,01));
    Если НомерДня < 7 Тогда
    КоличествоРабочихДней = КоличествоРабочихДней – НомерДня + 1;
    Иначе
    КоличествоРабочихДней = КоличествоРабочихДней – 5;
    КонецЕсли;

    НомерДня = ДеньНедели(Дата(Год, 12,31));
    Если НомерДня < 6 Тогда
    КоличествоРабочихДней = КоличествоРабочихДней – 5 + НомерДня;
    КонецЕсли;

    Сообщить(Строка(Год) + ” год – ” + КоличествоРабочихДней);

    КонецЦикла;
    </code>

  6. Для ТекущийГод=2010 по 2020 Цикл

    Рабочий=0;
    Праздник=0;
    Выходной=0;

    КоличествоНедель = НеделяГода(Дата(Строка(ТекущийГод),12,31));        
    ВсеДни = (КоличествоНедель-2)*5;

    Если ДеньНедели(Дата(Строка(ТекущийГод),01,01))=7 Тогда
    ВыходныеПервойНедели=1;
    Иначе
    ВыходныеПервойНедели=2;
    КонецЕсли;

    РабочииПервойНедели = 8-ДеньНедели(Дата(Строка(ТекущийГод),01,01))-ВыходныеПервойНедели;
    РабочииПоследнейНедели = ?(ДеньНедели(Дата(Строка(ТекущийГод),12,31))<=5,ДеньНедели(Дата(Строка(ТекущийГод),12,31)),5);
    ВсеДни = ВсеДни+РабочииПервойНедели+РабочииПоследнейНедели;

    Если ДеньНедели(Дата(Строка(ТекущийГод),01,01))=6 ИЛИ ДеньНедели(Дата(Строка(ТекущийГод),01,01))=7  Тогда
    // это выходной
    Иначе
    ВсеДни = ВсеДни-1;
    КонецЕсли;

    Если ДеньНедели(Дата(Строка(ТекущийГод),02,23))=6 ИЛИ ДеньНедели(Дата(Строка(ТекущийГод),02,23))=7  Тогда
    // это выходной
    Иначе
    ВсеДни = ВсеДни-1;
    КонецЕсли;

    Если ДеньНедели(Дата(Строка(ТекущийГод),03,08))=6 ИЛИ ДеньНедели(Дата(Строка(ТекущийГод),03,08))=7  Тогда
    // это выходной
    Иначе
    ВсеДни = ВсеДни-1;
    КонецЕсли;

    Сообщить(Строка(ТекущийГод)+” – “+ВсеДни);
    КонецЦикла;    

  7. Тимур 05.05.2011 в 14:25

    Выполнил, хоть и с почти месячным опозданием.


    Общие рассуждения над алгоритмом решения:
    Из условий задачи следует, что для получения количества рабочих дней в году необходимо:
     

    получить количество всех будних дней года
    из этого количества вычесть те праздничные дни, которые выпадают на будни

     
    Примечания:
     

    Код получился немного громоздким из-за использования переменных-констант. Но мне кажется, что так  код должен читаться лучше.
    Для более опрятного кода я использовал в некоторых местах объект Массив, который к моменту ДЗ мы не проходили.
    Исходного кода много, поэтому я не стал размещать его в комментариях, а вынес на сайт для хранения исходников.

     


    Решения:
    Я решил задачу двумя способами, различаются они по сути только способами реализации одной функции – функции подсчета количества будних дней в году.
     
    Решение 1.

    Первое решение использует объект типа Дата:  начиная от первого дня года и заканчивая последним последовательно перебирает дни, вычисляет является ли текущий день будним и в этом случае увеличивает счетчик будних дней.
     
    На псевдокоде примерно так:
     
    Для Каждого дня года Начиная с первого и заканчивая последним
    Если этоБуднийДень Тогда
    СчетчикБуднихДней = СчетчикБуднихДней + 1
     
    Исходный код Решения 1




    ———–
    Решение 2.
    Основано на подсчете.
    В году 365/7 = 52 1/7 недели, т.е. 52 полных недели и 1 дополнительный день. В високосном году – 366/7 = 52 2/7 , т.е.  те же 52 недели, но 2 дополнительных дня. Отсюда следует, что для подсчета будних дней необходимо:

    Получить количество будних дней в 52 неделях: 52(недели) * 5(будних дней в неделе) = 260 дней
    Узнать, на какой день недели выпадают дополнительные 365-й (в случае високосного года – и 366-й) день, и если это будни – добавить к общему числу будних дней года.

    Исходный код Решения 2

    П.С. Мне кажется, я пишу слишком громоздкий код?

    • Тимур 05.05.2011 в 14:33

      Неправильно вставил ссылку на исходный код решения 1, вот правильный:
      http://paste.org.ru/?emtsma

    • Тимур 05.05.2011 в 16:55

      Посмотрел решение ДЗ.
       
      Очень порадовало, что ход моих рассуждений при решении в целом совпал с ответом.
       
      Жаль я не догадался, что подсчет дополнительных дней в году тоже можно  произвести арифметически – я опирался на признак високосности года и на числовые константы

    • >П.С. Мне кажется, я пишу слишком громоздкий код?
      Код хорошо читается и это главное.

  8. Решила по “медленному” варианту с вложенными циклами, не впрямую варианты не обдумывала (уже спать надо)). Увидела альтернативу в видеоответе. Видеорешение сначало засомневало взятием первых дней января (а почему хвост рассматривается именно с первых чисел января) но последняя часть видео на вопрос ответила.
    Через регистр сведений, конечно, самое оптимальное) Имел бы в простейшем случае одно измерение – дата, ресурс – рабочий день (значение 0 и 1), который заполнялся бы разово обработкой на года (в ней была бы проверка на суб, воскр и праздник). А потом из него как из календаря можно было бы брать запросом данные, просуммировать ресурс за год. Что оптимальнее прогона алгоритма вычисления раб. и нераб. дней от начала до конца каждый раз, когда потребуется.

    отзывы о нулевом блоке:
    1. Основное новое – это конечно многие вещи по мелочам, облегчающие работу в конфигурации. Плюс раздел по работе как пользователь с управляемыми формами. И вообще о некотором новом в 8.2 быстрее и нагляднее, чем в книжке “коротко о..”, которую дочитать до конца – постоянный цейтнот. Плюс раздел про клиент-серверную структуру: кое-что в голове стало по местам. Были некоторые новые факты, вроде того, что что для веб-клиента есть поддержка браузера Файер Фокс, который используется под Линукс.
    2. Затруднений в теории на начальном этапе пока нет, жду их дальше…
    (особенно если доплата от нас задержится и блоки 1-4 я увижу с затянувшимся опозданием :( (в мае в бюджет включена сумма на обучение, с нее должны оплатить)
    3. Что исполняется на клиенте, а что на сервере. Алгоритм, как взвешивать, что написать: &НаСервере или &НаКлиенте

    • п. 3. Об этом будем говорить в первом блоке курса :)

    • Тимур 05.05.2011 в 17:31

      Почему вы считаете, что через регистр сведений оптимальнее? В чем заключается оптимальность?
      По-первых, его придется заполнить, во-вторых – хранить эти данные. А зачем, если они (данные)  не меняются и в них присутствует определенная закономерность, цикличность (т.е. их можно вычислить).
      Во-третьих – его данные придется считывать, а запросы к СУБД – вещь очень затратная по времени. Я  уверен, что арифметическое вычисление дней будет работать в разы быстрее запроса.

      • Думаю, Вы правы.
        Простой алгоритм выполниться гораздо быстрее (в разы), чем чтение из СУБД.
        Но разница будет идти на милисекунды :)

  9. elcinbektimirov 28.04.2011 в 11:27

    Самостоятельно решить  не смог, до этого не сталкивался с программированием. Посмотрел решение. И после того как повторил за Вами все действия картина как то  прояснилась…
    P.S. Скоро уезжаю на сессию, так что буду в отстающих.
    Отзыв: 1) Для меня все новое, учитывая что до этого не имел практики ни программирования, ни работы в 1с,и вдобавок я гуманитарий. Материал очень интересный, изложен  доходчиво, методично.
    2) Затруднение вызвала тема “Передача Параметров” помогло неоднократное повторение материала, и практика. А также “Контекст выполнения” процедур и функций, до сих пор нет полной ясности какие процедуры в каком контексте должны компилироваться.
    3) Пожалуй эти две темы и хотелось бы  раскрыть более развернуто.

    • >Пожалуй эти две темы и хотелось бы раскрыть более развернуто.
      Думаю в первом блоке ясность наступит..

  10. Светлана 22.04.2011 в 10:08

    1)  Очень много нового, не перечислишь, т.к. работаю с 1с7, с 8 еще не работала.
    2) Не было затруднений, достаточно было запустить ролик на просмотр еще раз (очень удобно! На реальной лекции, прослушал бы и все вылетело). Не понятно только, как выбирается &НаКлиенте и &НаСервере, но я думаю, что это материал будущего периода.
    3) затрудняюсь ответить…

    • >но я думаю, что это материал будущего периода.
      Да, директивы компиляции рассматриваем в 1-ом блоке.

  11. Светлана 22.04.2011 в 09:38

    Забыла результат:
    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 рабочих дней

  12. Светлана 22.04.2011 в 09:34

    &НаКлиенте
    Процедура ПоказатьДни(Команда)
     
     ТекГод = НачалоГода(ТекущаяДата());
     
     Для Сч = 1 по 10 Цикл
      
      РабочихДней=0;
      
      ТекДата = НачалоГода(ТекГод);
      
      Пока ТекДата < КонецГода(ТекГод) Цикл
       
       РабочихДней=РабочихДней+?(ДеньНедели(ТекДата)>5,0,1);
       ТекДата = ТекДата + 86400; //прибавили 1день в секундах
       
      КонецЦикла;
      
      //проверим праздничные дни как дни недели
      Если ДеньНедели(Дата(Год(ТекГод),01,01))<6 Тогда    // 1 января
       РабочихДней = РабочихДней – 1;
      КонецЕсли; 
      Если ДеньНедели(Дата(Год(ТекГод),02,23))<6 Тогда    // 23 февраля
       РабочихДней = РабочихДней – 1;
      КонецЕсли;
      Если ДеньНедели(Дата(Год(ТекГод),03,08))<6 Тогда    // 8 марта
       РабочихДней = РабочихДней – 1;
      КонецЕсли;  
      
      //выводим на экран результат
      сообщить(Формат(Год(ТекГод),”ЧГ0″)+” год – ” +РабочихДней+ ” рабочих дней”);
      ТекГод = ДобавитьМесяц(ТекГод,12);
      
     КонецЦикла;
     
    КонецПроцедуры                      

  13. Добрый день.
    В цикле по годам, последовательно проверяются все дни года на субботу/воскресенье. Контроль високосности возложил на саму 1С ;) 
    После этого отдельно вносится корректировка по праздникам в каждом году.
    <code>
    &НаСервере
    Процедура ВычислениеРабочихДней();
     
     Для Сч = 1 По 10 Цикл
      
      ТекГод = Год(ТекущаяДата())+Сч;
      ТекДата = НачалоГода(Формат(ТекГод, “ЧГ=”)+”0101″);
      РабочихДней = 0;
      
      Пока Год(ТекДата) = ТекГод Цикл
       Если (ДеньНедели(ТекДата) <= 5) Тогда
        РабочихДней = РабочихДней+1;
       КонецЕсли; 
      
       ТекДата = ТекДата + 24*60*60;
      КонецЦикла;
     
      РабочихДней = ?(ДеньНедели(Формат(ТекГод, “ЧГ=”)+”0101″) <= 5, РабочихДней-1, РабочихДней);
      РабочихДней = ?(ДеньНедели(Формат(ТекГод, “ЧГ=”)+”0223″) <= 5, РабочихДней-1, РабочихДней);
      РабочихДней = ?(ДеньНедели(Формат(ТекГод, “ЧГ=”)+”0308″) <= 5, РабочихДней-1, РабочихДней);
     
      Сообщить(Формат(ТекГод, “ЧГ=”)+” год – “+РабочихДней+” рабочих дней”);
      
     КонецЦикла;
     
    КонецПроцедуры
    </code>

    • Обратная связь.
      1. Узнал некоторые полезные вещи, которые при бессистемном самообучении часто пропускаются.
      2. Затруднений пока не возникало, т.к. есть опыт работы в 8.1 и 7.7.  Да и подача материала этому очень способствует.
      3. Не знаю. Возможно, в мастер-группе стоит раскрывать более сложные темы.

      Спасибо за вашу работу.

  14. Здравствуйте.
    Код:
    <code>Процедура Сформировать(Команда)

    ДатаНачала = НачалоГода(НачальнаяДата);
    ДатаКонца = КонецГода(НачальнаяДата);

    ПеременнаяДата = ДатаНачала;       

    Для Счетчик = 1 По 10 Цикл    
    РабочихДней = 0;
    Пока ПеременнаяДата<=ДатаКонца Цикл
    //Сообщить(ПеременнаяДата);

    Если (ДеньНедели(ПеременнаяДата) = 6) или (ДеньНедели(ПеременнаяДата) = 7) Тогда
    ПеременнаяДата = КонецДня(ПеременнаяДата)+1;
    Продолжить;
    КонецЕсли;

    Если (День(ПеременнаяДата)=1) и (Месяц(ПеременнаяДата) = 1) Тогда    //1 января
    ПеременнаяДата = КонецДня(ПеременнаяДата)+1;
    Продолжить;
    ИначеЕсли (День(ПеременнаяДата)=23) и (Месяц(ПеременнаяДата) = 2) Тогда    //23 февраля
    ПеременнаяДата = КонецДня(ПеременнаяДата)+1;
    Продолжить;
    ИначеЕсли (День(ПеременнаяДата)=8) и (Месяц(ПеременнаяДата) = 3) Тогда    //8 марта
    ПеременнаяДата = КонецДня(ПеременнаяДата)+1;
    Продолжить;
    КонецЕсли;

    РабочихДней = РабочихДней + 1;

    ПеременнаяДата = КонецДня(ПеременнаяДата)+1;
    КонецЦикла;
    Сообщить(РабочихДней);
    ПеременнаяДата = ПеременнаяДата – 1;
    Сообщить(“”+Год(ПеременнаяДата)+” год – “+РабочихДней+” рабочих дней”);

    ПеременнаяДата = ПеременнаяДата + 1;
    ДатаКонца = КонецГода(ПеременнаяДата);

    КонецЦикла;    

    </code>
    Вопрос: в 1С 7.7 ЗП был объект Календарь, здесь что-то подобное существует?
    Светлана

    • Ответы на вопросы для обратной связи.
      1.Работа с платформой, т.к. 8 версию я вижу в первый раз. В полном восторге. Столько новых возможностей по настройке интерфейсов. Теперь осталось все это поближе пощупать.
      2.Наверное еще рано, но совсем непонятно по работе процедур и функций – что выполняется на сервере, а что на клиенте. В этом вопросе полная каша.
      3.Установка сетевых версий программы на различных ОС.(наверное эта тема не касается программирования)
       
      <code>PS пару пробных
      строк для проверки тегов :) </code>

      • >Наверное еще рано, но совсем непонятно по работе процедур и функций – что выполняется на сервере, а что на клиенте.
        Об этом поговорим в первом блоке базового курса.
        >Установка сетевых версий программы на различных ОС.(наверное эта тема не касается программирования)
        Про развертывание системы мы говорим в курсе продвинутом.
        Что касается linux, то эту тему в курсах не затрагиваем.
        Возможно будет отдельная тематическая сессия по установке платформы под linux.

    • Совсем забыла:
      НачальнаяДата – реквизит, типа дата. Здесь вводится любая дата начального года

    • >в 1С 7.7 ЗП был объект Календарь, здесь что-то подобное существует
      Календаря в текущей версии нет.
      Появился более мощный объект – Регистр сведений, который в том числе в связке с регистром расчета и решает задачи календаря.

  15. Константин 19.04.2011 в 01:27

    Исходный код (привожу основные функции):
    Основная

    &НаКлиенте
    Процедура ВыполнитьДействие(Команда)
    Для Г = 2010 По 2020 Цикл
    Сообщить(Строка(Г) + ” год – ” + Строка(КоличествоРабДнейВГоду(Г)) + ” рабочих дней”);    
    КонецЦикла;
    КонецПроцедуры
    &НаСервере
    Функция КоличествоДнейВМесяце(Год, Месяц)
    Результат = -1;
    Если Месяц = 1 Тогда
    Если ЯвляетсяВисокосным(Год) Тогда
    Результат = ДниМесяцев[1].ТекЗначение + 1
    Иначе
    Результат = ДниМесяцев[1].ТекЗначение
    КонецЕсли;
    Иначе
    Если Месяц < 12 Тогда
    Результат = ДниМесяцев[Месяц].ТекЗначение
    КонецЕсли;
    КонецЕсли;
    Возврат Результат;
    КонецФункции
    Функция ЯвляетсяВисокосным(Год)
    Результат = Ложь;
    Если ((Год % 400) = 0) ИЛИ (((Год % 4)=0) И НЕ ((Год % 100)=0)) Тогда
    Результат = Истина;
    КонецЕсли;
    Возврат Результат;
    КонецФункции
    Процедура ИнициализироватьПеременные()
    ВрМассив = Новый Массив(12);
    ВрМассив[0]= 31;  ВрМассив[1] = 28;
    ВрМассив[2] = 31;  ВрМассив[3] = 30;
    ВрМассив[4] = 31;  ВрМассив[5] = 30;
    ВрМассив[6] = 31;  ВрМассив[7] = 31;
    ВрМассив[8] = 30;  ВрМассив[9] = 31;
    ВрМассив[10] = 30;  ВрМассив[11]= 31;
    Для Сч = 0 По 11 Цикл
    НоваяСтрока = ДниМесяцев.Добавить();
    НоваяСтрока.ТекЗначение = ВрМассив[Сч];
    КонецЦикла;
    КонецПроцедуры
    Функция КоличествоРабДнейВГоду(Год)
    СчетчикРабочихДней = 0;
    Для М = 1 По 12 Цикл
    КолДВМ = КоличествоДнейВМесяце(Год, М – 1);
    Для Д = 1 По КолДВМ Цикл
    ТекДень = ДеньНедели(Дата(Год, М, Д));
    Если НЕ (ТекДень = 6 ИЛИ ТекДень = 7
    ИЛИ (М = 1 И Д = 1) ИЛИ (М = 2 И Д = 23) ИЛИ (М = 3 И Д = 8)) Тогда
    СчетчикРабочихДней = СчетчикРабочихДней + 1;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    Возврат СчетчикРабочихДней;
    КонецФункции // КоличествоРабДнейВГоду()
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ИнициализироватьПеременные();
    КонецПроцедуры

    <code>

    Функция КоличествоРабДнейВГоду(Год)
    СчетчикРабочихДней = 0;
    Для М = 1 По 12 Цикл
    КолДВМ = КоличествоДнейВМесяце(Год, М – 1);
    Для Д = 1 По КолДВМ Цикл
    ТекДень = ДеньНедели(Дата(Год, М, Д));
    Если НЕ (ТекДень = 6 ИЛИ ТекДень = 7
    ИЛИ (М = 1 И Д = 1) ИЛИ (М = 2 И Д = 23) ИЛИ (М = 3 И Д = 8)) Тогда
    СчетчикРабочихДней = СчетчикРабочихДней + 1;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    Возврат СчетчикРабочихДней;
    КонецФункции // КоличествоРабДнейВГоду()

    Функция КоличествоДнейВМесяце(Год, Месяц)
    Результат = -1;
    Если Месяц = 1 Тогда
    Если ЯвляетсяВисокосным(Год) Тогда
    Результат = ДниМесяцев[1].ТекЗначение + 1
    Иначе
    Результат = ДниМесяцев[1].ТекЗначение
    КонецЕсли;
    Иначе
    Если Месяц < 12 Тогда
    Результат = ДниМесяцев[Месяц].ТекЗначение
    КонецЕсли;
    КонецЕсли;
    Возврат Результат;
    КонецФункции

    Функция ЯвляетсяВисокосным(Год)
    Результат = Ложь;
    Если ((Год % 400) = 0) ИЛИ (((Год % 4)=0) И НЕ ((Год % 100)=0)) Тогда
    Результат = Истина;
    КонецЕсли;
    Возврат Результат;
    КонецФункции

    Процедура ИнициализироватьПеременные()
    ВрМассив = Новый Массив(12);
    ВрМассив[0]= 31;  ВрМассив[1] = 28;
    ВрМассив[2] = 31;  ВрМассив[3] = 30;
    ВрМассив[4] = 31;  ВрМассив[5] = 30;
    ВрМассив[6] = 31;  ВрМассив[7] = 31;
    ВрМассив[8] = 30;  ВрМассив[9] = 31;
    ВрМассив[10] = 30;  ВрМассив[11]= 31;
    Для Сч = 0 По 11 Цикл
    НоваяСтрока = ДниМесяцев.Добавить();
    НоваяСтрока.ТекЗначение = ВрМассив[Сч];
    КонецЦикла;
    КонецПроцедуры

    </code>
    Вот что получилось:
    2010 год – 258 рабочих дней
    2011 год – 258 рабочих дней
    2012 год – 259 рабочих дней
    2013 год – 259 рабочих дней
    2014 год – 260 рабочих дней
    2015 год – 259 рабочих дней
    2016 год – 258 рабочих дней
    2017 год – 258 рабочих дней
    2018 год – 258 рабочих дней
    2019 год – 259 рабочих дней
    2020 год – 261 рабочих дней

    • Константин 19.04.2011 в 01:32

      Как же тут комментарии нормально вставлять…
      Есть некоторый вопрос – у меня не получилось завести переменную на сервере типа массив через реквизит неважно формы ли или обработки, пришлось использовать таблицу значений. Возможно ли это?
      Что нового узнал в 0 блоке – это Ctrl + { и Ctrl + }
      А также работа платформы с данными типа число.
      Затруднений не возникло.

      • Ни реквизит обработки, ни реквизит формы не может иметь тип данных Массив.
        Тем не менее Вы можете создать массив на сервере.
        Для этого используется техника работы со временным хранилищем (тема продвинутого курса).
        В 1-ом серверном вызове формируем массив, кладем его во временное хранилище (метод ПоместитьВоВременноеХранилище).
        В последующих вызовах извлекаем массив из временного хранилища – метод ПолучитьИзВременногоХранилища().

  16. Шум Дмитрий 19.04.2011 в 00:18

    Обратная связь:
    1) При том что опыт на платформе 8 уже был ( первым сертификатам 1С:Специалист более 5-ти лет) открыл для себя новые моменты. Особенно понравился раздел по инструментам, которые помогают быстрее писать код.
    2) Трудностей не встретил. Базовый курс брал только для того, что бы упорядочить знания и получить базовые знания по 8.2 ( очень дорогое время, что бы тратить его на самообучение)
    3) Жду продвинутый курс. Есть некоторые вопросы но мне кажется их переадресуют на продвинутый курс.
    Большое спасибо за ваш труд. Ни чуть не жалею то что приобрел ваши курсы.

  17. Шум Дмитрий 18.04.2011 в 23:53

    <code>
    &НаСервере
    Функция КоличествоРабочихДнейВГоду(Год)

    НачалоГода = Дата(Год,1,1);    
    КолРабочихДней = ДеньГода(КонецГода(НачалоГода));

    ВсПервойНедели = ДеньГода(КонецНедели(НачалоГода));
    КолРабочихДней = КолРабочихДней – ?(ВсПервойНедели > 3,3,ВсПервойНедели);

    Возврат КолРабочихДней –
    (
    2 * Цел(КолРабочихДней/7)
    + ?(КолРабочихДней%7 = 6,1,0)
    + ?(ДеньНедели(Дата(Год,2,23)) < 6,1,0)
    + ?(ДеньНедели(Дата(Год,3,8)) < 6,1,0)
    );

    КонецФункции // КоличествоРабочихДнейВГоду()
    </code>
    Результат:
    2010 год – 258 дней
    2011 год – 258 дней
    2012 год – 259 дней
    2013 год – 259 дней
    2014 год – 260 дней
    2015 год – 259 дней
    2016 год – 258 дней
    2017 год – 258 дней
    2018 год – 258 дней
    2019 год – 259 дней

  18. larisakonst 18.04.2011 в 19:19

    Обратная связь:
    1. Очень интересное программирование и удобнее, чем в 7.
    2.Было трудно, некоторые занятия надо повторить для себя.
    3.Темы раскрыты хорошо, правда, некоторые не совсем дошли. Думаю, после повторения будет доступнее.

  19. larisakonst 18.04.2011 в 19:16

    Решение вызвало затруднения, очень хотелось подсмотреть. Но справилась сама.
    &НаКлиенте
    Процедура Расчитать(Команда)
                // расчет от любого заданного в диалоге года – ГодРасчета
                РД=0; //рабочие дни
               
                Для ГодРД = ГодРасчета По ГодРасчета+9 Цикл
                           
                            ДеньГодаН = Дата(ГодРД,01,01);
                            ДеньГодаК = Дата(ГодРД,12,31);
            ДеньГода1 = Дата(ГодРД,01,01);   //ключевые даты
                            ДеньГода2 = Дата(ГодРД,02,23);   //для
                            ДеньГода3 = Дата(ГодРД,03,08);   //проверки праздников
                           
                            Пока  ДеньГодаН <= ДеньГодаК Цикл
                                       ДеньРД = ДеньНедели(ДеньГодаН);
                                       Если (ДеньРД < 6)
                                                    и Не  (ДеньГодаН=ДеньГода1
                                                    или    ДеньГодаН=ДеньГода2
                                                    или    ДеньГодаН=ДеньГода3) Тогда
                                                   РД=РД+1;
                                       КонецЕсли;
                                       ДеньГодаН = ДеньГодаН+86400;
                            КонецЦикла;
                Сообщить(Строка(ГодРД)+” год – “+ Строка(РД)+” рабочих дней”);
                РД=0;
                КонецЦикла;
    КонецПроцедуры

    • Как вам удалось вставить такой красивый код? :)

  20. Ярослав 18.04.2011 в 10:10

    Обратная связь Вчера закончил 0 Блок
    1) Перевернулось сознание по поводу мелочей которые раньше просто не замечал, Преобразование Типов.
    Узнал Как создавать обработки контекст выполнения кода.
    2) Трудностей не было
    3) предпочтений пока нет
     

  21. Равшан Абдуллаев 18.04.2011 в 09:20

    Извините за опоздание  связано с работой,
    Домашнее задание сделал не совсем правильно , ответ ДЗ все исправил и я понял.
    Самое  важное в нулевом блоке для меня было изучение встроенного языка,и доступность и простота объяснения. были затруднения при изуч. цикл. операторов и конструкторов. В мастер группе хотел бы чтобы раскрыли тему программного кода.
     

  22. Извините за опоздание.
    Задание выполнила. Для его решения сначала изучила встроенные функции для типа Дата. В решени использовала функции: Год, КонецДня, Дата, ДеньНедели.
    Алгоритм решения следующий:
    1. Определила начальный и конечный год (функция Год(), тип Число)
    2. Для перебора лет использовала цикл по счетчику
    3. В каждом году определяла: первый и последний день года + 1 января, 23 февраля, 8 марта. Для времени каждого дня использовала функцию КонецДня() , чтобы потом можно было использовать сравнение
    4. Для перебора каждого дня использовала цикл по условию. Чтобы получить следующий день к текущему дню прибавляла 86400
    5. Внутри вышеописанного цикла определяла нужно считать день рабочим или нет. Условие такое:
    Если НомерДняНедели<>6 И НомерДняНедели<>7 И ТекущиеДень<>Январь01 И ДниГода<>Февраль23 И ДниГода<>Март08 , то день считается рабочим.

    • Обратная связь:
      1. В нулевом блоке узнала много интересных способов ускорения написания программного кода. Стали понятны настройки параметров ИБ. Получила общее представление об устройстве файла 1CD и клиент-серверной архитектуре (правда пока не очень понятно что представляет из себя «кластер серверов», но надеюсь, что мы еще это будем изучать в дальнейшем более подробно). Мелочь, конечно, но теперь ясна логика создания в 8.2 не очень привычной панели «Действий» (для работы на тонких каналах). Получила представление о преобразованиях примитивных типов. Понравилось замечание о точности математических вычислений.
      2. При изучении тем затруднений не возникло. Наконец-то я получила простые и понятные объяснения! Спасибо. При выполнении ДЗ были ошибки по булевским значениям. Надеюсь, что дальнейшая практика это исправит.

      3. Пока не готова ответить.

      • > но надеюсь, что мы еще это будем изучать в дальнейшем более подробно
        Этот момент мы изучаем в продвинутом курсе.

  23. Извините за опоздание доганяю сроки
    &НаКлиенте
    Функция  РабочиеДни(ПередаваемаяДата)
    НачДата = НачалоГода(ПередаваемаяДата);
    КонДата = КонецГода(ПередаваемаяДата);
    //соберу все праздники  за 10 лет
    Праздники= Новый СписокЗначений;
    Для Год=1 по 10 Цикл
    ГодДаты=2010+Год;//с 2011 на 10 лет
    Праздники.Добавить(Дата(ГодДаты,1,1));
    Праздники.Добавить(Дата(ГодДаты,2,23));
    Праздники.Добавить(Дата(ГодДаты,3,8));
    КонецЦикла;

    ТекДата=НачДата;//’2012.01.01′;
    Рабочих= 0;
    Пока ТекДата < КонДата Цикл
    Праздник  = Строка(ТекДата) = Строка(Праздники.НайтиПоЗначению(ТекДата));
    Выходной = ДеньНедели(ТекДата) = 6 или ДеньНедели(ТекДата) = 7;
    Рабочих    = Рабочих+Число(Не Праздник и Не Выходной );
    ТекДата    = ТекДата+60*60*24 ;
    КонецЦикла;
    возврат Рабочих;
    КонецФункции

    &НаКлиенте
    Процедура РабочиеДниКоманда(Команда)
    Сообщить( Строка(Год(МояДата))+” рабочих дней “+Строка(РабочиеДни(МояДата)));
    КонецПроцедуры

    • 1. в нулевом узнал новые возможности языка 1с в отличие от 7.7 , система показалась удобнее  , понял как работать в конфигураторе, хотя остались вопросы по отладчику
      2. особых затруднений небыло
      3.хотелось бы услышать аналоги использования различных конструкция языка по сравнению с 7-й версией , например как прибавить день в обходе дат, узнать найден ли в списке значений элемент 1 или о ..

      • Пожелание понятно.
        Пока можете посмотреть решение ДЗ №3 и последнюю сессию мастер-группы.

  24. *гордо* Делал сам! Ушло около 4х часов+2-3 часа на отладку
    <code>

    Перем ГодНачала;
    Перем ПериодРасчета;
    Перем КоличествоДней;
    Перем ДатаНачалаДата;
    Перем ДатаКонецДата;
    Перем ДатаНачалоЧисло;
    Перем ДатаКонецЧисло;
    &НаКлиенте
    Процедура ВыполнитьРасчет(Команда)

    ГодНачала=2010;
    ПериодРасчета=10;

    Для Год=ГодНачала По ГодНачала+ПериодРасчета Цикл
    КоличествоДней=0;
    //конвертируем начальные данные в дату, затем в число для определения кол-ва дней в високосных годах
    ДатаНачалаДата=Дата(Год,01,01);
    ДатаКонецДата=КонецГода(ДатаНачалаДата);
    ДатаНачалаЧисло=ДеньГода(ДатаНачалаДата);
    ДатаКонецЧисло=ДеньГода(ДатаКонецДата);

    //Проверяем все дни на субб и воскресенье,кроме 1го января
    Для Счетчик=ДатаНачалаЧисло По ДатаКонецЧисло Цикл
    Если ДеньНедели(ДатаНачалаДата+((Счетчик-1)*60*60*24))<>6 И ДеньНедели(ДатаНачалаДата+((Счетчик-1)*60*60*24))<>7 Тогда
    КоличествоДней=КоличествоДней+1;
    КонецЕсли;
    КонецЦикла;
    //проверяем 8 марта, 23 февраля и 1го января на выходной
    Если ДеньНедели(ДатаНачалаДата)<>6 И ДеньНедели(ДатаНачалаДата)<>7 Тогда
    КоличествоДней=КоличествоДней-1;
    КонецЕсли;
    Если ДеньНедели(ДобавитьМесяц(ДатаНачалаДата,2)+23*60*60*24)<>6 И ДеньНедели(ДобавитьМесяц(ДатаНачалаДата,2)+23*60*60*24)<>7 Тогда
    КоличествоДней=КоличествоДней-1;
    КонецЕсли;
    Если ДеньНедели(ДобавитьМесяц(ДатаНачалаДата,3)+8*60*60*24)<>6 И ДеньНедели(ДобавитьМесяц(ДатаНачалаДата,3)+8*60*60*24)<>7 Тогда
    КоличествоДней=КоличествоДней-1;
    КонецЕсли;

    Сообщить(“”+Год+” год – “+КоличествоДней+” рабочих дней”);

    КонецЦикла;
    КонецПроцедуры
    Перем ГодНачала;Перем ПериодРасчета;Перем КоличествоДней;Перем ДатаНачалаДата;Перем ДатаКонецДата;Перем ДатаНачалоЧисло;Перем ДатаКонецЧисло;&НаКлиентеПроцедура ВыполнитьРасчет(Команда) ГодНачала=2010; ПериодРасчета=10; Для Год=ГодНачала По ГодНачала+ПериодРасчета Цикл КоличествоДней=0; //конвертируем начальные данные в дату, затем в число для определения кол-ва дней в високосных годах ДатаНачалаДата=Дата(Год,01,01); ДатаКонецДата=КонецГода(ДатаНачалаДата); ДатаНачалаЧисло=ДеньГода(ДатаНачалаДата); ДатаКонецЧисло=ДеньГода(ДатаКонецДата); //Проверяем все дни на субб и воскресенье,кроме 1го января Для Счетчик=ДатаНачалаЧисло По ДатаКонецЧисло Цикл Если ДеньНедели(ДатаНачалаДата+((Счетчик-1)*60*60*24))<>6 И ДеньНедели(ДатаНачалаДата+((Счетчик-1)*60*60*24))<>7 Тогда КоличествоДней=КоличествоДней+1; КонецЕсли; КонецЦикла; //проверяем 8 марта, 23 февраля и 1го января на выходной Если ДеньНедели(ДатаНачалаДата)<>6 И ДеньНедели(ДатаНачалаДата)<>7 Тогда КоличествоДней=КоличествоДней-1; КонецЕсли; Если ДеньНедели(ДобавитьМесяц(ДатаНачалаДата,2)+23*60*60*24)<>6 И ДеньНедели(ДобавитьМесяц(ДатаНачалаДата,2)+23*60*60*24)<>7 Тогда КоличествоДней=КоличествоДней-1; КонецЕсли; Если ДеньНедели(ДобавитьМесяц(ДатаНачалаДата,3)+8*60*60*24)<>6 И ДеньНедели(ДобавитьМесяц(ДатаНачалаДата,3)+8*60*60*24)<>7 Тогда КоличествоДней=КоличествоДней-1; КонецЕсли; Сообщить(“”+Год+” год – “+КоличествоДней+” рабочих дней”); КонецЦикла;КонецПроцедуры
    </code>
    Ответ такой

    2 010год – 258 рабочих дней
    2 011год – 259 рабочих дней
    2 012год – 260 рабочих дней
    2 013год – 259 рабочих дней
    2 014год – 258 рабочих дней
    2 015год – 258 рабочих дней
    2 016год – 259 рабочих дней
    2 017год – 259 рабочих дней
    2 018год – 259 рабочих дней
    2 019год – 259 рабочих дней
    2 020год – 259 рабочих дней

    • Обратная связь:
      1. Все новое – интересно.
      2. Блоки в принципе однородные, ни сложнее ни легче. Приходилось возвращаться и к циклам и к условиям и к примитивным типам на 3м ДЗ.
      3. Потратил около часа на всех ДЗ, пока пытался понять где переменные присваивать, где объявлять, как запускать обработку, чтобы она реагировала/не реагировала на кнопку  и выполнялась. Т.е. элементарные правила написания кода в модуле.

  25. Ярослав 15.04.2011 в 01:59

    Как всегда не успел со всеми(((
    по ДЗ
    Вот код решил обойтись без цикла по дням это слишком просто. в принципе весь расчет можно поместить в пару строк но это будет совсем не читабельно
    &НаКлиенте
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.

    НачальныйГод  = 2011;
    //ВисокосныйГод = 2012;

    для НачальныйГод = 2011 по 2021 цикл
    ВисокосныйГод = ПроверитьВисокосныйГод(НачальныйГод);   
    ЧислоДней = ПолучитьЧислоРабочихДней(НачальныйГод,ВисокосныйГод);
    сообщить(“В ” + НачальныйГод + ” год ” + ЧислоДней + ” Рабочих дней”);
    КонецЦикла;    

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

    &НаКлиенте
    Функция ПроверитьВисокосныйГод(Год)
    Если год%4 = 0 тогда
    Возврат Истина;
    иначе
    Возврат Ложь;
    КонецЕсли;
    КонецФункции

    &НаСервере
    Функция ПолучитьЧислоРабочихДней(НачальныйГод,ВисокосныйГод)
    КакойГодОтТекущего = НачальныйГод – Год(ТекущаяДата());

    ГодДляКалендаря = ДобавитьМесяц(НачалоГода(ТекущаяДата()),12*КакойГодОтТекущего);
    КакойДеньНеделиПервый = ДеньНедели(ГодДляКалендаря);
    СколькоРабочихДнейДоПервойНедели =  ?(КакойДеньНеделиПервый>5,0,5-КакойДеньНеделиПервый);  //КакойДеньНеделиПервый-1 тк 1 числа выходной

    Если НЕ ВисокосныйГод тогда
    //365 дней
    //посчитаем сколько дней без праздников вообще
    ДнейсполнымиНеделями = 365 – (8- КакойДеньНеделиПервый);
    РабочихДнейБезУчетПраздников = цел(ДнейсполнымиНеделями/7)*5+?(ДнейсполнымиНеделями%7<6,ДнейсполнымиНеделями%7,5);
    СколькоВычестьПразничныхДней = ?(ДеньНедели(ГодДляКалендаря+(31+22)*86400) < 6,1,0 ) + ?(ДеньНедели(ГодДляКалендаря+(31+28+7)*86400)< 6,1,0 );

    иначе //високосный 366 дней в году
    ДнейсполнымиНеделями = 366 – (8- КакойДеньНеделиПервый);
    РабочихДнейБезУчетПраздников = цел(ДнейсполнымиНеделями/7)*5+?(ДнейсполнымиНеделями%7<6,ДнейсполнымиНеделями%7,5);
    СколькоВычестьПразничныхДней = ?(ДеньНедели(ГодДляКалендаря+(31+22)*86400) < 6,1,0 ) + ?(ДеньНедели(ГодДляКалендаря+(31+29+7)*86400)< 6,1,0 );

    КонецЕсли;

    ВсегоРабочихДней  = СколькоРабочихДнейДоПервойНедели + РабочихДнейБезУчетПраздников – СколькоВычестьПразничныхДней;
    Возврат ВсегоРабочихДней;

    КонецФункции
    результат
    В 2 011 год 258 Рабочих дней
    В 2 012 год 259 Рабочих дней
    В 2 013 год 259 Рабочих дней
    В 2 014 год 260 Рабочих дней
    В 2 015 год 259 Рабочих дней
    В 2 016 год 258 Рабочих дней
    В 2 017 год 258 Рабочих дней
    В 2 018 год 258 Рабочих дней
    В 2 019 год 259 Рабочих дней
    В 2 020 год 261 Рабочих дней
    В 2 021 год 258 Рабочих дней
    по поводу Общих вопросов
    Отпишусь позже еще не до конца прошел курс.
     

    • Тимур 05.05.2011 в 18:42

      Неплохо. У меня есть несколько некритичных предложений по улучшению вашего кода:
       
       

      1) В функции ПроверитьВисокосныйГод достаточно написать

      <code>
      Возврат год%4 = 0;
      <code>

      Функция ведь возвращает результат выражения – ИСТИНУ если выражение истинно, и ЛОЖЬ – если ложно – так зачем писать лишний Если на 5 строк? Мне кажется это выглядит излишним, не находите?

      2) Функция ПолучитьЧислоРабочихДней у вас принимает вторым параметром Булево значение – признак високосности. Оно вычисляется и целиком зависит от номера текущего года – а он является первым параметром функции. Мне кажется, что в этом случае не стоит выносить признак високосности в параметр функции: его можно вычислить внутри этой функции на основании первого параметра. Да и какой смысл будет иметь эта функция, если ей передать номер невисокосного года, а значение параметра високосности передать ИСТИНА?

      <code>

      //
      ПолучитьЧислоРабочихДней( 2003, ИСТИНА)
      </code>

      В целом, конечно, это все некритично
       

      • Тимур 05.05.2011 в 18:48

        Какой ужас получился =( Попробую еще раз
         
        1) В функции ПроверитьВисокосныйГод достаточно написать
         
        Возврат год%4 = 0
         
        Функция ведь возвращает результат выражения – ИСТИНУ если выражение истинно, и ЛОЖЬ – если ложно – так зачем писать лишний Если на 5 строк? Мне кажется это выглядит излишним, не находите?
         
        2) Функция ПолучитьЧислоРабочихДней у вас принимает вторым параметром Булево значение – признак високосности. Оно вычисляется и целиком зависит от номера текущего года – а он является первым параметром функции. Мне кажется, что в этом случае не стоит выносить признак високосности в параметр функции: его можно вычислить внутри этой функции на основании первого параметра. Да и какой смысл будет иметь эта функция, если ей передать номер невисокосного года, а значение параметра високосности передать ИСТИНА?
         
        ПолучитьЧислоРабочихДней( 2003, ИСТИНА)


        В целом, конечно, это все некритично

  26. Извините за опоздание.
    Для НомерГода=0 По 9 Цикл
    Счетчик=0;
    НачДата=НачалоГода(ДобавитьМесяц(ТекущаяДата(),(НомерГода)*12));
    КонДата=КонецГода(ДобавитьМесяц(ТекущаяДата(),(НомерГода)*12));
    ТекущийГод=Год(ТекущаяДата())+НомерГода;
    Для НомерМесяца=1 По 12 Цикл
    ПоследДеньМесяца= День(КонецМесяца(Дата(ТекущийГод,НомерМесяца,01)));
    Для НомерДня=1 По ПоследДеньМесяца Цикл
    ДатаЦикла= Дата(ТекущийГод,НомерМесяца,НомерДня);
    Если ДеньНедели(ДатаЦикла)=6 ИЛИ ДеньНедели(ДатаЦикла)=7 Тогда  
    Продолжить
    КонецЕсли;
    Если ДатаЦикла= Дата(ТекущийГод,01,01)
    ИЛИ ДатаЦикла= Дата(ТекущийГод,02,23)
    ИЛИ ДатаЦикла= Дата(ТекущийГод,03,08) Тогда  
    Продолжить
    КонецЕсли;
    Счетчик=Счетчик+1;
    КонецЦикла;
    КонецЦикла;
    Сообщить(“”+ТекущийГод+” год – “+Счетчик+” рабочих дней “);
    0-й блок:
    1) Весь материал изложен очень хорошо и даже более подробно, чем я себе могла представить.  Для меня открытием стал материал главы “Работа в пользовательском режиме”
    2) Затруднения были во втором ДЗ. До просмотра решения разобраться помогли комментарии других пользователей.
    3) Подробнее хотелось бы узнать про использование Синтаксис-Помощника и  отладчика, а также про исполнение кода в разных контекстах. Я уже поняла, что все это далее по курсу.

  27. Виктор Смирнов 14.04.2011 в 18:46

    Самостоятельно осилить задание пока не смог.
    Пока еще не совсем хорошо умею пользоваться функциями глобального контекста.
    Пока ограничился  тем, что посмотрел решение, записанное на видео и разобрал несколько решений, опубликованных в этой ветке. Слава богу, проблем с разбором чужого кода нет. После того как решение вижу на бумаге,  оно становится ясным и понятным.
    Обратная связь
    Нулевая часть блока в принципе понравилась. Все объясняется достаточно доступно, да и сам формат обучения близок к оптимальному. До этого начинал изучать Радченко, и здесь нашел ответы на некоторые вопросы, которые у меня остались после ознакомления с этой книгой.
    Немного расстраивает то, что в видеоуроках используются те возможности, которые до этого еще не были объяснены пользователям.
    Например как пользоваться отладчиком или директивы компиляции (на клиенте или на сервере).  Если с отладчиком я разобрался самостоятельно, то с директивами до сих пор проблемы.  Жду, когда начнется их изучение.

  28. volodyapgu 13.04.2011 в 22:36

    Решить самостоятельно д/з не удалось, опыта программирования не имею и поэтому не могу сообразить что и как использовать. Проанализировал решения пользователей и  посмотрел ваше решение. Надеюсь что по мере обучения картина как-то изменится.

    Ответы на 3 вопроса:
    1.Для меня практически весь материал связанный с написанием кода новый, работал только как пользователь. Начинаю понимать какие-то вещи.
    2. Заатруднения были и во втором и в третьем д/з
    помогают решения пользователей и ваши решения.
    3. Вы показываете как с помощью отладчика и табло смотреть пошагово как работает программа, но непонятно как это сделать чтобы она не просто останавливалась на точке останова, а двигалась пошагово как у вас. И еще есть много вопросов, но не задаю т. к. понимаю, что знаний пока ноль буду изучать материал и надеюсь, что многие вопросы постепенно отпадут. Посмотрев часть Базового курса заказал и Продвинутый знания однозначно пригодятся, даже если пойму не все, но буду очень стараться.

    • Про отладчик подробно будем говорить в 1-ом блоке.
      Желаю Вам успехов в обучении!

  29. Internetkina 13.04.2011 в 22:14

    Домашнее задание выложу завтра. Пока чтобы не сильно опоздать кратко “оставляю обратную связь”:
    1.  одно время начинала читать книжку “1С:Предприятие 8.2 коротко о главном”, т.е. кое какие новшевства уже были известны мне. Однако, кое что нашла и новое, либо в книге не описанное, либо мною не замеченное. В частности вынесение “вложенных реквизитов” на управлямую форму, да ещё и в режиме предприятия, т.е. если на форме есть реквизит Контрагент, то мы можем вытащить ИНН контрагента на форму. очень удобная штука с учетом, что в 8.1 пришлось бы прописывать такие вещи в конфигураторе. Понравилось разъяснения по работе с сообщениями, оповещениями и т.д. Горячие клавиши для навигации по блокам условия и циклу Ctrl+( уже взяла на вооружение, не знала что такое есть, облегчили жизнь. Для начала неплохо описана структура файлов платформы и конфигурации, особенности работы в файловом и клиент-серверном режимах.
    2. Затруднений по урокам практически не возникало, кроме 2го домашнего задания, большую часть смотрела на ускоренном режиме, по причине отставания от группы, и т.к. есть хороший опыт работы с 8.1 и небольшой с 8.2.
    3. В 4-ой главе в ролике “Особенности файлового варианта” упоминалась структура файла 1Cv8.1CD и ограничения по размеру БД. В частности было сказано что файл внутри состоит из множества таблиц это сама конфигурация, списки пользователей, таблицы с данными и т.д. И у каждой таблицы есть ограничение в 4 ГБ. Хотелось бы узнать про таблицы с данными. Т.к. есть опыт работы с 7.7. то там была следующая структура хранения данных вносимых пользователем в режиме предприятия: для каждого объекта метаданных создавалась своя таблица DBF в которой хранились данные. Например создавали мы в конфигураторе новый справочник, в итоге при сохранении изменений у нас появлялся в папке с базой файл SC123.DBF, при просмотре папки с базой мы могли определить что в файлах SC хранятся данные справочников, DH данные шапки документов, DT данные таблиц документов и т.д. и увидеть объём хранимых в них данных.
    Вопрос: Таблица(ы) данных внутри файла 1CD есть для каждого объекта метаданных по аналогии с 77 или какая-то иная структура? Например я зашла в конфигуратор, создала новый справочник назвала его “Номенклатура”, сохранила изменения в конфигурации и в базе данных, что произошло в этот момент внутри файла 1CD? создалась новая таблица лимит которой 4 ГБ, т.е. я в режиме предприятия могу внести номенклатуры до 4х ГБ? и что случится если я привышаю лимит, система не даст записать больше, или же база может не запуститься? К примеру если будет запущена обработка заполнения этого нового справочника с циклом в пару миллионов или миллиардов значений, когда будет достигнут лимит данных в 4 ГБ что произойдёт? Вопрос интересует не из мотива сделать бяку и переполнить базу, а из тех соображений, что очень часто некоторые организации используют авто загрузки с внешних файлов, например грузят прайс-листы от поставщиков, но так как база не резиновая, неплохо было бы понимать последствия таких загрузок.

    • >Таблица(ы) данных внутри файла 1CD есть для каждого объекта метаданных по аналогии с 77 или какая-то иная структура?
      Да, но для некоторых объектов метаданных создается несколько таблиц (например, это регистры накопления).
      Структура хранения аналогичная, но от 7.7 отличается.
      И коренное отличие заключается в том, что для хранения используется свой собственный формат, а не dbf.
      > создала новый справочник назвала его «Номенклатура», сохранила изменения в конфигурации и в базе данных, что произошло в этот момент внутри файла 1CD
      Для справочника без табличной части будет создано 4 таблицы:
      – таблица описания структуры справочника;
      – таблица данных;
      – таблица хранения реквизитов неограниченной длины;
      – таблица индексов;
      Размер каждой из них ограничен 4Гб.

      Если в некоторый момент произойдет попытка превышения лимита, то система не зафиксирует соответствующую транзакцию записи. То есть система не позволит превысить указанный лимит.
      И по сути нормальная работа в такой ИБ будет невозможна – нужно будет переходить на клиент-серверный вариант.

    • И сразу отвечу на следующий Ваш вопрос – можно ли определить размер таблицы в файловой ИБ.
      Такими средствами платформа не располагает.
      Единственный вариант – перегнать базу в клиент-серверный вариант и посмотреть размер таблиц в нем.
      Но поскольку форматы хранения значительно отличаются, мы получаем лишь приблизительное значение.

  30. kuznetsovimail 13.04.2011 в 18:13

    В  ДЗ допустил опечатку вычислил количество выходных, а написал что это рабочие дни.

  31. 1. Систематизировал знания по 1С 8, узнал некоторые новые моменты и успешно их применяю.
    2. Сложности в задании 2, но трудности были преодолены.
    3. Материал очень инетересный.
    Спасибо, Насипову Фариту и Гилёву Евгению за такой курс.

    Пожелание: побольше домашних заданий

  32. Домашнее задание 3:

    Понимаю что длинный код,но постарался использовать то что проходил в уроках:

    &amp;НаКлиенте
    Процедура ВычислениеКоличестваРабочихДней(Команда)
        Перем   КоличествоПраздничныхДнейВРабочие;
        ГодОтсчета=Год(ТекущаяДата());
        ДесятьЛетВперед=ГодОтсчета+10;
        КоличествоМесяцев=0;
        МассивПраздничныхДней=Новый Массив;
        Пока ГодОтсчетаДесятьЛетВперед Цикл
            КоличествоДнейВГоду=ДеньГода(КонецГода(ДобавитьМесяц(ТекущаяДата(),КоличествоМесяцев)));
            КоличествоРабочихДней=0;
            ДеньНедели=ДеньНедели(НачалоГода(ДобавитьМесяц(Дата,КоличествоМесяцев)));
            Праздничные=ПраздничныеДниВГоду(ГодОтсчета,МассивПраздничныхДней,КоличествоПраздничныхДнейВРабочие);
            Для i=1 По КоличествоДнейВГоду Цикл
                Выходной=ДеньНедели=6 ИЛИ ДеньНедели=7;
                Если НЕ Выходной Тогда
                     КоличествоРабочихДней=КоличествоРабочихДней+1;
                КонецЕсли;  
                ДеньНедели=?(ДеньНедели=7,0,ДеньНедели);
                ДеньНедели=ДеньНедели+1;
            КонецЦикла;
            КоличествоРабочихДней=КоличествоРабочихДней-Праздничные;
            Сообщить(Строка(ГодОтсчета)+" год - "+Строка(КоличествоРабочихДней)+" рабочих дней");
            ГодОтсчета=ГодОтсчета+1;
            КоличествоМесяцев=КоличествоМесяцев+12;
        КонецЦикла;
       
    КонецПроцедуры          
    &amp;НаСервере
    Функция ПраздничныеДниВГоду(ГодОтсчета,МассивПраздничныхДней,КоличествоПраздничныхДнейВРабочие)
       
        КоличествоПраздничныхДнейВРабочие=0;
        МассивПраздничныхДней.Очистить();
        МассивПраздничныхДней.Добавить(?(ДеньНедели(Дата(СтрЗаменить(Строка(ГодОтсчета),Символ(160),"")+"0101"))=6 ИЛИ ДеньНедели(Дата(СтрЗаменить(Строка(ГодОтсчета),Символ(160),"")+"0101"))=7, Ложь,Истина));
        МассивПраздничныхДней.Добавить(?(ДеньНедели(Дата(СтрЗаменить(Строка(ГодОтсчета),Символ(160),"")+"0223"))=6 ИЛИ ДеньНедели(Дата(СтрЗаменить(Строка(ГодОтсчета),Символ(160),"")+"0223"))=7, Ложь,Истина));
        МассивПраздничныхДней.Добавить(?(ДеньНедели(Дата(СтрЗаменить(Строка(ГодОтсчета),Символ(160),"")+"0308"))=6 ИЛИ ДеньНедели(Дата(СтрЗаменить(Строка(ГодОтсчета),Символ(160),"")+"0308"))=7, Ложь,Истина));
        Для каждого ЭлементМассива Из МассивПраздничныхДней Цикл
            КоличествоПраздничныхДнейВРабочие=КоличествоПраздничныхДнейВРабочие+Число(ЭлементМассива);
        КонецЦикла;
        Возврат КоличествоПраздничныхДнейВРабочие;

    КонецФункции
  33. Вот, кстати, из пожеланий вспомнилось
    1. Больше домашних заданий, но не обязательных, а что-то “внеклассного чтения” – кто хочет, то возится, кто считает что ему это не надо, не возится, соответственно, разбор решений не в виде подробного видео, а просто ответом с комментариями, если они нужны, ну и на “внеклассное” отдельную тему, чтобы участники могли делиться мыслями.
    2. Очень прошу в темах, которые озаглавлены “Занятие номер такое-то”, указывать, что времени на изучение материала и выполнение ДЗ отведено с такого-то по такое-то число, решение будет предоставлено с такого-то по такое-то. Иначе приходится каждый раз отматывать в тему с план-графиком и сличать даты по плану. Я понимаю, что могу нарисовать календарь и повесить его на стенку, но указывать это сразу в теме было бы очень удобно.

    • 1. Пожелание записали.

      2. А конфигурацией для просмотра курсов не пользуетесь? Мы в ней постарались сделать удобный план-график.
      > могу нарисовать календарь
      Зачем же рисовать. В конфигурации в форме план-графика есть кнопка “Печать”. :)

      • Не пользуюсь, бывает смотрю видео в дороге и торчащий сбоку из ноута ключ 1С можно легко сломать неосторожным движением. Поэтому VLC и плейлист – гораздо удобнее.

        • примерно за 12 000 000 мы готовы продать все материалы проекта в исходниках : )
          Никаких ключей не потребуется : ))

          • Я думаю, что смогу найти людей, которые запросто выложат 12миллионов за исходники 1С, чтобы раз и навсегда пользоваться ей без ключа )

  34. stormalter 13.04.2011 в 09:47

    1.
    После прохождения комплексного курса по платформе 8.2
    были получены определенные знания, но в вашем курсе узнал много нового.
    Систематизировал знания и устранил пробелы в понимании некоторых
    вещей. Очередной раз убедился, что курс в ЦСО – это “галопом по европам”
    и выполняет он только ознакомительную роль. Даже после прохождения
    вменяемая картинка не сложилась, т.к. все сжато, быстро и если
    твой мозг немного не успевает за повествованием лектора, то
    времени для допонимание просто нет. Выйдя после курса можно сразу
    открывать литературу и начинать сначала. Ознакомление с вашим курсом
    очередной раз укрепило в правильности инвестиций и неэффективности
    курса от ЦСО.

    2.
    Так-как я еще не волшебник, а учусь – были определенные
    сложности уже на 2-м задании. Сказывается небольшой навык
    в программировании на этой платформе, но как говорится движение в этом
    направлении и пара бессоных ночей сделали дело.

    3.
    Мне все интересно, что вы предоставляете. Пока много вопросов
    для текущего ознакомления.