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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьДокументПоЧекуККМ(ЧекККМСсылка)
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ЧекККМ.КассаККМ КАК КассаККМ,
	|	ЧекККМ.Товары   КАК Товары
	|ИЗ
	|	Документ.ЧекККМ КАК ЧекККМ
	|ГДЕ
	|	ЧекККМ.Ссылка = &Ссылка");
	
	Запрос.УстановитьПараметр("Ссылка", ЧекККМСсылка);
	
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	
	Если Выборка.Следующий() Тогда
		ЗаполнитьДокументПоКассеККМ(Выборка.КассаККМ);
		Товары.Загрузить(Выборка.Товары.Выгрузить());
	КонецЕсли;
	
	ПриКопировании(ЧекККМСсылка);
	
КонецПроцедуры

Процедура ЗаполнитьОбъектРасчетов()
	
	Если ПодарочныеСертификаты.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ПодарочныеСертификаты.НомерСтроки КАК НомерСтроки,
	|	ВЫРАЗИТЬ(ПодарочныеСертификаты.ПодарочныйСертификат КАК Справочник.ПодарочныеСертификаты) КАК ПодарочныйСертификат
	|ПОМЕСТИТЬ ПодарочныеСертификаты
	|ИЗ
	|	&ПодарочныеСертификаты КАК ПодарочныеСертификаты
	|ИНДЕКСИРОВАТЬ ПО
	|	ПодарочныйСертификат
	|;
	|
	|/////////////////////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПодарочныеСертификаты.НомерСтроки КАК НомерСтроки,
	|	ПодарочныеСертификаты.ПодарочныйСертификат КАК ПодарочныйСертификат,
	|	ОбъектыРасчетов.Ссылка КАК ОбъектРасчетов
	|ИЗ
	|	ПодарочныеСертификаты КАК ПодарочныеСертификаты
	|	ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбъектыРасчетов КАК ОбъектыРасчетов
	|		ПО ОбъектыРасчетов.Объект = ПодарочныеСертификаты.ПодарочныйСертификат
	|			И НЕ ОбъектыРасчетов.ПометкаУдаления
	|ГДЕ
	|	ПодарочныеСертификаты.ПодарочныйСертификат.Владелец.УчетПодарочныхСертификатов2_5";
	
	Запрос.УстановитьПараметр("ПодарочныеСертификаты", ПодарочныеСертификаты.Выгрузить());
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Индекс = Выборка.НомерСтроки - 1;
		ПодарочныеСертификаты[Индекс].ОбъектРасчетов = Выборка.ОбъектРасчетов;
		ПодарочныеСертификаты[Индекс].СуммаВзаиморасчетов = ПодарочныеСертификаты[Индекс].Сумма;
	КонецЦикла;
	
КонецПроцедуры

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

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

#КонецЕсли

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