gifts2017

Склад/Характеристика в справочнике "Номенклатура"

Опубликовал Артём Алтухов (Fannasankh) в раздел Программирование - Практика программирования

Меняем Характеристика/Склад на Склад/Характеристика в справочнике номенклатура в УТ10.3

Меняем Характеристика/Склад на Склад/Характеристика в остатках в справочнике номенклатура в УТ10.3.

Думаю по коду всё ясно, вдруг кому пригодится.

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

 

// Процедура формирует дерево остатков номенклатуры на складах в разрезе складов номенклатуры
//
// Параметры
//  Номенклатура     - СправочникСсылка.Номенклатура, номенклатурная позиция, для которой необходимо рассчитать остатки
//  ОтображатьСклады - Булево, признак расчета остатков по складам
//  СписокЦенОстатков - таблица для расчета сложных типов цен
//
// Возвращаемое значение:
//   ДеревоЗначений, структура дерева описана в процедуре
//   для Каждого типа цен будет создана своя колонка куда и будет помещена соответсвующая сумма
//
Процедура ПолучитьДеревоОстатковНоменклатурыПоСкладам(ДеревоОстатков, Номенклатура, ОтображатьСклады, 
	СписокЦенОстатков = Неопределено, ВсеТипыЦен = Ложь, 
	КурсыВалют, СписокСкладов = Неопределено, ДатаАктуальности = Неопределено) Экспорт
	
	Если ДатаАктуальности = Неопределено Тогда
		ДатаАктуальности = КонецДня(ТекущаяДата());
	КонецЕсли;
	
	ДеревоОстатков.Строки.Очистить();
	
	ТипыЦен = Новый Массив;
	МассивРассчитываемыхЦен = Новый Массив;
	СформироватьМассивБазовыхТиповЦен(СписокЦенОстатков, ТипыЦен, МассивРассчитываемыхЦен, ВсеТипыЦен);
	
	ПолучатьЦены = (ТипыЦен.Количество() > 0);
	
	Запрос = Новый Запрос;
	
	Запрос.УстановитьПараметр("Номенклатура"        , Номенклатура);
	Запрос.УстановитьПараметр("ПустаяХарактеристика", Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
	Запрос.УстановитьПараметр("ПустойСклад"         , Справочники.Склады.ПустаяСсылка());
	Запрос.УстановитьПараметр("ТипыЦен"             , ТипыЦен);
	Запрос.УстановитьПараметр("ДатаАктуальности"    , ДатаАктуальности);
	Если ЗначениеЗаполнено(СписокСкладов) Тогда
		Запрос.УстановитьПараметр("Склады"       	, СписокСкладов);	
	КонецЕсли;
	
	ОграничениеПоСкладу = ?(НЕ ЗначениеЗаполнено(СписокСкладов), "", " И Склад В (&Склады) " );
	
	ТекстЗапроса = "
	|	ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|		ХарактеристикиНоменклатуры.Ссылка               КАК ХарактеристикаНоменклатуры
	|		" + ?(ОтображатьСклады,", ВложенныйЗапрос.Склад КАК Склад, АдресныйСклад.МестоХранения КАК МестоХранения","") + "
	|		, ВложенныйЗапрос.КоличествоОстаток             КАК КоличествоОстаток
	|		, ВложенныйЗапрос.КоличествоСвободныйОстаток    КАК КоличествоСвободныйОстаток
	|		, ВложенныйЗапрос.КоличествоВРезерве            КАК КоличествоВРезерве
	|		, 0                                             КАК КоличествоСвободныйОстатокВЗаказахПоставщикам
	|";
	
	Если ПолучатьЦены Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|	,
		|	Цены.ФлагУсловийПоставки  КАК ФлагЦены,
		|	ЕСТЬNULL(Цены.Цена, 0.00) КАК Цена,
		|	Цены.Валюта               КАК Валюта,
		|	Цены.ЕдиницаИзмерения     КАК ЕдиницаЦены,
		|	1                         КАК КурсВалюты,
		|	1                         КАК КратностьВалюты,
		|	Цены.ТипЦен               КАК ТИПЦЕН
		|";
	КонецЕсли;
	
	ТекстЗапроса = ТекстЗапроса + "
	|	ИЗ
	|	(
	|		ВЫБРАТЬ
	|			ХарактеристикиНоменклатуры.Ссылка   КАК Ссылка,
	|			ХарактеристикиНоменклатуры.Владелец КАК Владелец
	|		ИЗ
	|			Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
	|		ГДЕ
	|			ХарактеристикиНоменклатуры.Владелец = &Номенклатура
	|
	|		ОБЪЕДИНИТЬ
	|
	|		ВЫБРАТЬ
	|			ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка),
	|			&Номенклатура КАК Владелец
	|
	|		) КАК ХарактеристикиНоменклатуры
	|ЛЕВОЕ СОЕДИНЕНИЕ
	|	(ВЫБРАТЬ
	|		ВложенныйЗапрос.ХарактеристикаНоменклатуры                     КАК ХарактеристикаНоменклатуры
	|		" + ?(ОтображатьСклады,", ВложенныйЗапрос.Склад ","") + "
	|		, СУММА(ВложенныйЗапрос.ТоварыНаСкладахОстатки 
	|				+ ВложенныйЗапрос.ТоварыВРозницеОстатки 
	|				+ ВложенныйЗапрос.ТоварыВНТТОстатки)                   КАК КоличествоОстаток
	|		, СУММА(ВложенныйЗапрос.ТоварыНаСкладахОстатки
	|				+ ВложенныйЗапрос.ТоварыВРозницеОстатки
	|				+ ВложенныйЗапрос.ТоварыВНТТОстатки
	|				- ВложенныйЗапрос.ТоварыВРезервеСкладахОстатки
	|				- ВложенныйЗапрос.ТоварыКПередачеСоСкладовОстатки)     КАК КоличествоСвободныйОстаток
	|		, СУММА(ВложенныйЗапрос.ТоварыВРезервеСкладахОстатки)          КАК КоличествоВРезерве
	|	ИЗ
	|		(ВЫБРАТЬ
	|			ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры          КАК ХарактеристикаНоменклатуры
	|			, ТоварыНаСкладахОстатки.Склад                             КАК Склад
	|			, ТоварыНаСкладахОстатки.КоличествоОстаток                 КАК ТоварыНаСкладахОстатки
	|			, 0                                                        КАК ТоварыВРозницеОстатки
	|			, 0                                                        КАК ТоварыВНТТОстатки
	|			, 0                                                        КАК ТоварыВРезервеСкладахОстатки
	|			, 0                                                        КАК ТоварыКПередачеСоСкладовОстатки
	|		ИЗ
	|			РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаАктуальности, Номенклатура = &Номенклатура" + ОграничениеПоСкладу + ") КАК ТоварыНаСкладахОстатки
	
	|		ОБЪЕДИНИТЬ ВСЕ
	
	|		ВЫБРАТЬ
	|			ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры           КАК ХарактеристикаНомнклатуры
	|			, ТоварыВРозницеОстатки.Склад                              КАК Склад
	|			, 0                                                        КАК ТоварыНаСкладахОстатки
	|			, ТоварыВРозницеОстатки.КоличествоОстаток                  КАК ТоварыВРозницеОстатки
	|			, 0                                                        КАК ТоварыВНТТОстатки
	|			, 0                                                        КАК ТоварыВРезервеСкладахОстатки
	|			, 0                                                        КАК ТоварыКПередачеСоСкладовОстатки
	|		ИЗ
	|			РегистрНакопления.ТоварыВРознице.Остатки(&ДатаАктуальности, Номенклатура = &Номенклатура" + ОграничениеПоСкладу + ") КАК ТоварыВРозницеОстатки
	
	|		ОБЪЕДИНИТЬ ВСЕ
	
	|		ВЫБРАТЬ
	|			ТоварыВНТТОстатки.ХарактеристикаНоменклатуры               КАК ХарактеристикаНоменклатуры
	|			, ТоварыВНТТОстатки.Склад                                  КАК Склад
	|			, 0                                                        КАК ТоварыНаСкладахОстаток
	|			, 0                                                        КАК ТоварыВРозницеОстатки
	|			, ТоварыВНТТОстатки.КоличествоОстаток                      КАК ТоварыВНТТОстатки
	|			, 0                                                        КАК ТоварыВРезервеСкладахОстатки
	|			, 0                                                        КАК ТоварыКПередачеСоСкладовОстатки
	|		ИЗ
	|			РегистрНакопления.ТоварыВНТТ.Остатки(&ДатаАктуальности, Номенклатура = &Номенклатура" + ОграничениеПоСкладу + ") КАК ТоварыВНТТОстатки
	
	|		ОБЪЕДИНИТЬ ВСЕ
	
	|		ВЫБРАТЬ
	|			ТоварыВРезервеСкладахОстатки.ХарактеристикаНоменклатуры    КАК ХарактеристикаНоменклатуры
	|			, ТоварыВРезервеСкладахОстатки.Склад                       КАК Склад
	|			, 0                                                        КАК ТоварыНаСкладахОстатки
	|			, 0                                                        КАК ТоварыВРозницеОстатки
	|			, 0                                                        КАК ТоварыВНТТОстатки
	|			, ТоварыВРезервеСкладахОстатки.КоличествоОстаток           КАК ТоварыВРезервеСкладахОстатки
	|			, 0                                                        КАК ТоварыКПередачеСоСкладовОстатки
	|		ИЗ
	|			РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ДатаАктуальности, Номенклатура = &Номенклатура" + ОграничениеПоСкладу + ") КАК ТоварыВРезервеСкладахОстатки
	
	|		ОБЪЕДИНИТЬ ВСЕ
	
	|		ВЫБРАТЬ
	|			ТоварыКПередачеСоСкладовОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
	|			, ТоварыКПередачеСоСкладовОстатки.Склад                    КАК Склад
	|			, 0                                                        КАК ТоварыНаСкладахОстатки
	|			, 0                                                        КАК ТоварыВРозницеОстатки
	|			, 0                                                        КАК ТоварыВНТТОстатки
	|			, 0                                                        КАК ТоварыВРезервеСкладахОстатки
	|			, ТоварыКПередачеСоСкладовОстатки.КоличествоОстаток        КАК ТоварыКПередачеСоСкладовОстатки
	|		ИЗ
	|			РегистрНакопления.ТоварыКПередачеСоСкладов.Остатки(&ДатаАктуальности, Номенклатура = &Номенклатура" + ОграничениеПоСкладу + ") КАК ТоварыКПередачеСоСкладовОстатки
	
	|		) КАК ВложенныйЗапрос
	|	СГРУППИРОВАТЬ ПО ВложенныйЗапрос.ХарактеристикаНоменклатуры " + ?(ОтображатьСклады,", ВложенныйЗапрос.Склад","") + "
	|	) КАК ВложенныйЗапрос
	|ПО ХарактеристикиНоменклатуры.Ссылка = ВложенныйЗапрос.ХарактеристикаНоменклатуры
	|";
	Если ОтображатьСклады Тогда
		ОграничениеЗапросаПоСкладу = ?(НЕ ЗначениеЗаполнено(СписокСкладов), "", Символы.ПС + "И МестаХраненияНоменклатуры.Склад В (&Склады) " );
		
		ТекстЗапроса = ТекстЗапроса + "
		|	ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
		|	МестаХраненияНоменклатуры.МестоХранения КАК МестоХранения,
		|	МестаХраненияНоменклатуры.Склад КАК Склад,
		|	МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура,
		|	МестаХраненияНоменклатуры.Приоритет КАК Приоритет
		|ИЗ
		|	РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры
		|ГДЕ
		|	МестаХраненияНоменклатуры.Номенклатура = &Номенклатура "+ ОграничениеЗапросаПоСкладу + " ) КАК АдресныйСклад
		|	ПО
		|		АдресныйСклад.Склад = ВложенныйЗапрос.Склад
		|";
		
	КонецЕсли;
	Если ПолучатьЦены Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|
		|ЛЕВОЕ СОЕДИНЕНИЕ
		|(
		|ВЫБРАТЬ ЦеныНаБазовыйТип.Номенклатура,
		| 		ЦеныНаБазовыйТип.ХарактеристикаНоменклатуры,
		|		ВЫБОР	КОГДА ЦеныНаБазовыйТип.Рассчитывается
		|				ТОГДА
		|					ВЫБОР	КОГДА ЦеныНаБазовыйТип.СпособРасчета = ЗНАЧЕНИЕ(Перечисление.СпособыРасчетаЦены.ПоПроцентнойНаценкеНаБазовыйТип)
		|							ТОГДА ЕСТЬNULL(ЦеныНаБазовыйТип.Цена, 0.00) + ЕСТЬNULL(ЦеныНаБазовыйТип.Цена, 0.00) * (ЦеныНаБазовыйТип.ПроцентСкидкиНаценки /100)
		|							ИНАЧЕ ЕСТЬNULL(ЦенаПоДиапазону.Цена, 0.00)
		|					КОНЕЦ
		|				ИНАЧЕ ЕСТЬNULL(ЦеныНаБазовыйТип.Цена, 0.00)
		|		КОНЕЦ КАК Цена,
		|		ВЫБОР 	КОГДА ЦеныНаБазовыйТип.Рассчитывается
		|				ТОГДА
		|					ВЫБОР 	КОГДА ЦеныНаБазовыйТип.СпособРасчета = ЗНАЧЕНИЕ(Перечисление.СпособыРасчетаЦены.ПоПроцентнойНаценкеНаБазовыйТип)
		|							ТОГДА ЦеныНаБазовыйТип.Валюта
		|							ИНАЧЕ ЦенаПоДиапазону.Валюта
		|						КОНЕЦ
		|				ИНАЧЕ ЦеныНаБазовыйТип.Валюта
		|		КОНЕЦ КАК Валюта,
		|		ВЫБОР	КОГДА ЦеныНаБазовыйТип.Рассчитывается
		|				ТОГДА
		|					ВЫБОР	КОГДА ЦеныНаБазовыйТип.СпособРасчета = ЗНАЧЕНИЕ(Перечисление.СпособыРасчетаЦены.ПоПроцентнойНаценкеНаБазовыйТип)
		|							ТОГДА ЦеныНаБазовыйТип.ЕдиницаИзмерения
		|							ИНАЧЕ ЦенаПоДиапазону.ЕдиницаИзмерения
		|					КОНЕЦ
		|				ИНАЧЕ ЦеныНаБазовыйТип.ЕдиницаИзмерения
		|		КОНЕЦ КАК ЕдиницаИзмерения,
		|		ЛОЖЬ КАК ФлагУсловийПоставки,
		|		ЦеныНаБазовыйТип.Рассчитывается,
		|		ЦеныНаБазовыйТип.ТипЦенБазовыйДинамический КАК ТипЦен
		| ИЗ
		|(
		|	ВЫБРАТЬ
		|		НоменклатураХарактеристикаТипЦены.Номенклатура,
		|		НоменклатураХарактеристикаТипЦены.ХарактеристикаНоменклатуры,
		|		ВЫБОР 	КОГДА НоменклатураХарактеристикаТипЦены.Рассчитывается
		|				ТОГДА 	ВЫБОР 	КОГДА ЕСТЬNULL(КурсВалют.Кратность, 0.00) = 0 ИЛИ ЕСТЬNULL(КурсВалютДинамическийТип.Курс, 0.00) = 0
		|								ТОГДА 0.00
		|								ИНАЧЕ ЕСТЬNULL(ЕСТЬNULL(ЦеныНоменклатуры.Цена, ЦеныНоменклатурыПустаяХарактеристика.Цена), 0.00)
		|									  * ЕСТЬNULL(КурсВалют.Курс, 0.00)
		|									  * ЕСТЬNULL(КурсВалютДинамическийТип.Кратность, 0.00)
		|									  / КурсВалют.Кратность
		|									  / КурсВалютДинамическийТип.Курс
		|						КОНЕЦ
		|				ИНАЧЕ ЕСТЬNULL(ЦеныНоменклатуры.Цена, ЦеныНоменклатурыПустаяХарактеристика.Цена)
		|		КОНЕЦ КАК Цена,
		|		ВЫБОР 	КОГДА НоменклатураХарактеристикаТипЦены.Рассчитывается
		|				ТОГДА 	ВЫБОР 	КОГДА ЕСТЬNULL(ЦеныНоменклатурыДинамическийТип.СпособРасчетаЦены, ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.СпособРасчетаЦены) ЕСТЬ NULL
		|				                ТОГДА ТипЦенНоменклаутры.СпособРасчетаЦены
		|				                ИНАЧЕ ЕСТЬNULL(ЦеныНоменклатурыДинамическийТип.СпособРасчетаЦены, ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.СпособРасчетаЦены)
		|				        КОНЕЦ
		|				ИНАЧЕ NULL
		|		КОНЕЦ КАК СпособРасчета,
		|		ВЫБОР 	КОГДА НоменклатураХарактеристикаТипЦены.Рассчитывается
		|				ТОГДА 	ВЫБОР 	КОГДА ЕСТЬNULL(ЦеныНоменклатурыДинамическийТип.ПроцентСкидкиНаценки, ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.ПроцентСкидкиНаценки) ЕСТЬ NULL
		|				                ТОГДА ТипЦенНоменклаутры.ПроцентСкидкиНаценки
		|				                ИНАЧЕ ЕСТЬNULL(ЦеныНоменклатурыДинамическийТип.ПроцентСкидкиНаценки, ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.ПроцентСкидкиНаценки)
		|				        КОНЕЦ
		|				ИНАЧЕ NULL
		|		КОНЕЦ КАК ПроцентСкидкиНаценки,
		|		ВЫБОР 	КОГДА НоменклатураХарактеристикаТипЦены.Рассчитывается
		|				ТОГДА ЕСТЬNULL(ЕСТЬNULL(ЦеныНоменклатурыДинамическийТип.Валюта, ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.Валюта), ТипЦенНоменклаутры.ВалютаЦены)
		|				ИНАЧЕ ЕСТЬNULL(ЦеныНоменклатуры.Валюта, ЦеныНоменклатурыПустаяХарактеристика.Валюта)
		|		КОНЕЦ КАК Валюта,
		|		КурсВалютДинамическийТип.Валюта КАК ВалютаДинамическийТип,
		|		ЕСТЬNULL(ЕСТЬNULL(ЦеныНоменклатуры.ЕдиницаИзмерения, ЦеныНоменклатурыПустаяХарактеристика.ЕдиницаИзмерения), НоменклатураХарактеристикаТипЦены.ЕдиницаХраненияОстатков) КАК ЕдиницаИзмерения,
		|		НоменклатураХарактеристикаТипЦены.ТипЦен,
		|		НоменклатураХарактеристикаТипЦены.ТипЦенБазовыйДинамический,
		|		НоменклатураХарактеристикаТипЦены.Рассчитывается
		|	ИЗ
		|	(
		|		ВЫБРАТЬ
		|			НоменклатураХарактеристикаТипЦены.Номенклатура,
		|			НоменклатураХарактеристикаТипЦены.ХарактеристикаНоменклатуры,
		|			НоменклатураХарактеристикаТипЦены.ЕдиницаХраненияОстатков КАК ЕдиницаХраненияОстатков,
		|			ВЫБОР 	КОГДА СпрТипЦены.Рассчитывается
		|					ТОГДА СпрТипЦены.БазовыйТипЦен
		|					ИНАЧЕ СпрТипЦены.Ссылка
		|			КОНЕЦ КАК ТипЦен,
		|			СпрТипЦены.Ссылка КАК ТипЦенБазовыйДинамический,
		|			СпрТипЦены.Рассчитывается
		|		ИЗ
		|		(
		|			ВЫБРАТЬ НоменклатураХарактеристика.Номенклатура,
		|					НоменклатураХарактеристика.ХарактеристикаНоменклатуры,
		|					СпрНомеклатура.ЕдиницаХраненияОстатков КАК ЕдиницаХраненияОстатков,
		|					сТипыЦенНоменклатуры.Ссылка КАК ТипЦен
		|			ИЗ
		|			(
		|				ВЫБРАТЬ	
		|					Характеристики.Владелец КАК Номенклатура,
		|					Характеристики.Ссылка КАК ХарактеристикаНоменклатуры
		|				ИЗ
		|					Справочник.ХарактеристикиНоменклатуры КАК Характеристики
		|					ГДЕ Характеристики.Владелец = &Номенклатура
		|				ОБЪЕДИНИТЬ
		|				ВЫБРАТЬ 
		|						&Номенклатура КАК Номенклатура,
		|						ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры
		|			) КАК НоменклатураХарактеристика
		|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|				Справочник.Номенклатура КАК СпрНомеклатура
		|			ПО
		|				СпрНомеклатура.Ссылка = НоменклатураХарактеристика.Номенклатура
		|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|				Справочник.ТипыЦенНоменклатуры КАК сТипыЦенНоменклатуры
		|			ПО ИСТИНА
		|			ГДЕ
		|				сТипыЦенНоменклатуры.Ссылка В (&ТипыЦен)
		|		) КАК НоменклатураХарактеристикаТипЦены
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|			Справочник.ТипыЦенНоменклатуры КАК СпрТипЦены
		|		ПО
		|			СпрТипЦены.Ссылка = НоменклатураХарактеристикаТипЦены.ТипЦен
		|	) КАК НоменклатураХарактеристикаТипЦены
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальности, Номенклатура = &Номенклатура) КАК ЦеныНоменклатуры
		|	ПО
		|		ЦеныНоменклатуры.Номенклатура = НоменклатураХарактеристикаТипЦены.Номенклатура
		|		И ЦеныНоменклатуры.ХарактеристикаНоменклатуры = НоменклатураХарактеристикаТипЦены.ХарактеристикаНоменклатуры
		|		И ЦеныНоменклатуры.ТипЦен = НоменклатураХарактеристикаТипЦены.ТипЦен
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальности, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыПустаяХарактеристика
		|	ПО
		|		ЦеныНоменклатурыПустаяХарактеристика.Номенклатура = НоменклатураХарактеристикаТипЦены.Номенклатура
		|		И ЦеныНоменклатурыПустаяХарактеристика.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
		|		И ЦеныНоменклатурыПустаяХарактеристика.ТипЦен = НоменклатураХарактеристикаТипЦены.ТипЦен
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальности, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыДинамическийТип
		|	ПО
		|		ЦеныНоменклатурыДинамическийТип.Номенклатура = НоменклатураХарактеристикаТипЦены.Номенклатура
		|		И ЦеныНоменклатурыДинамическийТип.ХарактеристикаНоменклатуры = НоменклатураХарактеристикаТипЦены.ХарактеристикаНоменклатуры
		|		И ЦеныНоменклатурыДинамическийТип.ТипЦен = НоменклатураХарактеристикаТипЦены.ТипЦенБазовыйДинамический
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальности, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип
		|	ПО
		|		ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.Номенклатура = НоменклатураХарактеристикаТипЦены.Номенклатура
		|		И ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
		|		И ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.ТипЦен = НоменклатураХарактеристикаТипЦены.ТипЦенБазовыйДинамический
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		РегистрСведений.КурсыВалют.СрезПоследних(&ДатаАктуальности) КАК КурсВалют
		|	ПО
		|		КурсВалют.Валюта = ЕСТЬNULL(ЦеныНоменклатуры.Валюта, ЦеныНоменклатурыПустаяХарактеристика.Валюта)
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		Справочник.ТипыЦенНоменклатуры КАК ТипЦенНоменклаутры
		|	ПО 
		|		ТипЦенНоменклаутры.Ссылка = НоменклатураХарактеристикаТипЦены.ТипЦенБазовыйДинамический
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		РегистрСведений.КурсыВалют.СрезПоследних(&ДатаАктуальности) КАК КурсВалютДинамическийТип
		|	ПО
		|		КурсВалютДинамическийТип.Валюта = 	ВЫБОР 	КОГДА НоменклатураХарактеристикаТипЦены.Рассчитывается И ЕСТЬNULL(ЦеныНоменклатурыДинамическийТип.Валюта, ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.Валюта) ЕСТЬ NULL
		|													ТОГДА ТипЦенНоменклаутры.ВалютаЦены
		|													ИНАЧЕ ЕСТЬNULL(ЦеныНоменклатурыДинамическийТип.Валюта, ЦеныНоменклатурыПустаяХарактеристикаДинамическийТип.Валюта)
		|											КОНЕЦ
		|) КАК ЦеныНаБазовыйТип
		|//Динамический тип цен
		|ЛЕВОЕ СОЕДИНЕНИЕ
		|(
		|	ВЫБРАТЬ
		|	        ДинамическийТипЦен.Номенклатура
		|	      , ДинамическийТипЦен.ХарактеристикаНоменклатуры
		|	      , ДинамическийТипЦен.ДинамическийТип КАК БазовыйТипЦен
		|	      , ДинамическийТипЦен.ЕдиницаИзмерения КАК ЕдиницаИзмерения
		|	      , ЕСТЬNULL(ЦенаПоДиапазону.Цена, 0.00) КАК Цена
		|	      , ЦенаПоДиапазону.Валюта
		|	ИЗ
		|	(
		|		ВЫБРАТЬ  ЦенаДляРасчетаДиапазона.Номенклатура,
		|			ЦенаДляРасчетаДиапазона.ХарактеристикаНоменклатуры,		
		|	  		ЦенаДляРасчетаДиапазона.ДинамическийТип,
		|	  		МИНИМУМ(ЦенаПоДиапазону.Валюта) КАК Валюта,
		|	  		МИНИМУМ(ЦенаДляРасчетаДиапазона.ЕдиницаИзмерения) КАК ЕдиницаИзмерения,
		|	  		МИНИМУМ(ЦенаПоДиапазону.ВерхняяГраница) КАК Цена
		|	ИЗ
		|	(
		|		ВЫБРАТЬ
		|			НомеклатураХарактеристикаТип.Номенклатура КАК Номенклатура,
		|			НомеклатураХарактеристикаТип.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
		|			ЕСТЬNULL(ЕСТЬNULL(ЦеныБазовые.Цена, ЦеныБазовыеПустаяХарактеристика.Цена), 0.00) КАК Цена,
		|			ЕСТЬNULL(ЦеныБазовые.ТипЦен, ЦеныБазовыеПустаяХарактеристика.ТипЦен) КАК ДинамическийТип,
		|			ЕСТЬNULL(ЦеныБазовые.ЕдиницаИзмерения, ЦеныБазовыеПустаяХарактеристика.ЕдиницаИзмерения) КАК ЕдиницаИзмерения
		|		ИЗ
		|		(
		|			ВЫБРАТЬ	
		|				Характеристики.Владелец КАК Номенклатура,
		|				Характеристики.Ссылка КАК ХарактеристикаНоменклатуры
		|			ИЗ
		|				Справочник.ХарактеристикиНоменклатуры КАК Характеристики
		|			ГДЕ Характеристики.Владелец = &Номенклатура
		|			ОБЪЕДИНИТЬ
		|			ВЫБРАТЬ 
		|					&Номенклатура КАК Номенклатура,
		|					ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры
		|		) КАК НомеклатураХарактеристикаТип
		|		ЛЕВОЕ СОЕДИНЕНИЕ
		|			РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальности, Номенклатура = &Номенклатура И (НЕ ТипЦен.Рассчитывается И ТипЦен В (&ТипыЦен))) КАК ЦеныБазовые
		|		ПО
		|			ЦеныБазовые.Номенклатура = НомеклатураХарактеристикаТип.Номенклатура
		|			И ЦеныБазовые.ХарактеристикаНоменклатуры = НомеклатураХарактеристикаТип.ХарактеристикаНоменклатуры
		|		ЛЕВОЕ СОЕДИНЕНИЕ
		|			РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальности, Номенклатура = &Номенклатура И (НЕ ТипЦен.Рассчитывается И ТипЦен В (&ТипыЦен))) КАК ЦеныБазовыеПустаяХарактеристика
		|		ПО
		|			ЦеныБазовыеПустаяХарактеристика.Номенклатура = НомеклатураХарактеристикаТип.Номенклатура
		|			И ЦеныБазовыеПустаяХарактеристика.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
		|		ГДЕ
		|			НЕ ЕСТЬNULL(ЦеныБазовые.ТипЦен, ЦеныБазовыеПустаяХарактеристика.ТипЦен) ЕСТЬ NULL
		|	) КАК ЦенаДляРасчетаДиапазона
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|	(
		|		ВЫБРАТЬ  Диапазон.Валюта
		|				,ТипыЦен.БазовыйТипЦен КАК ТипЦен
		|				, Диапазон.Цена
		|				, Диапазон.ВерхняяГраница
		|		ИЗ
		|			РегистрСведений.ДиапазоныЦенДляНаценки.СрезПоследних(&ДатаАктуальности,) КАК Диапазон 
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|		(	
		|			ВЫБРАТЬ	ТипЦен
		|					, МАКСИМУМ(Период) КАК Период
		|			ИЗ РегистрСведений.ДиапазоныЦенДляНаценки.СрезПоследних(&ДатаАктуальности, ) КАК Диапазон 
		|			СГРУППИРОВАТЬ ПО Диапазон.ТипЦен
		|		) КАК Диапазон2
		|		ПО Диапазон2.ТипЦен = Диапазон.ТипЦен И Диапазон2.Период = Диапазон.Период
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|			Справочник.ТипыЦенНоменклатуры КАК ТипыЦен
		|		ПО
		|			ТипыЦен.Ссылка = Диапазон.ТипЦен
		|	) КАК ЦенаПоДиапазону
		|	ПО
		|		ЦенаПоДиапазону.ТипЦен = ЦенаДляРасчетаДиапазона.ДинамическийТип
		|		И ЦенаПоДиапазону.ВерхняяГраница > ЦенаДляРасчетаДиапазона.Цена
		|	ГДЕ
		|		НЕ ЦенаПоДиапазону.ВерхняяГраница ЕСТЬ NULL	
		|	СГРУППИРОВАТЬ ПО ЦенаДляРасчетаДиапазона.ДинамическийТип
		|					, ЦенаДляРасчетаДиапазона.ХарактеристикаНоменклатуры
		|					, ЦенаДляРасчетаДиапазона.Номенклатура	
		
		|	) КАК ДинамическийТипЦен
		|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|	(	
		|		ВЫБРАТЬ  Диапазон.Валюта
		|				, ТипыЦен.БазовыйТипЦен КАК ТипЦен
		|				, Диапазон.Цена
		|				, Диапазон.ВерхняяГраница
		|		ИЗ
		|			РегистрСведений.ДиапазоныЦенДляНаценки.СрезПоследних(&ДатаАктуальности,) КАК Диапазон 
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|			Справочник.ТипыЦенНоменклатуры КАК ТипыЦен
		|		ПО
		|			ТипыЦен.Ссылка = Диапазон.ТипЦен
		|	) КАК ЦенаПоДиапазону
		|	ПО
		|		ЦенаПоДиапазону.ТипЦен = ДинамическийТипЦен.ДинамическийТип
		|		И ЦенаПоДиапазону.ВерхняяГраница = ДинамическийТипЦен.Цена
		|) КАК ЦенаПоДиапазону
		|ПО
		|	ЦенаПоДиапазону.БазовыйТипЦен = ЦеныНаБазовыйТип.ТипЦен
		|	И ЦенаПоДиапазону.Номенклатура = ЦеныНаБазовыйТип.Номенклатура
		|	И ЦенаПоДиапазону.ХарактеристикаНоменклатуры = ЦеныНаБазовыйТип.ХарактеристикаНоменклатуры
		|ГДЕ
		|	ВЫБОР	КОГДА ЦеныНаБазовыйТип.Рассчитывается
		|			ТОГДА
		|				ВЫБОР 	КОГДА ЦеныНаБазовыйТип.СпособРасчета = ЗНАЧЕНИЕ(Перечисление.СпособыРасчетаЦены.ПоПроцентнойНаценкеНаБазовыйТип)
		|						ТОГДА ЕСТЬNULL(ЦеныНаБазовыйТип.Цена, 0.00) + ЕСТЬNULL(ЦеныНаБазовыйТип.Цена, 0.00) * (ЦеныНаБазовыйТип.ПроцентСкидкиНаценки /100)
		|						ИНАЧЕ ЕСТЬNULL(ЦенаПоДиапазону.Цена, 0.00)
		|				КОНЕЦ
		|			ИНАЧЕ ЕСТЬNULL(ЦеныНаБазовыйТип.Цена, 0.00)
		|	КОНЕЦ > 0
		|) КАК Цены
		|ПО
		|	Цены.Номенклатура = ХарактеристикиНоменклатуры.Владелец
		|	И Цены.ХарактеристикаНоменклатуры = ХарактеристикиНоменклатуры.Ссылка
		|";
	КонецЕсли;
	ТекстЗапроса = ТекстЗапроса + "
	|		ОБЪЕДИНИТЬ ВСЕ
	
	|		ВЫБРАТЬ
	|			ЗаказаныйТовар.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
	|			 " + ?(ОтображатьСклады,", ""НеВыводить"" КАК Склад, ""НеВыводить"" КАК МестоХранения ","") + "
	|			, 0 КАК КоличествоОстаток
	|			, 0 КАК КоличествоСвободныйОстаток
	|			, 0 КАК КоличествоВРезерве
	|			, ЗаказаныйТовар.КоличествоОстаток КАК КоличествоСвободныйОстатокВЗаказахПоставщикам";
	Если ПолучатьЦены Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|	,
		|	0  КАК ФлагЦены,
		|	0 КАК Цена,
		|	0 КАК Валюта,
		|	0 КАК ЕдиницаЦены,
		|	0 КАК КурсВалюты,
		|	0 КАК КратностьВалюты,
		|	NULL КАК ТИПЦЕН";
	КонецЕсли;
	ТекстЗапроса = ТекстЗапроса + "
	|		ИЗ
	|			(
	|			ВЫБРАТЬ
	|				ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	|				СУММА(ЕСТЬNULL(ЗаказыПоставщикамОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(РазмещениеЗаказовПокупателейОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
	|			ИЗ
	|				РегистрНакопления.ЗаказыПоставщикам.Остатки(, Номенклатура = &Номенклатура) КАК ЗаказыПоставщикамОстатки
	|			ЛЕВОЕ СОЕДИНЕНИЕ
	|				РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки(, Номенклатура = &Номенклатура) КАК РазмещениеЗаказовПокупателейОстатки
	|			ПО
	|				РазмещениеЗаказовПокупателейОстатки.ЗаказПоставщику = ЗаказыПоставщикамОстатки.ЗаказПоставщику
	|				И ЗаказыПоставщикамОстатки.Номенклатура = РазмещениеЗаказовПокупателейОстатки.Номенклатура
	|				И ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры = РазмещениеЗаказовПокупателейОстатки.ХарактеристикаНоменклатуры
	|			СГРУППИРОВАТЬ ПО
	|				ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры
	|			) КАК ЗаказаныйТовар
	|		ГДЕ ЕСТЬNULL(ЗаказаныйТовар.КоличествоОстаток , 0.00) > 0
	|";
	Если ОтображатьСклады Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|	УПОРЯДОЧИТЬ ПО
		|		ХарактеристикаНоменклатуры,
		|		Склад
		|		//,АдресныйСклад.Приоритет
		|	ИТОГИ 	
		|СУММА(КоличествоСвободныйОстатокВЗаказахПоставщикам),
		|СУММА(КоличествоОстаток),
	    |СУММА(КоличествоСвободныйОстаток),
	    |СУММА(КоличествоВРезерве),
		|//ВСТАВКА1
	    |СУММА(КоличествоСвободныйОстатокВЗаказахПоставщикам) 
		|ПО
		|	Склад,
		|	ХарактеристикаНоменклатуры,
		|//ВСТАВКА2
		|	МестоХранения
		|";
	Иначе	
		ТекстЗапроса = ТекстЗапроса + "
		|	УПОРЯДОЧИТЬ ПО
		|		ХарактеристикаНоменклатуры, КоличествоСвободныйОстатокВЗаказахПоставщикам Убыв
		| ";
	КонецЕсли;
	
	Если ПолучатьЦены Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ВСТАВКА2", "ТИПЦЕН,");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ВСТАВКА1", "МАКСИМУМ(ФлагЦены),
	                                                            |СРЕДНЕЕ(Цена),
																|МАКСИМУМ(Валюта),
																|МАКСИМУМ(ЕдиницаЦены),
																|СУММА(КурсВалюты),
																|СУММА(КратностьВалюты),
																|МАКСИМУМ(ТИПЦЕН),");
	КонецЕсли;
	
	
	
	Запрос.Текст = ТекстЗапроса;
	РезультатЗапроса = Запрос.Выполнить();
	// ничего не выбрали - нечего и обрабатывать
	Если РезультатЗапроса.Пустой() Тогда
		
		СтрокаХарактеристика = ДеревоОстатков.Строки.Добавить();
		
	КонецЕсли;
	
	ВыборкаСклад = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Склад");
	Пока ВыборкаСклад.Следующий() Цикл
		Если ЗначениеЗаполнено(ВыборкаСклад.Склад) Тогда
			СтрокаСклад = ДеревоОстатков.Строки.Добавить();
			СтрокаСклад.ХарактеристикаСклад = ВыборкаСклад.Склад;
		ИНАЧЕ Продолжить;
		КонецЕсли;
				
		
		
		// отображение результатов с итогами по Характеристикам и Складам
		ВыборкаХарактеристика = ВыборкаСклад.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ХарактеристикаНоменклатуры");
		Пока ВыборкаХарактеристика.Следующий() Цикл
			
			
			СтрокаХарактеристика = СтрокаСклад.Строки.Добавить();
			//ЗаполнитьХарактеристикуТовара(СтрокаХарактеристика, ВыборкаХарактеристика);
			СтрокаХарактеристика.Свободный = ВыборкаХарактеристика.КоличествоСвободныйОстаток;
			СтрокаХарактеристика.Общий = ВыборкаХарактеристика.КоличествоОстаток;
			СтрокаХарактеристика.ВРезерве = ВыборкаХарактеристика.КоличествоВРезерве;
			СтрокаХарактеристика.СвободныйОжидаемый = ВыборкаХарактеристика.КоличествоСвободныйОстатокВЗаказахПоставщикам;
			СтрокаХарактеристика.ХарактеристикаСклад = ВыборкаХарактеристика.ХарактеристикаНоменклатуры;
			
			Если ПолучатьЦены Тогда
				ВыборкаЦены = ВыборкаХарактеристика.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ТИПЦЕН");
				Пока ВыборкаЦены.Следующий() Цикл
					Если ВыборкаЦены.ТИПЦЕН = Null Тогда Продолжить КонецЕсли;
					ЗаполнитьПоляСумм(СтрокаХарактеристика, ВыборкаЦены, СписокЦенОстатков, КурсыВалют);
				КонецЦикла;
			КонецЕсли;
						
		КонецЦикла;
		
	КонецЦикла;
	
	ОсновнойСклад = РегистрыСведений.КАБ_ОсновнойСклад.ПолучитьПоследнее();
	
	//вот тут мы делаем махинации чтобы первой строкой всегда был основной склад
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("ХарактеристикаСклад", ОсновнойСклад.Склад);
	НайденныеСтроки = ДеревоОстатков.Строки.НайтиСтроки(ПараметрыОтбора);
	Если НайденныеСтроки.Количество() <> 0 Тогда
		СтрокаСОсновнымСкладом = НайденныеСтроки[0];
		ИндексОсновнойСтроки = ДеревоОстатков.Строки.Индекс(НайденныеСтроки[0]);
		ВременнаяСтрока = СтрокаСОсновнымСкладом;
		ПодчиненныеСтроки = СтрокаСОсновнымСкладом.Строки;
		НоваяСтрока1 = ДеревоОстатков.Строки.Вставить(0);
		Для каждого стр из ПодчиненныеСтроки Цикл
			НоваяПодчинённаяСтрока = НоваяСтрока1.Строки.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяПодчинённаяСтрока,стр);
		КонецЦикла;
		ЗаполнитьЗначенияСвойств(НоваяСтрока1, ВременнаяСтрока);
		ДеревоОстатков.Строки.Удалить(СтрокаСОсновнымСкладом);
	КонецЕсли;
	
	
КонецПроцедуры // ПолучитьНовДеревоОстатковНоменклатуры()

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа