Отчёт маржи

1. Intercititude 11.11.19 16:31 Сейчас в теме
Доброе время суток всем!

Необходимо вывести отчёт на определенную дату. Взяв цену из второго запроса и приравнять к номенклатуре.
Номенклатура, серияНоменклатуры, Склад, Цена
Цена высчитывается во втором запросе "РасчётнаяЦена" - это она.

Подскажите,что я делаю не так ? :

ВЫБРАТЬ
	РасчётнаяЦена.ВхЦена + РасчётнаяЦена.ВПроцентах / 100 * РасчётнаяЦена.ВхЦена + РасчётнаяЦена.ВРублях * ТоварыВРезервеНаСкладах.Номенклатура.алкЕмкость / 10 КАК РасчётнаяЦена,
	ТоварыВРезервеНаСкладах.Номенклатура,
	ТоварыВРезервеНаСкладах.Склад,
	ТоварыВРезервеНаСкладах.СерияНоменклатуры
ИЗ
	РегистрНакопления.ТоварыВРезервеНаСкладах КАК ТоварыВРезервеНаСкладах
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ПолученнаяВходящаяЦена.Цена КАК ВхЦена,
			КоэффициентыРасчетныхЦенСрезПоследних.ВПроцентах КАК ВПроцентах,
			КоэффициентыРасчетныхЦенСрезПоследних.ВРублях КАК ВРублях,
			ПолученнаяВходящаяЦена.Номенклатура.алкЕмкость КАК АлкЕмкость,
			ПолученнаяВходящаяЦена.Номенклатура КАК Номенклатура,
			ПолученнаяВходящаяЦена.Склад КАК Склад,
			ПолученнаяВходящаяЦена.СерияНоменклатуры КАК СерияНоменклатуры
		ИЗ
			(ВЫБРАТЬ
				ВЫБОР
					КОГДА (ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугСерия.Цена, 0)) КАК ЧИСЛО(10, 2))) <> 0
						ТОГДА ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугСерия.Цена, 0)) КАК ЧИСЛО(10, 2))
					ИНАЧЕ ВЫБОР
							КОГДА (ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугНоменклатура.Цена, 0)) КАК ЧИСЛО(10, 2))) <> 0
								ТОГДА ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугНоменклатура.Цена, 0)) КАК ЧИСЛО(10, 2))
							ИНАЧЕ ВЫБОР
									КОГДА СУ
ММА(Остатки.КоличествоОстаток) > 0
										ТОГДА ВЫРАЗИТЬ(СУММА(Остатки.СтоимостьОстаток) / СУММА(Остатки.КоличествоОстаток) КАК ЧИСЛО(10, 2))
									ИНАЧЕ 0
								КОНЕЦ
						КОНЕЦ
				КОНЕЦ КАК Цена,
				Остатки.Номенклатура КАК Номенклатура,
				Остатки.СерияНоменклатуры КАК СерияНоменклатуры,
				Остатки.Склад КАК Склад
			ИЗ
				(ВЫБРАТЬ
					ПартииТоваровНаСкладахОстатки.Номенклатура КАК Номенклатура,
					ПартииТоваровНаСкладахОстатки.СерияНоменклатуры КАК СерияНоменклатуры,
					ПартииТоваровНаСкладахОстатки.ДокументОприходования КАК ДокументОприходования,
					СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток,
					СУММА(ПартииТоваровНаСкладахОстатки.СтоимостьОстаток) КАК СтоимостьОстаток,
					ПартииТоваровНаСкладахОстатки.Склад КАК Склад
				ИЗ
					РегистрНакопления.ПартииТоваровНаСкладах.Остатки(, ) КАК ПартииТоваровНаСкладахОстатки
				
				СГРУППИРОВАТЬ ПО
					ПартииТоваровНаСкладахОстатки.СерияНоменклатуры,
					ПартииТоваровНаСкладахОстатки.Номенклатура,
					ПартииТоваровНаСкладахОстатки.ДокументОприходования,
					ПартииТоваровНаСкладахОстатки.Склад
				
				ИМЕЮЩИЕ
					СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток) > 0) КАК Остатки
					ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугСерия
					ПО Остатки.ДокументОприходования = ПоступлениеТоваровУслугСерия.Ссылка
						И Остатки.Номенклатура = ПоступлениеТоваровУслугСерия.Номенклатура
						И Остатки.СерияНоменклатуры = ПоступлениеТоваровУслугСерия.СерияНоменклатуры
					ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугНоменклатура
					ПО Остатки.ДокументОприходования = ПоступлениеТоваровУслугНоменклатура.Ссылка
						И Остатки.Номенклатура = ПоступлениеТоваровУслугНоменклатура.Номенклатура
			
			СГРУППИРОВАТЬ ПО
				Остатки.Номенклатура,
				Остатки.СерияНоменклатуры,
				Остатки.Склад) КАК ПолученнаяВходящаяЦена,
			РегистрСведений.КоэффициентыРасчетныхЦен.СрезПоследних(&НаДату, ) КАК КоэффициентыРасчетныхЦенСрезПоследних) КАК РасчётнаяЦена
		ПО ТоварыВРезервеНаСкладах.Номенклатура = РасчётнаяЦена.Номенклатура
Показать




Вот рабочий кусок кода,который рассчитывает цену для номенклатуры(брал отсюда),её и необходимо добавить в мой отчёт:

	
Функция ПолучитьЦенуНоменклатуры(Номенклатура, ХарактеристикаНоменклатуры = Неопределено, Знач ТипЦен, ДатаПараметр = Неопределено, ЕдиницаИзмерения = Неопределено,
	                             Валюта = Неопределено, Курс = 0, Кратность = 1, ПроцентСкидкиНаценки = 0, ДоговорКонтрагента = Неопределено,
	                             УсловиеПродаж = Неопределено, СерияНоменклатуры = Неопределено) Экспорт

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

КонецФункции // ПолучитьЦенуНоменклатуры()

//  функция для получения входной цены на ЛД
Функция ПолучитьВхЦену(Номенклатура, СерияНоменклатуры, Дата)
	Запрос  = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ВЫБОР
	               |		КОГДА (ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугСерия.Цена, 0)) КАК ЧИСЛО(10, 2))) <> 0
	               |			ТОГДА ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугСерия.Цена, 0)) КАК ЧИСЛО(10, 2))
	               |		ИНАЧЕ ВЫБОР
	               |				КОГДА (ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугНоменклатура.Цена, 0)) КАК ЧИСЛО(10, 2))) <> 0
	               |					ТОГДА ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугНоменклатура.Цена, 0)) КАК ЧИСЛО(10, 2))
	               |				ИНАЧЕ ВЫБОР
	               |						КОГДА СУММА(Остатки.КоличествоОстаток) > 0
	               |							ТОГДА ВЫРАЗИТЬ(СУММА(Остатки.СтоимостьОстаток) / СУММА(Остатки.КоличествоОстаток) КАК ЧИСЛО(10, 2))
	               |						ИНАЧЕ 0
	               |					КОНЕЦ
	               |			КОНЕЦ
	               |	КОНЕЦ КАК Цена
	               |ИЗ
	               |	(ВЫБРАТЬ
	               |		ПартииТоваровНаСкладахОстатки.Номенклатура КАК Номенклатура,
	               |		ПартииТоваровНаСкладахОстатки.СерияНоменклатуры КАК СерияНоменклатуры,
	               |		ПартииТоваровНаСкладахОстатки.ДокументОприходования КАК ДокументОприходования,
	               |		СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток,
	               |		СУММА(ПартииТоваровНаСкладахОстатки.СтоимостьОстаток) КАК СтоимостьОстаток
	               |	ИЗ
	               |		РегистрНакопления.ПартииТоваровНаСкладах.Остатки(, ) КАК ПартииТоваровНаСкладахОстатки
	               |	ГДЕ
	               |		ПартииТоваровНаСкладахОстатки.Номенклатура = &Номенклатура
	               |		И ПартииТоваровНаСкладахОстатки.СерияНоменклатуры = &СерияНоменклатуры
	               |	
	               |	СГРУППИРОВАТЬ ПО
	               |		ПартииТоваровНаСкладахОстатки.СерияНоменклатуры,
	               |		ПартииТоваровНаСкладахОстатки.Номенклатура,
	               |		ПартииТоваровНаСкладахОстатки.ДокументОприходования
	               |	
	               |	ИМЕЮЩИЕ
	               |		СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток) > 0) КАК Остатки
	               |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугСерия
	               |		ПО Остатки.ДокументОприходования = ПоступлениеТоваровУслугСерия.Ссылка
	               |			И Остатки.Номенклатура = ПоступлениеТоваровУслугСерия.Номенклатура
	               |			И Остатки.СерияНоменклатуры = ПоступлениеТоваровУслугСерия.СерияНоменклатуры
	               |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугНоменклатура
	               |		ПО Остатки.ДокументОприходования = ПоступлениеТоваровУслугНоменклатура.Ссылка
	               |			И Остатки.Номенклатура = ПоступлениеТоваровУслугНоменклатура.Номенклатура";
	Запрос.Параметры.Вставить("Номенклатура", 		Номенклатура);	
	Запрос.Параметры.Вставить("СерияНоменклатуры", 	СерияНоменклатуры);
	Результат = Запрос.Выполнить().Выбрать();
	Пока Результат.Следующий() Цикл
		Возврат Окр(Результат.Цена, 2);
	КонецЦикла;
	Возврат 0;
КонецФункции // ПолучитьВхЦену()
 
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. AlexandrSmith 69 11.11.19 16:53 Сейчас в теме
(1) (2) Согласен с коллегой, и еще не понятна фраза
Вообще брал рассчёт Цены отсюда. Но хрен знает как вывести в отчёт (СКД) эту формулу:

Ну в отчет СКД вывести как формулу
Вычисляемые поля СКД в 1С 8.3 и 8.2 на примере

https://programmist1s.ru/vyichislyaemyie-polya-skd-v-1s-8-3-i-8-2/
Боюсь только вас может не устроить скорость выполнения отчета, а так ваши проблемы решены.
5. Intercititude 11.11.19 16:56 Сейчас в теме
(4) Я скинул первый запрос. Там формула рассчитана в самом запросе.

Проблема в том,что соеденить эту цену не выходит с номенклатурой на определенную дату.
6. VmvLer 11.11.19 17:26 Сейчас в теме
(5) разбейте запрос на логические пакеты в Вт

Вт....

Вт...

Вт...

Результирующий запрос

Так запрос будет читабелен и понятен

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

пока запрос выглядит как какое-то "порно" и в понедельник смотреть такое найдутся силы не
у всех.
darkultro37; +1 Ответить
7. Intercititude 11.11.19 17:44 Сейчас в теме
Да никакого порно.

У меня тупо взяты два запроса из формулы и с помощью них рассчитана РасчётнойЦена. ( это всё во вложенном запросе )

А уже после эту цену соединяю и РегистромНакопления для вывода номенклатуры.
8. ice-net 19 12.11.19 08:31 Сейчас в теме
(1)
В запросе А из ПолучитьВхЦену у вас в основной таблице есть поля.
Номенклатура, СерияНоменклатуры, ДокументОприходования, КоличествоОстаток,СтоимостьОстаток

Вам надо по ним сгруппировать данные. и получить уникальные записи. Затем привязать получившуюся таблицу к вашему запросу Б(тот который требует цены) по (как минимум) Номенклатура, СерияНоменклатуры. Если в запросе Б нет поля ДокументОприходования, то его надо исключать из группировочных полей запроса А.
10. Intercititude 12.11.19 08:56 Сейчас в теме +0.96 $m
(8)
В запросе А из ПолучитьВхЦену у вас в основной таблице есть поля.
Номенклатура, СерияНоменклатуры, ДокументОприходования, КоличествоОстаток,СтоимостьОстаток


Имеете ввиду в самом запросе добавить их в группировку просто ? И уникальные записи будет после группировки ?


Вам надо по ним сгруппировать данные. и получить уникальные записи. Затем привязать получившуюся таблицу к вашему запросу Б(тот который требует цены) по (как минимум) Номенклатура, СерияНоменклатуры. Если в запросе Б нет поля ДокументОприходования, то его надо исключать из группировочных полей запроса А.


Запрос Б это какой ?
11. Intercititude 12.11.19 09:37 Сейчас в теме
(8) Собственно вот "ВходящаяЦена". Её ещё сгруппировать необходимо ?

ВЫБРАТЬ
	ВЫБОР
		КОГДА (ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугСерия.Цена, 0)) КАК ЧИСЛО(10, 2))) <> 0
			ТОГДА ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугСерия.Цена, 0)) КАК ЧИСЛО(10, 2))
		ИНАЧЕ ВЫБОР
				КОГДА (ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугНоменклатура.Цена, 0)) КАК ЧИСЛО(10, 2))) <> 0
					ТОГДА ВЫРАЗИТЬ(СРЕДНЕЕ(ЕСТЬNULL(ПоступлениеТоваровУслугНоменклатура.Цена, 0)) КАК ЧИСЛО(10, 2))
				ИНАЧЕ ВЫБОР
						КОГДА СУММА(Остатки.КоличествоОстаток) > 0
							ТОГДА ВЫРАЗИТЬ(СУММА(Остатки.СтоимостьОстаток) / СУММА(Остатки.КоличествоОстаток) КАК ЧИСЛО(10, 2))
						ИНАЧЕ 0
					КОНЕЦ
			КОНЕЦ
	КОНЕЦ КАК Цена
ИЗ
	(ВЫБРАТЬ
		ПартииТоваровНаСкладахОстатки.Номенклатура КАК Номенклатура,
		ПартииТоваровНаСкладахОстатки.СерияНоменклатуры КАК СерияНоменклатуры,
		ПартииТоваровНаСкладахОстатки.ДокументОприходования КАК ДокументОприходования,
		СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток,
		СУММА(ПартииТоваровНаСкладахОстатки.СтоимостьОстаток) КАК СтоимостьОстаток
	ИЗ
		РегистрНакопления.ПартииТоваровНаСкладах.Остатки(, ) КАК ПартииТоваровНаСкладахОстатки
	
	СГРУППИРОВАТЬ ПО
		ПартииТоваровНаСкладахОстатки.СерияНоменклатуры,
		ПартииТоваровНаСкладахОстатки.Номенклатура,
		ПартииТоваровНаСкладахОстатки.ДокументОприходования
	
	ИМЕЮЩИЕ
		СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток) > 0) КАК Остатки
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугСерия
		ПО Остатки.ДокументОприходования = ПоступлениеТоваровУслугСерия.Ссылка
			И Остатки.Номенклатура = ПоступлениеТоваровУслугСерия.Номенклатура
			И Остатки.СерияНоменклатуры = ПоступлениеТоваровУслугСерия.СерияНоменклатуры
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугНоменклатура
		ПО Остатки.ДокументОприходования = ПоступлениеТоваровУслугНоменклатура.Ссылка
			И Остатки.Номенклатура = ПоступлениеТоваровУслугНоменклатура.Номенклатура
Показать
12. ice-net 19 14.11.19 13:23 Сейчас в теме
(8)

Доброе время суток всем!

Необходимо вывести отчёт на определенную дату. Взяв цену из второго запроса и приравнять к номенклатуре.
Номенклатура, серияНоменклатуры, Склад, Цена
Цена высчитывается во втором запросе "РасчётнаяЦена" - это она.

Подскажите,что я делаю не так ? :


Ваши поля группировки основного отчета: Номенклатура, серияНоменклатуры (Склад игнорируем для получения цены).

в запросе из (8) у вас должно получиться 3 поля: Номенклатура, серияНоменклатуры и цена без дублей.
Дальше левым соединением связывайте таблицы по Номенклатура, серияНоменклатуры.
9. ice-net 19 12.11.19 08:36 Сейчас в теме
(1)

И еще момент. Вы в расчете цены берете ее из документов, но это перестанет работать правильно, когда валюта документа прихода начнет отличаться от регламентной валюты, т.к. суммы в регистре партий приводятся к валюте регламентированного учета.
2. VmvLer 11.11.19 16:42 Сейчас в теме
очень многое не так.
самое простое не так - не понятно, что вы хотите получить конкретно, а не завуалированно попсовым понятием "маржа".

ну да "маржа", при озвучке этого слова каждый спец обязан сделать умный вид и заявить, да как пальцы об асфальт - сча сбацаю.
3. Intercititude 11.11.19 16:44 Сейчас в теме
(2) Это "РасчетнаяЦена". Во втором запросе.

Именно её и надо вывести в отчёт приравненную к номенклатуре и на определенную дату.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот