Архивирование и удаление чеков ККМ / Форма / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем ПараметрыОбработчикаОжидания;

&НаКлиенте
Перем ФормаДлительнойОперации;

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

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

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

	УстановитьУсловноеОформление();
	
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	МИНИМУМ(ЧекККМ.Дата) КАК Дата
		|ИЗ
		|	Документ.ЧекККМ КАК ЧекККМ
		|ГДЕ
		|	ЧекККМ.Проведен
		|	И ЧекККМ.КассоваяСмена <> ЗНАЧЕНИЕ(Перечисление.СтатусыКассовойСмены.Открыта)");
		
	Результат = Запрос.Выполнить();
	Выборка   = Результат.Выбрать();
	Если Выборка.Следующий() Тогда
		ДатаНачала = Выборка.Дата;
	КонецЕсли;
	
	КоличествоДнейХраненияЧеков = Константы.КоличествоДнейХраненияЗаархивированныхЧеков.Получить() * 86400;
	ДатаОкончания = ТекущаяДатаСеанса() - КоличествоДнейХраненияЧеков;
	
	Если ДатаНачала > ДатаОкончания Тогда
		ДатаНачала = ДатаОкончания;
	КонецЕсли;
	
	ОбновитьСписокКассККМ();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ВыбратьВыделенныеКассы(Команда)
	МассивСтрок = Элементы.ТаблицаКассы.ВыделенныеСтроки;
	ВыбратьВыделенныеКассыНаСервере(МассивСтрок);
КонецПроцедуры

&НаКлиенте
Процедура ИсключитьВыделенныеКассы(Команда)
	МассивСтрок = Элементы.ТаблицаКассы.ВыделенныеСтроки;
	ВыбратьВыделенныеКассыНаСервере(МассивСтрок, Ложь);
КонецПроцедуры

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

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

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

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

// Функция-конструктор дополнительных параметров
// Возвращаемое значение:
// 	Структура - дополнительные параметры:
// * Диалог - ДиалогРедактированияСтандартногоПериода - 
// 
&НаКлиенте
Функция ДополнительныеПараметрыОбработкиЗавершения()
	
	Результат = Новый Структура;
	Результат.Вставить("Диалог");
	Возврат Результат;
	
КонецФункции

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

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

// Параметры:
//  Период - СтандартныйПериод, Неопределено -  
// 	ДополнительныеПараметры - см. ДополнительныеПараметрыОбработкиЗавершения
// 
&НаКлиенте
Процедура УстановитьИнтервалЗавершение(Период, ДополнительныеПараметры) Экспорт
	
	Диалог = ДополнительныеПараметры.Диалог;
	Если ЗначениеЗаполнено(Период) Тогда
		ДатаНачала    = Диалог.Период.ДатаНачала;
		ДатаОкончания = Диалог.Период.ДатаОкончания;
		ОбновитьСписокКассККМ();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

	//

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТаблицаКассыКассаККМ.Имя);

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

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

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

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

&НаСервере
Процедура ОбновитьСписокКассККМ()

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

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

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

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

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

&НаКлиенте
Процедура ВыполнитьОбработкуЧековЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	ОтветНаВопрос = РезультатВопроса;

	Если ОтветНаВопрос = "Обработать" Тогда
		РезультатОбработки = ОбработатьЧекиККМНаСервере();

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

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

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

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

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