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

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

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

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

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

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

  1. Букин Руслан Евгеньевич, г.Вологда

    Шаг №1:
    1.Новым в изучении данного курса для меня оказалась работа с регистрами бухгалтерии и расчета;
    2.Избавился от заблуждения, что “программировать-это сложно!”;
    3.С помощью полученных знаний я создал конфигурацию для учета рабочего времени преподавателя ВУЗа;
    4.Неожиданным для меня явилась работа с конструктором запросов;
    5.Формат обучения более удобен по сравнению с очным обучением.

    Шаг №2:
    1.В параметрах запуска 1С:Предприятия прописан толстый клиент, лучше задать «Выбирать автоматически»;
    2.В регистре накопления “Товары на складе”для ресурса «Количество» лучше задать точность 3, а не 2;
    3.Регистратором регистра накопления указан только документ «Покупка товаров», что является ошибкой, документ «Продажа товаров» также необходимо указать как формирующий движения по данному регистру.
    4.В документе «Покупка товаров» для реквизита «Количество» в табличной части неверно указан тип «Строка», нужно задать тип «Число», длина 15, точность 3;
    5.Исправил код в модуле объекта документа “Покупка товаров”:

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

    6.Исправил код в форме документа “Покупка товаров”:

    &НаКлиенте
    Процедура ЗаполнитьКлиента(Команда)
        Объект.Клиент = ЗаполнитьКлиентаНаСервере();
    КонецПроцедуры

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

        Возврат  Справочники.Клиенты.ОсновнойПоставщик;

    КонецФункции // ЗаполнитьКлиентаНаСервере()
     
    &НаКлиенте
    Процедура ЗаполнитьТовары(Команда)
       
        Перем Основание;
        ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));
        Если НЕ Основание = Неопределено И НЕ Основание.Пустая() Тогда
            ЗаполнитьТоварыНаСервере(Основание);
        КонецЕсли;
       
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
       
        Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
             
    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    7.В документе «Продажа товаров» для реквизита «Серия» в табличной части лучше задал связь параметров выбора: «Отбор.Владелец(Товары.Товар)».
    8.Исправил модуль объекта документа “Продажа товаров”:

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

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

        ВыборкаТовары = Результат.Выбрать();

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

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

    9.Для задания обязательности заполнения номера серии в справочнике «Серии» я для стандартного реквизита «Код» задал проверку заполнения в значение «Выдавать ошибку».
    10.Изменил код в форме документа “Продажа товаров:

    &НаКлиенте
    Процедура ПроверкаДокумента(Команда)
        ЗаписьНаСервере();
    КонецПроцедуры

    &НаСервере
    Процедура ЗаписьНаСервере()
        ДокументОбъект=РеквизитФормыВЗначение("Объект");
        ДокументОбъект.Записать();
        ЗначениеВРеквизитФормы(ДокументОбъект,"Объект");
        ПроверкаДокументовСервер.ПроверитьДокумент(Объект.Ссылка);
    КонецПроцедуры // ЗаписьНаСервере()

    11.В свойствах общего модуля «ПроверкаДокументовСервер» не установлен флаг «Вызов сервера» – устанавливаем данный флаг;
    12.Изменил код общего модуля «ПроверкаДокументовСервер»:

    Процедура ПроверитьДокумент(Документ) Экспорт

        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   ПродажаТоваровТовары.Товар,
            |   ПродажаТоваровТовары.НомерСтроки
            |ИЗ
            |   Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
            |ГДЕ
            |   ПродажаТоваровТовары.Ссылка = &Ссылка
            |   И ПродажаТоваровТовары.Количество < 0";

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

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

        Выборка = Результат.Выбрать();

        Пока Выборка.Следующий() Цикл
            Сообщить("Ошибка в строке № "+Выборка.НомерСтроки+" количество не может быть отрицательным!");
        КонецЦикла;

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

    Шаг №3:
    Фотографии с семинара:

    1

    2

    • Dobrenko Oleg 21.05.2013 в 09:01

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

  2. Алексей Иванов 19.05.2013 в 18:27
    Шаг 1.

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

    Шаг 2.

    0) В параметрах запуска 1С:Предприятия жестко прописан толстый клиент.
    Это не очень оправданно, лучше задать “Выбирать автоматически”.
    1) В регистре накопления для ресурса “Количество” лучше задать точность = 3, а не 2.
    2) Регистратором регистра накопления указан только документ “ПокупкаТоваров”, что является грубой ошибкой.
    Документ “ПродажаТоваров” также необходимо указать как формирующий движения по данному регистру.
    3) В документе “ПокупкаТоваров” для реквизита “Количество” в табличной части неверно указан тип “Строка”, что является грубой ошибкой.
    Нужно задать тип “Число”, длина 15, точность 3, неотрицательное.
    4) В обработке проведения документа “ПокупкаТоваров” допущена ошибка – формируемые движения никогда не будут записаны.
    Для исправления можно добавить в самом начале:

    Процедура ОбработкаПроведения(Отказ, Режим)
        // регистр ТоварыНаСкладе Приход
        Движения.ТоварыНаСкладе.Записывать = Истина;
       
        Для Каждого ТекСтрокаТовары Из Товары Цикл
        // дальнейший код процедуры

    5) В форме документа “ПокупкаТоваров” в обработчике команды “ЗаполнитьКлиента” допущена ошибка – делается попытка со стороны клиента получить доступ к серверным объектам.
    Исправить можно следующим образом:

    &НаКлиенте
    Процедура ЗаполнитьКлиента(Команда)
        Объект.Клиент = ПолучитьОсновногоПоставщика();
    КонецПроцедуры

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

    6) По условию задачи не требуется создавать никакого ввода на основании для документа “ПокупкаТоваров”.
    Соответственно, нужно убрать с формы кнопку “ЗаполнитьТовары” и также можно удалить/закомментировать связанные с ней процедуры “ЗаполнитьТовары” и “ЗаполнитьТоварыНаСервере”.
    7) В документе “ПродажаТоваров” для реквизита “Серия” в табличной части лучше задать связь параметров выбора как “Отбор.Владелец(Товары.Товар)”.
    Также, так как ведется учет себестоимости по средней, имеет смысл в форме документа реквизит “Сумма” табличной части сделать недоступным для редактирования, так как заполнять его мы будем автоматически.
    8) В обработке проведения документа “ПродажаТоваров” во внутреннем запросе использующемся в условии параметров виртуальной таблицы “РегистрНакопления.ТоварыНаСкладе.Остатки” лучше задать дополнительный параметр “Без повторяющихся”.
    Также, в запросе не устанавливается отбор по самому документу, что является грубой ошибкой.
    Для исправления нужно наложить дополнительное условие.
    Ошибками являются использование внутреннего соединения вместо левого, а также не учитываются возможные NULL-значения.
    Также ошибкой является то, что не учитывается возможность указания в табличной части нескольких одинаковых товаров/серий.
    Это можно исправить задав свертку табличной части в процедуре “ПередЗаписью”:

    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
        Товары.Свернуть("Товар, Серия", "Количество, Сумма");
    КонецПроцедуры

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

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

    9) В условии задачи ничего не сказано о необходимости соблюдать контроль остатков, поэтому информирование о недостаче безу установки флага “Отказ” в значение “Истина” считаем допустимым.
    Сообщение же о нехватке с точным позиционированием будет таким:

            Если Недостача>0 Тогда
           
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" в количестве "+Недостача;
                Сообщение.Поле = "Товары["+(ВыборкаТовары.НомерСтроки-1)+"].Количество";
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();
           
            КонецЕсли;

    10) Расчет суммы лучше изменить для большей точности + также записать рассчитанную сумму в документ:

            Запись.Сумма = ВыборкаТовары.СумОст*Запись.Количество/ВыборкаТовары.КолОст;
            ЭтотОбъект.Товары[ВыборкаТовары.НомерСтроки-1].Сумма = Запись.Сумма;

    11) В документе “ПродажаТоваров” в обработчике команды “ПроверкаДокумента” делается попытка вызывать процедуру общего серверного модуля.
    В тоже время для этого модуля не выставлен флаг “Вызов сервера”, что также можно считать ошибкой.
    12) В серверном модуле делается попытка вызова клиентской процедуры “Предупреждение”.
    Это невозможно и код следует исправить с помощью объекта “СообщениеПользователю”:

        Пока Выборка.Следующий() Цикл
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Ошибка в строке № "+Выборка.НомерСтроки+" количество не может быть отрицательным!";
            Сообщение.Сообщить();
        КонецЦикла;

    С другой стороны, в самом документе мы задали реквизит “Количество” как неотрицательный и данную команду использовать бессмысленно, так как система не даст нам ввести отрицательные значения.
    Таким образом, как команду, так и ее обработчик можно удалить/закомментировать.
    13) Для задания обязательности заполнения номера серии справочника “Серии” я поступил самым простым образом, а именно – для стандартного реквизита “Код” задал проверку заполнения в значение “Выдавать ошибку”.

    Шаг 3.

    Моя работа непосредственно не связанана с 1С, поэтому проводить семинары просто не для кого.
    Писать статьи, очевидно, еще слишком рано – мало опыта.
    Остается как то пытаться помочь форумчанам.
    Этот шаг постараюсь наполнить в самое ближайшее время.

  3. Жукова Наталья Алексеевна, г.Барнаул.
    Шаг 1:
    Имея опыт программирования на 8.0, 8.1 думала, а не начать ли сразу с продвинутого курса. Но выбрала все-таки базовый. Потому что думала изучить регистры бухгалтерии и расчета. Как выяснилось, при прохождении курса, пробелов в знаниях по 8.2 гораздо больше. Ни разу не пожалела, что взяла базовый.
    Узнала много нового не только про управляемое приложение, бухгалтерские и регистры расчета. Узнала про всяческие удобства в написании кода, про новые тенденции проверки остатков при проведении документов, про замечательные штуки в СКД (особенно понравилось, как там можно характеристики выводить, а то приходилось писать усложненные запросы для этого) и много чего еще.
    Курс хорош тем, что заставляет думать, заставляет рассматривать свой код критически и решить как его можно еще улучшить. Хотя и работаю пока в обычном приложении, есть что применить на практике после прохождения курса, то, что сильно облегчает жизнь.
    Формат курса очень удобен. Можно заниматься хоть ночами, что и приходилось делать. Единственно, что меня не сильно устроило — это длительность курса. Мне бы побольше, чем три месяца надо на усвоение такого концентрированного материала. Только просмотр уроков с разбором занимает больше времени, чем заявлено изначально. Также разбор домашнего задания у меня занимал много времени. Так как я не просто просматривала решения, но и переносила их на свою конфигурацию, с доработками и экспериментами. Правда, на последних уроках делать это я перестала, потому что перестала успевать с потоком (для последующих решений просто брала конфигурацию эталонного решения). Думаю, что буду спокойно и вдумчиво пересматривать этот курс. А пока пойду на продвинутый (хоть и немного страшно от того, что опять 3 месяца надо будет жить в очень напряженном режиме).
    Кстати, за время прохождения курса я смогла подготовиться и сдать экзамен на профессионала по платформе, чему способствовала информация из уроков.
    То, что делает ваша команда — это реально круто. Этому нет аналогов. Огромное спасибо за ваш труд.

    Шаг 2:
    1.Ошибка при открытии документа «Покупка товаров». Документ не открывается.
    Обращение к серверным операциям в клиентской процедуре.
    Исправление: Перенос в серверную процедуру.

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

        Возврат Справочники.Клиенты.ОсновнойПоставщик;

    КонецФункции // ВернутьОсновногоКлиента()

    2.Ошибка при нажатии на кнопку «Заполнить клиента».
    Исправление: Заменяем ОсновнойПокупатель на ОсновнойПоставщик.
    3.Не делаются движения по регистру «ТоварыНаСкладе» при проведении документа «ПокупкаТоваров».
    Исправление: добавляем строку Движения.ТоварыНаСкладе.Записывать = Истина;
    4.В документе «ПокупкаТоваров» реквизит «Количество» в табличной части имеет тип Строка. Исправление: Число(15,3).
    5.Не работает кнопка «ЗаполнитьТовары». При исправлении одной ошибки, выясняется другая и т.д. Поэтому здесь пришлось вообще переделать процедуры:

    &НаКлиенте
    Процедура ЗаполнитьТовары(Команда)
       
        Перем Основание;
        ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));
        Если НЕ Основание.Пустая() Тогда
            ЗаполнитьТоварыНаСервере(Основание);
        КонецЕсли;
       
    КонецПроцедуры

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)

        ЗаполняемыйДок = РеквизитФормыВЗначение("Объект");
        ЗаполняемыйДок.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
       
        ЗначениеВРеквизитФормы(ЗаполняемыйДок, "Объект");

    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    6.Не открывается документ «ПродажиТоваров». Ошибка та же, что и в документе «ПокупкаТоваров», надо делать вызов команды «ПроверкаДокументовСервер.ПроверитьДокумент(Объект.Ссылка);» через серверную процедуру. Не совсем понятно, зачем она вообще нужна, если в конфигурации количество определено строго неорицательное. Но даже, если сделать количество отрицательным и вынести команду в серверную процедуру, то она все равно не отработает, потому что «Предупреждение» работает только на клиенте. Надо исправить на «СообщениеПользователю».
    7. Серии в документе «ПродажиТоваров» никак не связаны с товаром.
    Исправление: выставляем связи параметров выбора.
    8. Документ «ПродажаТоваров» не является регистратором для регистра накопления «ТоварыНаСкладе».
    9. При проведении документа «ПродажиТоваров» с нехваткой товара выводится сообщение, но делаются движения по регистру «ТоварыНаСкладе».
    Исправление: Дописать в процедуре проведения: «Отказ = Истина».
    10. Если сделать ситуацию, когда самого товара хватает, но нет по количеству нужной серии, то ошибки при проведении не возникает.
    Исправление: Добавить в запрос, который проверяет остатки (Товар, Серия) В …
    Еще в запросе на проверку остатков необходимо добавить выбор по текущему документу. Записи в регистре надо выбирать на момент проведения документа. И внутреннее соединение надо заменить на левое.
    11.Для работы в обычном приложении надо добавить формы для всех документов и справочников.
    12. Просьбу гл. бухгалтера можно выполнить, если в стандартных реквизитах справочника сделать свойство «проверка заполнения» в «Выдавать ошибку» для реквизита «Код».

    Шаг 3:
    http://help1c.com/help/view/11186.html
    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=612346

    • Dobrenko Oleg 20.05.2013 в 07:45

      Наталья, благодарим за развернутый отзыв!
      >Мне бы побольше, чем три месяца надо на усвоение такого концентрированного материала.
      Да, темп действительно очень высокий.
      Финальное задание принято, поздравляем с успешным окончанием базового курса. Ждем на продвинутом :)

  4.  Шаг 1

    Обухова Анна Сергеевна г.Благовещенск (Амурская обл.)
    У данного курса очень удобный формат обучения: хотя и составлен график тем и домашних заданий, однако можно его подкорректировать под себя. Формат обучения конечно же предполагает силу воли от обучающегося, ибо может показаться, что раз нет «обязаловки» по посещению занятий в аудитории, и «железных» сроков сдачи домашних заданий, то можно отложить учебу на потом, придерживаясь принципа: «Сегодня я не поседел 2 часа за Базовым курсом, но завтра посижу все 4». Между тем, эта форма обучения намного удобней, особенно для тех, кто может заставит себя пусть и по немного (пусть даже час), но каждый день уделить обучению. Большой объем теоретического материала, который проиллюстрирован подробными примерами, причем примерами, которые в дальнейшем могут встретиться при решение реальных задач – одно из достоинств данного курса. Другим достоинством хотелось бы отметить – это самого преподавателя, его четкую дикцию, энтузиазм, звучащий в голосе, уверенность в собственных знаниях. Евгений Гилев показывает как должен работать программист, какими приемами и инструментами дожжен владеть, каким способами находить ошибки.
    При прохождении этого курса я научилась пользоваться встроенной справкой, работать в отладчике, не боятся делать ошибок, потому, что знаю, как их можно будет найти.
    К этом можно добавить, что, узнав программу изнутри, я стала понимать как работают типовые конфигурации, каким образом формируются записи, и почему, если в той же Бухгалтерии для предприятия ред. 2 правишь документ в ручную, нужно править не только записи регистра бухгалтерии, но и смотреть, по какими регистрам документ еще делает движения. Узнала, почему в ЗУПе начисления проходят в два этапа, и что же все-таки такое режимы вытеснения. И многое другое.
    Самым большим открытием было задание параметров для реальных и виртуальных таблиц регистров. До начала курса, я написала внешнею печатную форму, данные для которой берутся из одной из виртуальных таблиц регистра бухгалтерии. Меня очень озадачивало, почему моя форма так долго формируется (по сравнению с типовыми формами), пока не поменяла место задания параметров. И еще добавила в форму пару «фишек», которые узнала из курса.
    Кстати, сейчас меня попросили написать простую конфигурацию по учету материалов (только приход и расход). Полгода назад для меня это было нереально, но сейчас вполне возможно. Вот, наверное, одни из примеров того, как знания могут приносить доход.

     Шаг 2

    1 – Справочник «Клиенты» лучше переименовать в «Контрагенты».

    2 – Документ «Покупка товаров»: кнопка «Заполнить клиента» не корректно составлена процедура
    – ссылка на несуществующий предопределенный элемент справочника «Клиенты»;

    – получение основного поставщика нужно вынести в отдельную функции с директивой компиляции на сервере без контекста. Подобная функция может выглядеть так:

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

    – лучше, если основного поставщика пользователь будет выбирать сам, с помощью константы.

    3 – Документ «Покупка товаров»:
    – не происходит запись в регистр накопления, необходимо добавить в конце процедуры Движения.ТоварыНаСкладе.Записать().

    4 – Документ «Покупка товаров»: кнопка «Заполнить товары» не корректно составлена процедура:
    – необходимо исправить Тип(“Документ.ПокупкаТоваров”) на Тип(“ДокументСсылка.ПокупкаТоваров”);
    – процедура ЗаполнитьТоварыНаСервере() является не рабочие. Мой вариант этой процедуры:

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
        ЗначениеВРеквизитФормы(ДокументОснование.Товары,"Объект.Товары");
    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    – в том виде, в котором работает процедура ЗаполнитьТовары(Команда), пользователь, если решил не выбирать документ-основания, получит сообщение об ошибке, с отсылкой в конфигуратор. Мой вариант данной процедуры:

    &НаКлиенте
    Процедура ЗаполнитьТовары(Команда)
        Перем Основание;
        Если ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров")) Тогда
           
            ЗаполнитьТоварыНаСервере(Основание);
        КонецЕсли;    
    КонецПроцедур

    5- Документ «Продажа товаров»: выбираются все серии, а не только те, которые принадлежат выбираемому товару. Необходимо в свойствах реквизита табличной части «Серия» в свойстве «Связи параметров» «Товары.Товар».
    6 – Документ «Продажа товара» не установлено, что документ делает движения по регистру накопления.
    7 – Документ «Продажа товара»: процедура «Проверка документа» не имеет смысла, в свойствах реквизита Количество выставлено, что он не может принимать отрицательных значений.
    8 – Документ «Продажа товара»: процедура Обработка проведения.
    Для того, что бы движения, сделанным документом при предыдущем проведении, не влияли на движения, которые сделает документ при корректировке его пользователем, нужно вместо

     Движения.ТоварыНаСкладе.Записывать = Истина;

    записать

     Движения.ТоварыНаСкладе.Очистить();
        Движения.ТоварыНаСкладе.Записать();

    Необходимо так же внести изменив в текст запроса.
    Окончательный текст запроса выгладит так:

        "ВЫБРАТЬ
            |   ПродажаТоваровТовары.Товар КАК Товар,
            |   ПродажаТоваровТовары.Серия КАК Серия,
            |   СУММА(ЕСТЬNULL(ПродажаТоваровТовары.Количество, 0)) КАК КолДок,
            |   ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
            |   ТоварыНаСкладеОстатки.СуммаОстаток КАК СумОст,
            |   МАКСИМУМ(ПродажаТоваровТовары.НомерСтроки) КАК НомерСтроки
            |ИЗ
            |   Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
            |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладе.Остатки(
            |               &Момент,
            |               Товар В
            |                   (ВЫБРАТЬ
            |                       ПродажаТоваровТовары.Товар
            |                   ИЗ
            |                       Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
            |                   ГДЕ
            |                       ПродажаТоваровТовары.Ссылка = &Ссылка)) КАК ТоварыНаСкладеОстатки
            |       ПО ПродажаТоваровТовары.Товар = ТоварыНаСкладеОстатки.Товар
            |           И ПродажаТоваровТовары.Серия = ТоварыНаСкладеОстатки.Серия
            |
            |СГРУППИРОВАТЬ ПО
            |   ПродажаТоваровТовары.Товар,
            |   ПродажаТоваровТовары.Серия,
            |   ТоварыНаСкладеОстатки.СуммаОстаток,
            |   ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0)";

    Для нового параметра установить значение:

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

    Если все же найдутся отрицательные остатки, нужно что бы происходил отказ от выполнения проведения. Для это после условия

    Если Недостача>0 Тогда

    , нужно выставить:

    Отказ = Истина;

    Для того, что бы сообщение пользователю было привязано к строке с ошибкой, нужно исправить параметры сообщения:

    Сообщение.Поле = "Товары["+(ВыборкаТовары.НомерСтроки-1)+"].Количество";

    Для более корректного подсчета средней стоимости для списания:

    Запись.Сумма = ВыборкаТовары.СумОст*Запись.Количество/ВыборкаТовары.КолОст;

    И, что бы происходила запись в регистр, в конце процедуры необходимо:

     Движения.ТоварыНаСкладе.Записать();

    9 – Так как в документе «Продажа товара» Количество имеет тип Число (длина 15, точность 3), то и в документе «Покупка товара», тип реквизита табличной части Количество нужно заменить на тип Число длина 15, точность 3. Регистр накопления «Товары на складе» – ресурс «Количество» точность увеличить до 3.
    10 – «Номер серии» обязателен для заполнения.
    В справочнике «Серии» для стандартного реквизита «Код» (синоним «Номер серии») в свойстве Проверка заполнения выставить значение «Выдавать ошибку»

     Шаг 3

    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=612182
    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=612340

    • Dobrenko Oleg 19.05.2013 в 08:40

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

      • Добрый день! А практическая часть (шаги 2 и 3) тоже приняты?

        • Dobrenko Oleg 19.05.2013 в 12:55

          Добрый день. Да, вы в списке финалистов.

  5. Шаг 1 Отзыв по курсу

    ФИО Савицкий Андрей Михайлович
    Курс толковый с ОГРОМНЫМ количеством информации. Формат курсов намного удобней очных – можно всегда вернуться к пройденному материалу. Ограничение по времени было сильным пинком без него я, пожалуй, и не закончил бы курса. Новым было все содержание курса т.к. с 1С Предприятие 8.2 я не имел раньше дела, хотя и пробовал ее изучать самостоятельно без особого успеха. Достоинство вашего курса в том что идет подробный разбор ошибок и материал дается в виде пригодном для «быстрого старта», начиная с самого простого.
    Теперь о недостатках самый большой на мой взгляд это отсутствие ОПЕРАТИВНОЙ связи с преподавателем для ответа на возникающие вопросы по курсу. Если ответа на заданный в вопрос по электронной почте приходится ждать день-два, то это сильно затрудняет движение вперед. Хорошо ,если была бы возможность связываться с преподавателем по Скайпу например и получать ответ на вопрос тогда когда он нужнее всего!
    Второй недостаток это воспроизведение защищенных видеороликов с лекциями через конфигурацию просмотр курсов .На половине моих рабочих и домашних компов оно отказывается работать. Воспроизводить же видеоуроки через файловый менеджер по одному очень неудобно.
    Но несмотря на эти недостатки курс был очень полезен и я не жалею о потраченных на него деньгах. Спасибо создателям ! Подумываю о заказе продвинутого курса.

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

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

    &НаКлиенте
    Процедура ЗаполнитьКлиента(Команда)
        //Объект.Клиент = Справочники.Клиенты.ОсновнойПоcтавщик;
        ЗаполнитьКлиентаНаСервере();
    КонецПроцедуры
    &НаСервере
    Процедура ЗаполнитьКлиентаНаСервере()
       Объект.Клиент = Справочники.Клиенты.ОсновнойПоставщик;
    КонецПроцедуры // ЗаполнитьКлиентаНаСервере()

    Чтобы по нажатию кнопки «Заполнить товары» документ-основание выбирался правильно надо код: ВвестиЗначение(Основание, «Выберите документ-основание», Тип(«Документ.ПокупкаТоваров»));
    Заменить на строку кода: ВвестиЗначение(Основание, «Выберите документ-основание», Тип(«ДокументСсылка.ПокупкаТоваров»));
    В процедуре «ЗаполнитьТоварыНаСервере»
    надо изменить контекст с «&НаСервереБезКонтекста» на «&НаСервере» т.к. контекст в нее все же должен передаваться.
    В процедуре «ЗаполнитьТоварыНаСервере» 2 строки
    Объект = ТекущийДокумент.ПолучитьОбъект();
    Объект.Товары.Загрузить(ДокументОснование.Товары);
    Так заполнять табличную часть нельзя. В данном случае произойдет попытка заполнения копии документа в памяти и то, неудачно – так как нельзя в табличную часть загрузить другую табличную часть.
    Поэтому вместо 2 строк достаточно одной строки: Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
    при нажатию на кнопку «Заполнить товары» возникает сообщение об ошибке «Тип не определен (Документ.Покупка товаров) » .В обработчике события кнопки «Заполнить товары» надо строку: «НЕ Основание.Пустая()»
    заменить на: «Основание Неопределено И НЕ Основание.Пустая()»

    Документ ПродажаТовара
    По нажатию кнопки «Проверка документа проверяются товары с отрицательным количеством
    Проверка будет работать только для записанных в базу документов, необходимо принудительно записать документ. А кстати, зачем вообще нужна данная проверка?
    У реквизита ТЧ «Количество» уже установлен признак «Неотрицательный», т.е. проверяется условие которое никогда не наступит.
    Выбор серии осуществляется без отбора по владельцу. В свойствах реквизита Серия табличной части Товары надо установить Связь параметров выбора – Отбор.Владелец (Товары.Товар)
    В обработке проведения есть строка: Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;
    Что будет если Количество =0 ? Надо проверку деления на ноль .
    Не выполняется задание на проведение по регистру ТоварыНаСкладе,т.к
    на закладке «Движения» нет отмеченного регистра накопления.
    Ставим галку у регистра ТоварыНаСкладе. И еще в процедуре ОбработкаПроведения
    Нужно не забывать запись Движения.ТоварыНаСкладе.Записывать = Истина;
    и запрос в процедуре ОбработкаПроведения хорошо бы исправить так чтобы было приведение к пустому значению (isnull) у Количества и Суммы по документу если они будут нулевые по результатам запроса.
    В условии запроса нет фильтра для таблицы Документа ПродажаТоваров , необходимо вставить на закладке Условия таблицы ПродажаТоваровТовары.Ссылка = &Ссылка.
    Это будет условие отбора по текущему документу.
    Также в запросе надо заменить внутреннее соединение на ЛЕВОЕ т.к. нужно все содержимое таблицы документа. Внутреннее соединение не даст выборку записей по товарам которых нет на складе.
    Надо добавить в запрос «НомерСтроки» для более точного сообщения об ошибке
    Для защиты от дублей строк необходимо в запросе сгруппировать по товарам и по сериям
    Остатки необходимо получать на момент времени документа
    Если у нас появилась нехватка остатков товара не надо формировать запись движений,т.е. нужна по нехватке ветка «иначе».
    Если нехватка уже определилась(в том числе и при отсутствии остатка), в ветке недостачи нужно присвоить параметру отказ=Истина, чтобы не было проведения,
    т.е. записи рез-та транзакции. Здесь предусмотрена запись движений :
    Движения.ТоварыНаСкладе.Записывать = Истина;
    Нужно очищать движения до проведения.
    в начало процедуры проведения добавить
    Движения.ТоварыНаСкладе.Очистить();
    Движения.ТоварыНаСкладе.Записать();
    Ниже даю исправленный текст процедуры обработка проведения

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


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

        ВыборкаТовары = Результат.Выбрать();

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

    Далее, сообщение при нехватке товара надо бы подробнее с номером строки
    заменить строку: «Товары.Количество» на строку: «Товары[“+(ВыборкаТовары.НомерСтроки-1)+”].Количество
    Регистр накопления «ТоварыНаСкладе»:
    Здесь регистратор только документ «ПокупкаТоваров»
    Добавляем в качестве регистратора документ «ПродажаТоваров»

    Общий модуль «ПроверкаДокументовСервер»:
    Не установлен флаг «Вызов сервера» Устанавливаем данный флаг
    В процедуре «ПроверитьДокумент» используется метод «Предупреждение», который недоступен на сервере Заменить, к примеру, на «Сообщить()»
    Что же касается шага3 то отчет по мини семинару выложу в последующие дни.

    Фото-отчет:

    1

    2

    • Dobrenko Oleg 17.05.2013 в 15:35

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

  6. Добрый день!
    Ковалевич Валентина Петровна, город Пермь,
    инженер-программист фирмы франчайзи.

    Отзыв о результате прохождения курса.
    У меня за плечами курсы по управленческому, бухгалтерскому учету на 8.0 и расчетным механизмам на 8.1.
    Форма курсов дистанционная в реализации УЦ-3. На тот момент спасибо им,как и спасибо всем учителям!
    Одна неудачная попытка сдачи экзамена 1С- Специалист, перерыв в работе и в результате несдачи
    зафиксированные “дыры” в знаниях. Это исходные позиции.
    Если говорить эмоционально, то как же было трудно в аспекте управления временем!
    Потеря 20 дней на увлечение январскими вебинарами УТ-11 Быстрый старт, потеря недели на 3-х недельном лечении
    после перелома руки и после – загрузка на работе.
    Со своим 17 потоком не успела!
    Теперь без эмоций.
    Подача материала – профессиональна. По ходу изложения Евгений формирует настоящих 1С программистов.
    Из новичков, я думаю, он вообще создает программистов ,какими они должны быть.
    Я почерпнула многое, зная немало. Приемы, которые я взяла на вооружение и уже использую, знания, которые я
    стремилась получить, для меня бесценны.
    Я совсем не знала аспектов, связанных с управляемыми формами, не могла мыслить в
    структуре “этот код будет на сервере”, а “этот будет на клиенте”.
    У меня навсегда останется произнесенная Евгением вскользь мысль недословно следующая, что в любой момент надо представлять
    точно что происходит. Часто по незнанию некоторые действия я делала методом “тыка”, ситуация управляла мной, а не я ею.
    Забавно,но даже как правильно пользоваться синтаксис-помощником, шаблонами текста и подсказками,несколько приемов работы в отладчике
    я узнала, просматривая курс.
    Я очень ценю те бонусные материалы и материалы мастер- групп, которые я получила.
    Прослушанные материалы уже очень помогали мне в работе.
    Сегодня я проведу семинар для своих коллег, где использую материал нескольких бонусов.
    Я не буду их показывать или пересказывать, я написала маленькую конфигурацию и при этом многому
    сама научилась благодаря им.
    Это все! Спасибо!

    • Dobrenko Oleg 17.05.2013 в 13:10

      Здравствуйте, Валентина!
      Благодарим за развернутый отзыв. Ждем от вас решение практической части и фото семинара :)

      • Добрый день,Олег!
        Практическую часть Вы уже приняли в первых рядах,
        из-за загрузки и выдаю шаги “шагами”.
        Фото-отчет:
        1
        2

        • Dobrenko Oleg 17.05.2013 в 15:33

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

  7. Беспалова Татьяна Юрьевна

    Шаг1

    1. Новое
    – Зарплата, бухгалтерия (совсем новое)
    – Работа с пользовательском режиме (некоторые интересные штучки, которые облегчают жизнь)
    – Возможность вызова конструктора запроса из поля условия !!!

    2. Заблуждения. Ну не то, чтобы заблуждения, так скажем мутные места, которые прояснились.
    – Классы объектов
    – Работа с набором записи регистров (отбор, прочитать, когда он заполнен, когда нет…)
    – Условное проведение документов, варианты очистки движений
    – Запрос к ВТ остатки – что остатки надо получать на границу
    – Форма – взаимодействие клиента и сервера
    – Планы видов характеристик

    3. Мы свою конфигурацию пишем, так что все новое сразу находит применение. Вот запросы стало писать проще, пользуясь конструктором в условиях :)
    Проведение документов оптимизировано, некоторые формы, работа с регистрами сведений (независимыми), настройка командного интерфейса рабочего стола.

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

    Шаг 2

    1. Справочник “Серии”, стандартные реквизиты “Код” – “Проверка заполнения” поставить “Выдавать ошибку”
    2. Регистр накопления “Товары на складах” – добавить в качестве регистратора документ “Продажа товаров”
    3. Документ “Покупка товаров”
    3.1 Pаполнение клиента по умолчанию исправить с Справочники.Клиенты.ОсновнойПокупатель на Справочники.Клиенты.ОсновнойПоставщик
    3.2 В обработке проведения поставит ьнабору записей флаг Записывать = Истина
    4. Документ “ПродажаТоваров”
    4.1 Для реквизита ТЧ “Серия” установить “Связи параметров выбора” = Отбор.Владелец(Товары.Товар)
    4.2 При проверке надо передавать ТЧ, выгруженную в таблицу значений, а не ссылку (документ может быть изменен или вовсе не записан) и использовать как минимум Сообщить , а не Предупреждение
    4.3 Проведение:
    1. Сохранить пустые движения перед запросом
    2. Остатки получать на МоментВремени() документа
    3. В условии на ВТ Остатки добавить Серию: (Товар,Серия) В (Выбрать …)
    4. В запросе соединение должно быть левое (чтобы сообщения о недостаче включали и позиции, по которым нет остатка) + группировка по товару и серии
    5. В запросе для полей ВТ остаки использовать функцию ISNULL(…)
    6. Для вывода сообщения о недостаче в запрос включить номер строки; при выводе сообщения указывать (номер строки-1) и имя поля
    7. При расчете суммы списания сперва умножение, потом деление

    Шаг 3

    Был проведен минисеминар:
    1
    2

    • Dobrenko Oleg 17.05.2013 в 10:58

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

  8. Доровская Вера Николаевна
    г.Серпухов Московской обл.

    *************************
    Отзыв по курсу
    *************************

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

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

    Найденные ошибки и пути исправления:

    Для регистра накопления ТоварыНаСкладах в качестве регистратора был указан только документ ПокупкаТоваров. Необходимо указать еще документ ПродажаТоваров. При проведении документа ПродажаТоваров движения документа не будут записаны в базу, так как в обработке проведения свойство Записывать набора записей регистра не выставлено в Истину. У ресурса Количество тип Число точность указана 2, а не 3, как у реквизита Количество ТЧ Документа ПродажаТоваров, а у такого же реквизита документа ПоступлениеТоваров тип – Строка. Необходимо указать одинаковый тип Число (15, 3).
    В документе ПродажаТоваров в ТЧ Товары у реквизита Серия не указана связь по владельцу с реквизитом Товар: связи параметров выбора: Отбор.Владелец(Товары.Товар)

    Ошибки при проведении документа ПродажаТоваров:

    Сначала нужно очистить движения документа перед выполнением запроса к таблице остатков.При обращении к таблице остатков берутся текущие итоги, а не остатки на момент времени документа, не учитываются возможные дубли строк в табличной части документа, в запросе в условиях не указывается равенство ссылки документа ссылке обрабатываемого документа.
    Внутреннее соединение делать в запросе некорректно, так как остатков по товару может и не быть, в этом случе в результат запроса такой товар из табличной части документа не попадет. Нужно использовать левое соединение ТЧ Товары с вирт.таблицей остатков. При получении количества и суммы остатка необходимо использовать функцию ЕСТЬNULL для гарантии избавления от типа значения NULL в результате запроса. В параметрах виртуальной таблицы в запросе к ТЧ документа можно добавить к полю Товар поле Серия: (Товар, Серия). При расчете Запись.Сумма нужно поставить условие проверки на 0 элемента ВыборкаТовары.КолДок, чтобы избежать ошибки деления на 0.
    При проведении при появлении отрицательных остатков выдается предупреждение, но документ проводится. Если функционал заказчика
    устраивает, значит, такая ситуация возможна.

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

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

        ВыборкаТовары = Результат.Выбрать();

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

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

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

    &НаКлиенте
    Процедура ПроверкаДокумента(Команда)
       
        Для Каждого Строка из Объект.Товары цикл
           
            Если Строка.Количество <= 0 Тогда
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Ошибка в строке № " + Строка.НомерСтроки + " количество не может быть отрицательным!";
                Сообщение.Поле =  "Товары["+(Строка.НомерСтроки-1)+"].Количество";
                Сообщение.КлючДанных  = Объект.Ссылка;
                Сообщение.ПутьКДанным = "Объект";
                Сообщение.Сообщить();         
            КонецЕсли;
        КонецЦикла;  
       
    КонецПроцедуры

    В клиентской процедуре ЗаполнитьКлиента происходит попытка считать из базы значение предопределенного элемента справочника Контрагенты, недоступное на тонком клиенте. Можно использовать функцию глобального контекста ПредопределенноеЗначение. Для подстановки в документ ПокупкаТоваров контрагента по умолчанию происходит попытка присвоения реквизиту Клиент значения предопределенного элемента справочника Клиенты ОсновнойПокупатель, в базе же есть элемент ОсновнойПоставщик. Эту задачу можно было бы решить, добавив новую константу ОсновнойКонтрагент и задав её значение. Задавать значение основного контрагента на уровне конфигурации и прописывать его в модуле формы документа методологически неверно.

    Для обязательного заполнения номера серии в справочнике Серии нужно у стандартного реквизита Код выставить свойство Проверка заполнения: Выдавать ошибку. Поле Наименование имеет длину 0, для него нет смысла указывать “Выдавать ошибку”.

    У документа ПокупкаТоваров реализовано заполнение табличной части на основании другого документа поступления. Есть ошибки при реализации: При выборе документа-основания неверно указан тип, необходимо написать “ДокументСсылка.ПокупкаТоваров”. При использовании метода Загрузить табличной части параметр должен иметь тип “Таблица”, поэтому следует предварительно выгрузить в ТаблицуЗначений табличную часть документа-основания. Для работы с контекстом объекта на сервере нужно использовать директиву &НаСервере

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

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
       
        Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
           
       
    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    ************************
    Помощь ближнему
    ************************
    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=567124&threadtype=0
    http://infostart.ru/public/117764/

    • Dobrenko Oleg 17.05.2013 в 11:01

      Вера, благодарим за отзыв!
      Поздравляем, вы в списке финалистов базового курса. Ждем вас на продвинутом :)

  9. Штейнмиллер Сергей 16.05.2013 в 16:33

    Шаг 1.
    Курс понравился своей структурированностью, системным подходом. Отдельно порадовали практические задания, сделанные таким образом, что они похожи на лекционные, но с изюминкой. В результате при решении практической задачи ты не просто повторяешь действия преподавателя, но думаешь своей головой.

    Новым в курсе для меня были автоматизация бухучета и автоматизация расчетов. Почерпнул несколько “фишек” для СКД (в частности, Период с типом “Стандартный период”). Полезными оказались приёмы отладки. Понравился способ создания универсальных запросов с помощью функции ЗаменитьТекст, при этом запрос открывается в конструкторе. Ну и множество других вроде бы мелочей, которые значительно облегчают процесс разработки и увеличивают эффективность кода.

    На практике – я буквально вчера написал за 30 минут отчет, который раньше я бы делал часа 4 :-)

    Формат обучения удобен тем, что ты не привязан ни ко времени, ни к месту (при наличии ноутбука). Соответственно, проще сочетать обучение с основной работой.

    Штейнмиллер Сергей Викторович, г. Екатеринбург

    —————
    Шаг 2.

    1. В справочнике Клиенты не хватает предопределённого значения “ОсновнойПокупатель”.

    2. В документе ПокупкаТоваров:
    2.1 в команде ЗаполнитьКлиента неправильно получается предопределенное значение справочника. Правильно так:

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

    2.2. в команде ЗаполнитьКлиента неправильно задан тип в функции ВвестиЗначение. Правильно так:

    ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"));

    2.3. неправильно организовано заполнение товаров на сервере. Следует делать контекстный серверный вызов и загружать таблицу значений в основной реквизит формы – Объект. Таблицу значений следует получать запросом по переданной ссылке:

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(Ссылка)

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

        Объект.Товары.Загрузить(Результат);

    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    2.4. В обработке проведения не хватает строчки

    Движения.ТоварыНаСкладе.Записывать = Истина;

    3. В свойствах модуля ПроверкаДокументовСервер не хватает галочки ВызовСервера, чтобы к ней можно было обращаться с клиента.
    Но даже если поставить эту галочку, подход к проверке всё равно неверный, потому что при такой реализации мы будем проверять сохранённый документ, а не текущий. Следует разместить процедуру проверки в клиентском контексте модуля формы, где, например, обходить табличную часть циклом Для Каждого.
    Выдавать диагностические сообщения о проверке следует с помощью функции Сообщить, а не Предупреждение.
    Более того, без этой проверки можно вообще обойтись, поскольку для реквизита “Количество” установлен признак Неотрицательный. То есть ввести отрицательное значение в форму документа в принципе невозможно.

    4. Для РН ТоварыНаСкладе
    – не установлен регистратор ПродажаТоваров.
    – ресурс количество имеет формат 15,2, а нужно 15,3.

    5. В документе ПродажаТоваров в обработке проведения следующие ошибки:
    – в запросе нет условия на ссылку ТЧ, то есть выбираются данные по всем документам, а не по текущему.
    – в параметрах виртуальной таблицы не хватает условия на дату – на какой момент получаем остаток?
    – запрос остатков делается только по номенклатуре и не учитывает серий.
    – перед запросом остатков не удаляются существующие движения документа, то есть при оперативном проведении в остатки попадают движения документа.
    – в запросе не получается номер строки для привязки диагностического сообщения к строке ТЧ.
    – при обнаружении недостатка номенклатуры документ всё равно проводится (а это не нужно).

    Исправленная обработка проведения:

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

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

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

    7. В документе ПродажаТоваров для реквизита Серия в ТЧ не установлен отбор по владельцу. Нужно в свойствах реквизита установить связи параметров выбора в “Отбор.Владелец(Товары.Товар)”.

    6. Для того, чтобы сделать поле «Номер серии» в справочнике «Серии» обязательным для заполнения, необходмо открыть стандартные реквизиты справочника, и в свойствах реквизита Код установить проверку заполнения в значение “выдавать ошибку”.

    —————
    Шаг 3.

    Мною написана обработка и выложена на http://infostart.ru/public/92850/. Она позволяет организовать удобный и быстрый доступ ко внешним отчётам и обработкам.

    • Dobrenko Oleg 17.05.2013 в 10:51

      Сергей, благодарим за отзыв!
      >я буквально вчера написал за 30 минут отчет, который раньше я бы делал часа 4 :-)
      Отличный результат! Поздравляем, вы в списке финалистов.

  10. Дмитрий Конаков 16.05.2013 в 16:08

    Шаг 1.
    Конаков Дмитрий Александрович, г. Ростов-на-Дону, руководитель информационного отдела ООО “ПТП “ЛАД”.
    Ранее с 1с я имел дело только косвенно, подбор серверов для 1с, установка платформы, но с течением времени понадобилось совместить навыки системного администрирования и 1с программирования. Буквально осенью 2012 года я посетил двухнедельный очный курс по программированию в авторизированном УЦ 1с в своем городе. Должен сказать, что мои знания практически не изменились, только познакомился с платформой и с общими понятиями.
    Спустя полгода мне посоветовали Ваш курс. Тут-то я и увидел, какая большая разница в обучении. Теперь всем советую ваш формат обучения. Он наиболее оптимален по сравнению с очным курсом. Знания намного глубже, поскольку есть возможность пересматривать видеокурсы во время выполнения домашнего задания.
    В базовом курсе для меня практически всё в новинку, появилось общее видение устройства основных типовых конфигураций.
    Разобрался в торговых операциях, пришло понимание бухгалтерского учета.
    Уже кое-какие полученные знания применял на практике (вносил изменения в конфигурации БП 2.0 и УТ 10.2). Причем переписывал одно и тоже несколько раз, находя ошибки, пока продвигался в изучении Вашего курса.
    Я очень доволен курсом, у меня куплен еще Продвинутый, но к нему я вернусь попозже, вероятно осенью :)
    Шаг 2.
    По шагам разбираем конфигурацию:
    ПОКУПКА ТОВАРОВ
    1. На форме документа Покупка Товаров не работает кнопка “Заполнить клиента”. “Справочники” вызываются только на сервере, поэтому создадим функцию на сервере без контекста. Но этого окажется недостаточно, нужно изменить в коде функции “ОсновнойПокупатель” на “ОсновнойПоставщик”.

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

    2. В форме документа “Покупка Товаров” в ТЧ Товары у количества тип “Строка”, изменил на “Число”, длина 15, точность 3 и поставил флаг “Неотрицательное”.
    3. По аналогии в регистре накопления ТоварыНаСкладе изменил точность ресурса Количество на 3.
    4. По нажатию кнопки “Заполнить товары” в форме документа “Покупка Товаров” вызывается процедура Заполнить товары. Нужно исправить 2 ошибки – Тип(“Документ.ПокупкаТоваров”) должен быть Тип(“ДокументСсылка.ПокупкаТоваров”) и Основание.Пустая() нужно исправить на Основание = Неопределено.
    4а. В Процедуру ЗаполнитьТоварыНаСервере передаем только ДокументОснование. Процедуру ЗаполнитьТоварыНаСервере нужно исправить:

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)
        ТекущийОбъект = РеквизитФормыВЗначение("Объект");
        ТекущийОбъект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
        ЗначениеВРеквизитФормы(ТекущийОбъект, "Объект");
     КонецПроцедуры

    5. При проведении документа “Покупка Товаров” нужно в обработку проведения добавить строку:
    Движения.ТоварыНаСкладе.Записывать = Истина;

    ПРОДАЖА ТОВАРОВ
    6. Когда запустил создание документа “Продажа Товаров” в Тонком клиенте, получил ошибку вызова серверной процедуры из общего модуля. Добавил флаг этому модулю “Вызов сервера”.
    7. Кнопка “Проверка документа ” в форме создания нового документа “Продажа Товаров” приводит к ошибке, поэтому нужно использовать “СообщениеПользователю”. Документ нужно записывать перед проверкой, впрочем сама проверка не имеет смысла, потому как недопускается ставить отрицательные числа в поле “Количество”.
    8. При проведении документа “Продажа Товаров” данные в регистр ТоварыНаСкладах не попадают. Нужно установить флаг на регистре накопления в свойствах.
    9. В документе “Продажа Товаров” нужно изменить свойства реквизита “Серия” табличной части Товары – установить Связь параметров выбора – Отбор.Владелец (Товары.Товар)
    10. При проведении документа “Продажа Товаров” нужно очищать движения перед запросом.
    11. В запросе нужно обязательно устанавливать отбор по текущему документу.
    11а. Внутреннее соединение не подходит. Нужно использовать левое соединение.
    11б. Получать остатки нужно на момент времени документа. Поэтому нужно указывать параметры виртуальной таблицы ТоварыНаСкладах.Остатки – Период – &МоментВремени и Условие (Товар, Серия) В (Выбрать…)
    11в. Нужно в запросе добавить выходное поле “Номер Строки”, использовать его в конструкции “СообщениеПользователю”.
    12. Если товара не хватает, нужно ОТКАЗ делать равным Истина.
    13. Нужно изменить формулу расчета сумм списания:
    Запись.Сумма = ВыборкаТовары.СумОст * Запись.Количество / ВыборкаТовары.КолОст;
    14. Нужно проверять деление на ноль для ВыборкаТовары.КолОст.
    15. Чтобы поле “Номер серии” проверялось на заполнение, нужно в справочнике Серии в свойстве Проверка Заполнения реквизита “Код” поставить Выдавать ошибку.
    Шаг 3. Наша фирма занимается оптовой торговлей, поэтому я предпочел рассказать коллегам о преимуществах УТ 11. Ниже привожу фотографии с минисеминара.
    [IMG]http://i46.fastpic.ru/big/2013/0516/dc/5e2fb30fb2bb2a93a9e71f38baf461dc.jpg[/IMG]
    [IMG]http://i48.fastpic.ru/big/2013/0516/60/c7baae12972d7c8f39e53d1831c26860.jpg[/IMG]

    • Dobrenko Oleg 17.05.2013 в 10:49

      Дмитрий, благодарим за отзыв!
      Поздравляем с окончанием базового курса, ждем на продвинутом!

  11. ШАГ 1. Вопросы по курсу

    ФИО – Берестнев Василий Владимирович
    Город – Тюмень

    Курсы как никогда кстати. В этом году планируем вместе с командой переводить один большой проект с 8.1 на 8.2.

    Так как параллельно занимаюсь по двум курсам “Базовый” и “Продвинутый”, то выделю общие моменты:
    * очень полезно, что видео содержит ошибки преподавателя и их последующий разбор
    * для себя выбрал следующую методику обучения: глава из базового – эта же глава из продвинутого – так лучше усваивается и прорабатывается материал
    * полезными оказались блоки по: клиент-серверному взаимодействию, шаблонам текста, оптимизации запросов, СКД, Бизнес-процессам, регистрам бухгалтерии, регистрам расчета
    * отдельное спасибо за конструктор запроса с обработкой результата
    * формат курсов намного удобней очных – можно всегда вернуться к пройденному материалу, видео «лучше» чем книга
    * задумался о курсах по быстрому набору текста )))

    Пожалуй, самое главное для меня после стресс тестов по двум курсам – начинаешь с удивлением смотреть на свой “старый” код, есть что оптимизировать. И это хорошо – есть куда расти.

    Большое спасибо создателям! До встречи на новых курсах.

    ——————————————————————–

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

    Общее:

    * устанавливаем в стандартных реквизитах справочника “Серии” у реквизита “Код” проверку заполнения “Выдавать ошибку”.
    * для работы в обычном приложении необходимо для объектов создать обычные формы и назначить их дополнительными.

    **********************************
    Документ “ПокупкаТоваров”:

    BUG – Документ “ПокупкаТоваров” реквизит “Количство” в ТЧ “Товары” имеет тип “Строка”
    FIX – исправляем на тип Число 15,3 + признак неотрицательное

    BUG – в обработке проведения отсутствует флаг записи в регистр накопления
    FIX – Добавляем строку: Движения.ТоварыНаСкладе.Записывать = Истина;

    BUG – кнопка “Заполнить клиента” с кодом: Объект.Клиент = Справочники.Клиенты.ОсновнойПокупатель;
    FIX – Заменить на строку кода: Объект.Клиент = ПредопределенноеЗначение(“Справочник.Клиенты.ОсновнойПоставщик”);

    BUG – кнопка “Заполнить товары” с кодом: ВвестиЗначение(Основание, “Выберите документ-основание”, Тип(“Документ.ПокупкаТоваров”));
    FIX – Заменить на строку кода: ВвестиЗначение(Основание, “Выберите документ-основание”, Тип(“ДокументСсылка.ПокупкаТоваров”));

    BUG – процедура “ЗаполнитьТоварыНаСервере”
    FIX – изменить контекст с “&НаСервереБезКонтекста” на “&НаСервере”

    BUG – процедура “ЗаполнитьТоварыНаСервере”
    FIX – достаточно одной строки: Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());

    BUG – кнопка “Заполнить товары”
    FIX – строку: “НЕ Основание.Пустая()” заменить на: “Основание Неопределено И НЕ Основание.Пустая()”

    **********************************
    Документ “ПродажаТоваров”:

    BUG – есть кнопка “Проверка документа” по нажатию которой проверяются товары с отрицательным количеством
    FIX – будет работать только для записанных в базу документов, необходимо принудительно записать документ

    BUG – есть кнопка “Проверка документа” по нажатию которой проверяются товары с отрицательным количеством
    FIX – У реквизита ТЧ “Количество” уже установлен признак “Неотрицательный”, зачем вообще тогда нужен данный запрос?

    BUG – в обработке проведения есть строка: Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;
    FIX –
    1) отсутствует проверка деления на 0
    2) для повышения точности расчетов рекомендуется умножение выносить вперед деления

    BUG – при нехватке товара документ все равно делает движения по регистру
    FIX – необходимо добавить Отказ=Истина

    BUG – при выборе серии не установлен отбор по владельцу
    FIX – добавляем условие отбора по владельцу в “связи параметров выбора”

    BUG – обработка проведения и добавления записей в регистр
    FIX – добавляем перед записью в регистр Если НЕ Отказ Тогда

    BUG – обработка проведения и запрос
    FIX –
    * добавить в запрос “НомерСтроки”
    * для защиты от дублей строк необходимо в запросе сгруппировать по товарам и по сериям
    * внутреннее соединение заменить на ЛЕВОЕ
    * при соединии нет приведения isnull()
    * в параметрах виртуальной таблицы необходимо заменить “Товар В…” на строку “(Товар, Серия) В…”
    * для внешнего запроса не установлено условие: ПродажаТоваровТовары.Ссылка = &Ссылка
    * во вложенном запросе добавить ключевое слово “Различные”
    * добавить в запрос дату получения остатка &Момент
    * указанный запрос я бы переписал через пакет, так как идет обращение к одной и той же таблице два раза

    BUG – обработка проведения
    FIX – в начало процедуры добавить
    Движения.ТоварыНаСкладе.Очистить();
    Движения.ТоварыНаСкладе.Записать();

    BUG – сообщение при нехватке товара
    FIX – заменить строку: “Товары.Количество” на строку: “Товары[“+(ВыборкаТовары.НомерСтроки-1)+”].Количество

    ***********************************
    Регистр накопления “ТоварыНаСкладе”:

    BUG – ресурс “Количество” тип число 15,2
    FIX – исправляем на тип Число 15,3

    BUG – регистратор только документ “ПокупкаТоваров”
    FIX – Добавляем в качестве регистратора документ “ПродажаТоваров”

    ************************************
    Общий модуль “ПроверкаДокументовСервер”:

    BUG – не установлен флаг “Вызов сервера”
    FIX – Устанавливаем данный флаг

    BUG – в процедуре “ПроверитьДокумент” используется метод “Предупреждение”, который недоступен на сервере
    FIX – Заменить, к примеру, на “Сообщить()”

    ————————————————————————————————–

    ШАГ 3. Помощь ближним

    http://chistov.spb.ru/forum/33-2477-1
    http://chistov.spb.ru/forum/33-2014-1

    • Dobrenko Oleg 16.05.2013 в 12:38

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

  12. 1.Сомнительна настройка Сервис-Параметры-Запуск 1С: Предприятие

    . Толстый клиент(управляемое приложение)
    Я бы сделала настройку “Выбирать автоматически”(тонкий), а для случая необходимости толстого клиента указывала бы в окне запуска настройку базы “Основной режим запуска” “Толстый клиент”.

    Цитата из задания “ИБ должна корректно работать в толстом и тонком клиенте”
    2. Требование главбуха об обязательности заполнения поля “Номер серии” у элемента справочника “Серии”.
    Форма формируется на лету из описания объекта справочник Серии(представление в виде кода, а код -число).
    Такого точно поля нет, в пользовательском режиме в форме сменили заголовок поля код на “Номер серии”,поэтому трансляция ее слов на уровень объекта : это представление серии как кода.

    Для объекта Справочник Серии в модуль объекта вставляем код
    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    ПроверяемыеРеквизиты.Добавить(“Код”);
    КонецПроцедуры
    Это снимает вопрос с незаполненными сериями.
    Поскольку смысл ввода сертификатов в информации о сроке годности, я бы обязательно ввела и необходимость проверки заполнения этого реквизита,
    чего нет в свойствах реквизита СрокГодности
    ПроверяемыеРеквизиты.Добавить(“СрокГодности”);

    3. Документ ПокупкаТоваров

    3.1 Реквизит Количество в ТЧ описан как Строка 10, а в регистре ТоварыНаСкладе ресурс Количество,естественно,число.
    Строка не всегда м.б преобразована в число. В ТЧ реквизит Количество надо определить как число,например, разрядности 15.3 .
    3,2 Проведение документа не приводит к записи в регистр по причине того, что надо на выбор(в этой ситуации проведения по одному регистру и упрощенно),
    либо в модуле объекта в проц ОбработкаПроведения указать на любом месте
    Движения.ТоварыНаСкладе.Записывать = Истина;
    либо последним оператором Движения.ТоварыНаСкладе.Записать();
    3.3 Кнопка “Заполнить клиента” при нажатии приводит к появлению ошибки “Нет предопределенного элемента …”.
    Решение : в справочник Клиенты в предопределенные Элементы добавим эл с именем ОсновнойПокупатель.
    Для работы в тонком клиенте вариант реализации не годится
    Для всех вариантов (в тонком и толстом клиенте)

    &НаКлиенте
    Процедура ЗаполнитьКлиента(Команда)
        //Объект.Клиент = Справочники.Клиенты.ОсновнойПокупатель;
        ЗаполнитьКлиентаНаСервере();
    КонецПроцедуры
    &НаСервере
    Процедура ЗаполнитьКлиентаНаСервере()
       Объект.Клиент = Справочники.Клиенты.ОсновнойПокупатель;
    КонецПроцедуры // ЗаполнитьКлиентаНаСервере()

    3.4 Кнопка “ЗаполнитьТовары”
    Сама идея ввода документа основания через вопрос ошибочна.
    На закладке свойств ВводНаОсновании добавить документ ПокупкаТоваров
    Можно ввести реквизит ДокументОснование , если потом будет желание просматривать подчиненность документов.
    В модуле объекта док

    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
       
        Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПокупкаТоваров") Тогда
            ДокументОснование=ДанныеЗаполнения.Ссылка;
            // Заполнение шапки
            Клиент = ДанныеЗаполнения.Клиент;
            Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
                НоваяСтрока = Товары.Добавить();
                НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
                НоваяСтрока.Серия = ТекСтрокаТовары.Серия;
                НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
                НоваяСтрока.Товар = ТекСтрокаТовары.Товар;
            КонецЦикла;
        КонецЕсли;
       
    КонецПроцедуры

    Если оставить выбор основания через вопрос, то
    избежать выданных ошибок так(годится и для тонкого и для толстого клиента)

    &НаКлиенте
    Процедура ЗаполнитьТовары(Команда)
       
        Перем Основание;
        //ВвестиЗначение(Основание, "Выберите документ-основание", Тип("Документ.ПокупкаТоваров"));
        Если ВвестиЗначение(Основание, "Выберите документ-основание", Тип("ДокументСсылка.ПокупкаТоваров"))Тогда
        //Если НЕ Основание.Пустая() Тогда
            //ЗаполнитьТоварыНаСервере(Объект.Ссылка, Основание);
            ЗаполнитьТоварыНаСервере(Основание);
        //КонецЕсли;
        КонецЕсли;
       
    КонецПроцедуры

    //&НаСервереБезКонтекста   потому что нужен контекст формы
    &НаСервере
    //Процедура ЗаполнитьТоварыНаСервере(ТекущийДокумент, ДокументОснование)
    Процедура ЗаполнитьТоварыНаСервере( ДокументОснование)

        //Объект = ТекущийДокумент.ПолучитьОбъект();
        ДокументОбъект=РеквизитФормыВЗначение("Объект"); 
        ДокументОбъект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());
        ЗначениеВРеквизитФормы(ДокументОбъект,"Объект");

    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    4. Документ ПродажаТоваров
    4.1 Нет настройки для реквизита “Серии” в строке табличной части, поэтому при выборе серии нет отбора по владельцу в списке выбора.
    Надо в конфигураторе в описании объекта док ПродажаТоваров ТЧ Товары реквизит Серия в свойстве Связи параметров выбора указать Отбор.Владелец(Товары.Товар) .
    4,2 Не выполняется задание на проведение по регистру ТоварыНаСкладе,т.к
    на закладке “Движения” нет отмеченного регистра накопления. Ставим галку у регистра ТоварыНаСкладе.
    Процедура проведения имеется.
    Ошибки запроса.
    4.2.1 В условии нет фильтра для таблицы Документа ПродажаТоваров , необходимо вставить на закладке Условия таблицы
    ПродажаТоваровТовары.Ссылка = &Ссылка.
    Вся таблица таб частей доков ПродажаТоваров будет участвовать в соединении с таблицей остатков.
    Это не будет ощутимо на нашей пустой базе, но при увеличении базы производительность проведения упадет.
    Соединение нужно левое, т.к нужно все из таблицы документа.
    Если остатков нет, но нужно колво и сумму представить как 0.
    Нужно выбирать поле “НомерСтроки”,т.к. в сообщении ошибка в указании поля сообщения.
    Дальше деление на 0 в операторе
    Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;

    Если нехватка уже определилась(в том числе и при отсутствии остатка), в ветке недостаачи нужно присвоить параметру отказ=Истина,
    чтобы не было проведения,т.е. записи рез-та транзакции. Здесь предусмотрена запись движений :
    Движения.ТоварыНаСкладе.Записывать = Истина;
    При нехватке не надо формировать запись движений,т.е. нужна по нехватке ветка “иначе”.
    При настройке объекта док ПродажаТоваров Удаление движений – Удалять автоматически при отмене проведения.
    Поэтому нужно очищать движения до проведения.

    Модуль объекта

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


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

        ВыборкаТовары = Результат.Выбрать();

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

    5. Кнопка ПроверкаДокумента не имеет смысла для проверки отрицательных количеств,т.к. в свойствах реквизита
    Количество таб части настройки “Число 15.3” ,неотрицательное и уже на вводе нет возможности ввести отрицательное количество.
    Тем не менее, нельзя – потому что “Дорого” на сервере писать так:
    Предупреждение(“Ошибка в строке № “+Выборка.НомерСтроки+” количество не может быть отрицательным!”, 5);
    Это конец паралллельно обработки и 5 секунд ожидания.
    Надо использовать объект “Сообщение”.

    Отзыв и отчет по мини- семинару будут в следущие дни. На работе – много работы!

    • Dobrenko Oleg 16.05.2013 в 09:12

      Ок, практическую часть принимаю.
      Ждем отзыв по курсу и фото отчет по мини-семинару.

  13. Фролов Сергей Викторович, г.Бердск
    Отзыв по курсу:
    Новым в курсе для меня было работа с управляемыми формами, так как ранее опыта работы с ними вообще не было, а так же блок по расчету заработной платы. Да и по другим темам проскальзывали моменты, которые помогли систематизировать уже имеющиеся знания.
    Новые знания уже используются, где возможно пытаюсь реализовывать управляемые формы, а так же, на прошлой неделе довольно быстро нашел ошибку в начислениях ЗП, без знаний полученных в курсе я бы искал ее очень долго!!!
    Формат обучения очень удобен потому как проходит в своем ритме. А ограничение по срокам является очень хорошой подгонялкой, иначе бы все обучение откладывалось на потом, когда появится больше свободного времени…
    Вообще, для меня условия обучения оказались спартанские, когда приходилось в день выделять дополнительные час-два вместо того чтобы лечь спать :)))

    Ошибки в конфигурации
    1. Документ ПокупкаТоваров не делает движения по регистру. В Обработке проведения установили свойство Записывать = Истина для набора записей регистра.
    2. В документе ПродажаТоваров выбор серии осуществляется без отбора по владельцу. В ствойствах реквизита Серия табличной части Товары установили Связь параметров выбора – Отбор.Владелец (Товары.Товар)
    3. Документ ПродажиТоваров не включен в список регистраторов для регистра ТоварыНаСкладе.
    4. В запросе для контроля остатков при попытке проведения документа ПродажаТоваров ошибки:
    – Не хватает условия отбора по текущему документу,
    – Внутренне соединение не даст в выборку записей по товарам которых нет на складе
    – Остатки необходимо получать на момент времени документа
    Текст правильного запроса

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

    5. Перед выполнение запроса для корректного учета остатков товаров на складе необходимо удалить движения по данному документу.
    6. При проверке превышения остатка необходим отказ от проведения если такой факт обнаружен (Отказ = Истина).
    7. В расчете сумм списания для записи возможны погрешности расчета, перепишем немного по другому

    Запись.Сумма = ВыборкаТовары.СумОст * Запись.Количество / ВыборкаТовары.КолОст;

    8. Кнопка “Проверить документ” в форме документа. Для общего модуля ПроверкаДокументовСерер не указано свойство вызов сервера, поэтому его нельзя вызвать с клиента. Метод Предупреждение() нельзя использовать на сервере, надо заменить на СообщениеПользователю. Перед вызовом функции проверки необходимо записать документ в базу. Сам алгоритм проверки в общем модуле не имеет смысла, так как реквизит Количество табличной части Товары не может быть отрицательным.
    9. Кнопка “Заполнить клиента” в документе ПокупкаТоваров. На клиенте к предопределенному элементу можно обратится через функцию ПредопределенноеЗначение и имя предопределенного элемента указано не правильно.
    10. Кнопка “Заполнить Товары”. Не правильно указан тип значения при попытке выбрать документ основание, правильный тип – ДокументСсылка.ПокупкаТоваров.
    Алгоритм заполнения табличной части неверный. в данном случае произойдет попытка заполнения копии документа в памяти и то, неудачно – так как нельзя в табличную часть загрузить другую табличную часть. Правильный алгоритм:

    &НаСервере
    Процедура ЗаполнитьТоварыНаСервере(ДокументОснование)

        Объект.Товары.Загрузить(ДокументОснование.Товары.Выгрузить());

    КонецПроцедуры // ЗаполнитьТоварыНаСервере()

    11. Для того чтобы было обязательным заполнение серийного номера указали значение “Выдавать ошибку” у свойства “Проверка заполнения” стандартного реквизита “Код”.

    Статья http://infostart.ru/public/186036/

    • Dobrenko Oleg 16.05.2013 в 09:04

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