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

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

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

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

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

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

  1. Шаг1
    Белик Любовь, ведущий инженер-программист, Новокузнецк, автотранспортное предприятие.
    До начала занятий по этой программе я пыталась программировать на 1с 8.0 и 1С 8.1, имея совершенно поверхностные знания. Но прослушав Базовый курс, я открыла совершенно иной мир. Практически весь материал был для меня новым, за малым исключением.
    Самое серьезное заблуждение: программирование в 1с 8.2 чрезвычайно сложное. Теперь я смотрю на 8-ку с оптимизмом. Запросы и СКД тоже виделись мне очень сложными.
    Пройдя курс, я, даже продолжая заниматься с 1С 7.7, стала больше включать в код запросы.
    Очень хорошо было рассказано о предмете бухгалтерского учета. Еще одно моё заблуждение, что бухгалтерию понять ТРУДНО! Но ваш способ обучения сломал эту твердыню.
    О зарплате я напротив думала, что я знаю хорошо сам предмет и мне будет легко все понять, но вот тут то оказалось все не так. Над зарплатой так же пришлось напряженно потрудиться, чтобы усвоить материал.
    Клиентские и серверные процедуры по началу мне было сложно их делить, но продвигаясь по курсу, это восприятие упростилось.
    Приобретенные навыки практически сразу пришлось применять. Только мы закончили блок по бухгалтерии, как очень срочно надо было доработать документ, созданный для экономической службы, где надо было к плановым цифрам добавить фактическое выполнение. Времени мне отвели 1.5 дня и сурово сказали: НАДО! Когда мне рассказали какие цифры им нужны я сразу поняла, что все они есть в регистре бухгалтерии! Я ведь сделала этот документ в указанный срок! Я была так вам благодарна! Я конечно потом еще 2 недели шлифовала код, потому что пользователи любят выдавать важную информацию частями, но всё это было только мне на пользу! К этому документу я сделала и отчет. Это было самая моя серьезная работа.
    Неожиданным было написание запросов в параметрах запроса. О наличии виртуальных таблиц я не знала, но как они удобны! То, что табличные части документа отдельные таблицы в базе, я поняла не сразу, но усвоив это стало легче работать с запросами.
    Формат обучения в сравнении с очным несомненно оказался подходящим, т.к. совмещаешь и работу, и обучение. Сейчас не жалею и о том, что не было возможности получить какую-либо помощь, решая задания. Приходилось самой искать ходы, решения, оказываясь от придуманного, пробуя множество вариантов. Надо сказать, что ритм занятий очень напряженный. Мне пришлось отказаться от многих вещей, ради учебы. Реально я втянулась в процесс только во второй половине обучения. Очень хорошо изложен материал. В самом начале я прослушала рекламный ролик с голосом Евгения Гилева и именно голос и манера говорить были решающими факторами, в пользу покупки курса. Я сразу поверила вам. И не ошиблась. Евгений, у вас дар обучать! Слава Богу, что этим даром вы помогаете многим людям! Благословений вам и всей команде!

    Шаг 2
    1) Документ Поступление. В модуле формы вместо процедуры ПриСозданииНаСервере (которая неуместна с целью заполнения реквизита для нового документа), создать клиентскую процедуру ПриОткрытии() и из неё уйти в серверную процедуру.
    В которой, при условии, что это новый документ, заполнить реквизит ИсточникПоступления значением константы ОсновнойИсточник.
    2) Документ Поступление. Не поняла смысл заполнения Стандартного реквизита Дата значением заполнения 01.01.1980 0:00:00, я бы убрала это значение.
    3) Документ ВыбытиеЖивотных. В модуле формы, в клиентской процедуруе ПриОткрытии() нельзя читать значение константы, поэтому и из неё уйти в серверную процедуру.
    В которой, при условии, что это новый документ, заполнить реквизит Направление значением константы ОсновноеНаправление.
    4) Документ ВыбытиеЖивотных. ОбработкаПроведения(). Строку: Движения.РазмещениеЖивотных.Записывать = Истина; УБРАТЬ, т.к. далее происходит запись движений напрямую.
    5) А при записи движений, вместо Движения.Записать(); надо указать имя регистра: Движения.РазмещениеЖивотных.Записать();
    6) Во вложенном запросе, при формировании таблицы ДанныеДокумента, нужно добавить условие ВыбытиеЖивотныхЖивотные.Ссылка = &Ссылка.
    7) Этот же запрос, при установке параметров запроса, вместо МоментВремени() установить значение Новый Граница(МоментВремени(), ВидГраницы.Включая)
    8) Далее, сообщая об ошибке по номеру строки, надо значение номера строки уменьшать на единицу
    9) Документ ПеремещениеЖивотных. ОбработкаПроведения(). Строку: Движения.РазмещениеЖивотных.Записывать = Истина; УБРАТЬ, т.к. далее происходит запись движений напрямую. А при записи движений, вместо Движения.Записать(); надо указать имя регистра: Движения.РазмещениеЖивотных.Записать();
    10) Запрос необходимо дополнить условием:

    |ГДЕ
    |   РазмещениеЖивотныхОстатки.КоличествоОстаток < 0";

    11) Хорошо бы при перемещении или прибытии животных проверять пустая клетка или в ней уже есть какое-то животное, если это другое животное, то выдавать предупреждение.
    12) Регистр ВыбытияЖивотных надо сделать оборотным, т.к. выбытие увеличивается в одну сторону.
    13) В параметрах запуска системы переключатель поставить на значение выбирать автоматически.

    Шаг 3
    Сегодня провела семинар для соседнего предприятия. Они попросили рассказать про СКД, но получилось и про запросы пришлось кое-что рассказать!

    • Dobrenko Oleg 27.06.2013 в 07:09

      Любовь, благодарим за развернутый отзыв!
      Практическое задание принято, фото мини-семинара получили. Поздравляем, вы в списке финалистов базового курса!

  2. Доброго времени суток!
    Шупиченко Марина Петровна, эксперт по разработке ПО, ООО «Центр информационных технологий, г. Стрежевой Томской области.
    Шаг 1.
    Этот курс- именно то, что надо. Я давно такой искала . Много лет программировала на Клиппере и на языке на его основе, разработанном поставщиком ПО из Томска (это старый язык программирования, кто застал DOS- возможно слышали). С 2009 г. начала работать с 1С, сначала на внедрении, теперь + программирование (нетиповые конфигурации). Сначала было очень нелегко, мыслить объектами было трудно, непривычен код на русском языке и т.д.
    Очные курсы – конечно хорошо, но очень быстро проходят, и практического материала в очных курсах часто бывает недостаточно((
    Этот же курс хорош во всех отношениях – большой объем материала, подробные объяснения, материал можно пересмотреть несколько раз. Особо хочу отметить пользу от решений домашних заданий и возможность видеть решения преподавателя.
    Курс помог уложить в голове многие базовые моменты, в которых было недопонимание- иерархия классов, работа с синтакс – помощником, работа с формами, клиент- серверное взаимодействие, общие модули и т.д. Абсолютно новой (и трудной) для меня была зарплатная часть. На запоминание деталей не всегда хватало времени, пора начинать повторение, укреплять нейронные связи, как сказано на первой странице методички .
    В заключении хочу сказать огромное спасибо всей команде за то, что вы делаете!
    Евгению Гилеву отдельное спасибо за феноменальную подачу материала!
    Шаг 2.
    1) В параметрах запуска 1С:Предприятия задала режим запуска «Выбирать автоматически» вместо «Толстый клиент»;

    2) В документах “Поступление животных» и «Выбытие животных» – настроила командный интерфейс формы для видимости движений документа. Исправила процедуру «при открытии» формы документа.
    Константу можно получить только на сервере

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

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

    3) При создании документа поступления его дата заполнялась значением 01/01/1980, убрала значение заполнения из стандартного реквизита «Дата».
    4) в процедуре «при создании на сервере» добавила проверку на пустую ссылку для того, чтобы при открытии уже имеющихся документов не менять источник поступления.

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

    5) Количество в реквизитах документов и регистров – можно исправить на 15,3 , но в данной конфигурации этого можно и не делать( если планируется использовать документы только для отражения движений животных в шт.)
    6) Создала форму документа «Перемещение животных» для того, чтобы видеть движения по регистрам. Настроила видимость регистров в командном интерфейсе формы.
    7) В процедуре «Обработка проведения» дописала условие «Где» в запрос, вычисляющий нехватку животных, т.к. для того, чтоб вычислить нехватку используя новый способ проведения документов, нужно найти отрицательные остатки по требуемым параметрам.

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

    8) Инвентаризация – сняла проверку заполнения с колонки «КоличествоФакт», теоретически значение в колонке может быть равным 0.
    9) в процедуру ЗаполнитьНаСервере() документа «Инвентаризация» добвила параметр «Дата» ( Инвентаризация проводится на дату документа).

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

    10) Регистр «Выбытия животных» должен быть оборотным.
    11)Документ «Выбытие животных». В данные заполнения при создании документа выбытия передается дата 01/01/1980, закомментировала кусок кода

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

    12) Исправила параметр в запросе при проведении документа «Выбытие животных» ( т.к. используем таблицу остатков, надо учитывать границу периода)

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

    13) Исправила индекс при выводе сообщения:

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

    14) В отчете «Размещение животных» прописала выражение для даты (т.к. в регистре остатков не учитывается последняя секунда периода

      ДобавитьКДате(КонецПериода(&Период, "День"), "Секунда", 1)

    Шаг 3.
    Мои первые робкие попытки помочь миру.Кстати, дело очень полезное, и для тех, кто пытается помочь, тоже 
    http://forum.infostart.ru/forum26/topic88333/message931286/#message931286
    http://forum.infostart.ru/forum26/topic88265/message930448/#message930448
    http://forum.infostart.ru/forum26/topic88023/message928239/#message928239
    http://forum.infostart.ru/forum26/topic88300/message930861/#message930861

    • Dobrenko Oleg 24.06.2013 в 07:52

      Здравствуйте, Марина!
      Благодарим за отзыв по курсу. Поздравляем, вы в списке финалистов!

  3. Alexandr Lipatnikov 21.06.2013 в 10:09

    Шаг 1.
    Липатников Александр Витальевич, руководитель группы автоматизации в Управлении Пенсионного фонда РФ в г.Руза, Московской области.
    Серьезно начал интересоваться вопросами программирования в 1С 8 с прошлого 2012 года. Сдал тест по платформе 1С: Профессионал, решил углубить свои знания и изучить материал более детально. Практически весь курс для меня был новым, смотрел уроки, как говорится, на одном дыхании. Очень нравится сама форма обучения, когда ты зависишь только от себя, занимаешься в свободное время и без отрыва на основном месте работы. В планах подготовится и сдать аттестацию на специалиста по платформе, для чего уже заказан продвинутый курс. В результате обучения понял, что программировать не так уж и сложно. Спасибо большое за создание данного ресурса и проекта!

    Шаг 2. Ошибки и недочеты, которые я обнаружил в конфигурации:

    1. В параметрах конфигурации “Запуск 1С:Предприятия” включено “Толстый клиент (управляемое приложение)”. Необходимо
    поставить “Выбирать автоматически”.

    2.Документ “Поступление” – если пользователь не вносит дату руками – проставляется дата 01.01.1980 – на мой взгляд не очень
    удобно и не логично. В настройках стандартного реквизита “Дата” убрать значение заполнения.

    3. Скорее не ошибка, а небольшой недочет: реквизит “ИсточникПоступления” заполняется в модуле формы документа “Поступление”, логичнее внести алгоритм заполнения
    данного реквизита в модуль объекта в Обработку заполнения. Тем самым реквизит будет заполняться независимо от формы.

    4. Документ “ВыбытиеЖивотных” – в модуле формы документа присутствует обращение к константе на стороне клиента – ошибка, т.к. данный объект в тонком клиенте не доступен.
    Вынес код, в котором прописываем заполнение реквизита “Направление” в модуль объекта в обработку заполнения.

    5. Аналогично, как и у документа “Поступление” если пользователь не задает дату документа “ВыбытиеЖивотных” руками- устанавливается значение 01.01.1980. В настройках
    стандартного реквизита “Дата” убираем галочку со свойства “Заполнять из данных заполнения” и в модуле объекта в обработке заполнения уберем код

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

    6. При проведении документа “ВыбытиеЖивотных” неправильно контролируется остаток, связано с несколькими ошибками (ошибки 7-10):
    7. В запросе, получающем данные из табличной чати документа нет условия, что нам нужны данные только текущего документа (ВыбытиеЖивотныхЖивотные.Ссылка = &Ссылка)
    8. В виртуальной таблице “РазмещениеЖивотныхОстатки” условие сформировал бы следующим образом

    (Животное, Клетка) В
        (ВЫБРАТЬ РАЗЛИЧНЫЕ
            ВыбытиеЖивотныхЖивотные.Животное,
            ВыбытиеЖивотныхЖивотные.Клетка
        ИЗ
            Документ.ВыбытиеЖивотных.Животные КАК ВыбытиеЖивотныхЖивотные
        ГДЕ
            ВыбытиеЖивотныхЖивотные.Ссылка = &Ссылка)

    Таким образом, выбираю без повторяющихся значений.

    9. В связях двух таблиц “ДанныеДокумента” и “РазмещениеЖивотныхОстатки” необходимо левое соединение к таблице “ДанныеДокумента”.

    В конце концов запрос принял вид:

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

    10. Установить Параметр “Момент времени” как границу с типом “Включая”

    11. В сообщении пользователю о нехватке обращаться к строке табличной части документа правильнее так:

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

    . В (предлагаемой конфигурации не вычитается единичка).

    12. У регистра “ВыбытияЖивотных” необходим вид “Обороты”, а не “Остатки”

    13. Регистр “ВыбытияЖивотных” не выводится в ноль, т.к. делаются только приходные движения – с изменением вида регистра с “Остатки” на “Обороты”
    избавляемся от такой ошибки.

    14. В документе “ВыбытиеЖивотных” движения по регистрам “РазмещениеЖивотных” и “ВыбытияЖивотных” делаю в одном цикле

    Для Каждого ТекСтрокаЖивотные Из Животные Цикл
            Движение = Движения.РазмещениеЖивотных.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Животное = ТекСтрокаЖивотные.Животное;
            Движение.Клетка = ТекСтрокаЖивотные.Клетка;
            Движение.Количество = ТекСтрокаЖивотные.Количество;
           
            Движение = Движения.ВыбытияЖивотных.Добавить();
            Движение.Период = Дата;
            Движение.Животное = ТекСтрокаЖивотные.Животное;
            Движение.Направление = Направление;
            Движение.Количество = ТекСтрокаЖивотные.Количество;
        КонецЦикла;

    15. Отчет “РазмещениеЖивотных” не учитывает того, что остаток берется на предыдущую секунду. Можно решить использованием функции ДОБАВИТЬКДАТЕ(&ПериодОтчета,”СЕКУНДА”,1).
    Т.е. вводим еще один параметр, заполнить который и предлагаем пользователю.

    16. При проведении документа “ПеремещениеЖивотных” неправильно контролируется остаток- в запросе нет условия на отрицательный остаток. Правильный запрос:

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

    17. Не очень нравится, что при заполнении документа “Инвентаризация” остаток берется на текущую дату, а не на дату документа. Думаю, правильнее бы было делать именно
    на дату документа “Инвентаризация”.

    Фото отчет мини-семинара:

    1

    2

    • Dobrenko Oleg 21.06.2013 в 14:05

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

  4. Жуков Алексей, Красноярский край, г. Минусинск. Пока только устраиваюсь на работу во франч

    1. Мои впечатления по курсу:

    Уфф! ))) Признаться в начале я был совершенно далек от представления каков базовый курс на самом деле, насколько он сильно отличается от представления начинающих по книге Радченко. Я еще помню в начале думал: Да стоит ли проходить то вообще, что там я не знаю как создать справочник или документ что ли…

    После прохождения Базового курса, оглядываясь назад, я вообще удивляюсь как я работал. Такое впечатление что раньше я вообще ничего не знал. )

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

    Уверен теперь, что код лучше оттестить на 10 раз, посмотреть на возможные последствия, прогнать отчеты, и лучше посидеть подольше в первый раз но все сделать по уму, чем быстренько сдать работу и потом чесать затылок перед клиентом.

    После прохождения базового курса могу смело теперь браться за задания бухгалтеров, знаю теперь где искать концы решения, какая процедура или обработчик за что отвечает, и распределять код как можно более оптимально, а не сваливать все в модуль объекта, как раньше )
    Идеальный выход использовать общие модули – сейчас уже и мыслить начинаешь по другому, и код смотрится и понимается легче, и как сделать еще более оптимально уже понимаешь без проблем

    Регистры и работа с Расчетами я пробовал и раньше, но не понял нифига, а то что понял через месяц забыл. Благодаря графическим схемам и сидению за разборами по 5-6 часов в день ( а иногда так и выходило, потому что не хотел двигаться дальше пока не пойму какой счет относится к активному какой к пассивному, какой элемент ПВР базовый, какой вытесняющий). Вид обучения мне кажется идеальным. Во первых, видео позволяет перемотать, прослушать еще и еще раз, и самое главное, подумать. Поэтому мне кажется, если в Москве формат видео обучения скоро и отомрет, то в Сибири еще долго будет пользоваться успехом. Ведь по сути как такового обучения не происходит, если ищешь что-то самостоятельно, ты спер у кого то кусочек кода который работает, и втыкаешь его в разные работы просто потому, что он работает, а в детали просто не в даешься, потому что не знаешь с какого бока подойти. Тут же сидишь и думаешь, и познавая важные мелочи, которые в итоге совсем не мелочи, ты учишься думать наперед и выбирать оптимальное решение, самое оптимальное, плюс знаешь что ответить, почему ты процедуру печати размечаешь в модуле команды и модуле менеджера, а не так как все – все в модуль объекта! А чо это модуль команды, зачем это…???

    Благодаря курсу я закончил свою разработку Ведение учета для малого автопредприятия, и сегодня пригласили на собеседование в крупный франч. Хотя опыта работы практически никакого, но строчка в резюме “Окончил курсы по проекту Spec8.ru сыграла решающее значение.

    Очное обучение в ЦСО я проходил в одиночку, потому что группа просто распалась, не захотели учится. Выделили мне машину, дали методичку, и давай вперед самостоятельно. Над первым заданием:

    Организация = Константы.Организация.Получить();

    я думал 4 дня, потому что до этого программировал только на Бейсике в 1990 году )))
    в конце обучения до чего додумался, с тем и получил свидетельство о прослушке: а на деле научился только создавать объекты, составлять простые отчеты да заполнять табличную часть. В общем, если б мне сразу этот базовый курс, столько времени можно было бы сэкономить…

    впереди Продвинутый. повторение курса конвертации ( на середине сказал себе стоп, и решил начать с азов, с базового), далее курсы по Бухгалтерии 2.0. Все уже в наличии есть, Нужно только время и время )

    2. Тестирование информационной базы

    По порядку нахождения ошибок:
    Документ ПоступлениеЖивотных: Таб. часть Животные, реквизит Количество – исправил точность на 3 (длина 15 точность 3)

    2. На форме документа Поступление в командном интерфейсе поставил галочку видимости регистра РазмещениеЖивотных;

    3. РегистрНакопления РазмещениеЖивотных – в ресурсе Количество так же исправил точность на 3,

    4. Документ Инвентаризация –
    Поправил Реквизит количество в таб части – длина 15 точность 3;

    поправил обработку заполнения таб части Животныедокумента Инвентаризация:

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

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

    ………

    5. Документ ВыбытиеЖивотных – на форме включил видимость регистра ВыбытияЖивотных, поправил код на форме документа:

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

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

         Возврат Константы.ОсновноеНаправление.Получить();

    КонецФункции // получитьНаправление()

    Далее

    6. убрал из движений регистр РазмещениеЖивотных, так как это относится к приходу, а не к расходу;

    7 удалил соответствующий код в обработке проведения оставив только движения по регистру РазмещениеЖивотных,

    8. поправил точность реквизита Количество в таб части (точность не 0 а 3)

    9. в обработке проведения документа Выбытие Животных поправил текст запроса:

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

        Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
        Запрос.УстановитьПараметр("Ссылка", Ссылка);

        Результат = Запрос.Выполнить();
       
        Если Не Результат.Пустой() Тогда

            ВыборкаДетальныеЗаписи = Результат.Выбрать();

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
               
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Недостаточно животного в "+ВыборкаДетальныеЗаписи.Животное+" в "+ВыборкаДетальныеЗаписи.Клетка+" в количестве "+ВыборкаДетальныеЗаписи.Нехватка;
                Сообщение.Поле = "Животные["+ВыборкаДетальныеЗаписи.НомерСтроки+"].Животное";
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();
               
            КонецЦикла;
                     Отказ = Истина;
        Иначе
             
            Движения.ВыбытияЖивотных.Записывать = Истина;
            Для Каждого ТекСтрокаЖивотные Из Животные Цикл
                // далее код оставил таким же

    10. в этом же коде как показано выше, строчку “Отказ = истина” переместил после цикла выдачи сообщения о нехватке, так как логичнее сначала показать пользователю в чем причина а потом уже пугать его красным крестиком =)

    11. в обработке заполнения этого же документа в условии если – удалил веточку иначе, не вижу в ней смысла, если заполняем на основании документа инвентаризация, то все отлично, а по другому не делаем ничего.

    12. Документ перемещение Животных, без особого удивления правлю реквизит Количество – точность исправляю на 3,

    13. Документ Перемещение животных, в модуле объекта правлю текст запроса:

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

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

    и правлю так же обработку проведения: добавляю очищение записей в начале, свойство записывать=истина передвигаю в конец, а добавление по движению расхода включаю в условие проверки на отрицательные остатки;, и добавляю условие в цикл, потому что в документе может быть не одна строчка табличной части:

    Процедура ОбработкаПроведения(Отказ, Режим)
       
        Движения.РазмещениеЖивотных.Очистить();
        движения.РазмещениеЖивотных.Записать();
       
       
        Движение = Движения.РазмещениеЖивотных.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Животное = Животное;
        Движение.Клетка = КлеткаКуда;
        Движение.Количество = Количество;
       
       
       
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |   РазмещениеЖивотныхОстатки.Животное,
        |   РазмещениеЖивотныхОстатки.Клетка,
        |   ВЫБОР
        |       КОГДА РазмещениеЖивотныхОстатки.КоличествоОстаток < 0
        |           ТОГДА -РазмещениеЖивотныхОстатки.КоличествоОстаток
        |       ИНАЧЕ 0
        |   КОНЕЦ КАК Нехватка
        |ИЗ
        |   РегистрНакопления.РазмещениеЖивотных.Остатки(
        |           &МоментВремени,
        |           Животное = &Животное
        |               И Клетка = &Клетка) КАК РазмещениеЖивотныхОстатки";
       
        Запрос.УстановитьПараметр("Животное", Животное);
        Запрос.УстановитьПараметр("Клетка", КлеткаОткуда);
        Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(), ВидГраницы.Включая));
       
        Результат = Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = Результат.Выбрать();
       
        Пока  ВыборкаДетальныеЗаписи.Следующий() цикл
           
            Если  ВыборкаДетальныеЗаписи.Нехватка<0 Тогда
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Недостаточно животного "+ВыборкаДетальныеЗаписи.Животное+" в "+ВыборкаДетальныеЗаписи.Клетка+" в количестве "+ВыборкаДетальныеЗаписи.Нехватка;
                Сообщение.Сообщить();
                Отказ = Истина;
               
            иначе
                Движение = Движения.РазмещениеЖивотных.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;
                Движение.Животное = Животное;
                Движение.Клетка = КлеткаОткуда;
                Движение.Количество = Количество;
            КонецЕсли;
        КонецЦикла;
        Движения.РазмещениеЖивотных.Записывать = Истина;
       

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

    Кроме этого создаю форму документа, и вывожу на форму видимость регистра РазмещениеЖивотных.

    помощь миру:

    http://forum.infostart.ru/forum26/topic88175/message929734/?result=reply#message929734

    http://forum.infostart.ru/forum26/topic88197/message929740/?result=reply#message929740

    http://forum.infostart.ru/forum26/topic88192/message929751/?result=reply#message929751

    http://forum.infostart.ru/forum26/topic88134/message929766/?result=reply#message929766

    http://forum.infostart.ru/forum26/topic88217/message929852/?result=reply#message929852

    • Dobrenko Oleg 20.06.2013 в 09:05

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

  5. Чуприна Ирина. Программист. Московская область, г.Люберцы.

    Финальное задание.

    Шаг 1. Обратная связь.
    Очень объемный и полезный материал. Что особенно порадовало – это весомое количество практических занятий. Интересным оказалось и то, что при рассмотрении решений домашних заданий других участников, к концу курса понимаешь, что уже гораздо быстрее вникаешь в чужой код. Не хватало печатных материалов и времени, пользоваться видеоуроками в части поиска не удобно, а конспекты писать не всегда успеваю. Но в целом курс прошел очень увлекательно, захватывает. Даже расставаться жалко. Но у меня еще есть материалы Мастер-группы и бонусы 

    Формат обучения конечно сильно выигрывает в сравнении с очным обучением. Просто «небо и земля», тут и говорить нечего.
    Большое вам спасибо за идею и ее реализацию!
    Буду брать еще курсы от вашей команды.

    Шаг 2. Практическая задача.
    Список возможных ошибок в конфигурации «Зоопарк»:

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

    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
        ИсточникПоступления = Константы.ОсновнойИсточник.Получить();

    2. Документ «Поступление».
    В стандартных реквизитах для реквизита Дата установлено значение заполнения 01.01.1980.
    Решение: удаляем значение заполнения.

    3. Документ «ВыбытиеЖивотных».
    Также в модуле формы из клиентской процедуры заполняется реквизит Направление значением константы, (получение которой почему-то на платформе 8.2.18.102 стало доступна в контексте клиента … хотя при проверке модуля выдается ошибка).
    Решение:
    Лучше разместить код заполнения значением по умолчанию в модуле объекта, тогда он будет доступен для всех форм.

    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
        Направление = Константы.ОсновноеНаправление.Получить();

    4. В той же процедуре ОбработкаЗаполнения присутствует код, который очищает параметр ДанныеЗаполнения и устанавливает дату документа на 1980-й год.

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

    Решение:
    Удалить этот фрагмент кода.

    5. Контроль остатков в документе «ВыбытиеЖивотных».
    Контроль остатков не работает, запрос не оптимален. Не учитывается режим проведения.
    Решение:
    При установке параметра использовать «Граница», чтобы получать остатки учитывая движения текущего документа

        Если Режим = РежимПроведенияДокумента.Оперативный Тогда
            Запрос.УстановитьПараметр("МоментВремени", Неопределено);
        Иначе
            Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени()));
        КонецЕсли;

    6. Изменить текст запроса на:

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

    7. В той же процедуре проведения документа «ВыбытиеЖивотных» неправильно устанавливается номер строки для вывода связанного сообщения.
    Решение:
    Чтобы получить индекс добавить «-1» к номеру строки.

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

    8. Документ «ПеремещениеЖивотных». Контроль остатков при перемещении работает неправильно.
    Решение:
    Добавить в запрос процедуры ОбработкаПроведения условие и тоже учесть режим проведения:

    |ГДЕ
    |   РазмещениеЖивотныхОстатки.КоличествоОстаток < 0";

    9. Регистр накопления «ВыбытияЖивотных».
    Вид регистра – Остатки. При этом движения по регистру осуществляются только одним документом в одну сторону. Таким образом регистр никогда «не уйдет в ноль».
    Решение:
    Изменить вид регистра на «Обороты».

    10. Отчет «РазмещениеЖивотных».
    В отчете при установке периода могут не учитываться движения за текущий день.
    Решение:
    В настройках схемы компоновки данных для Периода в поле Дата указать состав даты = Дата.
    В выражении для Периода указать «ДобавитьКДате(КонецПериода(&Период, “День”), “Секунда”, 1)»

    Шаг 3. Помощь начинающим.
    Моя посильная «помощь миру»:
    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=613587#613587
    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=613627#613627
    Остальные ветки на форумах как то уже заполнены советами, поэтому может быть в качестве полезного инструмента подойдет немного переделанная мною обработка КонсольЗапросов для управляемого приложения? Некоторый функционал типовой обработки не работал, теперь в консоли запросов возможно настраивать автоматическое сохранение с выбором периода, работает настройка сохранения запросов в файл и автоматическое заполнение из файла настроек при следующем открытии. Немного изменена форма для удобства применения. Обработка может работать, как встроенной в конфигурацию, так и в режиме открытия внешней обработки. Мне эта консоль очень помогала еще на курсе «Быстрый старт», может быть пригодится и следующим участникам.
    http://yadi.sk/d/okJq_o0W5y9zQ

    • Dobrenko Oleg 20.06.2013 в 08:26

      Ирина, благодарим за отзыв!
      Шаги №2,3 приняты, поздравляем с успешным окончанием базового курса. Ждем на продвинутом!