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

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

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

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

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

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

  1. Вопросы по курсу:

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

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

    1. В табличных частях документов «Покупка товаров» и «Продажа товаров» нет колонки Цена, только Количество и Сумма. Нужно добавить недостающий реквизит Цена и для удобства добавить автоматический расчет Суммы при изменении Цены, либо Количества.
    2. В документе «Покупка товаров» в табличной части Товары у реквизита Количество указан тип Строка(10), надо указать Число(15,3).
    3. В документе «Покупка товаров» при нажатии на кнопку «Заполнить клиента» идёт обращение к несуществующему предопределенному элементу ОсновнойПокупатель. Необходимо заменить на ОсновнойПоставщик.
    4. Так как необходимо обеспечить работу решения в толстом и тонком клиентах управляемого приложения, нельзя обращаться к предопределенному элементу в клиентской процедуре. Нужно вынести это обращение в серверную процедуру и уже её вызывать.
    5. В документе «Покупка товаров» в процедуре проведения нужно добавить строчку Движения.ТоварыНаСкладе.Записывать = Истина, чтобы осуществлялась запись в регистр.
    6. В документе «Покупка товаров» при нажатии на форме кнопки «Заполнить товары» выскакивает ошибка, т.к. при вызове глобальной функции ВвестиЗначение указан неверный тип Тип(«Документ.ПокупкаТоваров»). Нужно указывать Тип(«ДокументСсылка.ПокупкаТоваров»).
    7. В документе «Покупка товаров» при нажатии на форме кнопки «Заполнить товары» при выборе документа выскакивает ошибка, т.к. неправильно написана процедура ЗаполнитьТоварыНаСервере(Объект.Ссылка, Основание).
    Во-первых, нужно изменить директиву компиляции с &НаСервереБезКонтекста на &НаСервере.
    Во-вторых, теперь нам доступен контекст формы и не нужно передавать первым параметром Объект.Ссылка. Вот как будет выглядить теперь эта процедура.
    8. В документе «Продажа товаров» для реквизита Серия табличной части Товары нужно настроить отбор по Владельцу в «Связи параметров выбора».
    9. Для того чтобы удовлетворить желание главного бухгалтера Виолы Григорьевны, необходимо на вкладке Данные справочника Серии открыть Стандартные реквизиты и выставить у реквизита Код свойство «Проверка заполнения» — «Выдавать ошибку».

    Помощь ближним:
    Статья: http://infostart.ru/public/304910/index.php?detail=Y Проходит модерацию, будет видна, если зайти под моим аккаунтом.
    Логин: pavel_D
    Пароль: dfuythvfrsbv

    • Dobrenko Oleg 01.10.2014 в 09:20

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

  2. Франк Елена Викторовна

    1шаг
    Я получила из данного курса много новых знаний, начиная от самых элементарных, которые почему-то прошли мимо и были мне не известны, заканчивая тонкими нюансами, до которых нужно еще докопаться, набив немало шишек в работе. Даже знакомые темы заставляли критично отнестись к своим знаниям и узнать что-то новое, пересмотреть используемы алгоритмы, более глубоко понять смысл часто используемых свойств, функций. В итоге появились не только новые знания,которые еще будут пополняться, потому что не раз еще буду возвращаться к пройденным урокам, но и поменялся стиль работы, стало получаться быстрее и оптимальнее то,на что раньше уходило гораздо больше времени. И как раз удобство данного форматат заключается в том, что все уроки можно просмотреть заново в любое удобное время.

    шаг2
    -При проведении документа “Покупка товаров” не заполняются регистры.
    В начале процедуры нужно добавить

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

    -документ “Покупка товаров”. При нажатии на кнопку возникает ошибка

    “Тип не определен (Документ.ПокупкаТоваров)”
    Исправить Тип(“Документ.ПокупкаТоваров”) на Тип

    (“ДокументСсылка.ПокупкаТоваров”)

    -Тип поля таб.части “Количество” изменила на число

    -Ошибка “Несоответствие типов (параметр номер ‘1’)” при выборке

    документа для заполнения

    -В проц.”ЗаполнитьКлиента” исправляем выбор предопределенного

    поставщика “ОсновнойПоставщик” и выносим на сервер

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

    -Исправляем проц для заполнения табл.части

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

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

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

        Результат = Запрос.Выполнить();
       
        ТекущийДокумент.Товары.Загрузить(Результат.Выгрузить());

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

    -При проведении документа “Продажа товаров” возникает ошибка “Поле

    объектов не обноружено”
    Нужно добавить на закладку “Движения” возможность формирования

    движений ро регистру “ТоварыНаСкладе”

    -При проведении документа “Продажа товаров” возникает проведение в “минус”
    Нужно исправить условие (Недостача<0).Необходимо прекратить проведение, присвоив Отказ=Истина;
    Исправить запрос, чтобы по нему можно было определить и недостачу (остаток-кол-во документа) и получить среднее для списания

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

    -Проверка
    Так как в минус мы не можем провести документ, то проверка по кнопке "Проверить документ" никогда не выдаст нам ошибку.
    Логично организовать проверку на заполнение номенклатуры и серии, но не подобной процедурой,а установкой соответствующего свойства.

    -Для того,чтобы поле номер серрии было обязательным для заполнения нужно в свойствах поля код поставить проверка заполненного – выдавать ошибку. Свойства находятся в стандартных реквизитах.
    шаг3
    http://www.sql.ru/forum/1117547/razlichiya-v-konfiguracii-postavshhika-i-bd

    • Dobrenko Oleg 01.10.2014 в 09:10

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

  3. Добрый день!

    Меня зовут Ростовцев Дмитрий Дмитриевич, г.Москва.

    1. Обратная связь по курсу

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

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

    На практике удалось применить знания о работе управляемых форм.

    Дистанционный формат меня всегда привлекал, он мне кажется более эффективным. На своем примере понял (нахожусь в другом городе), что такой формат мне подходит ))

    2. Тестирование конфигурации

    Ошибки, найденные при тестировании:

    1. Документ “Закупка товаров”

    а. В документе «Закупка товаров» создана кнопка «Заполнить клиента», при нажатии на
    которую система должна подставить в документ контрагента по умолчанию. – некоректный код заполнения.Необходимо реализовать заполнение на сервере + неправильное имя прредопределенного элемента

    Вместо

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

    нужно

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

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

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

    КонецФункции // ЗаполнитьПоУмолчаниюНаСервере()

    б. Кнопка “Заполнить товары” – неправильно определен тип:
    вместо

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

    нужно

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

    в. Кнопка “Заполнить товары” – ошибка заполнения товаров:

    Нужно

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

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

    г. Не формируются записи в РН

    В обработку проведения добавить :

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

    2. Документ “Продажа товаров”

    а. Не установлен регистратор для регистра ТоварыНаСкладах
    б. Кнопка “Проверка документа” – нет смысла, поле “Количество” в ТЧ – неотрицательное
    в. Ошибка проведения документа – параметр Отказ не меняется при превышение остатки.
    г. Некорректный запрос – в запросе нужно левое соединение, в параметры запроса не передается &ДатаСреза в виртуальную таблицу остатков, необходимо реализовать проверку на 2 поля(номенклатура + серии) в параметрах виртуальной таблицы остатков, нет проверки на Null для числовых полей выборки.
    д. При обходе выборки нет проверка при делении на ноль, есть проблема неточного деления, движения по регистру остатков необходимо перенести в другую ветку.
    Код исправленной обработки проведения:

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

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

    Моя статья на Инфостарте:
    http://infostart.ru/public/304671/

    • Dobrenko Oleg 01.10.2014 в 09:08

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

  4. Александр М. 28.09.2014 в 09:01

    Здравствуйте Масловец Александр Валентинович г. Витебск

    ШАГ 1 Обратная связь.

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

    Шаг 2

    1. В общем модуле “ПроверкаДокументовСервер” добавил вызов сервера.
    2. В документе “покупка товаров” изменил тип для реквизита количество на число (15,3);
    3. В документе “Продажа товаров” для реквизита “серия” через “связь параметров выбора” установил отбор по владельцу (владелец – товар в текущей строке).
    4. В документе “Продажа товаров” установил для документа признак проведения по регистру “Товары на складе”.
    5. Для решения задачи обязательного заполнения номера серия сделал стандартный реквизит “Код” справочника серии обязательным для заполнения. (исходил из того, что код и есть номер серии).
    6. У ресурса количество регистра накопления изменил длину дробной сачти с 2 на 3
    7. В документе продажа товаров убрал кнопку “Проверка документа”, т.к. в ней нет смысла.
    8. В документе “покупка товаров” в процедуре “Заполнить товары” в команде “ВвестиЗначение” во вотором параметре заменил тип на “ДокументССылка.Покупка товаров”;
    8. В документе “покупка товаров” в процедуре “Заполнить клиента” клиента поменял на “ОсновнойПоставщик”. Само заполнение сделал на сервере, потом вернул назад на клиента.

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

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

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

    9. В документе “Покупка товаров” Переписал процедуру “ОбработкаПроведения”:

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

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

    10. В документе “продажа товаров” переписал процедуру “обработкапроведения”

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

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

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

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

    ШАГ3

    С коллегами на работе (небольшой отдел, 3 человека) постоянно делился полученными знаниями. К сожалению фотографироваться они отказались.

    • Dobrenko Oleg 28.09.2014 в 17:06

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

      >К сожалению фотографироваться они отказались.
      От выполнения условий третьего шага финального задания это не освобождает :) Вы можете попробовать помочь кому-нибудь на форуме! Не обязательно выбирать какой-то сложный вопрос.

  5. Здравсствуйте.

    Отчет по финальному заданию

    Бурлака Сергей Дмитриевич, г.Одесса

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

    2 шаг.
    1.-

    2.-в МО ПродажаТоваров добавил проверку на 0 для делителя и умножение перенес в числитель

        //**    Запись.Сумма = ВыборкаТовары.СумОст/ВыборкаТовары.КолОст*Запись.Количество;
            Если ВыборкаТовары.КолОст<>0 Тогда
           
                Запись.Сумма = (ВыборкаТовары.СумОст*ВыборкаТовары.КолДок)/ВыборкаТовары.КолОст;
            Иначе
                Запись.Сумма = 0;
            КонецЕсли;

        //

    3.-в МО ПродажаТоваров в запросе добавил Левое соединение Товары с Остатки и привел NULL к 0

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

    4.-в форме ПокупкаТоваров изменил обработчик кн.ЗаполнитьКлиента

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

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

    5.-изменил обработчик кн.ЗаполнитьКлиента

    //**    Предупреждение("Ошибка в строке № "+Выборка.НомерСтроки+" количество не может быть отрицательным!", 5);
       
    Сообщить("Ошибка в строке № "+Выборка.НомерСтроки+" количество не может быть отрицательным!");

    6.
    – для регистра ТоварыНаСкладе также указал регистратором док.ПродажаТоваров

    -в МО ПокупкаТоваров для Движенийдобавил Записывать в транзакции

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

    7.-для главбуха в свойствах “Номер серии” установил поле Проверка заполнения = Выдавать ошибку.

    3 шаг. Провел у клиента семинар на тему “Приемы настройки пользователем форм и отчетов”.

    1

    • Dobrenko Oleg 28.09.2014 в 17:02

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

  6. Константин 26.09.2014 в 09:19

    Шаг 1.
    Длительное время занимался сопровождением и написанием программ на Clipper (далее Harbour) и Delphi. Опыт работы с 1С полностью отсутствует. По рекомендации друзей посетил сайт курсы-по-1с.рф. Для пробы подписался на бесплатный курс “Программирование в 1С – за 21 день”. Мне понравилась форма обучения и я оплатил “Базовый курс”, о чем ни капли не пожалел. Особенно мне понравилось, что на всем протяжении курса наглядно демонстрируется практическая работа по разработке на платформе 1С, включая поиск ошибок и отладку. Отдельная песня – решения домашнего задания от преподавателя. Мне было очень интересно при их просмотре. То, что после прохождения курса не жалко ни потраченного времени, ни потраченных денег, на мой взгляд наивысшая оценка вашего труда.
    Шаг 2.
    1. Так как просьба главного бухгалтера – это святое, то начал с нее.
    1.1 Кроме уже установленных свойств реквизита “Серия” табличных частей документов, требуется в свойстве “Проверка заполнения” стандартного реквизита “Код” справочника “Серии”, указать “Выдавать ошибку”.
    1.1 Затем глубоко задумался. А если главбух требует, чтобы документ нельзя было сохранить без указания серии? Ведь штатная проверка отработает только при попытке проведения. Дальше видел два пути: проверять заполнение в событии модуля объекта “ПередЗаписью” или тоже самое в модуле формы. В модуле объекта, вообще-то правильнее и надежнее, но в данном случае по таким пустякам сервер беспокоить… В итоге добавил обработчик события формы “ПередЗаписью” на клиенте, в котором вызываю процедуру, определенную в клиентском общем модуле. Эту доработку осуществил в формах обоих документов.
    2. Документ “Покупка товаров”
    2.1 В обработчике команды “Заполнить клиента”
    а) Обращение к БД на клиенте. Добавил функцию с директивой препроцессора “НаСерверБезКонтекста”, в которую перенес получение ссылки на клиента.
    б) далее заменил на обращение к несуществующему основному покупателю на предопределенный элемент “Основной поставщик”. Хотя на мой взгляд такие вещи полагается задавать константой, но если сказано: “функционал устраивает”, значит устраивает.
    2.2 В обработчике команды “Заполнить товары”
    а) В вызове процедуры “ВвестиЗначение” заменил тип “Документ.ПокупкаТоваров” на “ДокументСсылка.ПокупкаТоваров”
    б) а ошибок то, и директива неподходящая и с типами параметров путаница. В общем, заменил текст заполнения:

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

    2.3 В процедуре “ОбработкаПроведения” нет ни выставления флага “Записывать” для регистра “ТоварыНаСкладе”, ни явной записи набора. Добавил строку c установкой флага “Записывать” в значение “Истина”.
    2.4 Тип реквизита табличной части “Количество” со строки(10) заменил на Число(15,3)
    3. Документ “Продажа товаров”
    3.1 Для реквизита табличной части “Серия” установил свойство “Связи параметров выбора”
    3.2 Обработчик команды “Проверка документа”:
    а) Смысла проверять неотрицательность количества в документе, притом в БД, если для реквизита явно указан флаг “Неотрицательное” не увидел. Разве, что:

    &amp;НаСервере
    Процедура ПроверкаДокументаСервер()
        РеквизитФормыВЗначение("Объект").ПроверитьЗаполнение();
    КонецПроцедуры // ПроверкаДокументаСервер
    /
            б) После стимулирования мышления путем почесывания затылка появилось желание проверить наличие товара, указанной серии на складе. Заодно и в применении полезного приема из разбора первого домашнего задания продвинутого курса потренировался. Содержание табличной части документа объекта загрузил во временную таблицу, далее все аналогично контролю остатков в обработке проведения, но данные документа беру из временной таблицы.
        3.3 Указал, что документ является регистратором для регистра "ТоварыНаСкладе"
        3.4 При разборе обработчика проведения впал в задумчивость: как правильнее обеспечивать контроль остатков при перепроведении документа. Очищать набор записей вручную в начале процедуры обработки или установить соответствующее свойство документа. В итоге, для свойство "Удаление движений" установил в значение "Удалять автоматически".
        3.5 В обработчике проведения документа:
            а) Для обеспечения неоперативного проведения устанавливаю параметр виртуальной таблицы "Период" в значение МоментВремени()
            б) Внутреннее соединение в запросе следует заменить на ЛЕВОЕ СОЕДИНЕНИЕ (товара на складе может и не быть). Далее для полей "КолОст" и "СумОст" следует учесть значение NULL, т.е. isnull(...,0) КАК ...
            в) В запросе не учитываются возможные дубли товаров и серий. Добавил группировку по товару и серии, а также выборку поля МИНИМУМ(ПродажаТоваровТовары.НомерСтроки) для привязки сообщения к строке табличной части
            г) Добавил привязку сообщения к ошибочной строке табличной части
            д) При наличии недостачи устанавливаю параметр "Отказ" в значение "Истина"
            е) При вычислении себестоимости товара вынес умножение перед операцией деления (проблемы копеек нам только не хватало)
    Шаг3.
    Пряников не заработал. Но количество пропущенных слонов на втором шаге было бы интересно узнать :) До встречи на продвинутом курсе.
    • Dobrenko Oleg 28.09.2014 в 16:57

      Константин, благодарим вас за отзыв!
      Практическое задание принято, ждем от вас отчета по шагу №3.

  7. Иван, г. Иркутск

    Обратная связь:

    Много узнал ли я нового ?)
    Да много, так как относительно недавно начал изучать 1с.
    Программированием я занимаюсь давно на с++ и делфи.

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

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

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

    Купив ваш курс ни разу не пожалел о потраченных деньгах. Это гораздо
    лучше очных курсов.

    Понравились домашние задания, поначалу показались сложноватыми, но они просто заставляют подумать)
    И решая их понимаешь что научился частичке нового). Мне очень понравились все ДЗ.

    Что касается Видеоуроков с мастер-группами, считаю их нужно давать качать все сразу а не тянуть весь курс.

    Жаль что на сайте нет возможности группового обсуждения тем. Неудобная система комментариев. Все сливается.

    Но несмотря ни на что, моя оценка этого курса 10 из 10. Лучше и понятнее быть просто не может)

    Практическая часть:

    1) нет Предопределенного элемента ОсновнойПокупатель в справочнике Клиенты

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

    нельзя исполнять на клиенте

    правильно:

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

    3)
    док. закупка, модуль формы:

    Правильно:

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

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

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

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

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

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

    4) док. закупка, модуль объекта:

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

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

    5) в док. продажи при выборе серии не настроены связи параметров выбора.

    6) в документе продажи кнопка ПроверитьДокумент – не имеет смысла,
    так как на уровне реквизита количество стоит свойство неотрицательное.

    7) документ продажи не был регистратором для регистра ТоварыНаСкладе

    8) При проведении док. продажи в параметрах виртуальной таблицы Остатки регистра ТоварыНаСкладе условие было не полным.
    Вот правильно:

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

    9)При проведении док. продажи в параметрах виртуальной таблицы Остатки регистра ТоварыНаСкладе не указан момент времени.

    10) При проведении док. продажи в условии запроса не было отбора ТЧ по ссылке.

    11) рабочая обработка проведения продаж после всех исправлений:

    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

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

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

    Запрос.УстановитьПараметр(“МоментВремени”, Граница);
    Результат = Запрос.Выполнить();

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

    Пока ВыборкаТовары.Следующий() Цикл

    Недостача = ВыборкаТовары.КолОст – ВыборкаТовары.КолДок;
    Если Недостача < 0 Тогда

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Недостаточно товара "+ВыборкаТовары.Товар+" в количестве "+Недостача;
    Сообщение.Поле = "Товары.Количество";
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    Отказ = Истина;

    Иначе

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

    КонецЕсли;

    КонецЦикла;

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

    12) В справочнике Серии, код и есть номер серии. Вот проверка заполнения:

    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    ПроверяемыеРеквизиты.Добавить("Код");
    КонецПроцедуры

    Моя статья:

    http://infostart.ru/public/302832/

    • Dobrenko Oleg 26.09.2014 в 07:24

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

  8. Здравствуйте.

    Миначетдинов Ринат Мансурович, г. Москва

    1 ЧАСТЬ. Обратная связь.

    До прохождения курса я обладал знаниями в программировани на 1С, но т.к. я занимался самообучением, некоторые вещи были урывками. Данный курс помог мне всё систематизировать, разложить по полочкам. Курс разбит по блокам, на мой взгляд, это очень удобно. Отдельное спасибо за “Блок 4. Автоматизация расчета заработной платы”, т.к. до этого я не работал с Планами видов расчета и с Регистрами расчета.
    Данный формат обучения очень удобен, т.к. ты не привязан к определенному месту и времени.
    Прохождением курса остался доволен, спасибо.

    2 ЧАСТЬ. Отчет по практическому заданию.

    1. В табличных частях документов “Покупка товаров” и “Продажа товаров” нет колонки Цена, только Количество и Сумма. Нужно добавить недостающий реквизит Цена и для удобства добавить автоматический расчет Суммы при изменении Цены, либо Количества.
    2. В документе “Покупка товаров” в табличной части Товары у реквизита Количество указан тип Строка(10), надо указать Число(15,3).
    3. В документе “Покупка товаров” при нажатии на кнопку “Заполнить клиента” идёт обращение к несуществующему предопределенному элементу ОсновнойПокупатель. Необходимо заменить на ОсновнойПоставщик.
    4. Так как необходимо обеспечить работу решения в толстом и тонком клиентах управляемого приложения, нельзя обращаться к предопределенному элементу в клиентской процедуре. Нужно вынести это обращение в серверную процедуру и уже её вызывать.

    &НаСервереБезКонтекста
    Функция ОсновнойПоставщик()

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

    КонецФункции // ОсновнойПоставщик()

    5. В документе “Покупка товаров” в процедуре проведения нужно добавить строчку Движения.ТоварыНаСкладе.Записывать = Истина, чтобы осуществлялась запись в регистр.
    6. В документе “Покупка товаров” при нажатии на форме кнопки “Заполнить товары” выскакивает ошибка, т.к. при вызове глобальной функции ВвестиЗначение указан неверный тип Тип(“Документ.ПокупкаТоваров”). Нужно указывать Тип(“ДокументСсылка.ПокупкаТоваров”).
    7. В документе “Покупка товаров” при нажатии на форме кнопки “Заполнить товары” при выборе документа выскакивает ошибка, т.к. неправильно написана процедура ЗаполнитьТоварыНаСервере(Объект.Ссылка, Основание).
    Во-первых, нужно изменить директиву компиляции с &НаСервереБезКонтекста на &НаСервере.
    Во-вторых, теперь нам доступен контекст формы и не нужно передавать первым параметром Объект.Ссылка. Вот как будет выглядить теперь эта процедура.

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

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

    8. В документе “Продажа товаров” для реквизита Серия табличной части Товары нужно настроить отбор по Владельцу в “Связи параметров выбора”.
    9. Для документа “Продажа товаров” не выбран регистр накопления “Товары на складе”. Нужно его выбрать на вкладке Движения.
    10. У ресурса Количество регистра накопления “Товары на складе” указан тип Число(15, 2), необходимо изменить на Число(15, 3).
    11. В обработке проведения документа “Продажа товаров”:
    1) в запросе используется ВНУТРЕННЕЕ соединение, а нужно использовать ЛЕВОЕ, также не указана секция ГДЕ с отбором по ссылке;
    2) чтобы при повторном проведении учитывались корректные остатки, необходимо делать очистку движений регистра “Товары на складе” и запись;
    3) необходимо в запрос добавить выбор номера строки, чтобы корректно отображать сообщение об ошибке нехватки товара;
    4) также необходимо в условии Недостача>0 добавить Отказ=Истина и Продолжить.
    Текст процедуры ниже:

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

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

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

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

    3 ЧАСТЬ. Помощь ближним.

    http://forum-1c.ru/index.php?topic=42754.0
    http://forum-1c.ru/index.php?topic=42767.0
    http://forum-1c.ru/index.php?topic=42762.0

    Ник: mku-rino

    • Dobrenko Oleg 26.09.2014 в 07:21

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