Чек ККМ коррекции / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

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

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

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

Процедура ПриЗаписи(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)
	
	ВызватьИсключение НСтр("ru = 'Копирование документа ""Чек ККМ коррекции"" запрещено!'");
	
КонецПроцедуры

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

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

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

#Область ИнициализацияИЗаполнение

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

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

Процедура ЗаполнитьДокументПоОтбору(ДанныеЗаполнения)
	
	Если ДанныеЗаполнения.Свойство("КассаККМ") Тогда
		ЗаполнитьДокументПоКассеККМ(ДанныеЗаполнения.КассаККМ);
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьДокументПоЧекуККМ(ДокументОснование)
	
	Если Документы.ЧекККМВозврат.ЕстьВозвратПоЧекуККМ(ДокументОснование) Тогда
		ВызватьИсключение НСтр("ru = 'По Чеку ККМ введен Чек ККМ на возврат. Ввод Чека ККМ коррекции запрещен!'");
	КонецЕсли;
	
	Если Документы.ЧекККМКоррекции.ЕстьКоррекцияПоЧекуККМ(ДокументОснование, Истина) Тогда
		ВызватьИсключение НСтр("ru = 'По Чеку ККМ введен Чек ККМ коррекции. Ввод нового Чека ККМ коррекции запрещен!'");
	КонецЕсли;
	
	Если Документы.ВозвратТоваровОтКлиента.ЕстьВозвратТоваровОтКлиентаПоЧекуККМ(ДокументОснование) Тогда
		ВызватьИсключение НСтр("ru = 'По Чеку ККМ введен Возврат товаров от клиента. Ввод нового Чека ККМ коррекции запрещен!'");
	КонецЕсли;
	
	// Заполним данные шапки документа.
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	ЧекККМ.Валюта КАК Валюта,
	|	ЧекККМ.Ссылка КАК ЧекККМ,
	|	ЧекККМ.Дата КАК ДатаЧекаККМ,
	|	ЧекККМ.ВидЦены КАК ВидЦены,
	|	ЧекККМ.Организация КАК Организация,
	|	ЧекККМ.КассаККМ КАК КассаККМ,
	|	ЧекККМ.Склад КАК Склад,
	|	ЧекККМ.ЦенаВключаетНДС КАК ЦенаВключаетНДС,
	|	ЧекККМ.НалогообложениеНДС КАК НалогообложениеНДС,
	|	ЧекККМ.ПолученоНаличными КАК ПолученоНаличными,
	|	ЧекККМ.Статус КАК Статус,
	|	ЧекККМ.Проведен КАК Проведен,
	|	ЧекККМ.Партнер КАК Партнер,
	|	ЧекККМ.ФормаОплаты КАК ФормаОплаты
	|ИЗ
	|	Документ.ЧекККМ КАК ЧекККМ
	|ГДЕ
	|	ЧекККМ.Ссылка = &Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Товары.НоменклатураЕГАИС КАК НоменклатураЕГАИС,
	|	Товары.НоменклатураНабора КАК НоменклатураНабора,
	|	Товары.ХарактеристикаНабора КАК ХарактеристикаНабора,
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.Серия КАК Серия,
	|	Товары.СтатусУказанияСерий КАК СтатусУказанияСерий,
	|	Товары.Упаковка КАК Упаковка,
	|	Товары.КоличествоУпаковок КАК КоличествоУпаковок,
	|	Товары.Количество КАК Количество,
	|	ВЫРАЗИТЬ(ВЫБОР
	|		КОГДА Товары.СуммаРучнойСкидки + Товары.СуммаАвтоматическойСкидки + Товары.СуммаБонусныхБалловКСписаниюВВалюте = 0
	|		ИЛИ Товары.КоличествоУпаковок = 0
	|			ТОГДА Товары.Цена
	|		ИНАЧЕ Товары.Сумма / Товары.КоличествоУпаковок
	|	КОНЕЦ КАК ЧИСЛО(31, 2)) КАК Цена,
	|	Товары.Сумма КАК Сумма,
	|	Товары.СтавкаНДС КАК СтавкаНДС,
	|	Товары.СуммаНДС КАК СуммаНДС,
	|	Товары.Помещение КАК Помещение,
	|	Товары.Продавец КАК Продавец,
	|	Товары.Комитент КАК Комитент,
	|	Товары.НомерСтроки
	|ПОМЕСТИТЬ врТовары
	|ИЗ
	|	Документ.ЧекККМ.Товары КАК Товары
	|ГДЕ
	|	Товары.Ссылка = &Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Товары.НоменклатураЕГАИС КАК НоменклатураЕГАИС,
	|	Товары.НоменклатураНабора КАК НоменклатураНабора,
	|	Товары.ХарактеристикаНабора КАК ХарактеристикаНабора,
	|	Товары.Номенклатура КАК Номенклатура,
	|	Товары.Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	|	Товары.Характеристика КАК Характеристика,
	|	Товары.Серия КАК Серия,
	|	Товары.СтатусУказанияСерий КАК СтатусУказанияСерий,
	|	Товары.Упаковка КАК Упаковка,
	|	Товары.СтавкаНДС КАК СтавкаНДС,
	|	Товары.Цена КАК Цена,
	|	Товары.Помещение КАК Помещение,
	|	Товары.Продавец КАК Продавец,
	|	Товары.Комитент КАК Комитент,
	|	Товары.КоличествоУпаковок КАК КоличествоУпаковок,
	|	Товары.Количество КАК Количество,
	|	Товары.Сумма КАК Сумма,
	|	Товары.СуммаНДС КАК СуммаНДС,
	|	Товары.НомерСтроки КАК НомерСтроки
	|ИЗ
	|	врТовары КАК Товары
	|ГДЕ
	|	Товары.Количество > 0
	|
	|УПОРЯДОЧИТЬ ПО
	|	НомерСтроки,
	|	Номенклатура,
	|	Характеристика,
	|	Серия,
	|	Упаковка,
	|	Помещение,
	|	Продавец,
	|	Комитент,
	|	Цена
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Серии.Номенклатура КАК Номенклатура,
	|	Серии.Характеристика КАК Характеристика,
	|	Серии.Серия КАК Серия,
	|	Серии.Помещение КАК Помещение,
	|	Серии.Количество КАК Количество
	|ПОМЕСТИТЬ врСерии
	|ИЗ
	|	Документ.ЧекККМ.Серии КАК Серии
	|ГДЕ
	|	Серии.Ссылка = &Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Серии.Номенклатура КАК Номенклатура,
	|	Серии.Характеристика КАК Характеристика,
	|	Серии.Серия КАК Серия,
	|	Серии.Помещение КАК Помещение,
	|	СУММА(Серии.Количество) КАК Количество
	|ИЗ
	|	врСерии КАК Серии
	|СГРУППИРОВАТЬ ПО
	|	Серии.Номенклатура,
	|	Серии.Характеристика,
	|	Серии.Серия,
	|	Серии.Помещение
	|ИМЕЮЩИЕ
	|	СУММА(Серии.Количество) > 0
	|
	|УПОРЯДОЧИТЬ ПО
	|	Номенклатура,
	|	Характеристика,
	|	Серия,
	|	Помещение
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	АкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка,
	|	АкцизныеМарки.Справка2 КАК Справка2,
	|	АкцизныеМарки.ШтрихкодУпаковки КАК ШтрихкодУпаковки,
	|	АкцизныеМарки.КодАкцизнойМарки КАК КодАкцизнойМарки
	|ИЗ
	|	Документ.ЧекККМ.АкцизныеМарки КАК АкцизныеМарки
	|ГДЕ
	|	АкцизныеМарки.Ссылка = &Ссылка
	|
	|УПОРЯДОЧИТЬ ПО
	|	АкцизнаяМарка,
	|	ШтрихкодУпаковки,
	|	КодАкцизнойМарки
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ОплатыПлатежнымиКартами.ВидОплаты КАК ВидОплаты,
	|	ОплатыПлатежнымиКартами.ЭквайринговыйТерминал КАК ЭквайринговыйТерминал,
	|	ОплатыПлатежнымиКартами.КодАвторизации КАК КодАвторизации,
	|	ОплатыПлатежнымиКартами.НомерПлатежнойКарты КАК НомерПлатежнойКарты,
	|	ОплатыПлатежнымиКартами.Сумма КАК Сумма
	|ПОМЕСТИТЬ ВозвратОплатыПлатежнымиКартамиПоЧеку
	|ИЗ
	|	Документ.ЧекККМВозврат КАК ЧекККМВозврат
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМВозврат.ОплатаПлатежнымиКартами КАК ОплатыПлатежнымиКартами
	|		ПО (ОплатыПлатежнымиКартами.Ссылка = ЧекККМВозврат.Ссылка)
	|ГДЕ
	|	ЧекККМВозврат.ЧекККМ = &Ссылка
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	ЭквайринговыйТерминал,
	|	КодАвторизации,
	|	НомерПлатежнойКарты,
	|	Сумма
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ОплатаПлатежнымиКартами.ВидОплаты КАК ВидОплаты,
	|	ОплатаПлатежнымиКартами.ЭквайринговыйТерминал КАК ЭквайринговыйТерминал,
	|	ОплатаПлатежнымиКартами.КодАвторизации КАК КодАвторизации,
	|	ОплатаПлатежнымиКартами.НомерПлатежнойКарты КАК НомерПлатежнойКарты,
	|	ОплатаПлатежнымиКартами.Сумма КАК Сумма,
	|	ОплатаПлатежнымиКартами.ИдентификаторКорзины КАК ИдентификаторКорзины,
	|	ОплатаПлатежнымиКартами.СсылочныйНомер КАК СсылочныйНомер,
	|	ОплатаПлатежнымиКартами.ДоговорПодключения КАК ДоговорПодключения,
	|	ОплатаПлатежнымиКартами.ИдентификаторПлатежнойСистемы КАК ИдентификаторПлатежнойСистемы,
	|	ОплатаПлатежнымиКартами.НомерЧекаЭТ КАК НомерЧекаЭТ
	|ИЗ
	|	Документ.ЧекККМ.ОплатаПлатежнымиКартами КАК ОплатаПлатежнымиКартами
	|ГДЕ
	|	ОплатаПлатежнымиКартами.Ссылка = &Ссылка
	|	И НЕ (ОплатаПлатежнымиКартами.ВидОплаты, ОплатаПлатежнымиКартами.ЭквайринговыйТерминал,
	|		ОплатаПлатежнымиКартами.КодАвторизации, ОплатаПлатежнымиКартами.НомерПлатежнойКарты, ОплатаПлатежнымиКартами.Сумма)
	|		В
	|		(ВЫБРАТЬ
	|			ВозвратОплатыПлатежнымиКартамиПоЧеку.ВидОплаты,
	|			ВозвратОплатыПлатежнымиКартамиПоЧеку.ЭквайринговыйТерминал,
	|			ВозвратОплатыПлатежнымиКартамиПоЧеку.КодАвторизации,
	|			ВозвратОплатыПлатежнымиКартамиПоЧеку.НомерПлатежнойКарты,
	|			ВозвратОплатыПлатежнымиКартамиПоЧеку.Сумма
	|		ИЗ
	|			ВозвратОплатыПлатежнымиКартамиПоЧеку КАК ВозвратОплатыПлатежнымиКартамиПоЧеку)
	|
	|УПОРЯДОЧИТЬ ПО
	|	ВидОплаты,
	|	ЭквайринговыйТерминал,
	|	НомерПлатежнойКарты,
	|	КодАвторизации,
	|	ИдентификаторКорзины,
	|	ДоговорПодключения,
	|	НомерЧекаЭТ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ЧекККМПодарочныеСертификаты.ПодарочныйСертификат КАК ПодарочныйСертификат,
	|	ЧекККМПодарочныеСертификаты.Сумма КАК Сумма,
	|	ЧекККМПодарочныеСертификаты.СуммаВВалютеСертификата КАК СуммаВВалютеСертификата
	|ИЗ
	|	Документ.ЧекККМ.ПодарочныеСертификаты КАК ЧекККМПодарочныеСертификаты
	|ГДЕ
	|	ЧекККМПодарочныеСертификаты.Ссылка = &Ссылка
	|
	|УПОРЯДОЧИТЬ ПО
	|	ПодарочныйСертификат";
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр("Ссылка", ДокументОснование);
	
	РезультатЗапроса = Запрос.ВыполнитьПакет();
	
	Выборка = РезультатЗапроса[0].Выбрать();
	Выборка.Следующий();
	ЗаполнитьЗначенияСвойств(ЭтотОбъект, Выборка, ,"Статус, Проведен");
	ДатаСовершенияКорректируемогоРасчета = Выборка.ДатаЧекаККМ;
	
	СтруктураСостояниеКассовойСмены = РозничныеПродажи.ПолучитьСостояниеКассовойСмены(Выборка.КассаККМ);
	КассоваяСмена = СтруктураСостояниеКассовойСмены.КассоваяСмена;
	
	Если Не Выборка.Проведен Тогда
		ТекстОшибки = НСтр("ru='Чек ККМ не проведен. Ввод на основании невозможен.'");
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
	Товары.Загрузить(РезультатЗапроса[2].Выгрузить());
	Серии.Загрузить(РезультатЗапроса[4].Выгрузить());
	АкцизныеМарки.Загрузить(РезультатЗапроса[5].Выгрузить());
	ОплатаПлатежнымиКартами.Загрузить(РезультатЗапроса[7].Выгрузить());
	ПодарочныеСертификаты.Загрузить(РезультатЗапроса[8].Выгрузить());
	
	Статус = Перечисления.СтатусыЧековККМ.ОтложенБезРезервирования;
	СуммаДокумента = ЦенообразованиеКлиентСервер.ПолучитьСуммуДокумента(Товары, ЦенаВключаетНДС);
	
	ПолученоНаличными = СуммаДокумента - ОплатаПлатежнымиКартами.Итог("Сумма") - ПодарочныеСертификаты.Итог("Сумма");
	
КонецПроцедуры

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

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

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

#Область Локализация

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

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

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

#КонецЕсли

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