Чек ККМ на возврат / Модуль объекта

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

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

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

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

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

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

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

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

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

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

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

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

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

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

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

	МассивТекстовЗапросов = Новый Массив;
	МассивТекстовЗапросов.Добавить(ОсновнойТекстЗапроса);
	МассивТекстовЗапросов.Добавить(Документы.ЧекККМ.ТекстЗапросаДляПолученияНеотмененныхОплатПоЧекуККМ(Истина, Истина));

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

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

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

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

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

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

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

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

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

#КонецЕсли

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