Организации / Форма применение ЕНВД / Модуль формы

файл

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

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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	Если ИсточникВыбора.ИмяФормы = "ОбщаяФорма.ВыборДаты" Тогда
		ОбработкаВыбораДатыНаСервере(ВыбранноеЗначение);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Оповещение = Новый ОписаниеОповещения("СохранитьИЗакрыть", ЭтотОбъект);
	ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ЗавершениеРаботы,, ТекстПредупреждения);
	
КонецПроцедуры

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

#Область ОбработчикиСобытийТаблицыФормыПрименениеЕНВД

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

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

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

&НаКлиенте
Процедура ПрименениеЕНВДПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОК(Команда)
	Если Модифицированность Тогда
		Если ЗаписатьСведения() Тогда
			Закрыть(Истина);
		КонецЕсли;
	Иначе
		Закрыть();
	КонецЕсли;
КонецПроцедуры

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

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

&НаСервере
Процедура ОбновитьТаблицуПримененияЕНВД()
	
	ПрименениеЕНВД.Очистить();
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ЕСТЬNULL(ПримененияЕНВД.РозничнаяТорговляОблагаетсяЕНВД, ЛОЖЬ) КАК РозничнаяТорговляОблагаетсяЕНВД,
	|	ЕСТЬNULL(ПримененияЕНВД.Период, &ТекущаяДата) КАК Период,
	|	""История"" КАК История,
	|	Склады.Ссылка КАК Склад
	|ИЗ
	|	Справочник.Склады КАК Склады
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПримененияЕНВД КАК ПримененияЕНВД
	|		ПО Склады.Ссылка = ПримененияЕНВД.Склад
	|			И (ПримененияЕНВД.Организация = &ГоловнаяОрганизация)
	|			И (ЕСТЬNULL(ПримененияЕНВД.Период, &ТекущаяДата) <= &ТекущаяДата)
	|ГДЕ
	|	Склады.ТипСклада = ЗНАЧЕНИЕ(Перечисление.ТипыСкладов.РозничныйМагазин)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Период УБЫВ,
	|	Склад
	|ИТОГИ ПО
	|	Склад";
	
	Запрос.УстановитьПараметр("ГоловнаяОрганизация", Организация);
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
	
	РезультатЗапроса = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	ПараметрыСравнения = Новый Массив;
	ПараметрыСравнения.Добавить("РозничнаяТорговляОблагаетсяЕНВД");
	Для Каждого СтрокаРезультатаПоСкладу Из РезультатЗапроса.Строки Цикл
		СтрокаТаблицы = ПрименениеЕНВД.Добавить();
		ЗагрузитьНаиболееРанниеДанныеВРеквизитыФормы(СтрокаРезультатаПоСкладу.Строки, СтрокаТаблицы, ПараметрыСравнения);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ПрименениеЕНВДВыборЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Ответ = РезультатВопроса;
	
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	Если ЗаписатьСведения() Тогда
		ОткрытьФормуСпискаПрименениеЕНВД();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьИЗакрыть(Результат, ДополнительныеПараметры) Экспорт 
	
	ОК(Неопределено);
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаВыбораДатыНаСервере(ВыбраннаяДата)
	
	ОткрытаФормаВыбораДаты = Ложь;

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

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

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

// Процедура из таблицы значений выбирает наиболее раннюю актуальную информацию.
// Например, имеем:
// 	1.01.2013 - Общая система налогообложения
//  1.02.2013 - Упрощенная система налогообложения
//  1.03.2013 - Общая система налогообложения  <--
//  1.04.2013 - Общая система налогообложения
//  1.05.2013 - Общая система налогообложения
// В данном случае будет выбрана третья строка, поскольку информация в ней актуальна по сравнению с последней записью,
// и между выбранной и последней строками информация одинакова.
//
// Параметры:
//	ТаблицаЗначений - ТаблицаЗначений - таблица значений с данными, из которых будет производиться выбор
//	ПриемникДанных - Произвольный - содержит в себе объект-приемник выбранных данных (например, форма, строка таблицы значений и т.д.)
//	ПараметрСравнения - Строка - параметр, по которому будет идти сравнение на актуальность.
&НаСервере
Процедура ЗагрузитьНаиболееРанниеДанныеВРеквизитыФормы(ТаблицаЗначений, ПриемникДанных, ПараметрыСравнения)
	
	СтрокаНайдена = Ложь;

	ПредыдущаяСтрока = Неопределено;
	
	Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
		Для Каждого ПараметрСравнения Из ПараметрыСравнения Цикл
			Если ПредыдущаяСтрока <> Неопределено 
				И СтрокаТаблицы[ПараметрСравнения] <> ПредыдущаяСтрока[ПараметрСравнения] Тогда
				СтрокаНайдена = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Если СтрокаНайдена Тогда
			Прервать;
		КонецЕсли;
		ПредыдущаяСтрока = СтрокаТаблицы;
	КонецЦикла;
	
	Если ЗначениеЗаполнено(ПредыдущаяСтрока) Тогда
		ЗаполнитьЗначенияСвойств(ПриемникДанных, ПредыдущаяСтрока);
	КонецЕсли;	
	
КонецПроцедуры

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

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