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

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

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

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

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

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

  1. Что-то и мой отчет от 11 янв. подзатерялся.

    • Dobrenko Oleg 14.01.2014 в 07:28

      Опубликуйте пожалуйста повторно.

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

    Спирина Людмила Анатольевна
    г. Владивосток.

    2. Тестирование конфигурации.
    Документ “ПокупкаТоваров”

    1. Исправила тип реквизита “Количество” табличной части “Товары” “Строка” на “Число” 15.3
    2. Обращение с клиента к предопределенному элементу справочника, исправляем:

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

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

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

    КонецФункции

    3. Обработчик команды “ЗаполнитьТовары”. Исправляем ошибки, хотя правильнее было бы организовать стандартный “Ввод на основании”.

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

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

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

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

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

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

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

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

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

    11. Обработка проведения.
    Для того, что бы текущие движения документа не учитывались при перепроведении:
    Движения.ТоварыНаСкладе.Очистить();
    Движения.ТоварыНаСкладе.Записать();
    12. Привести результат запроса типа NULL к 0:
    ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
    ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст
    13. Требуется указать левое соединение табличной части документа и регистра по полям Товар и Серия.
    14. Также в запросе нужно сгруппировать товар по количеству.
    15. В свойствах таблицы Остатки регистра накоплений следует указать параметр период, в который следует передать границу по моменту времени документа:
    Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);
    Запрос.УстановитьПараметр(“Период”, Граница);
    16. Необходимо включить проверку деления на ноль:
    Запись.Сумма = ?(ВыборкаТовары.КолОст =0, 0,ВыборкаТовары.СумОст*Запись.Количество/ВыборкаТовары.КолОст);

    17. Просьба главбуха: в свойствах стандартных реквизитов справочника «Серии», установить проверку заполнения — выдавать ошибку для реквизита «Код».

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

    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=621616
    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=621925
    http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=622189

    • Dobrenko Oleg 16.01.2014 в 05:41

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

  3. Здравствуйте Олег!
    10-го отправляла отчет по Финальному, но почему-то не вижу его в комментариях. сейчас отправлю повторно, но теперь на mg@spec8.ru

    • Dobrenko Oleg 13.01.2014 в 05:40

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

  4. Нагаева Светлана Вячеславовна, г.Н.Новгород, программист
    1. Шаг1
    1.Что нового я узнала из Базового курса : это принципы работы управляемых форм, которые используют специализированные типы данных, СКД, бухгалтерского учета и расчетных механизмов. Приобретены навыки грамотного использования отладчика, что сделало процесс разработки более прозрачным и понятным. До прохождения курса процедура разработки модулей управляемого приложения была несколько хаотичной, простые вопросы отнимали много времени. Знания приобрели системный характер и теперь есть множество базовых навыков для решения широкого круга задач.
    2.До прохождения курса не было понимания того, что разработчик программирует клиентскую и серверную часть, минимизируя количество вызовов сервера. Кроме того, стал понятен принцип реализации расчетных механизмов типовой конфигурации ЗУП.
    3.На практике приходилось дорабатывать функциональность управляемых форм конфигурации УТ 11. Недавно была разработана статистическая форма в конфигурации ЗУП, где применялись приемы, изложенные в блоке 4 относительно получения данных о графике сотрудника. В данный момент стоит задача написания “с нуля” конфигурации на основе управляемого приложения.
    4.Несомненно, такой формат достаточно удобен с точки зрения выбора времени для самостоятельных занятий. Кроме того, всегда есть возможность просмотреть урок повторно. При выполнении домашних заданий оставались некоторые проблемы, которые всегда разрешались сопоставлением своего решения с эталонным. Была приятно удивлена, что не раз преподаватели подробно затрагивали именно те вопросы, которые уже неоднократно вставали в процессе работы и требовали много времени для решения.
    Спасибо всем авторам и участникам этого проекта.

    2. Шаг2
    Практическое задание:
    1.Документ “Покупка товаров” ТЧ “Товары” Строка(10) изменить на Число(15,3). Аналогично РН.ТоварыНаСкладе ресурс Количество Число (15,3)
    2.Документ “Покупка товаров” Модуль объекта – Обработка проведения добавляем:

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

    3.Документ “Покупка товаров” Исправляем ошибку в клиенткой процедуре модуля формы документа “Заполнить клиента”:

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

    4.Документ “Покупка товаров”- Модуль формы документа- процедура “Заполнить товары” –метод глобального контекста ВвестиЗначение изменяем параметр Тип:

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

    5.В той же процедуре оператор

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

    изменяем на:

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

    6. Процедуру “ЗаполнитьТоварыНаСервере” изменяем на:

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

    7. Документ “ПродажаТоваров” –Движения – указываем регистр “ТоварыНаСкладе”
    8. При проведении документа “ПродажаТоваров” правильнее применять метод оценки остатков на складе после записи движений. Для представленного метода изменим запрос:
    ЛЕВОЕ СОЕДИНЕНИЕ вместо ВНУТРЕННЕЕ СОЕДИНЕНИЕ (т.к. записи из табличной части документа должны войти в результат запроса даже если отсутствуют остатки);
    для полей выборки ТоварыНаСкладеОстатки.КоличествоОстаток и ТоварыНаСкладеОстатки.СуммаОстаток вставим проверку ISNULL (для случая отсутствия остатков):

    |ЕСТЬNULL(ТоварыНаСкладеОстатки.КоличествоОстаток, 0) КАК КолОст,
    |ЕСТЬNULL(ТоварыНаСкладеОстатки.СуммаОстаток, 0) КАК СумОст,

    добавим поле выборки -МАКСИМУМ(ПродажаТоваровТовары.НомерСтроки) КАК НомерСтроки для диагностики номера строки с(Товар, Серия), по которым обнаружена нехватка;
    для виртуальной таблицы остатков по регистру накопления “Товары на складе” укажем параметр Период и условие:

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

    выполним группировку по Товар, Серия

    Соответственно добавляем установку параметра :

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

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

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

    В случае нехватки устанавливаем Отказ=Истина и прерываем цикл обхода выборки.
    10.Документ “Продажа товаров” ТЧ “Товары” для реквизита Серии устанавливаем связи параметров выбора: Отбор.Владелец(Товары.Товар)
    11.Для общего модуля ПроверкаДокументовСервер устанавливаем ВызовСервера.
    12.В справочнике “Серии ” добавляем реквизит “Номерсерии “ и указываем свойство Проверка заполнения – выдавать ошибку.
    13.В обработке проведения модуля документа “Продажа товаров” изменяем

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

    на

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

    для обеспечения точности расчета.
    3. Шаг 3
    Проведен мини-семинар на тему “Использование механизмов СКД для некоторых отчетов типовой конфигурации 1с:Бухгалтерия 8.2 ред 2.0”
    Фото отправлено по адресу: mg@spec8.ru

    • Dobrenko Oleg 13.01.2014 в 05:30

      Светлана, благодарим за отзыв!
      Финальное задание принято, поздравляем вы в списке финалистов!

  5. Прохоренко Виктор 10.01.2014 в 08:52

    Отзыв:
    Имея некоторый опыт программирования на 1С, не ждал от Базового курса по программированию открытия прописных истин, и действительно большая часть материала для меня знакома и уже очевидна. Но я рад, что прошёл этот курс – он открыл для меня ряд элегантных приёмов программирования, внёс ясность и позволил структурировать имеющиеся знания. Теперь я могу решать встающие передо мной задачи ещё оптимальней и быстрые.
    Отдельно стоит отметить удобство формата обучения. Не нужно привязываться к конкретному времени и строить гибкий график обучения. Общий график курса позволяет при необходимости делать перерыв в обучении и наверстать отставание, когда это будет удобно.

    Прохоренко Виктор, г.Краснодар.

    Документ ПокупкаТоваров, модуль формы документа
    В процедуре ЗаполнитьТовары заменил

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

    на

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

    Процедуру ЗаполнитьТоварыНаСервере модифицировал с

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

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

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

    на

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

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

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

    Документ ПокупкаТоваров, модуль объекта
    В процедуре ОбработкаПроведения добавил

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

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

    Для исправления этих ошибок в начале процедуры добавил код:

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

    а так же переписал запрос

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

    СГРУППИРОВАТЬ ПО
        ПродажаТоваровТовары.Товар,
        ПродажаТоваровТовары.Серия

    ИНДЕКСИРОВАТЬ ПО
        Товар,
        Серия
    ;

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

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

    В процедуре ЗаполнитьКлиентазаменил

    Справочники.Клиенты.ОсновнойПокупатель

    на

    ПредопределенноеЗначение("Справочник.Клиенты.ОсновнойПоставщик")

    Общий модуль ПроверкаДокументовСервер
    В процедуре ПроверитьДокумент заменил

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

    на

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

    Для общего модуля ПроверкаДокументовСервер установил признак ВызовСервера

    • Dobrenko Oleg 10.01.2014 в 10:43

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

      • Прохоренко Виктор 10.01.2014 в 12:08

        Отправил письмом на mg@spec8.ru

        • Dobrenko Oleg 10.01.2014 в 13:05

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

  6. 1) Лепешкин Олег Юрьевич, программист, Москва.
    Новыми для меня были блоки 3 и 4 – раньше не приходилось сталкиваться с этими предметными областями. Очень понравилась и реализация
    бухгалтерского учета в платформе и доходчивая подача материала по этой теме. Оценил ту легкость, которую дает СКД при построении отчетов, занялся подробным изучением этого механизма, планирую активно его использовать. Благодаря материалам одной из мастер-групп безболезненно перевел свою конфигурацию с 8.1 на 8.2.
    Материалов много, домашние задания объемные (и это хорошо, позволяет лучше усваивать информацию). Когда работаешь полный рабочий день с
    периодическими авралами, график прохождения курса начинает казаться очень плотным. Если сравнивать с очным форматом обучения, плюсы этого курса в том, что в любой момент можно сделать остановку, можно вернуться назад и более внимательно пересмотреть ключевой материал – можно двигаться вперед не оставляя недопонятых тем, которые будут тормозить дальнейшее обучение. Из минусов – большая задержка при обратной связи. Еще плюс – все материалы остаются
    под рукой, всегда можно вернуться к ним и освежить в памяти, хотя поиск в конфигурации просмотра курсов не очень удобен. Было бы здорово, если бы к урокам можно было бы добавлять свои комментарии, тэги, категории, и потом искать по ним.

    2)Отладка конфигурации.

    2.1 Общий серверный модуль ПроверкаДокументовСервер – попытка использовать на сервере процедуру “Предупреждение”, доступную только на клиентах. Меняю на процедуру “Сообщить” (предварительно убрав параметр ВремяТаймаута).

    2.2 Общий серверный модуль ПроверкаДокументовСервер – поврежден текст запроса проверки документа. Восстановил его:

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

    2.3 Что бы сделать НомерСерии обязательным для заполнения. Открываем форму настройки справочника Серии. На закладке Данные вызываем список СтандартныхРеквизитов, и у реквизита Код, который используется для хранения номера серии, указываем признак ПроверкиЗаполнения – ВыдаватьОшибку.

    2.4 Попытка обратиться к предопределенному элементу справочника Клиенты из клиентского контекста формы документа ПокупкаТоваров.
    Для решения проблемы написал серверную функцию без контекста ПолучитьОсновногоПоставщика. Исправил имя предопределенного элемента на ОсновнойПоставщик

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

    2.5 В форме документа ПокупкаТоваров починил команду ЗаполнитьТовары:

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

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

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

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

    2.6 В обработчике проведения документа ПокупкаТоваров необходимо указать, что сформированные движения надо записать:
    Движения.ТоварыНаСкладе.Записывать = Истина;

    2.7 В документе ПродажаТоваров необходимо указать, что документ делает движения для РН ТоварыНаСкладе

    2.8 Обработчик проведения документа ПродажаТоваров необходимо модифицировать. Так как при проведенении выполняется расчет себестоимости, буду применять обработчик проведения в стиле 8.1 – очистка движений, запрос с табличной частью документа, остатками на момент времени и ценами, контроль остатков, формирование движений и запись, если все в порядке:

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

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

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

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

    2.10 Для реквизита Серия табличной части Товары документа ПродажаТоваров установил реквизт СвязиПараметровВыбора в Отбор.Владелец(Товары.Товар), что бы при заполнеии
    табличной части выбирались серии, соответствующие выбранной номенклатуре

    3) Помощь ближним: http://infostart.ru/public/249359/
    Отдельное спасибо за это задание. Получил новый опыт.

    • Dobrenko Oleg 10.01.2014 в 10:41

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