Скидки (наценки) / Изменение статуса / Модуль формы

файл

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

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

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

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

&НаКлиенте
Процедура ДатаНачалаПриИзменении(Элемент)
	
	НастроитьФорму();
	
КонецПроцедуры

&НаКлиенте
Процедура СтатусДействуетДоМаксимальнойДатыПриИзменении(Элемент)
	ВариантВыбораДатыОкончанияПриИзменении(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура ДействуетДоДатыПриИзменении(Элемент)
	ВариантВыбораДатыОкончанияПриИзменении(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура МаксимальнаяДатаНеОпределенаСтатусДействуетБессрочноПриИзменении(Элемент)
	ВариантВыбораДатыОкончанияПриИзменении(ЭтаФорма);
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервере
Процедура НастроитьФорму()
	
	Если СкидкиНаценки.Количество() > 0 Тогда
		
		ТекстЗапроса = 
		"ВЫБРАТЬ
		|	Минимум(Т.Период) КАК Период
		|ИЗ
		|	РегистрСведений.ДействиеСкидокНаценок КАК Т
		|ГДЕ
		|	Т.Период > &ДатаНачала
		|	И Т.Источник В (&Источники)
		|	И Т.СкидкаНаценка В (&Таблица)";
		
		Таблица = СкидкиНаценки.Выгрузить().ВыгрузитьКолонку("Ссылка");
		
	КонецЕсли;
	
	Если Товары.Количество() > 0 Тогда
		
		ТекстЗапроса = 
		"ВЫБРАТЬ
		|	Т.Номенклатура,
		|	Т.Характеристика
		|ПОМЕСТИТЬ Товары
		|ИЗ
		|	&Таблица КАК Т
		|;
		|
		|ВЫБРАТЬ
		|	Минимум(Т.Период) КАК Период
		|ИЗ
		|	РегистрСведений.ДействиеСкидокНаценокПоНоменклатуре КАК Т
		|ГДЕ
		|	Т.Период > &ДатаНачала
		|	И Т.Источник В (&Источники)
		|	И (Т.Номенклатура, Т.Характеристика) В (ВЫБРАТЬ Т.Номенклатура, Т.Характеристика ИЗ Товары КАК Т)";
		
		Таблица = Товары.Выгрузить();
		
	КонецЕсли;
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
	Запрос.УстановитьПараметр("Источники", Источники.Выгрузить().ВыгрузитьКолонку("Ссылка"));
	Запрос.УстановитьПараметр("Таблица", Таблица);
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	
	МаксимальнаяДатаНовогоСтатуса = '00010101';
	ВариантВыбораДатыОкончания = 0;
	Если Выборка.Следующий() И ЗначениеЗаполнено(Выборка.Период) Тогда
		МаксимальнаяДатаНовогоСтатуса = НачалоДня(Выборка.Период - 1);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(МаксимальнаяДатаНовогоСтатуса) Тогда
		ВариантВыбораДатыОкончания = 1;
	КонецЕсли;
	
	Если Статус = Перечисления.СтатусыДействияСкидок.НеДействует Тогда
		Элементы.Страницы.ТекущаяСтраница = Элементы.Страницы.ПодчиненныеЭлементы.НеДействует;
	Иначе
		Если ЗначениеЗаполнено(МаксимальнаяДатаНовогоСтатуса) Тогда
			Элементы.Страницы.ТекущаяСтраница = Элементы.Страницы.ПодчиненныеЭлементы.МаксимальнаяДатаОпределена;
			МаксимальнаяДатаОпределена = Истина;
		Иначе
			Элементы.Страницы.ТекущаяСтраница = Элементы.Страницы.ПодчиненныеЭлементы.МаксимальнаяДатаНеОпределена;
			МаксимальнаяДатаОпределена = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Элементы.СтатусДействуетДоМаксимальнойДаты.СписокВыбора[0].Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		"по %1", Формат(МаксимальнаяДатаНовогоСтатуса, "ДЛФ=D"));
	
	ВариантВыбораДатыОкончанияПриИзменении(ЭтаФорма);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ВариантВыбораДатыОкончанияПриИзменении(Форма)

	Форма.Элементы.МаксимальнаяДатаНеОпределенаДатаОкончания.Доступность = (Форма.ВариантВыбораДатыОкончания = 1);
	Форма.Элементы.ДатаОкончания.Доступность = (Форма.ВариантВыбораДатыОкончания = 0);

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

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

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

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