Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
13 дек 2024, 07:02

Как в ЗАПРОСЕ к Регистру СебестоимостьТоваров выбрать последний период

Автор om, 25 дек 2022, 21:15

0 Пользователей и 1 гость просматривают эту тему.

om

Здравствуйте. С Наступающим Всех!
КА25
ЗАПРОС
Надо выбрать из Планов продаж Количество Номенклатуры, ее Цены и последнюю Себестоимость расчитанную документом Производство без заказа.
Если в Запросе задаю Период для регистра СебестоимостьТоваров, то выборак правильная, т.е выбирается последняя себестоимость номенклатуры (контролирую полем ДатаЗатрат)
Если пытаюсь наити последний период, то выбираются все записи и суммируются как затраты из регистра СебестоимостьТоваров, так и из других регистров.
Прошу специалистов помочь составить корректный Запрос.
Текст запроса в консоли такой:
ВЫБРАТЬ
    ПланыПродаж.Номенклатура КАК Номенклатура,
    СУММА(ПланыПродаж.Количество) КАК КолвоОпт,
    СУММА(0) КАК КолвоРозн,
    МАКСИМУМ(ПланыПродаж.Период) КАК Дата,
    МИНИМУМ(ЦеныНоменклатурыСрезПоследнихОпт.Цена) КАК ЦенаОпт,
    МИНИМУМ(ЦеныНоменклатурыСрезПоследнихРозн.Цена) КАК ЦенаРозн,
    СУММА(0) КАК Затраты
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.ПланыПродаж КАК ПланыПродаж
    ПРАВОЕ СОЕДИНЕНИЕ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследнихОпт
        ПО ЦеныНоменклатурыСрезПоследнихОпт.Номенклатура = ПланыПродаж.Номенклатура
        И ПланыПродаж.Период МЕЖДУ &НачПериодПлана И &КонПериодПлана
        И ПланыПродаж.ВидПлана.Наименование НЕ ПОДОБНО &ВидПланаНаименование
        И ЦеныНоменклатурыСрезПоследнихОпт.ВидЦены = &ВидЦеныОпт
        И ЦеныНоменклатурыСрезПоследнихОпт.Период <= ПланыПродаж.Период

    ПРАВОЕ СОЕДИНЕНИЕ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследнихРозн
        ПО ЦеныНоменклатурыСрезПоследнихРозн.Номенклатура = ПланыПродаж.Номенклатура
        И ПланыПродаж.Период МЕЖДУ &НачПериодПлана И &КонПериодПлана
        И ПланыПродаж.ВидПлана.Наименование НЕ ПОДОБНО &ВидПланаНаименование
        И ЦеныНоменклатурыСрезПоследнихРозн.ВидЦены = &ВидЦеныРозн
        И ЦеныНоменклатурыСрезПоследнихРозн.Период <= ПланыПродаж.Период
       
СГРУППИРОВАТЬ ПО
    ПланыПродаж.Номенклатура
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПланыПродаж1.Номенклатура КАК Номенклатура,
    СУММА(0) КАК КолвоОпт,
    СУММА(ПланыПродаж1.Количество) КАК КолвоРозн,
    МАКСИМУМ(ПланыПродаж1.Период),
    МИНИМУМ(ЦеныНоменклатурыСрезПоследнихОпт.Цена) КАК ЦенаОпт,
    МИНИМУМ(ЦеныНоменклатурыСрезПоследнихРозн.Цена) КАК ЦенаРозн,
    СУММА(0) КАК Затраты

ИЗ
    РегистрНакопления.ПланыПродаж КАК ПланыПродаж1
    ПРАВОЕ СОЕДИНЕНИЕ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследнихОпт
        ПО ЦеныНоменклатурыСрезПоследнихОпт.Номенклатура = ПланыПродаж1.Номенклатура
        И ПланыПродаж1.Период МЕЖДУ &НачПериодПлана И &КонПериодПлана
        И ПланыПродаж1.ВидПлана.Наименование ПОДОБНО &ВидПланаНаименование
        И ЦеныНоменклатурыСрезПоследнихОпт.ВидЦены = &ВидЦеныОпт
        И ЦеныНоменклатурыСрезПоследнихОпт.Период <= ПланыПродаж1.Период
    ПРАВОЕ СОЕДИНЕНИЕ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследнихРозн
        ПО ЦеныНоменклатурыСрезПоследнихРозн.Номенклатура = ПланыПродаж1.Номенклатура
        И ПланыПродаж1.Период МЕЖДУ &НачПериодПлана И &КонПериодПлана
        И ПланыПродаж1.ВидПлана.Наименование ПОДОБНО &ВидПланаНаименование
        И ЦеныНоменклатурыСрезПоследнихРозн.ВидЦены = &ВидЦеныРозн
        И ЦеныНоменклатурыСрезПоследнихРозн.Период <= ПланыПродаж1.Период
       
СГРУППИРОВАТЬ ПО
    ПланыПродаж1.Номенклатура
;

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

СГРУППИРОВАТЬ ПО
    ВТ.Номенклатура
    УПОРЯДОЧИТЬ ПО
    ВТ.Номенклатура.Наименование
ИТОГИ
    СУММА(КолвоОпт),
    СУММА(КолвоРозн),
    СУММА(Затраты)
ПО
    ОБЩИЕ

Максим75

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

Максим75

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

om

Здравствуйте Максим.
Огромное спасибо за содействие!
Практики у меня мало, поэтому, буду перестраивать запрос по Вашему совету. Потом сообщу о результате.
С Новым годом!

om

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск