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

файл

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

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

	Если ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Набор") Тогда
		РассчитатьПараметрыНабора();
	КонецЕсли;

	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
	
	УстановитьВидимостьКоличествоЕдиницХранения();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

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

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

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

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

	//

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

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

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

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

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

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

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

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

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

#Область Наборы

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

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

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

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

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

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

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

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

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