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

файл

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

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

	Элементы.Период.Видимость                  = (ИспользуетсяККТФЗ54 Или КассаККМИспользуетсяБезПодключенияОборудования);

	ЗаполнитьПредставленияЗаголовкаКнопкиОформитьВозвратНаСервере();
	Элементы.ФормаОформитьВозврат.Заголовок = ПредставленияЗаголовкаКнопкиОформитьВозврат.ОформитьВозврат;
	
	СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
	Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
		Элементы.ГруппаИтого.ЦветФона = Новый Цвет();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура НайтиСертификаты(Команда)
	
	ЗаполнитьТаблицуТоваров();
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ОткрытьФормуРМКДляОформленияЧекаККМВозврат(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.Да Тогда

		ПараметрыФормы = Новый Структура;	
		Строки = ДополнительныеПараметры.ВыбранныеСтроки;	
		ПодобранныйЧек = Строки[0].ЧекККМ;

		ПараметрыОткрытия = Новый Структура;
		ПараметрыОткрытия.Вставить("Товары", АдресВоВременномХранилище(ВладелецФормы.УникальныйИдентификатор));
		ПараметрыОткрытия.Вставить("ЧекККМ", ПодобранныйЧек);
		ПараметрыОткрытия.Вставить("Кассир", Кассир);
		ПараметрыФормы.Вставить("Основание", ПараметрыОткрытия);

		ОткрытьФорму("Документ.ВозвратПодарочныхСертификатов.Форма.ФормаДокументаРМК", ПараметрыФормы, ВладелецФормы);
		
		Закрыть();
	КонецЕсли;
	
КонецПроцедуры

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

	КонецЕсли;

	Возврат Результат;
КонецФункции

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

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

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

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

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

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

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

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

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