Чек ККМ на возврат / Форма документа (РМК) / Модуль формы

файл
&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ

&НаКлиенте
Перем ТекущиеДанныеИдентификатор; // используется механизмом серий

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

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

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

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

	ПолучитьСсылкиНаОборудование();
	ЗаполнитьДанныеПоЧекуККМ();
	УстановитьВидимостьЭлементовФормы();
	
	СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
	РаботаСТабличнымиЧастями.ИнициализироватьКэшСтрок(Элементы.Товары);
	
	ПолучитьСтатусОплатыСБППоЧекуКММ();
	
	ПриСозданииЧека();
	
	ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ИспользоватьПодключаемоеОборудование Тогда
		
		Если ОткрыватьФормуСПодключеннымОборудованием И ВладелецФормы = Неопределено Тогда
			
			ПодключитьОбработчикОжидания("ОткрытьФормуПодключенноеОборудованиеОбработчикОжидания", 0.5, Истина);
			
		Иначе
			
			ПодключитьОбработчикОжидания("НачатьПодключениеОборудованияОбработчикОжидания", 0.1, Истина);
			
		КонецЕсли;
		
	КонецЕсли;
	
	ПересчитатьДокументНаКлиенте();
	
	Если ПринудительнаяАвторизация И ВладелецФормы = Неопределено Тогда
		ПодключитьОбработчикОжидания("ОткрытьОкноАвторизации", 0.5, Истина);
	КонецЕсли;
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

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

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

	МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаОповещенияНаСервере(ИмяСобытия, Параметр, Источник)

	ДополнительныеПараметры = Новый Структура("ИмяСобытия, Параметр, Источник", ИмяСобытия, Параметр, Источник);
	СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Событие", ДополнительныеПараметры);

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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

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

	СобытияФорм.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);

	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	
	Оповестить("Запись_ЧекККМВозврат", ПараметрыЗаписи, Объект.Ссылка);

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

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

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

	МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ТекущийОбъект, ПараметрыЗаписи);

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

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

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

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

&НаКлиенте
Процедура ТоварыПриАктивизацииЯчейки(Элемент)
	
	СобытияФормКлиент.ПриАктивизацииЯчейки(ЭтотОбъект, Элемент);

	Если Не Элемент.ТекущийЭлемент = Элементы.ТоварыШтрихкод Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Элементы.ТоварыШтрихкод.СписокВыбора.Очистить();
		Возврат;
	КонецЕсли;

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

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

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

&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
	
	ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
	УстановитьДоступностьЭлементовРМК(ЭтотОбъект, РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);

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

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

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

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

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

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

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

	Если ДополнительныеПараметры.Свойство("ТребуетсяСерверныйВызов") Тогда
		КэшированныеЗначения.Вставить("СобытияФорм");
	КонецЕсли;
	Если НоменклатураКлиент.НеобходимоОбновитьСтатусыСерий(Элемент, КэшированныеЗначения, ПараметрыУказанияСерий) Тогда
		КэшированныеЗначения.Вставить("НеобходимоОбновитьСтатусыСерий");
		ДополнительныеПараметры.Вставить("ТребуетсяСерверныйВызов");
	КонецЕсли;

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

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

&НаКлиенте
Процедура ТоварыПриОкончанииРедактированияДляСерверногоВызова()

	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	Если КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
		ТекущаяСтрокаИдентификатор = ТекущиеДанные.ПолучитьИдентификатор();
	КонецЕсли;

	ТоварыПриОкончанииРедактированияНаСервере(ТекущаяСтрокаИдентификатор, КэшированныеЗначения);

	Если КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
		НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(Элементы.Товары, КэшированныеЗначения, ПараметрыУказанияСерий);
		КэшированныеЗначения.Удалить("НеобходимоОбновитьСтатусыСерий");
	КонецЕсли;

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

&НаСервере
Процедура ТоварыПриОкончанииРедактированияНаСервере(ИдентификаторСтроки, КэшированныеЗначения)

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

	Если КэшированныеЗначения.Свойство("СобытияФорм") Тогда
		СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
		КэшированныеЗначения.Удалить("СобытияФорм");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	
	ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
	ТоварыНоменклатураПриИзмененииСервер(ИдентификаторТекущейСтроки);
	
КонецПроцедуры

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

	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);

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

&НаКлиенте
Процедура ТоварыХарактеристикаПриИзменении(Элемент)
	
	ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
	
	ТоварыХарактеристикаПриИзмененииСервер(ИдентификаторТекущейСтроки);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ТоварыУпаковкаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;

	Если ТекущаяСтрока.Упаковка <> КэшированныеСтроки[Элементы.Товары.Имя].Упаковка Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("Элемент", Элемент);
		ДополнительныеПараметры.Вставить("ИдентификаторСтроки", ТекущаяСтрока.ПолучитьИдентификатор());		

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

&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;

	Если ПревышеноКоличествоУпаковокНевозвращенныхПозицийПоДаннымТекущейСтроки(ТекущаяСтрока) Тогда
		КоличествоУпаковокПоЧеку = ?(ЗначениеЗаполнено(КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковокПоЧеку), КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковокПоЧеку,
									КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковок);
		ТекущаяСтрока.КоличествоУпаковок = КоличествоУпаковокПоЧеку;
	КонецЕсли;
	
	Если ТекущаяСтрока.КоличествоУпаковок <> КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковок Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("Элемент", Элемент);
		ДополнительныеПараметры.Вставить("ИдентификаторСтроки", ТекущаяСтрока.ПолучитьИдентификатор());		

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УказатьСерии(Команда)
	
	РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
	РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
	
	ОткрытьПодборСерий();
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ОткрытьМенюОперацииСККМ(Команда)
	
	РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);

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

&НаКлиенте
Процедура ОткрытьМенюПрочихОпераций(Команда)
	
	РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);

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

&НаКлиенте
Процедура БыстрыеТовары(Команда)
	
	РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
	ОткрытьФорму("Документ.ЧекККМ.Форма.БыстрыеТовары", Новый Структура("ГорячиеКлавиши", ГорячиеКлавиши), ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПодключенноеОборудование(Команда)
	
	РозничныеПродажиКлиент.ОткрытьФормуПодключенноеОборудование(ЭтотОбъект, Ложь);
	
КонецПроцедуры

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

	Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
		Возврат;
	КонецЕсли;

	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
	"Документ.ЧекККМВозврат.ФормаДокументаРМК.Команда.ОткрытьПодбор");
	
	РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);

	ПараметрыФормы = Новый Структура;

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

	ПараметрыФормы.Вставить("ВидЦены", Объект.ВидЦены);
	ПараметрыФормы.Вставить("РежимПодбораБезСоглашенийСКлиентами", Истина);
	ПараметрыФормы.Вставить("ВариантАнализаНоменклатурыПродаваемойСовместно", ПредопределенноеЗначение("Перечисление.ВариантыАнализаНоменклатурыПродаваемойСовместно.РозничнаяТорговля"));
	ПараметрыФормы.Вставить("РежимОтбораПоАссортименту", КонтролироватьАссортимент);

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

	ОткрытьФорму(ИмяФормыПодбора, 
					ПараметрыФормы, 
					ЭтотОбъект, 
					УникальныйИдентификатор,
					,
					,
					ОповещениеОЗакрытии
					,
					РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ИзменитьПомещение(Команда)
	
	РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОплатитьЭСФСС(Команда)
	
	ОплатитьЭСФССЛокализация();
	
КонецПроцедуры

&НаКлиенте
Процедура ОплатитьСБП(Команда)
	
	ОплатитьСБПЛокализация();
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьТолькоВозвращаемыеПозиции(Команда)
	
	Элементы.ПоказыватьТолькоВозвращаемыеПозиции.Пометка = Не Элементы.ПоказыватьТолькоВозвращаемыеПозиции.Пометка;
	РежимОтображенияТоваровПоЧеку = Не Элементы.ПоказыватьТолькоВозвращаемыеПозиции.Пометка;

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

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

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

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

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

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

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

// Параметры:
// 	Команда - КомандаФормы - 
&НаКлиенте
Процедура ВыбранБыстрыйТовар(Команда)
	
	НайденныеСтроки = БыстрыеТовары.НайтиСтроки(Новый Структура("ИмяКоманды", Команда.Имя));
	
	ПараметрыОповещения = Новый Структура();
	ПараметрыОповещения.Вставить("Номенклатура", НайденныеСтроки[0].Номенклатура);
	ПараметрыОповещения.Вставить("Характеристика", НайденныеСтроки[0].Характеристика);
	ПараметрыОповещения.Вставить("Серия", ПредопределенноеЗначение("Справочник.СерииНоменклатуры.ПустаяСсылка"));
	ПараметрыОповещения.Вставить("Упаковка", НайденныеСтроки[0].Упаковка);
	ПараметрыОповещения.Вставить("ТипНоменклатуры", НайденныеСтроки[0].ТипНоменклатуры);
	ПараметрыОповещения.Вставить("КоличествоУпаковок", 1);
	ПараметрыОповещения.Вставить("ФормаВладелец", УникальныйИдентификатор);
	
	Если НайденныеСтроки.Количество() > 0 Тогда
		Оповестить("ВыбранБыстрыйТовар", ПараметрыОповещения);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьИнформационнуюПанельОшибкиПриПечатиЧека(Команда)
	Элементы.ИнформационнаяПанельОшибкаПриПечатиЧека.Заголовок = "";
	ИнформационнаяПанельОшибкаПриПечатиЧекаТекст = "";
	Элементы.ГруппаИнформационнаяПанельОшибкаПриПечатиЧека.Видимость = Ложь;
КонецПроцедуры

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

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

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

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

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

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтотОбъект);

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеСерийНоменклатуры(ЭтотОбъект, Ложь);

	//
	
	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтотОбъект);

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеСтатусовУказанияСерий(ЭтотОбъект, Ложь);
	
	//
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	//
	
	ЭтоВозвратПоЧеку = ЗначениеЗаполнено(Объект.ЧекККМ);
	Элементы.ФормаБыстрыеТовары.Доступность = Не ЭтоВозвратПоЧеку;
	Элементы.ФормаГорячиеКлавишиБыстрыеТовары.Доступность = Не ЭтоВозвратПоЧеку;
	
КонецПроцедуры

#Область ШтрихкодыИТорговоеОборудование

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

&НаСервере
Процедура ОбработатьШтрихкодыСервер(СтруктураПараметровДействия,КэшированныеЗначения)
	
	ШтрихкодированиеНоменклатурыСервер.ОбработатьШтрихкоды(ЭтотОбъект,Объект,СтруктураПараметровДействия,КэшированныеЗначения);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОткрытьФормуПодключенноеОборудованиеОбработчикОжидания()
	
	РозничныеПродажиКлиент.ОткрытьФормуПодключенноеОборудование(ЭтотОбъект, Истина);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВывестиИнформациюНаДисплейПокупателя()

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

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

&НаСервере
Процедура ПоискПоШтрихкодуЗавершениеНаСервере(ДополнительныеПараметры)
	
	СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработатьДанныеШтрихкода", ДополнительныеПараметры);
	ПослеОбработкиШтрихкодов(ДополнительныеПараметры);

	ДополнительныеПараметры.РезультатОбработкиШтрихкода.ДобавленныеСтроки = Новый Массив;
	ДополнительныеПараметры.РезультатОбработкиШтрихкода.ИзмененныеСтроки  = Новый Массив;
	
КонецПроцедуры

// Параметры:
// 	Результат - Произвольный - результат обработки кода маркировки
// 	ДополнительныеПараметры - Неопределено - не используется
// 
&НаКлиенте
Процедура ОбработкаКодаМаркировкиВыполнитьДействие(Результат, ДополнительныеПараметры) Экспорт
	
	СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработкаКодаМаркировкиВыполнитьДействие", Результат);
	ОбработкаКодаМаркировкиВыполнитьДействиеСервер(Результат);
	СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ЗавершитьОбработкуШтрихкода", Результат);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОткрытьФормуУточненияДанных()
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ДанныеДляОбработки", ДанныеДляОбработки());

	СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Подключаемый_ОткрытьФормуУточненияДанных", ДополнительныеПараметры);

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

&НаКлиенте
Процедура Подключаемый_ПослеОбработкиШтрихкодов()
	
	ИзменятьКоличество = Не (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"));
	
	ШтрихкодированиеНоменклатурыКлиент.ОбработатьНеизвестныеШтрихкоды(ДанныеДляОбработки(),КэшированныеЗначения,ЭтотОбъект);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("КэшированныеЗначения", КэшированныеЗначения);
	ДополнительныеПараметры.Вставить("ДанныеДляОбработки", ДанныеДляОбработки);
	ДополнительныеПараметры.Вставить("СтандартнаяОбработка", Истина);
	СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПослеОбработкиШтрихкодов", ДополнительныеПараметры);
	КэшированныеЗначения = ДополнительныеПараметры.КэшированныеЗначения;

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

		КонецЕсли;
		
	КонецЕсли;
	
	Если ИзменятьКоличество Тогда
		ПересчитатьДокументНаКлиенте();
	КонецЕсли;
	
	Если ДанныеДляОбработки().ТекущаяСтрока <> Неопределено Тогда
		Элементы.Товары.ТекущаяСтрока = ДанныеДляОбработки().ТекущаяСтрока;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбработатьСтрокиТЧ(ДобавленныеСтроки, ИзмененныеСтроки, КэшированныеЗначения = Неопределено, ДействияПриИзмененииКоличества = Неопределено) Экспорт

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

	СтруктураДействийСИзмененнымиСтроками = Новый Структура;
	ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(СтруктураДействийСИзмененнымиСтроками,
		ДействияПриИзмененииКоличества, Истина);
	
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
		ДобавленныеСтроки,
		СтруктураДействийСДобавленнымиСтроками,
		Объект.Товары,
		КэшированныеЗначения);
	
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
		ИзмененныеСтроки,
		СтруктураДействийСИзмененнымиСтроками,
		Объект.Товары,
		КэшированныеЗначения);
	
	ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
	
	Если ДобавленныеСтроки.Количество() > 0 Тогда
		Элементы.Товары.ТекущаяСтрока = ДобавленныеСтроки[ДобавленныеСтроки.Количество() - 1].ПолучитьИдентификатор();
	ИначеЕсли ИзмененныеСтроки.Количество() > 0 Тогда
		Элементы.Товары.ТекущаяСтрока = ИзмененныеСтроки[ИзмененныеСтроки.Количество() - 1].ПолучитьИдентификатор();
	КонецЕсли;
	
	Если ДобавленныеСтроки.Количество()>0 Или ИзмененныеСтроки.Количество()>0 Тогда
		СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
	КонецЕсли;

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

&НаСервере
Функция ПослеОбработкиШтрихкодов(ДополнительныеПараметры)
	
	РезультатОбработкиШтрихкода = ДополнительныеПараметры.РезультатОбработкиШтрихкода; // - Структура
	КэшированныеЗначения        = ДополнительныеПараметры.КэшированныеЗначения;
	
	Если РезультатОбработкиШтрихкода.Свойство("ТребуетсяОбработкаШтрихкода") И РезультатОбработкиШтрихкода.ТребуетсяОбработкаШтрихкода Тогда
		
		ЗагрузкаИзТСД = Ложь;
		
		Если ТипЗнч(РезультатОбработкиШтрихкода.ИсходныеДанные) = Тип("Структура") Тогда
			ДанныеШтрихкодов = Новый Массив;
			ДанныеШтрихкодов.Добавить(РезультатОбработкиШтрихкода.ИсходныеДанные);
		Иначе
			ДанныеШтрихкодов = РезультатОбработкиШтрихкода.ИсходныеДанные;
		КонецЕсли;
		
		ИзменятьКоличество = Не (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"));

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

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

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

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

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

// Возвращаемое значение:
// 	см. ШтрихкодированиеНоменклатурыКлиентСервер.ПараметрыОбработкиШтрихкодов
&НаКлиенте
Функция ДанныеДляОбработки()
	
	Возврат ДанныеДляОбработки;
	
КонецФункции

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

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

#Область Серии

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

&НаСервере
Процедура ОбработатьУказаниеСерийСервер(ПараметрыФормыУказанияСерий)
	
	НоменклатураСервер.ОбработатьУказаниеСерий(Объект, ПараметрыУказанияСерий, ПараметрыФормыУказанияСерий);
	СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Серии");
	
КонецПроцедуры

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

&НаСервере
Функция ПараметрыФормыУказанияСерий(ТекущиеДанныеИдентификатор)
	
	Возврат НоменклатураСервер.ПараметрыФормыУказанияСерий(Объект, ПараметрыУказанияСерий, ТекущиеДанныеИдентификатор, ЭтотОбъект);
	
КонецФункции

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

#Область Наборы

&НаКлиентеНаСервереБезКонтекста
Функция КолонкиНабора()
	
	Колонки = Новый Массив;
	Колонки.Добавить("Номенклатура");
	Колонки.Добавить("Характеристика");
	
	Колонки.Добавить("Цена");
	Колонки.Добавить("Упаковка");
	Колонки.Добавить("Количество");
	Колонки.Добавить("КоличествоУпаковок");
	
	Колонки.Добавить("СтавкаНДС");
	Колонки.Добавить("СуммаНДС");
	Колонки.Добавить("Сумма");
	
	Возврат Колонки;
	
КонецФункции

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

&НаСервере
Процедура ПриУдаленииКомплектующихНаСервере(ИмяТЧ, ДополнительныйПараметр)
	НаборыСервер.ПриУдаленииКомплектующих(ЭтотОбъект, ИмяТЧ, ДополнительныйПараметр);
КонецПроцедуры

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

КонецФункции

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

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

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

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

#Область ПечатьЧека

&НаСервере
Функция ПараметрыОперацииФискализацииЧекаНаСервере()
	
	Возврат ПараметрыОперацииФискализацииЧекаНаСервереЛокализация();
	
КонецФункции

&НаКлиенте
Функция ПараметрыОперацииФискализацииЧека()
	
	Возврат ПараметрыОперацииФискализацииЧекаНаСервере();
	
КонецФункции

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

#Область ФискальнаяОперация

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

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

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

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

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

&НаКлиенте
Процедура ОткрытьОкноАвторизации()
	
	ОткрытьФорму("Документ.ЧекККМ.Форма.Авторизация", Новый Структура("Режим", "СменитьПрава"), ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПодтверждениеИзмененияСоставаПозиций(ОписаниеОповещенияОЗавершении)

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

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

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

&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзмененииПодтверждениеЗавершение(Результат, ДополнительныеПараметры) Экспорт

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

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

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

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

	Если Результат = КодВозвратаДиалога.Да Тогда
		ДанныеШтрихкодов = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(ДополнительныеПараметры.Параметр);
		ОбработатьШтрихкоды(ДанныеШтрихкодов);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаСервере
Функция ПоместитьТабличнуюЧастьТоварыВоВременноеХранилищеДляПроверкиКоличества(ВыгруженаТолькоНеМаркируемаяПродукция = Ложь)
	
	ТабличнаяЧастьТовары = Объект.Товары.Выгрузить();
	Если ТабличнаяЧастьТовары.Колонки.Найти("МаркируемаяПродукция") <> Неопределено Тогда
		НомерТекущейСтроки = ТабличнаяЧастьТовары.Количество()-1;
		Пока НомерТекущейСтроки >= 0 Цикл
			Если ТабличнаяЧастьТовары[НомерТекущейСтроки].МаркируемаяПродукция Тогда
				ТабличнаяЧастьТовары.Удалить(НомерТекущейСтроки);
				ВыгруженаТолькоНеМаркируемаяПродукция = Истина;
			КонецЕсли;
			НомерТекущейСтроки = НомерТекущейСтроки - 1;
		КонецЦикла;
	КонецЕсли;

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

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

			Если СтрокаИсточник.КоличествоУпаковок = 0 Тогда
				Прервать;
			КонецЕсли;
			
			Если СтрокаТЧ.КоличествоУпаковок = 0
				И СтрокаИсточник.КоличествоУпаковок < 0 Тогда
				Продолжить;
			КонецЕсли;
			
			Если СтрокаИсточник.КоличествоУпаковок >= 0 Тогда
				
				СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + СтрокаИсточник.КоличествоУпаковок;
				СтрокаИсточник.КоличествоУпаковок = 0;
				
			Иначе
				
				КоличествоКСписанию = -СтрокаИсточник.КоличествоУпаковок;
				КоличествоВСтроке   = СтрокаТЧ.КоличествоУпаковок;
				
				Если КоличествоКСписанию > КоличествоВСтроке Тогда
					СтрокаИсточник.КоличествоУпаковок = КоличествоВСтроке - КоличествоКСписанию;
					СтрокаТЧ.КоличествоУпаковок       = 0;
				Иначе
					СтрокаИсточник.КоличествоУпаковок = 0;
					СтрокаТЧ.КоличествоУпаковок       = КоличествоВСтроке - КоличествоКСписанию;
				КонецЕсли;
				
			КонецЕсли;
			
			Если СтрокаТЧ.КоличествоУпаковок = 0 Тогда
				
				Если УдаляемыеСтроки.Найти(СтрокаТЧ) = Неопределено Тогда
					УдаляемыеСтроки.Добавить(СтрокаТЧ);
				КонецЕсли;

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

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

	Для Каждого СтрокаТЧ Из УдаляемыеСтроки Цикл
		Объект.Товары.Удалить(СтрокаТЧ);
	КонецЦикла;

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий, Объект)
	
	СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
	СтруктураДействий.Вставить("ПересчитатьСумму");
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваЕдиниц(СтруктураДействий, Объект)
	
	СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
	СтруктураДействий.Вставить("ПересчитатьСумму");
	
КонецПроцедуры

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

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

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

	ИнформацияОбОплате.Вставить("ПлатежныеКартыОтменено", ОплатаПлатежнымиКартамиОтменено);
	ИнформацияОбОплате.Вставить("ПодарочныеСертификаты",  0);
	ИнформацияОбОплате.Вставить("БонусныеБаллы",          0);
	
	ИнформацияОбОплате.Вставить("СуммаДокумента",        Форма.СуммаДокумента);
	ИнформацияОбОплате.Вставить("СуммаКОплате",          СуммаБезСкидки);
	ИнформацияОбОплате.Вставить("СуммаСкидки",           0);
	
	ИнформацияОбОплате.Вставить("ДоступныеВидыОплаты",   РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(Форма));
	
	ИнформацияОбОплате.Вставить("ИтогоОплачено", ИнформацияОбОплате.Наличные + ОплатаПлатежнымиКартамиОтменено);
	
	ИнформацияОбОплатеЛокализация(Форма, ИнформацияОбОплате);

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьОтборСтрокТаблицыТовары(РежимОтображенияТоваровПоЧеку, ЭлементыТовары)
	ТоварыОтборСтрок = Новый Структура;
	Если Не РежимОтображенияТоваровПоЧеку Тогда
		ТоварыОтборСтрок.Вставить("ВозвращаемаяПозиция", Истина);	
	КонецЕсли;
	ЭлементыТовары.ОтборСтрок = Новый ФиксированнаяСтруктура(ТоварыОтборСтрок);	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоЧеку()

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

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

			КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
			
			СтруктураДействий = Новый Структура;
			СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");

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

#Область ОтменаОплатыПлатежнымиКартами

&НаКлиенте
Процедура ДополнитьПараметрыОтменыОплатыПлатежнымиКартами(ДополнительныеПараметры)
	
	ДополнительныеПараметры.Вставить("Форма",             ЭтотОбъект);
	ДополнительныеПараметры.Вставить("ДокументОснование", Объект.Ссылка);
	ДополнительныеПараметры.Вставить("Валюта",            Объект.Валюта);
	ДополнительныеПараметры.Вставить("ПараметрыКассыККМ", ПараметрыКассыККМ);
	
	Если ЭтоПолныйВозвратВСменуПродажи 
		И ДанныеПоЧекуККМ.КоличествоНеотмененныхОплатПлатежнымиКартами > 0 Тогда
		ДополнительныеПараметры.Вставить("ТипТранзакции",     "AuthorizeVoid");
	Иначе
		ДополнительныеПараметры.Вставить("ТипТранзакции",     "AuthorizeRefund");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьОплатыПлатежнымиКартами(Результат, ДополнительныеПараметры) Экспорт
	
	ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);

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

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

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

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

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

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

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

	// Дозаполнение данных эквайринговой операции в случае возврата произвольной суммы
	Если ДополнительныеПараметры.Свойство("ВозвратНаПлатежнуюКартуПроизвольнойСуммы") И ДополнительныеПараметры.ВозвратНаПлатежнуюКартуПроизвольнойСуммы = Истина Тогда
		СтрокаОплаты.НомерПлатежнойКарты = ДополнительныеПараметры.НомерКарты;
		СтрокаОплаты.СсылочныйНомер		 = ДополнительныеПараметры.СсылочныйНомер;
		СтрокаОплаты.НомерЧекаЭТ		 = ДополнительныеПараметры.НомерЧека;
		СтрокаОплаты.КодАвторизации		 = ДополнительныеПараметры.КодАвторизации;
	КонецЕсли;

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

// Вызывается из формы сложной оплаты
&НаКлиенте
Процедура ОтменитьОплату(Результат, ДополнительныеПараметры) Экспорт
	
	ВыполнитьОбработкуОповещения(
		Новый ОписаниеОповещения("ДобавитьОтменуОплатыКартой", ЭтотОбъект, ДополнительныеПараметры));
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОтменитьОплатуЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеВФормуОплаты, ИнформацияОбОплате(ЭтотОбъект));
	
КонецПроцедуры

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

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

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

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

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

	Форма.ИнформационнаяПанельСуммаКВозврату                  = ИнформацияОбОплате.СуммаКОплате;

	Форма.ИнформационнаяПанельСуммаКВозвратуПлатежнымиКартами = 0;   
	СуммаПоВидуОплатыПлатежнаяКарта = ?(Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"),
											ИнформацияОбОплате.ПлатежныеКартыОтменено, ИнформацияОбОплате.ПлатежныеКарты);
	Если СуммаПоВидуОплатыПлатежнаяКарта = 0 Тогда
		Форма.ИнформационнаяПанельСуммаКВозвратуНаличными         = ИнформацияОбОплате.СуммаКОплате;
	Иначе
		Форма.ИнформационнаяПанельСуммаКВозвратуНаличными         = ИнформацияОбОплате.СуммаКОплате - СуммаПоВидуОплатыПлатежнаяКарта;
		Форма.ИнформационнаяПанельСуммаКВозвратуПлатежнымиКартами = СуммаПоВидуОплатыПлатежнаяКарта;
	КонецЕсли;
	ИнформационнаяПанельЛокализация(Форма, ИнформацияОбОплате);
	
	КоличествоСтрокВТЧ = Форма.Объект.Товары.Количество();
	
	ТекущаяСтрока = Форма.Элементы.Товары.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ > 0 Тогда
		ТекущиеДанные = Форма.Объект.Товары[КоличествоСтрокВТЧ - 1];
		Форма.Элементы.Товары.ТекущаяСтрока = ТекущиеДанные.ПолучитьИдентификатор();
	ИначеЕсли ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ = 0 Тогда
		ТекущиеДанные = Неопределено;
	Иначе
		ТекущиеДанные = Форма.Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
	КонецЕсли;
	
	НаименованиеТовара = "";
	Если ТекущиеДанные <> Неопределено Тогда
		НаименованиеТовара = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(
			ТекущиеДанные.Номенклатура,
			ТекущиеДанные.Характеристика,
			,
			ТекущиеДанные.Серия);
	КонецЕсли;
	
	ОбязательныеРеквизиты = Новый Массив;
	ДанныеСтроки = Новый Структура;
	ПродавецТолькоКассир = Форма.КассирМожетБытьПродавцом И Не Форма.МенеджерТорговогоЗалаМожетБытьПродавцом;
	Если Не ПродавецТолькоКассир И ТекущиеДанные <> Неопределено Тогда
		ИмяРеквизитаИнформационнойПанели = "Продавец";
		ОбязательныеРеквизиты.Добавить(ИмяРеквизитаИнформационнойПанели);
		ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, ТекущиеДанные.Продавец);
	КонецЕсли;
	Если Форма.ПараметрыКассыККМ.ИспользоватьСкладскиеПомещения И ТекущиеДанные <> Неопределено Тогда
		ИмяРеквизитаИнформационнойПанели = "Помещение";
		ОбязательныеРеквизиты.Добавить(ИмяРеквизитаИнформационнойПанели);
		ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, ТекущиеДанные.Помещение);
	КонецЕсли;
	Если Форма.ИспользоватьКартыЛояльности И ТекущиеДанные <> Неопределено Тогда
		ИмяРеквизитаИнформационнойПанели = "Карта";
		ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, Форма.Объект.КартаЛояльности);
	КонецЕсли;
	
	СуммовыеПараметры = Новый Структура;
	СуммовыеПараметры.Вставить("Количество",                0);
	СуммовыеПараметры.Вставить("Цена",                      0);
	СуммовыеПараметры.Вставить("СуммаРучнойСкидки",         0);
	СуммовыеПараметры.Вставить("СуммаАвтоматическойСкидки", 0);
	СуммовыеПараметры.Вставить("Сумма",                     0);
	Если ТекущиеДанные <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(СуммовыеПараметры, ТекущиеДанные);
	КонецЕсли;
	
	Данные = Новый Структура;
	Данные.Вставить("НаименованиеТовара",    НаименованиеТовара);
	Данные.Вставить("ДанныеСтроки",          ДанныеСтроки);
	Данные.Вставить("СуммовыеПараметры",     СуммовыеПараметры);
	Данные.Вставить("ОбязательныеРеквизиты", ОбязательныеРеквизиты);
	
	Если ОтобразитьСдачу Тогда
		
		ТекстСдача = Новый ФорматированнаяСтрока(
			СтрШаблон(НСтр("ru = 'Получить сдачу: %1'"),
				Формат(ИнформацияОбОплате.ИтогоОплачено - ИнформацияОбОплате.СуммаКОплате, "ЧДЦ=2; ЧН=0.00")));
		
		Данные.Вставить("ОтобразитьСдачу", Истина);
		Данные.Вставить("ТекстСдача",      ТекстСдача);
		
	Иначе
		Данные.Вставить("ОтобразитьСдачу", Ложь);
	КонецЕсли;
	
	РозничныеПродажиКлиентСервер.ОбновитьДанныеИнформационнойПанели(Форма, Данные);
	
КонецПроцедуры

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

&НаСервере
Процедура ОбновитьЗаголовокФормы()
	
	Заголовок = НСтр("ru = 'Возврат (Кассир: %Кассир%, Продавец: %Продавец%)'");
	Заголовок = СтрЗаменить(Заголовок, "%Кассир%", Объект.Кассир);
	Заголовок = СтрЗаменить(Заголовок, "%Продавец%", ?(ЗначениеЗаполнено(ТекущийПродавец),ТекущийПродавец, НСтр("ru='<Не выбран>'")));
	
КонецПроцедуры

&НаКлиенте 
Процедура ОбновитьЗаголовкиКнопокФормы()
	
	Если ЗаголовкиКнопокНастроены Тогда
		Возврат;
	КонецЕсли;
	
	ОбновитьЗаголовкиКнопокФормыНаСервере();
	
КонецПроцедуры

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

&НаСервере
Процедура ПриСозданииЧека()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команды[ИмяКоманды], Объект);

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

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

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

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

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

&НаКлиенте
Процедура ЗагрузитьНовыйЧекФрагмент()
	
	ПересчитатьДокументНаКлиенте();
	
КонецПроцедуры

// Параметры:
//  Результат - Булево, Неопределено - 
// 	ДополнительныеПараметры - Структура:
// 		* Ссылка - ДокументСсылка
&НаКлиенте
Процедура ЗагрузитьНовыйЧекЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	НовыйЧекНаСервере(ДополнительныеПараметры.Ссылка);
	
	ЗагрузитьНовыйЧекФрагмент();
	
КонецПроцедуры

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

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

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

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

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

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

	ЗаполнитьДанныеПоЧекуККМ();
	
	ПриСозданииЧека();
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьЭлементовРМК(Форма, ДоступныеВидыОплаты)
	
	ЕстьВозвращаемыеПозиции = (Форма.Объект.Товары.Количество() > 0);
	Форма.Элементы.ОплатитьНаличными.Доступность = ЕстьВозвращаемыеПозиции;
	Форма.Элементы.ОплатитьКартой.Доступность    = ЕстьВозвращаемыеПозиции;
	Форма.Элементы.СмешаннаяОплата.Доступность   = ЕстьВозвращаемыеПозиции;
	
	Если ДоступныеВидыОплаты.ПлатежныеКарты Тогда
		Если Форма.ОбщаяСуммаОплатыПлатежнымиКартами > Форма.СуммаДокумента Тогда
			Форма.Элементы.ОплатитьКартой.Доступность = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	УстановитьДоступностьЭлементовРМКЛокализация(Форма, ДоступныеВидыОплаты);
	
КонецПроцедуры

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

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

	НастроитьРМК();
	
КонецПроцедуры

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

&НаСервере
Функция ИсправитьПревышениеКоличестваУпаковокПоДаннымНевозвращенныхПозиций(ДополнительныеПараметры)

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПревышеноКоличествоУпаковокНевозвращенныхПозицийВСтроке(СтрокаДляПроверки, КоличествоУпаковокДляПроверки)

	Результат = Ложь;
	Если КоличествоУпаковокДляПроверки > СтрокаДляПроверки.КоличествоУпаковокПоЧеку Тогда
		Результат = Истина;
		ТекстОшибки = НСтр("ru = 'Возвращаемое количество ""%Номенклатура%"" не может быть больше, чем указано в чеке продажи.'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Номенклатура%", СтрокаДляПроверки.Номенклатура);

		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			ТекстОшибки,
			,
			,
			,);
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

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

&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователюЧтоПозицияНеУказанаВЧекеПродажи(ОтборПоНоменклатуре)

		ТекстОшибки = НСтр("ru = 'Нельзя вернуть позицию ""%Номенклатура%"", так как она не указана в чеке продажи.'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Номенклатура%", ОтборПоНоменклатуре.Номенклатура);
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			ТекстОшибки,
			,
			,
			,);
			
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователюЧтоШтрихкодНеНайденВЧекеПродажи(Штрихкод)

		ТекстОшибки = НСтр("ru = 'Позиция со штрихкодом ""%Штрихкод%"" не найдена в чеке продажи.'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Штрихкод%", Штрихкод);
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			ТекстОшибки,
			,
			,
			,);
			
КонецПроцедуры

// Возвращает признак использования складом помещений на указанную дату.
//
// Параметры:
// 	Склад - СправочникСсылка.Склады - склад.
// 	Дата - Дата - дата получения признака.
//
// Возвращаемое значение:
// 	Булево.
//
&НаСервереБезКонтекста
Функция ИспользоватьСкладскиеПомещения(Склад, Дата)
	
	Возврат СкладыСервер.ИспользоватьСкладскиеПомещения(Склад,
		?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
	
КонецФункции

&НаСервере
Функция ПолучитьЦенуПоОтбору(Номенклатура, Характеристика, Серия, Упаковка)
	
	СтруктураПараметровОтбора = Новый Структура;
	СтруктураПараметровОтбора.Вставить("Валюта", Объект.Валюта);
	СтруктураПараметровОтбора.Вставить("Дата", ТекущаяДатаСеанса());
	СтруктураПараметровОтбора.Вставить("ВидЦены", Объект.ВидЦены);
	СтруктураПараметровОтбора.Вставить("Номенклатура", Номенклатура);
	СтруктураПараметровОтбора.Вставить("Характеристика", Характеристика);
	СтруктураПараметровОтбора.Вставить("Серия", Серия);
	СтруктураПараметровОтбора.Вставить("Упаковка", Упаковка);
	
	Возврат ЦеныПредприятияЗаполнениеСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
	
КонецФункции

&НаСервере
Процедура ДобавитьПроверкуАссортиментаВСтруктуруДействий(СтруктураДействий)
	
	СтруктураПроверкиАссортимента = АссортиментКлиентСервер.ПараметрыПроверкиАссортимента();
	СтруктураПроверкиАссортимента.Ссылка = Объект.Ссылка;
	СтруктураПроверкиАссортимента.Склад = Объект.Склад;
	СтруктураПроверкиАссортимента.Дата = Объект.Дата;
	СтруктураПроверкиАссортимента.ТекстСообщения = НСтр("ru = 'Товар %1 не включен в ассортимент магазина или запрещен к продаже.'");
	СтруктураПроверкиАссортимента.ИмяРесурсаАссортимента = "РазрешеныПродажи";
	СтруктураПроверкиАссортимента.ПровереноМожноДобавлять = Истина;
	СтруктураПроверкиАссортимента.РазрешатьДобавление = Ложь;
	
	СтруктураДействий.Вставить("ПроверитьАссортиментСтроки", СтруктураПроверкиАссортимента);
	
КонецПроцедуры

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

&НаСервере
Процедура НастроитьРМК()
	
	УстановитьПривилегированныйРежим(Истина);
	
	ПолучитьСсылкиНаОборудование();
	
	Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
		Элементы.СуммаКВозврату.Ширина                  = 22;
		Элементы.СуммаКВозвратуПлатежнымиКартами.Ширина = 22;
		Элементы.СуммаКВозвратуНаличными.Ширина         = 22;
	КонецЕсли;

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

	Элементы.ДекоративноеПолеГруппаСуммаКВозврату1.Видимость = Не Элементы.ОплатитьКартой.Видимость;
	Элементы.ДекоративноеПолеГруппаСуммаКВозврату2.Видимость = Истина;
	Элементы.СуммаКВозвратуПлатежнымиКартами.Видимость = Элементы.ОплатитьКартой.Видимость;
	
	ЭлементыНаПерегруппировку = Новый Массив;
	ЭлементыНаПерегруппировку.Добавить(Элементы.БыстрыеТовары);
	
	Для Каждого Подгруппа Из Элементы.ГруппаНижняяКоманднаяПанельКонтекстныеКоманды.ПодчиненныеЭлементы Цикл
		Для Каждого Элемент Из Подгруппа.ПодчиненныеЭлементы Цикл
			ЭлементыНаПерегруппировку.Добавить(Элемент);
		КонецЦикла;
	КонецЦикла;
	
	ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьНаличными);
	ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьКартой);
	ЭлементыНаПерегруппировку.Добавить(Элементы.СмешаннаяОплата);
	
	НастроитьРМКЛокализация(ДоступныеВидыОплаты, ЭлементыНаПерегруппировку);
	
	РозничныеПродажи.ПерегруппироватьКнопкиФормы(ЭтотОбъект, ЭлементыНаПерегруппировку);
	
	РозничныеПродажи.НастроитьКомандыПечати(ЭтотОбъект, Элементы.ПеремещаемыеКнопки);
	
КонецПроцедуры

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

&НаСервере
Процедура ОбновитьСостояниеКассовойСмены()
	
	Если ЗначениеЗаполнено(Объект.КассаККМ)
		И Объект.Статус <> Перечисления.СтатусыЧековККМ.Пробит Тогда

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

		ТекущийПользователь = Пользователи.ТекущийПользователь();
		Если Объект.Кассир <> ТекущийПользователь 
			И НЕ ЗначениеЗаполнено(Объект.Кассир) Тогда

			Объект.Кассир = ТекущийПользователь;
		КонецЕсли;

	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДанныеПоЧекуККМ()

	ДанныеПоЧекуККМ = Новый Структура;
	ДанныеПоЧекуККМ.Вставить("КассоваяСмена", ПредопределенноеЗначение("Документ.КассоваяСмена.ПустаяСсылка"));
	ДанныеПоЧекуККМ.Вставить("СтатусКассовойСмены", ПредопределенноеЗначение("Перечисление.СтатусыКассовойСмены.ПустаяСсылка"));	
	ДанныеПоЧекуККМ.Вставить("СуммаДокумента", 0);
	ДанныеПоЧекуККМ.Вставить("АдресТаблицыНеотмененныхОплатПлатежнымиКартами", "");
	ДанныеПоЧекуККМ.Вставить("АдресТаблицыНевозвращенныхПозиций", "");
	ДанныеПоЧекуККМ.Вставить("КомбинацииСуммНеотмененныхОплатПлатежнымиКартами", Новый Массив);	
	ДанныеПоЧекуККМ.Вставить("НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой", 0);
	ДанныеПоЧекуККМ.Вставить("КоличествоНеотмененныхОплатПлатежнымиКартами", 0);
	ДанныеПоЧекуККМ.Вставить("ДанныеПервойНеотмененнойОплатыПлатежнымиКартами", Неопределено);
	ДанныеПоЧекуККМ.Вставить("НомераСтрокОтменяемыхОплатПлатежнойКартой", Новый Соответствие);
	
	Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
	
		РеквизитыЧекККМ = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.ЧекККМ, "КассоваяСмена,СуммаДокумента");
		ДанныеПоЧекуККМ.КассоваяСмена = РеквизитыЧекККМ.КассоваяСмена;
		ДанныеПоЧекуККМ.СуммаДокумента = РеквизитыЧекККМ.СуммаДокумента;
		
		//@skip-check bsl-legacy-check-string-literal
		СтатусКассовойСмены = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеПоЧекуККМ.КассоваяСмена, "Статус");
		ДанныеПоЧекуККМ.СтатусКассовойСмены = СтатусКассовойСмены;

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

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

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

&НаСервере
Процедура УстановитьВидимостьЭлементовФормы()
	
	Элементы.ОплатитьЭСФСС.Видимость = Ложь;
	Элементы.ОплатитьСБП.Видимость = Ложь;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДанныеНеотмененныхОплатПлатежнымиКартамиПоЧекуККМ()

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

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

#Область БыстрыеТоварыИОбработкаПроверкиКоличества

&НаСервере
Процедура ДобавитьВКорзинуНаСервере(ПараметрыТовара, НовыеСтроки)
	
	ИспользоватьСкладскиеПомещения = ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата);
	
	// Ограничивает строки, используемые для подготовки исходных данных, при выполнении пакетной обработки строк табличной части.
	ДобавленныеСтрокиДляОбработки = Новый Массив;
	// Используется для получения данных о погрешности вычисления сумм из параметра НовыеСтроки в привязке к добавляемым строкам табличной части Товары.
	СвязьДобавленныхИНовыхСтрок = Новый Соответствие;
	
	Погрешности = Новый Соответствие();
	
	ИзмененныеСтрокиДляОбработки = Новый Массив;
	Для Каждого СтрокаТовара Из НовыеСтроки Цикл
		
		Если СтрокаТовара.Упаковка.Пустая() Тогда
			СтрокаТовара.Упаковка = ПодборТоваровВызовСервера.ПолучитьУпаковкуХранения(СтрокаТовара.Номенклатура);
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(СтрокаТовара.Цена) И ПараметрыТовара.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Набор Тогда
			СтрокаТовара.Цена = ПолучитьЦенуПоОтбору(СтрокаТовара.Номенклатура, СтрокаТовара.Характеристика, СтрокаТовара.Серия, СтрокаТовара.Упаковка);
		КонецЕсли;
		
		Отбор = Новый Структура;
		Отбор.Вставить("НоменклатураНабора",   СтрокаТовара.НоменклатураНабора);
		Отбор.Вставить("ХарактеристикаНабора", СтрокаТовара.ХарактеристикаНабора);
		Отбор.Вставить("Номенклатура",   СтрокаТовара.Номенклатура);
		Отбор.Вставить("Характеристика", СтрокаТовара.Характеристика);
		Отбор.Вставить("Упаковка",       СтрокаТовара.Упаковка);
		Отбор.Вставить("Цена",           СтрокаТовара.Цена);
		Отбор.Вставить("Помещение",      СтрокаТовара.Помещение);
		
		РезультатПоиска = Объект.Товары.НайтиСтроки(Отбор);
		
		Если РезультатПоиска.Количество() = 0 ИЛИ СтрокаТовара.Погрешность <> 0 Тогда
			
			ТекущаяСтрока = Объект.Товары.Добавить();
			
			ЗаполнитьЗначенияСвойств(ТекущаяСтрока, ПараметрыТовара);
			ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
			ТекущаяСтрока.ИндексНабора = ?(ЗначениеЗаполнено(ТекущаяСтрока.НоменклатураНабора), 1, 0);
			ДобавленныеСтрокиДляОбработки.Добавить(ТекущаяСтрока);
			Погрешности.Вставить(ТекущаяСтрока, СтрокаТовара.Погрешность);
			СвязьДобавленныхИНовыхСтрок.Вставить(ТекущаяСтрока, СтрокаТовара);
		Иначе
			
			ТекущаяСтрока = РезультатПоиска[0];
			
			ТекущаяСтрока.КоличествоУпаковок = СтрокаТовара.КоличествоУпаковок + ТекущаяСтрока.КоличествоУпаковок;
			ИзмененныеСтрокиДляОбработки.Добавить(ТекущаяСтрока);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Если ДобавленныеСтрокиДляОбработки.Количество() Или	ИзмененныеСтрокиДляОбработки.Количество() Тогда
		Если ДобавленныеСтрокиДляОбработки.Количество() Тогда
			КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
			
			СтруктураДействий = Новый Структура;
			
			Если ИспользоватьСкладскиеПомещения Тогда
				СтруктураДействий.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
			КонецЕсли;
			
			Если КассирМожетБытьПродавцом И НЕ МенеджерТорговогоЗалаМожетБытьПродавцом Тогда
				СтруктураДействий.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
			КонецЕсли;

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

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

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

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

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	НовыеСтроки = Новый Массив;

	Для Каждого ПодобранныйТовар Из Результат.ПодобранныеТовары Цикл

		НоваяСтрока = ПодборТоваровКлиентСервер.ПараметрыТовара();

		ЗаполнитьЗначенияСвойств(НоваяСтрока, ДополнительныеПараметры);
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ПодобранныйТовар);

		НовыеСтроки.Добавить(НоваяСтрока);

	КонецЦикла;

	ПараметрыДанных = Новый Структура;
	ПараметрыДанных.Вставить("НовыеСтроки", НовыеСтроки);
	ПараметрыДанных.Вставить("ПараметрыТовара", ДополнительныеПараметры.ПараметрыТовара);

	ДобавитьВКорзинуФрагмент(ПараметрыДанных);

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

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

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

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

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

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

&НаСервере
Процедура НастроитьРМКЛокализация(ДоступныеВидыОплаты, ЭлементыНаПерегруппировку)
	
	//++ Локализация
	Элементы.ОплатитьСБП.Видимость       = ДоступныеВидыОплаты.СБП И ОбщаяСуммаОплатыСБП > 0
	                                          ИЛИ ДоступныеВидыОплаты.СБП И Не ЗначениеЗаполнено(Объект.ЧекККМ);
	
	Элементы.ОплатитьНаличными.Видимость = Элементы.ОплатитьНаличными.Видимость И ОбщаяСуммаОплатыЭСФСС = 0
	                                          ИЛИ Элементы.ОплатитьСБП.Видимость;
	                                          
	Элементы.ОплатитьКартой.Видимость    = Элементы.ОплатитьКартой.Видимость И ОбщаяСуммаОплатыЭСФСС = 0;
	Элементы.ОплатитьСБП.Видимость       = Элементы.ОплатитьСБП.Видимость И ОбщаяСуммаОплатыЭСФСС = 0;
	Элементы.СмешаннаяОплата.Видимость   = Элементы.СмешаннаяОплата.Видимость
											ИЛИ (Элементы.ОплатитьСБП.Видимость И ОбщаяСуммаОплатыЭСФСС = 0 И СуммаДокумента <> ОбщаяСуммаОплатыСБП);
	
	Элементы.ОплатитьЭСФСС.Видимость = ДоступныеВидыОплаты.ЭСФСС И ОбщаяСуммаОплатыЭСФСС > 0;
	ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьЭСФСС);
	
	ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьСБП);
	
	Элементы.ДекоративноеПолеГруппаСуммаКВозврату2.Видимость = Не Элементы.ОплатитьСБП.Видимость;
	Элементы.СуммаКВозвратуСБП.Видимость = Элементы.ОплатитьСБП.Видимость;	
	//-- Локализация
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ПечатьЧекаПослеЗаписиИзмененийЛокализация(ПараметрыОперацииФискализацииЧека)
	
	//++ Локализация
	ФорматноЛогическийКонтрольКлиентСервер.ПровестиФорматноЛогическийКонтроль(ПараметрыОперацииФискализацииЧека, ПараметрыКассыККМ.ИдентификаторУстройства);
	
	ВыполнитьДействиеПослеЗаписи(
		Новый ОписаниеОповещения("ПробитьЧекПослеПроведения", ЭтотОбъект, ПараметрыОперацииФискализацииЧека),
		НСтр("ru = 'Перед выполнением операции пробития чека не удалось провести документ.'"));
	
	Возврат;
	//-- Локализация
	
	//@skip-warning
	УстановитьФискальныйСтатусПробит();
	
	РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
	
КонецПроцедуры

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ИнформационнаяПанельЛокализация(Форма, ИнформацияОбОплате)
	
	//++ Локализация
	СуммаПоВидуОплатыСБП = ?(Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"),
								ИнформацияОбОплате.СБПОтменено, ИнформацияОбОплате.СБП);
	Если СуммаПоВидуОплатыСБП > 0 Тогда
		
		ОбщаяСуммаОплатыПлатежнымиКартамиИСБП = Мин(ИнформацияОбОплате.СуммаКОплате, Форма.ИнформационнаяПанельСуммаКВозвратуПлатежнымиКартами + СуммаПоВидуОплатыСБП);
		
		Форма.ИнформационнаяПанельСуммаКВозвратуНаличными  = ИнформацияОбОплате.СуммаКОплате - ОбщаяСуммаОплатыПлатежнымиКартамиИСБП;
		
	КонецЕсли;
	
	Форма.ИнформационнаяПанельСуммаКВозвратуСБП = СуммаПоВидуОплатыСБП;
	//-- Локализация
	
КонецПроцедуры

&НаКлиенте
Процедура НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении)
	
//++ Локализация

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

	ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, КодВозвратаДиалога.Да);
	
КонецПроцедуры

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

//++ Локализация

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

&НаКлиенте
Процедура ПечатьЧека_ПослеОткрытияЧека(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	
	ПараметрыЛокализации = Новый Структура;
	ПараметрыЛокализации.Вставить("ПараметрыВыполнения",     ПараметрыВыполнения);
	ПараметрыЛокализации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
	ПараметрыЛокализации.Вставить("СтандартнаяОбработка",    Истина);
	СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПечатьЧека_ПослеОткрытияЧека", ПараметрыЛокализации);

	Если ПараметрыЛокализации.СтандартнаяОбработка Тогда
		ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОповещениеПродолжения, ПараметрыВыполнения);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Функция ЗаписатьФискальнуюОперациюНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи, РеквизитыФискальнойОперацииКассовогоУзла)
	
	Результат = ЗаписатьФискальнуюОперациюНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, РеквизитыФискальнойОперацииКассовогоУзла);
	
	Если Результат Тогда
		Оповестить("Запись_ЧекККМВозврат", Новый Структура, Неопределено);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

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

&НаСервере
Функция ПараметрыПередачиДанныхФискальногоЧека(ДокументОснование, СуммаСертификатамиЭСФСС)
	
	Возврат ЭлектронныеСертификатыНСПКУТ.ПараметрыПередачиДанныхФискальногоЧека(ДокументОснование, СуммаСертификатамиЭСФСС);
	
КонецФункции

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

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

&НаСервере
Процедура ДобавитьЗаписьПоНеотправленномуВНСПКФискальномуЧеку(ЧекККМ, ТекстСообщения)
	
	ЭлектронныеСертификатыНСПКУТ.ДобавитьЗаписьПоНеотправленномуВНСПКФискальномуЧеку(ЧекККМ, ТекстСообщения);
	
КонецПроцедуры

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

	НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении);
	
КонецПроцедуры

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

&НаСервере
Функция ТоварыФССКОплате()
	
	Возврат ЧекККМВозвратЛокализация.ТоварыФССВДокументеКОплате(
				Объект.Товары.Выгрузить(),
				Объект.ЦенаВключаетНДС);
	
КонецФункции

&НаСервереБезКонтекста
Функция СуммаОплатыЭСФССПоДокументу(ЗНАЧ ОплатыПлатежнойКартой)
	
	Возврат РозничныеПродажиЛокализация.СуммаОплатыЭСФССПоДокументу(ОплатыПлатежнойКартой.Выгрузить());
	
 КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ОплатыЭСФСС(ЗНАЧ ОплатаПлатежнымиКартами)
	
	ОтборОплатыЭСФСС = Новый Структура("ВидОплаты", ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.СертификатНСПК"));
	Возврат ОплатаПлатежнымиКартами.НайтиСтроки(ОтборОплатыЭСФСС);
	
КонецФункции

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

	НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении);
	
КонецПроцедуры

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

&НаСервере
Функция СкладКассыККМ(КассаККМ)
	РеквизитСклада = "Склад";
	Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КассаККМ, РеквизитСклада);
КонецФункции

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

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

//-- Локализация

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

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