Запрос стоимости партии на даты документов одним запросом (УТ 10)

31.03.15

Разработка - Запросы

Ниже приведен запрос, который получает стоимость партии на дату документа.
Такой запрос нужен, когда документ не делает движений по регистру Партии товаров.
В УТ10 это документ Перемещение товаров, Приходный и Расходный ордера при отключенной настройке "Вести учет партий в разрезе складов"

Запрос составлен на примере документа Приходный ордер на товары.

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

Остались сомнения по получению остатка партии.

В данном случае Цена себестоимости = (НачСтоимость + ПриходСтоимость + КонСтоимость) / (НачКоличестов + ПриходКоличество + КонКоличество).

Возможно есть более оптимальные способы получения стоимости партии.

Любая критика приветствуется.


Текст запроса:

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

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

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

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

Запрос управление торговлей себестоимость анализ продажи период на каждый день остатки стоимость

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159733    876    399    

862

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    9965    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5214    XilDen    36    

80

Запросы Программист Запросы Бесплатно (free)

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

16.08.2024    7957    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2409    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8741    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3401    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. karpik666 3854 31.03.15 19:23 Сейчас в теме
Я видимо чего-то не понимаю, но зачем получать партии в документах, где партионный учет отключен? И почему нельзя использовать регистр ПродажиСебестоимость для получения себестоимости? В общем куча критики и по поводу самого запроса, представляю сколкько времени он будет формироваться. Посмотрите стандарты разработки фирмы 1С, очень доходчиво объясняется как следует использовать вложенные запросы и временные таблицы.
4. bashhhh 26 01.04.15 11:20 Сейчас в теме
(1) karpik666, Снабженцы поставили задачу получить отчет. где видно себестоимость перевезенного груза за период. Другого способа получить себестоимость на дату документа не нашел, если подскажите - буду рад.
5. bashhhh 26 01.04.15 11:36 Сейчас в теме
(1) karpik666, Стандарты обязательно посмотрю. По скорости запрос за 2014г в базе, где 2200 приходных ордеров, номенклатуры около 5000 элементов выполнился за 10 сек. это долго?
7. caponid 02.04.15 09:29 Сейчас в теме
(5) для такого небольшого количества - это долго.
явно неоптимальный план запроса - надо перевести вложенные запросы на временные таблицы.
потом можно еще посмотреть по размерам ВТ в сторону индексации - если записей ВТ много и индекс по соединяемому полу получается селективный - тогда можно и проиндексировать ВТ - затраты на построение индекса окупятся при соединении или выборке.

5-100 записей в таблице индексировать не стоит - все равно будет использоваться скан таблицы а не поиск по индексу
2. Dach 383 31.03.15 21:38 Сейчас в теме
Я, конечно, извиняюсь, но соединение с виртуальной таблицей "остатки и обороты", да еще и во вложенном запросе...
Почитайте литературу по написанию запросов, собственно и на ИС много статей, например http://infostart.ru/public/165456/ или http://infostart.ru/public/158617/

Да, и публикации - это не форум, здесь делятся интересными разработками, а Ваша на таковую ну никак не тянет....
6. bashhhh 26 01.04.15 11:39 Сейчас в теме
(2) Dach, Спасибо за статьи, обязательно прочитаю. Я только ЗА оптимизацию кода.
А запрос выложил в публикации, потому что не нашел в интернете подобного, возможно, кому-нибудь пригодится.
И конечно же, почитать комментарии и мнения знающих специалистов.
3. caponid 01.04.15 09:12 Сейчас в теме
я так тоже баловался... вот мой вариант с фифо или лифо с получением полной таблицы списания
только с использованием ВТ и списанием пустой партии с количеством если нехватает
ВЫБРАТЬ
	РасходныйОрдер.Ссылка КАК Регистратор,
	РасходныйОрдер.Дата КАК Период,
	РасходныйОрдер.Организация,
	РасходныйОрдер.Склад,
	РасходныйОрдер.МоментВремени
ПОМЕСТИТЬ втШапка
ИЗ
	Документ.РасходныйОрдер КАК РасходныйОрдер
ГДЕ
	РасходныйОрдер.Ссылка = &Ссылка
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СебестоимостьТоваровОстатки.Организация КАК Организация,
	СебестоимостьТоваровОстатки.Склад КАК Склад,
	СебестоимостьТоваровОстатки.Номенклатура КАК Номенклатура,
	СебестоимостьТоваровОстатки.Качество КАК Качество,
	СебестоимостьТоваровОстатки.ДокументПартии КАК Партия,
	СебестоимостьТоваровОстатки.ДокументПартии.МоментВремени КАК МоментВремени,
	СебестоимостьТоваровОстатки.КоличествоОстаток КАК КоличествоПартии,
	СебестоимостьТоваровОстатки.СуммаОстаток КАК СуммаПартии,
	ВЫРАЗИТЬ(ВЫБОР
			КОГДА СебестоимостьТоваровОстатки.КоличествоОстаток = 0
				ТОГДА 0
			ИНАЧЕ СебестоимостьТоваровОстатки.СуммаОстаток / СебестоимостьТоваровОстатки.КоличествоОстаток
		КОНЕЦ КАК ЧИСЛО(15, 3)) КАК ЦенаПартии
ПОМЕСТИТЬ втОстатки
ИЗ
	РегистрНакопления.СебестоимостьТоваров.Остатки(
			,
			(Организация, Склад, Номенклатура, Качество) В
				(ВЫБРАТЬ
					втТЧ.Организация,
					втТЧ.Склад,
					втТЧ.Номенклатура,
					втТЧ.Качество
				ИЗ
					втТЧ КАК втТЧ)) КАК СебестоимостьТоваровОстатки
ГДЕ
	СебестоимостьТоваровОстатки.КоличествоОстаток > 0

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

ВЫБРАТЬ
	втТЧ.Организация,
	втТЧ.Склад,
	втТЧ.Номенклатура,
	втТЧ.Качество,
	NULL,
	ВЫБОР
		КОГДА &ФИФО
			ТОГДА ДАТАВРЕМЯ(3999, 11, 1)
		ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
	КОНЕЦ,
	ВЫРАЗИТЬ(9999999999 КАК ЧИСЛО(15, 3)),
	0,
	0
ИЗ
	втТЧ КАК втТЧ

ИНДЕКСИРОВАТЬ ПО
	Номенклатура
    	
;

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

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втШапка.Период,
	втШапка.Регистратор,
	втДанные3.Организация,
	втДанные3.Склад,
	втДанные3.Номенклатура,
	втДанные3.Качество,
	втДанные3.Партия,
	ВЫБОР
		КОГДА втДанные3.ОсталосьСписатьКоличество = втДанные3.КоличествоПартии
			ТОГДА втДанные3.ОсталосьСписатьКоличество
		ИНАЧЕ втДанные3.КоличествоПартии
	КОНЕЦ КАК Количество,
	ВЫБОР
		КОГДА втДанные3.ОсталосьСписатьКоличество = втДанные3.КоличествоПартии
			ТОГДА ВЫБОР
					КОГДА втДанные3.СуммаПартии - втДанные3.ОсталосьСписатьКоличество * втДанные3.ЦенаПартии = 0
						ТОГДА втДанные3.СуммаПартии
					ИНАЧЕ втДанные3.ОсталосьСписатьКоличество * втДанные3.ЦенаПартии
				КОНЕЦ
		ИНАЧЕ втДанные3.СуммаПартии
	КОНЕЦ КАК Сумма,
	ВЫБОР
		КОГДА втДанные3.Партия ЕСТЬ NULL 
			ТОГДА ИСТИНА
		ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК Недостача
ИЗ
	втДанные3 КАК втДанные3
		ЛЕВОЕ СОЕДИНЕНИЕ втШапка КАК втШапка
		ПО (ИСТИНА)
ГДЕ
	втДанные3.НакопительныйИтогКоличество = втДанные3.КоличествоДокумента

Показать
Оставьте свое сообщение