Базовый курс. Финальное задание 23-го потока

Объявляем начало финала 23-го потока базового курса по программированию.

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

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

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

комментариев 10 на “Базовый курс. Финальное задание 23-го потока”

  1. Доброго дня!
    1.Обратная связь
    Свирина Екатерина Владимировна, главный бухгалтер, Москва
    Нового было много, стала понимать архитектуру 1с, взаимосвязи объектов, понимать программный код. Самыми интересными оказались, пожалуй, уроки о регистрах бухгалтерского учета и регистрах расчета. Для меня курс оказался достаточно интенсивным, так что все до конца усвоить не удалось, скорее всего буду возвращаться к видео-урокам еще не один раз.
    Практически, кроме того, что полученные знания помогают более эффективно использовать 1с в моей бухгалтерской работе, написала для себя небольшую программу для учета личных доходов в разрезе затраченного времени и учета расходов.
    Формат обучения считаю оптимальным во всех отношениях, с очным нельзя даже сравнивать! Самый большой минус – неудобный поиск по урокам конкретной информации, тратится слишком много времени.
    В целом – огромное спасибо всей команде за вашу работу!!!
    2. Практическое задание
    Документ Поступление:
    1)По умолчанию подставляется дата документа 01.01.1980. Очистила поле “значение заполнения” в свойствах стандартного реквизита Дата.
    2)При открытии уже существующего документа реквизит “источник” перезаполняется из константы. Добавила условие в процедуру ПриСозданииНаСервере в модуле формы

    Если Объект.Ссылка.Пустая() Тогда
            Объект.ИсточникПоступления = Константы.ОсновнойИсточник.Получить();
        КонецЕсли;

    3)Проведение документа с незаполненным реквизитом Источник посчитала ошибкой, а не “устраивающим функционалом”. Установила для реквизита свойство проверка заполнения – выдавать ошибку.
    Документ Выбытие Животных
    4)Документ не открывается (интересно, что при открытии документа в режиме отладки, ошибок не возникает). Заменила клиентскую процедуру модуля формы ПриОткрытии на процедуру ПриСозданииНаСервере.
    5)По умолчанию подставляется дата документа 01.01.1980. Удалила часть кода в процедуре ОбработкаЗаполнения

    //Иначе
        // 
        //  ДанныеЗаполнения = Новый Структура;
        //  ДанныеЗаполнения.Вставить("Дата", '19800101');

    6)Отсутствует проверка на наличие животных при проведении. Исправлено определение параметра запроса

    Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);     
        Запрос.УстановитьПараметр("МоментВремени", Граница);

    Документ Перемещение животных
    7)Неверно работает контроль остатков при проведении. Изменен текст запроса

    Запрос.Текст =
            "ВЫБРАТЬ
            |   РазмещениеЖивотныхОстатки.Животное,
            |   РазмещениеЖивотныхОстатки.Клетка,
            |   РазмещениеЖивотныхОстатки.КоличествоОстаток КАК Нехватка
            |ИЗ
            |   РегистрНакопления.РазмещениеЖивотных.Остатки(
            |           &МоментВремени,
            |           Животное = &Животное
            |               И Клетка = &Клетка) КАК РазмещениеЖивотныхОстатки
            |ГДЕ
            |   РазмещениеЖивотныхОстатки.КоличествоОстаток < 0";

    Документ Инвентаризация
    8)При автоматическом заполнении не учитывает дату документа. Изменила установку параметра запроса

    Запрос.УстановитьПараметр("Дата",КонецДня(Объект.Дата));

    9)Регистр накопления Выбытие Животных должен иметь вид – обороты.
    10)После изменения вида регистра перестал работать отчет Анализ выбытия животных. Добавила условие по периодичности в параметры ВТ.
    11)К свойствам реквизита Количество во всех документах добавила “неотрицательное”.(полагаю это ошибка, а не функционал)
    3. Помощь миру
    http://infostart.ru/public/237942/

    • Dobrenko Oleg 27.11.2013 в 03:28

      Екатерина, благодарим за развернутый отзыв, поиск будем дорабатывать :)
      Практическое задание и “помощь миру” приняты, поздравляем – вы в списке финалистов!

  2. Никита (nick_krsk) 24.11.2013 в 06:45

    Добрый день!
    Николайчук Никита Владимирович, руководитель отдела программирования, г.Красноярск.

    Обратная связь
    1.Из базового курса я узнал много новой информации. С 1С 8.2 я работаю около года (до этого несколько лет работал с 7.7). Общее представление о работе платформы у меня было. Но с помощью данного курса я начал обращать внимания на, казалось бы, не очевидные вещи. А понимание нюансов работы системы помогает в решении реальных задач.
    3.Избавился от заблуждения, что бухгалтерский учет и расчет зарплаты это вещь весьма сложная и непонятная.
    Новые навыки я начал применять уже во время прохождения курса. Пользовался новыми знаниями при проектировании и реализации доработок для реальной информационной базы (оперативный учет).В планах – оптимизировать архитектуру системы, сделать ее оптимальнее. Произвести рефакторинг.
    4.Лично для меня формат обучения был удобен. Я выделял свободное время в выходные дни и вечером в будни.

    Практическое задание
    1.Документ ВыбытиеЖивотных. Не работает контроль остатков т.к. в нем не учитываются движения текущего документа. Чтобы это исправить нужно вместо строки:
    Запрос.УстановитьПараметр(“МоментВремени”, МоментВремени());
    Написать:
    Запрос.УстановитьПараметр(“МоментВремени”, Новый Граница(МоментВремени(),ВидГраницы.Включая));

    2.Регистр накопления ВыбытияЖивотных увеличивается только в одну сторону. Это приведет к увеличению таблиц остатков и замедлению работы системы. Поэтому нужно сделать регистр ВыбытияЖивотных оборотным.
    3.Документ Инвентаризация. По кнопке Заполнить вычисляются актуальные остатки, а не на дату документа. Нужно изменить запрос:

    Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   РазмещениеЖивотныхОстатки.Животное,
            |   РазмещениеЖивотныхОстатки.Клетка,
            |   РазмещениеЖивотныхОстатки.КоличествоОстаток КАК Количество
            |ИЗ
            |   РегистрНакопления.РазмещениеЖивотных.Остатки(&ДатаОстатков, ) КАК РазмещениеЖивотныхОстатки";

        Запрос.УстановитьПараметр("ДатаОстатков",КонецДня(Объект.Дата));

    4.Документ ВыбытиеЖивотных. Если документ вводится не на основании Инвентаризации, то дата документа всегда 01.01.1980. Нужно в обработке заполнения удалить строки:
    ДанныеЗаполнения = Новый Структура;
    ДанныеЗаполнения.Вставить(“Дата”, ‘19800101’);

    5.Справочники НаправлениеВыбытия и ИсточникиПоступления отображают одинаковыую сущность, которую можно назвать “Вид движения”. Поэтому эти два справочника можно заменить на один.
    6.В регистрах неплохо было бы установить флаг “Запрет незаполненных значений” для измерений.
    7.Документ ВыбытиеЖивотных, вывод сообщения пользователю о нехватке товаров. Неверно задается индекс строки.
    Вместо:Сообщение.Поле = “Животные[“+(ВыборкаДетальныеЗаписи.НомерСтроки)+”].Животное”;
    Нужно написать:Сообщение.Поле = “Животные[“+(ВыборкаДетальныеЗаписи.НомерСтроки-1)+”].Животное”;

    8.Документ ПеремещениеЖивотных, ошибка в запросе при контроле остатков. Не хватает условие по отрицательным остаткам:

        Запрос.Текст =
            "ВЫБРАТЬ
            |   РазмещениеЖивотныхОстатки.Животное,
            |   РазмещениеЖивотныхОстатки.Клетка,
            |   -РазмещениеЖивотныхОстатки.КоличествоОстаток КАК Нехватка
            |ИЗ
            |   РегистрНакопления.РазмещениеЖивотных.Остатки(
            |           &МоментВремени,
            |           Животное = &Животное
            |               И Клетка = &Клетка) КАК РазмещениеЖивотныхОстатки
            |ГДЕ
            |   РазмещениеЖивотныхОстатки.КоличествоОстаток < 0
            |";

    9.Документ Поступление. Источник поступления заполняется каждый раз при открытии. Нужно перенести заполнение в процедуру ОбработкаЗаполнения:ИсточникПоступления = Константы.ОсновнойИсточник.Получить();
    10.Документ Поступление. Для реквизита ИсточникПоступления включить проверку заполнения.

    Помощь миру (комментарий №4):
    http://forum.infostart.ru/forum26/topic99335/message1027382/?result=reply#message1027382

    • Dobrenko Oleg 27.11.2013 в 03:26

      Никита, благодарим за отзыв по курсу!
      Финальное задание принято, поздравляем с успешным окончанием базового курса!

  3. —Обратная связь————————-
    Из базового курса я узнал очень много нового. Если до начала курса я имел смутное представление об 1с8 в

    целом (был опыт конфигурирования только в 1с7.7). То к концу курса я достаточно свободно ориентируюсь в

    1с8.2. К тому же узнав разные, казалось бы простые и очень эффективные приемы, до которых я бы вряд ли

    до думался, которые значительно облегчают жизнь программиста (особенно начинающего ;) ).
    По этому я очень рад, что подписался на эти курсы. Формат обучения для меня очень удобен, т.к. не всегда

    получается сидеть каждый вечер в одно и тоже время.

    Москвин М.В. программист, г. Кирово-Чепецк, Кировской области.

    —2. Выявление ошибок ——————-

    Ошибки №:
    1. Получение значения константы было на клиенте.
    Выявлена Проверкой модулей (Конфигурация-Проверка модулей).
    Способ устранения: – добавить функцию

    &НаСервереБезКонтекста
    Функция ПолучениеКонстанты()
        Возврат Константы.ОсновноеНаправление.Получить();
    КонецФункции

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        Если Объект.Ссылка.Пустая() Тогда
            Объект.Направление = ПолучениеКонстанты();
        КонецЕсли;
    КонецПроцедуры

    2. Лишняя строка Движения.Запись()

    3. неправильный запрос в модуле объекта документа ВыбытиеЖивотных

    ВЫБРАТЬ
        ЕСТЬNULL(РазмещениеЖивотныхОстатки.КоличествоОстаток, 0) -

    ЕСТЬNULL(ВыбытиеЖивотныхЖивотные.Количество, 0) КАК Нехватка,
        ВыбытиеЖивотныхЖивотные.Животное КАК Животное,
        ВыбытиеЖивотныхЖивотные.Клетка КАК Клетка,
        МИНИМУМ(ВыбытиеЖивотныхЖивотные.НомерСтроки) КАК НомерСтроки
    ИЗ
        РегистрНакопления.РазмещениеЖивотных.Остатки(
                &МоментВремени,
                Животное В
                    (ВЫБРАТЬ
                        ВыбытиеЖивотныхЖивотные.Животное
                    ИЗ
                        Документ.ВыбытиеЖивотных.Животные КАК

    ВыбытиеЖивотныхЖивотные
                    ГДЕ
                        ВыбытиеЖивотныхЖивотные.Ссылка = &Ссылка
                    СГРУППИРОВАТЬ ПО
                                ВыбытиеЖивотныхЖивотные.Животное)) КАК

    РазмещениеЖивотныхОстатки
            ПОЛНОЕ СОЕДИНЕНИЕ Документ.ВыбытиеЖивотных.Животные КАК

    ВыбытиеЖивотныхЖивотные
            ПО РазмещениеЖивотныхОстатки.Животное = ВыбытиеЖивотныхЖивотные.Животное
                И РазмещениеЖивотныхОстатки.Клетка = ВыбытиеЖивотныхЖивотные.Клетка
    ГДЕ
        ВыбытиеЖивотныхЖивотные.Ссылка = &Ссылка
        И ЕСТЬNULL(РазмещениеЖивотныхОстатки.КоличествоОстаток, 0) -

    ЕСТЬNULL(ВыбытиеЖивотныхЖивотные.Количество, 0) < 0

    СГРУППИРОВАТЬ ПО
        ВыбытиеЖивотныхЖивотные.Животное,
        ВыбытиеЖивотныхЖивотные.Клетка,
        ЕСТЬNULL(РазмещениеЖивотныхОстатки.КоличествоОстаток, 0) -

    ЕСТЬNULL(ВыбытиеЖивотныхЖивотные.Количество, 0)

    4. После получения результата запроса при выводе сообщения пользователю
    было

    Сообщение.Поле = "Животные["+ВыборкаДетальныеЗаписи.НомерСтроки+"].Животное";

    Должно быть

    Сообщение.Поле = "Животные["+(ВыборкаДетальныеЗаписи.НомерСтроки - 1)+"].Животное";

    т.к. строка по индексу, а не по номеру строки.

    5.(возможно просто опечатка) В модуле объекта документа ПеремещениеЖивотных в процедуре

    ОбработкаПроведения движение нужно поменять местами (начала расход, а затем приход)

    6. В модуле объекта документа ПеремещениеЖивотных в процедуре ОбработкаПроведения, убрать строку

    Движения.Записать();

    7. В модуле объекта документа ПеремещениеЖивотных в процедуре ОбработкаПроведения, заменить запрос

    на

    ВЫБРАТЬ
        РазмещениеЖивотныхОстатки.Животное,
        РазмещениеЖивотныхОстатки.Клетка,
        ЕСТЬNULL(РазмещениеЖивотныхОстатки.КоличествоОстаток, 0) -

    ЕСТЬNULL(ПеремещениеЖивотных.Количество, 0) КАК Нехватка
    ИЗ
        РегистрНакопления.РазмещениеЖивотных.Остатки(
                &МоментВремени,
                Животное = &Животное
                    И Клетка = &Клетка) КАК РазмещениеЖивотныхОстатки
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеЖивотных КАК ПеремещениеЖивотных
            ПО РазмещениеЖивотныхОстатки.Животное = ПеремещениеЖивотных.Животное
                И РазмещениеЖивотныхОстатки.Клетка = ПеремещениеЖивотных.КлеткаОткуда
    ГДЕ
        ЕСТЬNULL(РазмещениеЖивотныхОстатки.КоличествоОстаток, 0) -

    ЕСТЬNULL(ПеремещениеЖивотных.Количество, 0) < 0
        И ПеремещениеЖивотных.Ссылка = &Ссылка

    8. При создании нового документа Поступление, реквизиту Дата присваивалось значение 01.01.1980 0:00:00
    Способ устранения: Очистить поле ЗначениеЗаполнения в политре свойств у стандартного реквизита Дата

    9. При создании нового документа ВыбытиеЖивотных, реквизиту Дата присваивалось значение 01.01.1980

    0:00:00.
    Способ устранения:
    – в политре свойств реквизита Дата, убрать галочку “Заполнять из данных заполнения” и
    в модуле объекта документа ВыбытиеЖивотных в процедуре ОбработкаЗаполнения убрать

    Иначе
        ДанныеЗаполнения = Новый Структура;
        ДанныеЗаполнения.Вставить("Дата", '19800101');

    10. При открытии документа Поступление реквизиту ИсточникПоступления, всегда присваивалось значение из

    константы. При том не важно проведен уже документ или нет
    Способ устранения:
    – добавить условие для проверки на заполнение реквизита ИсточникПоступления в модуль формы в

    процедуру ПриСозданииНаСервере

    Если НЕ ЗначениеЗаполнено(Объект.ИсточникПоступления) Тогда
        Объект.ИсточникПоступления = Константы.ОсновнойИсточник.Получить();
    КонецЕсли;

    11. Для всех измерений и ресурсов регистров накопления поставить Проверка заполнения: выдавать ошибку

    12. В форме документа Инвентаризация у элементов ЖивтоноеЖивотное, ЖивотноеКлетка в политре свойств

    поставить галочку “ТолькоПросмотр”

    13. Отчет размещение животных, период не приводится к концу дня
    Способ исправления: в СКД на закладке “Пареметры”, в колонке выражение написать:

    КонецПериода(&Период, "День")

    —-3. Помощь миру ——————————————-
    С этой частью домашнего задания у меня к сожалению, ни чего не получилось (((

    • Dobrenko Oleg 27.11.2013 в 03:24

      Благодарим за отзыв!
      >я очень рад, что подписался на эти курсы
      ждем на продвинутом :)
      По поводу шага №3 – проведите мини семинар для менее опытных коллег! Они будут Вам благодарны :)

  4. ILya_Dremalov 22.11.2013 в 14:34

    Дремалов Илья Николаевич, 1С программист, Воронеж
    С платформой “1С:Предприятие 8” уже работаю некоторое время и удается применять знания и навыки, полученные в ходе обучения на курсе. В основном это относится к работе с регистрами накопления и сведений. Формат обучения считаю наиболее оптимальным для меня. Видео на флешке может помочь и помогает при решении возникающих вопросов.

    1. Документ «Выбытие животных», модуль формы документа, при создании нового документа происходит получение константы
    на клиенте. Создал новую функцию ПолучитьОсновноеНаправление() &НаСервере.
    2. Документ «Поступление животных». Станадартный реквизит Дата. Убрал значениеЗаполнения “01:01:1980”
    3. Документ «Поступление живоных». Установил Проверку заполнения в значение “Выдавать ошибку” для реквизита ИсточникПоступления.
    4. Документ “Выбытие животных”. Модуль формы документа. В процедуре ПриОткрытии() нужно получать значение Константы
    ОсновноеНаправление функцией с директивой &НаСервере.
    5. Документ «Выбытие животных». Модуль объекта. Процедура ОбработкаПроведения. Параметр запроса МоментВремени
    устанавливается как Граница с ВидомГраницы – Включая.
    6. Документ «Выбытие животных». Проверка на заполнение реквизита Направление.
    7. Документ «Выбытие животных». Модуль объекта. Процедура ОбработкаПроведения. В запросе изменил поле НомерСтроки
    (-1) КАК Индекс. Нумерация строк с 0.

    Запрос.Текст =
            "ВЫБРАТЬ
            |   РазмещениеЖивотныхОстатки.Животное,
            |   РазмещениеЖивотныхОстатки.Клетка,
            |   -РазмещениеЖивотныхОстатки.КоличествоОстаток КАК Нехватка,
            |   ДанныеДокумента.НомерСтроки - 1 КАК Индекс
            |ИЗ

    8. в данных документа 003 «Выбытие животных» установлена некорректная дата, По документам: Животное “Лама” было
    перемещено в клекту “Клетка средняя 40 м2”. Таким образом, Выбытие датой 01.06.2011 не может быть
    9. Документ «Выбытие животных», модуль объекта. Обработка проведения, Запрос на проверку нехватки животного.
    Внутреннее соединение с выборкой по текущему документу.
    10. документ «Инвентаризация» ошибка при настройке проверки заполнения табличной части, колонка “количество факт”.
    при вводе количества факт равным нулю система сообщает об ошибке, но хотя такое возможно. нужно настроить соответствующую проверку в конфигураторе.
    11. Документ «Инвентаризация». Модуль формы документа. Процедура Заполнить. Запрос из таблицы остатков регистра без указания даты. Добавил параметр Период и установил его как границу с видом границы – включая.
    12. Документ «Поступление животных», модуль формы документа. Процедура ПриСозданииНаСервере добавил проверку
    Объект.Ссылка.Пустая() (новый это документ или нет).

    Помощь миру. http://www.forum.mista.ru/topic.php?id=688282.
    Фото вышлю на mg@spec8.ru.

    • Dobrenko Oleg 27.11.2013 в 03:22

      Илья, благодарим за отзыв по курсу!
      >и удается применять знания и навыки, полученные в ходе обучения на курсе.
      Отлично, желаем успехов в дальнейшем обучении.
      Финальное задание принято, поздравляем Вас с успешным окончанием базового курса!

  5. 1. Обратная связь

    Ковалев Алексей Сергеевич, инженер-программист, г.Псков.

    Во время изучения базового курса по программированию я получил детальное представление о работе управляемых
    приложений клиент-серверного варианта и о работе с запросами. Совершенно новой для меня была информация, размещенная
    в блоках по бухгалтерскому учету и расчету заработной платы. Благодаря новым навыкам начал успешно применять
    клиент-серверный вариант при разработке новой конфигурации.Формат обучения для меня был очень удобен, поскольку
    была возможность заниматься в любое удобное для меня время.Отедльная благодарность разработчикам курсов за предоставленные
    бонусы. Из них я почерпнул множество идей для решения своих рабочих задач. Учитывая всю полученную информацию в целом –
    и на курсах, и почерпнутую из “бонусов”, – я могу решать новые задачи с большим успехом и минимизацией временных затрат.

    2. Практическое задание

    – Документ Поступления.

    1. При открытии документа Поступления подставляется значение источника по умолчанию, нужно организовать проверку,
    чтобы работало только для новых документов.

    Модуль формы:

    &НаСервере
     Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если Объект.Ссылка.Пустая() Тогда
            Объект.ИсточникПоступления = Константы.ОсновнойИсточник.Получить();
        КонецЕсли;    
     КонецПроцедуры

    2. В свойствах стандартного реквизита дата удаляем “Значение заполнения” = 01.01.1980 0:00:00

    3. Устанавливаем проверку заполнения для реквизита “ИсточникЗаполнения”

    – Документ ВыбытияЖивотных.

    4. В модуле формы документа для подстановки ОсновногоНаправления, нужно изменить процедуру:

    &НаСервере
     Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если Объект.Ссылка.Пустая() Тогда
            Объект.Направление = Константы.ОсновноеНаправление.Получить();
        КонецЕсли;
     КонецПроцедуры

    5. В модулеОбъкта ОбработкаПроведения установить параметр МоментаВремени() по границе, включая:

    Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая); 
     Запрос.УстановитьПараметр("МоментВремени", Граница);

    6. В модулеОбъкта ОбработкаПроведения сообщение об ошибке привязать по индексу, а не по строке:

    Сообщение.Поле = "Животные["+(ВыборкаДетальныеЗаписи.НомерСтроки-1)+"].Животное";

    7. Устанавливаем проверку заполнения для реквизита “Направление”

    – Документ Инвентаризация

    8. В табличной части “Животные”, колонка “Количество” поставить галочку “ТолькоПросмотр” – для ограничения
    редактирования данных пользователем.

    9. Заполнение табличной части “Животные” происходит только по животным, которые есть на остатке. А нужно выводить
    остаток всех животных, которые занесены в справочнике. Для этого меняем запрос:

     "ВЫБРАТЬ
            |   Звери.Зверь КАК Животное,
            |   Остатки.Клетка,
            |   Остатки.Количество
            |ИЗ
            |   (ВЫБРАТЬ
            |       Животные.Ссылка КАК Зверь
            |   ИЗ
            |       Справочник.Животные КАК Животные
            |   ГДЕ
            |       Животные.ЭтоГруппа = ЛОЖЬ) КАК Звери
            |       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            |           РазмещениеЖивотныхОстатки.Животное КАК Животное,
            |           РазмещениеЖивотныхОстатки.Клетка КАК Клетка,
            |           РазмещениеЖивотныхОстатки.КоличествоОстаток КАК Количество
            |       ИЗ
            |           РегистрНакопления.РазмещениеЖивотных.Остатки КАК РазмещениеЖивотныхОстатки) КАК Остатки
            |       ПО Звери.Зверь = Остатки.Животное";

    10. Убрать проверку заполнения графы “КоличествоФакт” в табличной части “Животные”

    – Регистр РазмещениеЖивотных

    11. Поставить проверку заполнения у реквизитов

    – Регистр ВыбытияЖивотных

    12. Поставить проверку заполнения у реквизитов.
    13. Поменять вид регистра на Обороты

    – Отчет РазмещенияЖивотных

    14. Приводим данные к концу дня, на закладке “Параметры”
    меняем в типе даты состав даты на “Дата” и выражение приводим
    к концу дня “КонецПериода(&Период, “День”)”

    3. Помощь миру

    Отправляю фотографии на mg@spec8.ru

    • Dobrenko Oleg 22.11.2013 в 06:49

      Здравствуйте, Алексей.
      Благодарим за отзыв!
      Поздравляем с успешным окончанием базового курса и ждем на продвинутом :)