Подбор товаров в документ продажи / Запрос количества / Модуль формы

файл

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();
	
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	ВидЦены                        = Параметры.ВидЦены;
	Цена                           = Параметры.Цена;
	Дата                           = Параметры.Дата;
	ДатаОтгрузки                   = Параметры.ДатаОтгрузки;
	Склад                          = Параметры.Склад;
	Номенклатура                   = Параметры.Номенклатура;
	Характеристика                 = Параметры.Характеристика;
	Упаковка                       = Параметры.Упаковка;
	Валюта                         = Параметры.Валюта;
	ЦенаВключаетНДС                = Параметры.ЦенаВключаетНДС;
	Если НЕ Параметры.Свойство("ИспользуетсяЦенообразование25", ИспользуетсяЦенообразование25) Тогда
		ИспользуетсяЦенообразование25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25(Дата);
	КонецЕсли;
	
	РедактироватьВидЦены           = Параметры.РедактироватьВидЦены;
	
	Параметры.Свойство("БезОтбораПоВключениюНДСВЦену", БезОтбораПоВключениюНДСВЦену);
	Параметры.Свойство("БезОтбораПоИспользоватьПриПродажеВЦену", БезОтбораПоИспользоватьПриПродажеВЦену);
	
	СтруктураНоменклатуры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура, "ЕдиницаИзмерения, ИспользоватьУпаковки");
		
	Если СтруктураНоменклатуры.ИспользоватьУпаковки Тогда
		Элементы.Упаковка.ПодсказкаВвода = СтруктураНоменклатуры.ЕдиницаИзмерения;
	КонецЕсли;
		
	СтараяУпаковка            = Упаковка;
	
	НаименованиеТовара = "" + Параметры.Номенклатура + ?(ЗначениеЗаполнено(Параметры.Характеристика), " (" + Параметры.Характеристика + ")","");
	
	
	Если ЗначениеЗаполнено(ВидЦены) Тогда
		ВидЦеныПредставление  = ВидЦены;
	Иначе
		ВидЦеныПредставление  = НСтр("ru='<произвольная>'");
	КонецЕсли;
	
	Если Параметры.СкрытьЦену Тогда
		Элементы.Цена.Видимость    = Ложь;
		Элементы.ДекорацияЗаголовокЦена.Видимость  = Ложь;
		Элементы.ВидЦеныПредставление.Видимость    = Ложь;
		Элементы.Валюта.Видимость  = Ложь;
		ЭтаФорма.АвтоЗаголовок     = Ложь;
		ЭтаФорма.Заголовок         = НСтр("ru = 'Ввод количества'");
	КонецЕсли;
	
	Если Не Параметры.ИспользоватьДатыОтгрузки Тогда
		Элементы.ДатаОтгрузки.Видимость = Ложь;
	КонецЕсли;
	
	Если Параметры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
		ДатаОтгрузки = '00010101';
		Склад = Справочники.Склады.ПустаяСсылка();
		Элементы.ДатаОтгрузки.Видимость = Ложь;
	КонецЕсли;
	
	Если Не Параметры.ИспользоватьСкладыВТабличнойЧасти
		Или Параметры.Склады.Найти(Склад) = Неопределено Тогда
		Склад = Неопределено;
	КонецЕсли;
	
	Элементы.Склад.Видимость = Не Параметры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга
		И Не Параметры.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Работа
		И Параметры.Склады.Количество() > 1
		И Параметры.ИспользоватьСкладыВТабличнойЧасти;
	Элементы.ДекорацияЗаголовокСклад.Видимость = Элементы.Склад.Видимость;
		
	ОбщегоНазначенияУТКлиентСервер.ДобавитьПараметрВыбора(Элементы.Склад, "Ссылка", Параметры.Склады);
	
	СтруктураИзмеренийУказанияВДокументах = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура, "ПлощадьМожноУказыватьВДокументах, ОбъемМожноУказыватьВДокументах, ВесМожноУказыватьВДокументах, ДлинаМожноУказыватьВДокументах");
	Если СтруктураИзмеренийУказанияВДокументах.ПлощадьМожноУказыватьВДокументах
		Или СтруктураИзмеренийУказанияВДокументах.ВесМожноУказыватьВДокументах
		Или СтруктураИзмеренийУказанияВДокументах.ОбъемМожноУказыватьВДокументах
		Или СтруктураИзмеренийУказанияВДокументах.ДлинаМожноУказыватьВДокументах
		Или ЗначениеЗаполнено(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "НаборУпаковок")) Тогда
		
		Элементы.Упаковка.Видимость = Истина;
		Элементы.ЕдиницаИзмерения.Видимость = Ложь;
		Элементы.Упаковка.ПодсказкаВвода = СтруктураНоменклатуры.ЕдиницаИзмерения;
	Иначе
		Элементы.Упаковка.Видимость = Ложь;
		Элементы.ЕдиницаИзмерения.Видимость = Истина;
	КонецЕсли;
	
	КоличествоУпаковок = 1;
	
	Элементы.Цена.Доступность = Параметры.РедактироватьВидЦены;
	
	ЗаполнитьСписокЦен();
	
	// Настроить видимость и установить значения реквизитов для редактирования ручных скидок, наценок.
	СуммаДокумента = КоличествоУпаковок * Цена;
	
	Если Не Параметры.ИспользоватьРучныеСкидкиВПродажах Или Параметры.СкрыватьРучныеСкидки Тогда
		
		Элементы.ГруппаПараметрыСкидкиНаценки.Видимость = Ложь;
		
	Иначе
		
		// Установить свойства элементов относящихся к скидкам (наценкам).
		ИспользоватьОграниченияРучныхСкидок = (ПолучитьФункциональнуюОпцию("ИспользоватьОграниченияРучныхСкидокВПродажахПоПользователям")
		                                      Или ПолучитьФункциональнуюОпцию("ИспользоватьОграниченияРучныхСкидокВПродажахПоСоглашениям"));
		
		Если ИспользоватьОграниченияРучныхСкидок Тогда
			
			СтруктураТаблиц = ПолучитьИзВременногоХранилища(Параметры.АдресВоВременномХранилище);
			
			МаксимальныйПроцентСкидки  = СтруктураТаблиц.Ограничения[0].МаксимальныйПроцентРучнойСкидки;
			МаксимальныйПроцентНаценки = СтруктураТаблиц.Ограничения[0].МаксимальныйПроцентРучнойНаценки;
			
			Если МаксимальныйПроцентСкидки > 0 Тогда
				Элементы.ПроцентРучнойСкидкиНаценки.КнопкаСпискаВыбора = Истина;
				Элементы.ПроцентРучнойСкидкиНаценки.СписокВыбора.Добавить(МаксимальныйПроцентСкидки, Формат(МаксимальныйПроцентСкидки, "ЧДЦ=2"));
			КонецЕсли;
			
		КонецЕсли;
		
		Элементы.НадписьМаксимальнаяРучнаяСкидка.Видимость  = ИспользоватьОграниченияРучныхСкидок;
		Элементы.НадписьМаксимальнаяРучнаяСкидка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%2 Макс. скидка: %1%2'"),
			МаксимальныйПроцентСкидки,
			"%");
		
		Элементы.НадписьМаксимальнаяРучнаяНаценка.Видимость = ИспользоватьОграниченияРучныхСкидок;
		Элементы.НадписьМаксимальнаяРучнаяНаценка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%2 Макс. наценка: %1%2'"),
			МаксимальныйПроцентНаценки,
			"%");
		
		Элементы.НадписьМаксимальнаяСкидкаНеОграничена.Видимость   = Не ИспользоватьОграниченияРучныхСкидок;
		Элементы.НадписьМаксимальнаяНаценкаНеОграничена.Видимость  = Не ИспользоватьОграниченияРучныхСкидок;
		
		// Установить варианты выбора ручной скидки (наценки).
		Элементы.ВариантПредоставления.СписокВыбора.Добавить("Скидка", НСтр("ru = 'Скидка'"));
		Элементы.ВариантПредоставления.СписокВыбора.Добавить("Наценка", НСтр("ru = 'Наценка'"));
		
		// Установить значение варианта предоставления при открытии.
		ВариантПредоставления = "Скидка"; // Скидка
		Элементы.ВариантыПредоставления.ТекущаяСтраница = Элементы.ВариантыПредоставления.ПодчиненныеЭлементы.Скидка;
		
	КонецЕсли;
	
 	УстановитьВидимостьКоличествоЕдиницХранения();

	ОбновитьКоличетсво();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура УпаковкаПриИзменении(Элемент)
	
	УпаковкаПриИзмененииНаСервере(СтараяУпаковка);
	СтараяУпаковка = Упаковка;
	
КонецПроцедуры

&НаКлиенте
Процедура УпаковкаОчистка(Элемент, СтандартнаяОбработка)
	
	УпаковкаПриИзмененииНаСервере(СтараяУпаковка);
	СтараяУпаковка = Упаковка;
	
КонецПроцедуры

&НаКлиенте
Процедура ЦенаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Число") Тогда
		
		ВидЦеныПредставление = НСтр("ru='<произвольная>'");
		Возврат;
		
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	ВидЦены = ВыбранноеЗначение;
	ВидЦеныПредставление = ВыбранноеЗначение;
		
	Для Каждого Строка Из ВидЦеныЦена Цикл
		Если Строка.ВидЦены = ВыбранноеЗначение Тогда
			Цена = Строка.Цена;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ЦенаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВидЦены = Неопределено;
	ВидЦеныПредставление = НСтр("ru='<произвольная>'");
	Цена = Число(Текст);
	
	ДанныеВыбора = Новый СписокЗначений;
	ДанныеВыбора.Добавить( Цена, Формат(Цена, "ЧДЦ=2; ЧН=") + " (<произвольная>)" );
	
КонецПроцедуры

&НаКлиенте
Процедура ВариантПредоставленияПриИзменении(Элемент)
	
	Элементы.ПроцентРучнойСкидкиНаценки.КнопкаСпискаВыбора = Ложь;
	Элементы.ПроцентРучнойСкидкиНаценки.СписокВыбора.Очистить();
	
	Если ВариантПредоставления = "Скидка" Тогда
		Элементы.ВариантыПредоставления.ТекущаяСтраница = Элементы.ВариантыПредоставления.ПодчиненныеЭлементы.Скидка;
		Если МаксимальныйПроцентСкидки > 0 Тогда
			Элементы.ПроцентРучнойСкидкиНаценки.КнопкаСпискаВыбора = Истина;
			Элементы.ПроцентРучнойСкидкиНаценки.СписокВыбора.Добавить(МаксимальныйПроцентСкидки, Формат(МаксимальныйПроцентСкидки, "ЧДЦ=2"));
		КонецЕсли;
	Иначе
		Элементы.ВариантыПредоставления.ТекущаяСтраница = Элементы.ВариантыПредоставления.ПодчиненныеЭлементы.Наценка;
		Если МаксимальныйПроцентНаценки > 0 Тогда
			Элементы.ПроцентРучнойСкидкиНаценки.КнопкаСпискаВыбора = Истина;
			Элементы.ПроцентРучнойСкидкиНаценки.СписокВыбора.Добавить(МаксимальныйПроцентНаценки, Формат(МаксимальныйПроцентНаценки, "ЧДЦ=2"));
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура КоличествоУпаковокПриИзменении(Элемент)
	
	ОбновитьКоличетсво();
	
КонецПроцедуры

&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
	
	ОбновитьКоличетсвоУпаковок();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ОК(Команда)
	
	Отказ = Ложь;
	ОчиститьСообщения();
	
	Если КоличествоУпаковок = 0 Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не заполнено количество'"),,"КоличествоУпаковок",,Отказ);
	КонецЕсли;
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	ПодобранныеТовары = Новый Массив;
	
	ПараметрыТовара = Новый Структура;
	ПараметрыТовара.Вставить("Номенклатура", Номенклатура);        
	ПараметрыТовара.Вставить("Характеристика", Характеристика);
	ПараметрыТовара.Вставить("Упаковка", Упаковка);
	ПараметрыТовара.Вставить("Цена", Цена);
	ПараметрыТовара.Вставить("ВидЦены", ВидЦены);
	ПараметрыТовара.Вставить("КоличествоУпаковок", КоличествоУпаковок);
	ПараметрыТовара.Вставить("Склад", Склад);
	ПараметрыТовара.Вставить("ДатаОтгрузки", ДатаОтгрузки);
	
	Если ВариантПредоставления = "Скидка" Тогда
		ПараметрыТовара.Вставить("ПроцентРучнойСкидки", ПроцентРучнойСкидкиНаценки);
	Иначе
		ПараметрыТовара.Вставить("ПроцентРучнойСкидки", -ПроцентРучнойСкидкиНаценки);
	КонецЕсли;
	
	ПодобранныеТовары.Добавить(ПараметрыТовара);
	
	Результат = Новый Структура("ПодобранныеТовары, МаксимальнаяДатаОтгрузки", ПодобранныеТовары, ДатаОтгрузки);

	Закрыть(Результат);
	
КонецПроцедуры

&НаКлиенте
Процедура Отмена(Команда)
	
	Закрыть(Неопределено);
	
КонецПроцедуры

&НаКлиенте
Процедура Округлить(Команда)
	
	Количество = Окр(Количество, 0, РежимОкругления.Окр15как20);
	ОбновитьКоличетсвоУпаковок();
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПроцентРучнойСкидкиНаценки.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПроцентРучнойСкидкиНаценки");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("МаксимальныйПроцентСкидки");

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьОграниченияРучныхСкидок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВариантПредоставления");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = "Скидка";

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.FireBrick);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПроцентРучнойСкидкиНаценки.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПроцентРучнойСкидкиНаценки");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("МаксимальныйПроцентНаценки");

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИспользоватьОграниченияРучныхСкидок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВариантПредоставления");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = "Наценка";
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.FireBrick);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.НоменклатураЕдиницаИзмерения.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Количество.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("УказаноДробноеКоличествоВБазовыхЕдиницах");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийОшибкуТекст);

КонецПроцедуры

&НаСервере
Процедура УпаковкаПриИзмененииНаСервере(СтараяУпаковка)
	
	УстановитьВидимостьКоличествоЕдиницХранения();
	ОбновитьКоличетсво();
	
	ЗаполнитьСписокЦен();
	Если Не ЗначениеЗаполнено(ВидЦены) 
		Или Не РедактироватьВидЦены Тогда
		Цена = Цена * 
			Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(Упаковка, Номенклатура) /
			Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(СтараяУпаковка, Номенклатура);
	КонецЕсли;
		
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокЦен()
	
	Если (ИспользуетсяЦенообразование25) Тогда
		ЗаполнитьСписокЦен2_5();
		Возврат;
	КонецЕсли;
	
	Если РедактироватьВидЦены Тогда
		// Заполнить список выбора видов цен.
		Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ВидыЦен.Ссылка КАК ВидЦены
		|ПОМЕСТИТЬ ВидыЦен
		|ИЗ
		|	Справочник.ВидыЦен КАК ВидыЦен
		|ГДЕ
		|	НЕ ВидыЦен.ПометкаУдаления
		|	И ВидыЦен.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДействияВидовЦен.Действует)
		|	И &ИспользоватьПриПродаже
		|	И &ЦенаВключаетНДС
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	КурсыСрезПоследних.Валюта КАК Валюта,
		|	КурсыСрезПоследних.КурсЧислитель,
		|	КурсыСрезПоследних.КурсЗнаменатель
		|ПОМЕСТИТЬ КурсыСрезПоследних
		|ИЗ
		|	РегистрСведений.ОтносительныеКурсыВалют.СрезПоследних(&Дата, БазоваяВалюта = &БазоваяВалюта) КАК КурсыСрезПоследних
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Валюта
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	КурсыСрезПоследнихВалютаЦены.Валюта КАК Валюта,
		|	КурсыСрезПоследнихВалютаЦены.КурсЧислитель,
		|	КурсыСрезПоследнихВалютаЦены.КурсЗнаменатель
		|ПОМЕСТИТЬ КурсыСрезПоследнихВалютаЦены
		|ИЗ
		|	РегистрСведений.ОтносительныеКурсыВалют.СрезПоследних(&Дата,
		|				Валюта = &Валюта И БазоваяВалюта = &БазоваяВалюта) КАК КурсыСрезПоследнихВалютаЦены
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
		|	ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
		|	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
		|	ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки1, 1) / ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки2, 1) КАК Коэффициент
		|ПОМЕСТИТЬ ЦеныНоменклатурыСрезПоследних
		|ИЗ
		|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
		|			КОНЕЦПЕРИОДА(&Дата, ДЕНЬ),
		|			Номенклатура = &Номенклатура
		|				И Характеристика = &Характеристика
		|				И ВидЦены В
		|					(ВЫБРАТЬ
		|						ВидыЦен.ВидЦены
		|					ИЗ
		|						ВидыЦен КАК ВидыЦен)) КАК ЦеныНоменклатурыСрезПоследних
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
		|	ВЫРАЗИТЬ(ЦеныНоменклатурыСрезПоследних.Цена * КурсыСрезПоследних.КурсЧислитель / КурсыСрезПоследних.КурсЗнаменатель / КурсыСрезПоследнихВалютаЦены.КурсЧислитель * КурсыСрезПоследнихВалютаЦены.КурсЗнаменатель * ЦеныНоменклатурыСрезПоследних.Коэффициент КАК ЧИСЛО(31,2)) КАК Цена
		|ИЗ
		|	ЦеныНоменклатурыСрезПоследних КАК ЦеныНоменклатурыСрезПоследних
		|		ЛЕВОЕ СОЕДИНЕНИЕ КурсыСрезПоследних КАК КурсыСрезПоследних
		|		ПО (КурсыСрезПоследних.Валюта = ЦеныНоменклатурыСрезПоследних.Валюта)
		|		ЛЕВОЕ СОЕДИНЕНИЕ КурсыСрезПоследнихВалютаЦены КАК КурсыСрезПоследнихВалютаЦены
		|		ПО (ИСТИНА)");
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекстЗапросаКоэффициентУпаковки1",
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
			"ВЫРАЗИТЬ(&Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения)", "ЦеныНоменклатурыСрезПоследних.Номенклатура"));
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекстЗапросаКоэффициентУпаковки2",
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
			"ЦеныНоменклатурыСрезПоследних.Упаковка",
			"ЦеныНоменклатурыСрезПоследних.Номенклатура"));
		
		ТекстЗамены = "ВидыЦен.ЦенаВключаетНДС = &ЦенаВключаетНДС";
		Если БезОтбораПоВключениюНДСВЦену Тогда
			ТекстЗамены = "ИСТИНА";
		Иначе
			Запрос.УстановитьПараметр("ЦенаВключаетНДС", ЦенаВключаетНДС);
		КонецЕсли;
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ЦенаВключаетНДС", ТекстЗамены);

		ТекстЗамены = "ВидыЦен.ИспользоватьПриПродаже";
		Если БезОтбораПоИспользоватьПриПродажеВЦену Тогда
			ТекстЗамены = "ИСТИНА";
		КонецЕсли;
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИспользоватьПриПродаже", ТекстЗамены);
		
		Запрос.УстановитьПараметр("Дата",           Дата);
		Запрос.УстановитьПараметр("Номенклатура",   Номенклатура);
		Запрос.УстановитьПараметр("Характеристика", Характеристика);
		Запрос.УстановитьПараметр("Упаковка",       Упаковка);
		Запрос.УстановитьПараметр("Валюта",         Валюта);
		Запрос.УстановитьПараметр("БазоваяВалюта", ЗначениеНастроекПовтИсп.БазоваяВалютаПоУмолчанию());
		
		СписокВыбораЦен = Элементы.Цена.СписокВыбора;
		СписокВыбораЦен.Очистить();
		ВидЦеныЦена.Загрузить(Запрос.Выполнить().Выгрузить());
		
		ВидЦеныСовпал = Ложь;
		Для Каждого Строка Из ВидЦеныЦена Цикл
			Представление = Формат(Строка.Цена, "ЧДЦ=2; ЧН=") + " (" + Строка.ВидЦены + ")";
			СписокВыбораЦен.Добавить(Строка.ВидЦены,Представление);
			Если Строка.ВидЦены = ВидЦены Тогда
				Цена = Строка.Цена;
				ВидЦеныСовпал = Истина;
			КонецЕсли;
		КонецЦикла;
		
		Если Не ВидЦеныСовпал Тогда
			ВидЦены = Справочники.ВидыЦен.ПустаяСсылка();
			ВидЦеныПредставление  = НСтр("ru='<произвольная>'");
		КонецЕсли;
			
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокЦен2_5()
	
	Если РедактироватьВидЦены Тогда
		// Заполнить список выбора видов цен.
		Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	ВЫРАЗИТЬ(&Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
		|	ВЫРАЗИТЬ(&Характеристика КАК Справочник.ХарактеристикиНоменклатуры) КАК Характеристика,
		|	ВЫРАЗИТЬ(&Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения) КАК Упаковка
		|ПОМЕСТИТЬ ТаблицаТовары
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ТаблицаТовары.Номенклатура КАК Номенклатура,
		|	ТаблицаТовары.Характеристика КАК Характеристика,
		|	ВЫБОР
		|		КОГДА
		|			ВидыНоменклатуры.НастройкиКлючаЦенПоХарактеристике = ЗНАЧЕНИЕ(Перечисление.ВариантОтбораДляКлючаЦен.НеИспользовать)
		|			ТОГДА ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатурыДляЦенообразования.ПустаяСсылка)
		|		ИНАЧЕ ТаблицаТовары.Характеристика.ХарактеристикаНоменклатурыДляЦенообразования
		|	КОНЕЦ КАК ХарактеристикаЦО,
		|	ЗНАЧЕНИЕ(Справочник.СерииНоменклатурыДляЦенообразования.ПустаяСсылка) КАК СерияЦО,
		|	ВЫБОР
		|		КОГДА ВидыНоменклатуры.НастройкиКлючаЦенПоУпаковке = ЗНАЧЕНИЕ(Перечисление.ВариантОтбораДляКлючаЦен.НеИспользовать)
		|			ТОГДА ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
		|		ИНАЧЕ ТаблицаТовары.Упаковка
		|	КОНЕЦ КАК УпаковкаЦО
		|ПОМЕСТИТЬ ТаблицаОтбора
		|ИЗ
		|	ТаблицаТовары КАК ТаблицаТовары
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры
		|		ПО ВидыНоменклатуры.Ссылка = ТаблицаТовары.Номенклатура.ВидНоменклатуры
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура,
		|	ХарактеристикаЦО,
		|	СерияЦО,
		|	УпаковкаЦО
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ВидыЦен.Ссылка КАК ВидЦены
		|ПОМЕСТИТЬ ВидыЦен
		|ИЗ
		|	Справочник.ВидыЦен КАК ВидыЦен
		|ГДЕ
		|	НЕ ВидыЦен.ПометкаУдаления
		|	И ВидыЦен.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДействияВидовЦен.Действует)
		|	И &ИспользоватьПриПродаже
		|	И &ЦенаВключаетНДС
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	КурсыСрезПоследних.Валюта КАК Валюта,
		|	КурсыСрезПоследних.КурсЧислитель,
		|	КурсыСрезПоследних.КурсЗнаменатель
		|ПОМЕСТИТЬ КурсыСрезПоследних
		|ИЗ
		|	РегистрСведений.ОтносительныеКурсыВалют.СрезПоследних(&Дата, БазоваяВалюта = &БазоваяВалюта) КАК КурсыСрезПоследних
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Валюта
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	КурсыСрезПоследнихВалютаЦены.Валюта КАК Валюта,
		|	КурсыСрезПоследнихВалютаЦены.КурсЧислитель,
		|	КурсыСрезПоследнихВалютаЦены.КурсЗнаменатель
		|ПОМЕСТИТЬ КурсыСрезПоследнихВалютаЦены
		|ИЗ
		|	РегистрСведений.ОтносительныеКурсыВалют.СрезПоследних(&Дата,
		|			Валюта = &Валюта И БазоваяВалюта = &БазоваяВалюта) КАК КурсыСрезПоследнихВалютаЦены
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
		|	ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
		|	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
		|	ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки1, 1) / ЕСТЬNULL(&ТекстЗапросаКоэффициентУпаковки2, 1) КАК Коэффициент
		|ПОМЕСТИТЬ ЦеныНоменклатурыСрезПоследних
		|ИЗ
		|	РегистрСведений.ЦеныНоменклатуры25.СрезПоследних(КОНЕЦПЕРИОДА(&Дата, ДЕНЬ), (Номенклатура, ХарактеристикаЦО,
		|		СерияЦО, УпаковкаЦО) В
		|		(ВЫБРАТЬ
		|			Т.Номенклатура,
		|			Т.ХарактеристикаЦО,
		|			Т.СерияЦО,
		|			Т.УпаковкаЦО
		|		ИЗ
		|			ТаблицаОтбора КАК Т)
		|	И ВидЦены В
		|		(ВЫБРАТЬ
		|			ВидыЦен.ВидЦены
		|		ИЗ
		|			ВидыЦен КАК ВидыЦен)) КАК ЦеныНоменклатурыСрезПоследних
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
		|	ВЫРАЗИТЬ(ЦеныНоменклатурыСрезПоследних.Цена * КурсыСрезПоследних.КурсЧислитель / КурсыСрезПоследних.КурсЗнаменатель /
		|		КурсыСрезПоследнихВалютаЦены.КурсЧислитель * КурсыСрезПоследнихВалютаЦены.КурсЗнаменатель *
		|		ЦеныНоменклатурыСрезПоследних.Коэффициент КАК ЧИСЛО(31, 2)) КАК Цена
		|ИЗ
		|	ЦеныНоменклатурыСрезПоследних КАК ЦеныНоменклатурыСрезПоследних
		|		ЛЕВОЕ СОЕДИНЕНИЕ КурсыСрезПоследних КАК КурсыСрезПоследних
		|		ПО КурсыСрезПоследних.Валюта = ЦеныНоменклатурыСрезПоследних.Валюта
		|		ЛЕВОЕ СОЕДИНЕНИЕ КурсыСрезПоследнихВалютаЦены КАК КурсыСрезПоследнихВалютаЦены
		|		ПО ИСТИНА");
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекстЗапросаКоэффициентУпаковки1",
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
			"ВЫРАЗИТЬ(&Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения)", "ЦеныНоменклатурыСрезПоследних.Номенклатура"));
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекстЗапросаКоэффициентУпаковки2",
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
			"ЦеныНоменклатурыСрезПоследних.Упаковка",
			"ЦеныНоменклатурыСрезПоследних.Номенклатура"));
		
		ТекстЗамены = "ВидыЦен.ЦенаВключаетНДС = &ЦенаВключаетНДС";
		Если БезОтбораПоВключениюНДСВЦену Тогда
			ТекстЗамены = "ИСТИНА";
		Иначе
			Запрос.УстановитьПараметр("ЦенаВключаетНДС", ЦенаВключаетНДС);
		КонецЕсли;
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ЦенаВключаетНДС", ТекстЗамены);
		
		ТекстЗамены = "ВидыЦен.ИспользоватьПриПродаже";
		Если БезОтбораПоИспользоватьПриПродажеВЦену Тогда
			ТекстЗамены = "ИСТИНА";
		КонецЕсли;
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИспользоватьПриПродаже", ТекстЗамены);
		
		Запрос.УстановитьПараметр("Дата",           Дата);
		Запрос.УстановитьПараметр("Номенклатура",   Номенклатура);
		Запрос.УстановитьПараметр("Характеристика", Характеристика);
		Запрос.УстановитьПараметр("Упаковка",       Упаковка);
		Запрос.УстановитьПараметр("Валюта",         Валюта);
		Запрос.УстановитьПараметр("БазоваяВалюта", ЗначениеНастроекПовтИсп.БазоваяВалютаПоУмолчанию());
		
		СписокВыбораЦен = Элементы.Цена.СписокВыбора;
		СписокВыбораЦен.Очистить();
		ВидЦеныЦена.Загрузить(Запрос.Выполнить().Выгрузить());
		
		ВидЦеныСовпал = Ложь;
		Для Каждого Строка Из ВидЦеныЦена Цикл
			Представление = Формат(Строка.Цена, "ЧДЦ=2; ЧН=") + " (" + Строка.ВидЦены + ")";
			СписокВыбораЦен.Добавить(Строка.ВидЦены,Представление);
			Если Строка.ВидЦены = ВидЦены Тогда
				Цена = Строка.Цена;
				ВидЦеныСовпал = Истина;
			КонецЕсли;
		КонецЦикла;
		
		Если Не ВидЦеныСовпал Тогда
			ВидЦены = Справочники.ВидыЦен.ПустаяСсылка();
			ВидЦеныПредставление  = НСтр("ru='<произвольная>'");
		КонецЕсли;
			
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ОбновитьКоличетсво()
	
	Количество = КоличествоУпаковок*Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(Упаковка, Номенклатура);
	УстановитьВидимостьОкруглить();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьКоличетсвоУпаковок()
	
	КоличествоУпаковок = Количество/Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(Упаковка, Номенклатура);
	УстановитьВидимостьОкруглить();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьКоличествоЕдиницХранения()
	
	ЕдиницаИзмеренияТипИзмеряемойВеличины = "";
	УпаковкаТипИзмеряемойВеличины = "";
	
	ЕдиницаМерная = Справочники.УпаковкиЕдиницыИзмерения.ЭтоМернаяЕдиница(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "ЕдиницаИзмерения"),
																			ЕдиницаИзмеренияТипИзмеряемойВеличины);
																			
	УпаковкаМерная = Справочники.УпаковкиЕдиницыИзмерения.ЭтоМернаяЕдиница(Упаковка,
																			УпаковкаТипИзмеряемойВеличины);
	Если ЕдиницаМерная
		И УпаковкаТипИзмеряемойВеличины <> ЕдиницаИзмеренияТипИзмеряемойВеличины
		И УпаковкаТипИзмеряемойВеличины <> "Упаковка"
		И УпаковкаТипИзмеряемойВеличины <> ""
		Или ЕдиницаИзмеренияТипИзмеряемойВеличины = "КоличествоШтук" 
		И УпаковкаМерная Тогда 
		
		Элементы.Количество.Видимость = Истина;
		Элементы.НоменклатураЕдиницаИзмерения.Видимость = Истина;
		Элементы.ДекорацияКоличествоОкруглить.Видимость = Ложь;
		
	Иначе
		
		Элементы.Количество.Видимость = Ложь;
		Элементы.НоменклатураЕдиницаИзмерения.Видимость = Ложь;
		Элементы.ДекорацияКоличествоОкруглить.Видимость = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьОкруглить()
	
	Если Количество <> Цел(Количество) И Элементы.Количество.Видимость И Не ЕдиницаМерная Тогда
		УказаноДробноеКоличествоВБазовыхЕдиницах = Истина;
		Элементы.Округлить.Видимость = Истина;
	Иначе
		УказаноДробноеКоличествоВБазовыхЕдиницах = Ложь;
		Элементы.Округлить.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

Связанные материалы