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

файл

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

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

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

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

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

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

&НаКлиенте
Процедура ВидЦеныПриИзменении(Элемент)
	
	ВидЦеныПриИзмененииНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ЦенаПриИзменении(Элемент)
	
	ВидЦены = Неопределено;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтображатьОстаткиНадписьНажатие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ОтображатьОстатки = Не ОтображатьОстатки;
	Элементы.ОстаткиТоваров.Видимость = ОтображатьОстатки;
	ПодборТоваровКлиентСервер.УстановитьТекстНадписиОтображатьОстатки(ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

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

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

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

#Область ПриИзмененииРеквизитов

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

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

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

#Область Прочее

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

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

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

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