Один Ответ на “Продвинутый курс. Занятие №13”

  1. Продвинутый курс. Домашнее задание№13
    Добрый день!
    1. Создаю РН «СтоимостьТовара» для ведения стоимостного учёта. Структура регистра аналогична РН «ОстаткиТоварова» добавлен ресурс «Сумма»
    2. Движение приход по РН «СтоимостьТовара» осуществляет документ «ПТиУ»

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

    3. Добавлена последовательность «ПоследовательностьДвиженияТоваров», входящие документы: «РТиУ»
    Движение влияющие на последовательность «РегистрНакопления.ОстаткиТоваров»
    4. Движение расход реализовывало с помощью обработки «ВосстановлениеПоследовательности»:

    &НаКлиенте
    Процедура Сформировать(Команда)
        ОчиститьСообщения();
        СформироватьНаСервере();
    КонецПроцедуры


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

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