Имя: Пароль:
1C
1С v8
подготовка к 1с специалист по платформе
0 DmitriyDI
 
12.11.15
12:46
В конфигурации пример из сборника в обработке проведения расх. накладной встретил, запрос, долго пытался его осмыслить, до этого всегда в таких ситуациях пользовался методом описанным Павлом Чистовым в этой статье: http://1c.chistov.pro/2010/06/1-82.html

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

Мне это кажется очень сложным, почему нельзя просто списать по партиям какие указаны, сколько указано, а если партия не указана разбить по партиям и списать, и потом просто проверить на отр. остатки? Каким методом более предпочтительно пользоваться в жизни и на экзамене?
1 DmitriyDI
 
12.11.15
12:46
вот текст запроса из тестовой конфигураци:


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

СГРУППИРОВАТЬ ПО
    РасходнаяНакладнаяТовары.Номенклатура,
    РасходнаяНакладнаяТовары.Партия
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеОстатки.Номенклатура,
    ВсеОстатки.Партия,
    ВЫБОР
        КОГДА ВсеОстатки.КоличествоОстаток > РасходнаяНакладная.Количество
            ТОГДА РасходнаяНакладная.Количество
        ИНАЧЕ ВсеОстатки.КоличествоОстаток
    КОНЕЦ КАК КоличествоВыбраннойПартии,
    ВЫБОР
        КОГДА ВсеОстатки.КоличествоОстаток > РасходнаяНакладная.Количество
            ТОГДА РасходнаяНакладная.Количество * ВсеОстатки.СуммаОстаток / ВсеОстатки.КоличествоОстаток
        ИНАЧЕ ВсеОстатки.СуммаОстаток
    КОНЕЦ КАК СуммаВыбраннойПартии,
    1 КАК ПорядокСортировки
ПОМЕСТИТЬ ПартииДокумента
ИЗ
    РасходнаяНакладная КАК РасходнаяНакладная
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеОстатки КАК ВсеОстатки
        ПО РасходнаяНакладная.Номенклатура = ВсеОстатки.Номенклатура
            И РасходнаяНакладная.Партия = ВсеОстатки.Партия

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВсеОстатки.Номенклатура,
    ВсеОстатки.Партия,
    ВЫБОР
        КОГДА ВсеОстатки.КоличествоОстаток > РасходнаяНакладная.Количество
            ТОГДА ВсеОстатки.КоличествоОстаток - РасходнаяНакладная.Количество
        ИНАЧЕ 0
    КОНЕЦ,
    ВЫБОР
        КОГДА ВсеОстатки.КоличествоОстаток > РасходнаяНакладная.Количество
            ТОГДА ВсеОстатки.СуммаОстаток - РасходнаяНакладная.Количество * ВсеОстатки.СуммаОстаток / ВсеОстатки.КоличествоОстаток
        ИНАЧЕ 0
    КОНЕЦ,
    2
ИЗ
    РасходнаяНакладная КАК РасходнаяНакладная
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеОстатки КАК ВсеОстатки
        ПО РасходнаяНакладная.Номенклатура = ВсеОстатки.Номенклатура
            И РасходнаяНакладная.Партия = ВсеОстатки.Партия
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПартииДокумента.Номенклатура,
    ПартииДокумента.Партия,
    -ПартииДокумента.КоличествоВыбраннойПартии КАК КоличествоВыбраннойПартии,
    -ПартииДокумента.СуммаВыбраннойПартии КАК СуммаВыбраннойПартии,
    2 КАК ПорядокСортировки
ПОМЕСТИТЬ ОстальныеПартии
ИЗ
    ПартииДокумента КАК ПартииДокумента

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВсеОстатки.Номенклатура,
    ВсеОстатки.Партия,
    ВсеОстатки.КоличествоОстаток,
    ВсеОстатки.СуммаОстаток,
    2
ИЗ
    ВсеОстатки КАК ВсеОстатки
;

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

СГРУППИРОВАТЬ ПО
    Накладная.Номенклатура,
    ОстаткиТоваров.Партия,
    ЕСТЬNULL(ОстаткиТоваров.ПорядокСортировки, 0)

УПОРЯДОЧИТЬ ПО
    ПорядокСортировки,
    ОстаткиТоваров.Партия.МоментВремени
ИТОГИ
    МАКСИМУМ(КоличествоВДокументе),
    СУММА(КоличествоПартии)
ПО
    Номенклатура