Чек ККМ / Рабочее место кассира / Модуль формы

файл
#Область ОписаниеПеременных

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

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

// ++ Локализация
&НаКлиенте
Перем КэшКодовТРУ;
// -- Локализация

&НаКлиенте
Перем УИДЗамераПроверкаКодаМаркировкиСредствамиККТ;

&НаКлиенте
Перем УИДЗамераПечатьСлипЧека;

&НаКлиенте
Перем УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве;

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

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

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

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

	ПриСозданииЧека();
	
	ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

	// ПодключаемоеОборудование
	Если Источник = "ПодключаемоеОборудование" И ВводДоступен()
		И Не ТолькоПросмотр Тогда
		Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ++ Локализация
	ОтменитьИзменениеВПравахРедактированияКоличестваЛокализация();
	КонтрольКодовТРУ();
// -- Локализация
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

// ++ Локализация
	КонтрольКодовТРУ();
// -- Локализация
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
	Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<характеристики не используются>'"));
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	//

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

	//

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПриОкончанииРедактированияНабора(АдресВоВременномХранилище)

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

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

#Область РасчетСкидок

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ПриИзмененииРеквизитов

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

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

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

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

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

#Область ЦенообразованиеИСкидки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Функция СтруктураСообщений()
	
	Возврат СкидкиНаценкиЗаполнениеСервер.СтруктураСообщений(Объект);
	
КонецФункции

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

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

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

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

&НаСервере
Процедура ЗагрузитьТабличнуюЧастьПодарочныеСертификатыИзХранилища(АдресВХранилище)
	
	Объект.ПодарочныеСертификаты.Загрузить(ПолучитьИзВременногоХранилища(АдресВХранилище));
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

	КонецЦикла;

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

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

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

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

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

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

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

		ЗаполнитьЗначенияСвойств(Отбор, СтрокаИсточник);
		НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);
		
		Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл

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

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

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

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

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

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

&НаКлиенте
Процедура ОбработатьШтрихкоды(ДанныеШтрихкодов, ЗагрузкаИзТСД = Ложь, НеизвестныеШтрихкоды = Ложь)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	Если Не ДополнительныеПараметры.СтандартнаяОбработка Тогда
		Возврат;
	КонецЕсли;

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

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

	СтруктураДействийОкругление = Новый Структура;
	ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийОкругление, Объект);
	
	СтрокиСОкруглением = Новый Массив();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//
#Область КомандыРаботыСЧеком

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

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

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

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

&НаСервере
Функция ВыполнитьЧастьРасчетаНаСервере(ВозвращенноеЗначениеУправляемыеСкидки, ТребуетсяПовторнаяПопыткаЗаписи)

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

	Возврат Новый Структура("РасчетВыполненУспешно, СтруктураСообщений", Результат, СтруктураСообщений);
	
КонецФункции

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

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

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

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

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

#Область Оплата

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

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

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


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

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

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


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

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


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

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

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

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


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

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

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

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

&НаКлиенте
Процедура ДобавитьОплатуПодарочнымСертификатомЗавершение(АдресВХранилище, ДополнительныеПараметры) Экспорт
	
	Если ЗначениеЗаполнено(АдресВХранилище) Тогда
		
		ЗагрузитьТабличнуюЧастьПодарочныеСертификатыИзХранилища(АдресВХранилище);
		
	КонецЕсли;
	
	ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
	
КонецПроцедуры

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

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

#Область ОплатаСлужебные

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

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

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

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

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

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

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

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

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

	ДополнительныеПараметры.Вставить("ПоказатьКнопкуОтменитьОплатыПоследовательно", Ложь);
	ДополнительныеПараметры.Вставить("ПоказыватьТолькоОплатыПлатежнымиКартами", Истина);
	ДополнительныеПараметры.Вставить("СуммаДокумента", СуммаДокумента);

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

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

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

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

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

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

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

	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеВФормуОплаты, ИнформацияОбОплате);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЗагрузитьНовыйЧекФрагмент()
	
	АдресПримененныхСкидокВоВременномХранилище = "";
	УправляемыеСкидки = Новый СписокЗначений;
	
	ПересчитатьДокументНаКлиенте();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьТекущийЭлементНаКнопкуНовыйЧек()
	
	ТекущийЭлемент = Элементы.НовыйЧек;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьТекущийЭлементНаТабличнуюЧастьТовары()
	
	ТекущийЭлемент = Элементы.Товары;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УправлениеДоступностьюКнопокОплатыЛокализация(Форма, ИнформацияОбОплате)

	//++ Локализация
	ОплатаКартойНачатаЧекНеПробит = ((Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
										Или Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате")) 
										И ИнформацияОбОплате.ПлатежныеКарты <> 0);

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

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

	Если ИнформацияОбОплате.СБП > 0 ИЛИ ИнформацияОбОплате.СБПОжидание > 0 ИЛИ ОплатаЭСФССНачатаЧекНеПробит Тогда
		Элементы.ОплатитьЭСФСС.Доступность = Ложь;
		Элементы.ОплатитьПодарочнымСертификатом.Доступность = Ложь;
		Элементы.ОплатитьНаличными.Доступность = Ложь;
		Элементы.ОплатитьКартой.Доступность = Ложь;
		Если ОплатаЭСФССНачатаЧекНеПробит Тогда
			Элементы.ОплатитьЭСФСС.Доступность = Истина;
			Элементы.СмешаннаяОплата.Доступность = Ложь;
		КонецЕсли;	
	КонецЕсли;
	//-- Локализация
	
КонецПроцедуры

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

		Элементы.ПоискПоШтрихкоду.Доступность = Ложь;
		Элементы.СчитатьКартуЛояльности.Доступность = Ложь;
		Элементы.ОткрытьПодбор.Доступность = Ложь;
		Элементы.ОтменитьОплатыПлатежнымиКартами.Доступность = Ложь;
		Элементы.ФормаБыстрыеТовары.Доступность = Ложь;
		Элементы.БыстрыеТовары.Доступность = Ложь;
		Элементы.РассчитатьСкидки.Доступность = Ложь;
		
		Элементы.ГруппаНижняяКоманднаяПанельКонтекстныеКоманды.Доступность = Ложь;
		
		Элементы.Товары.ИзменятьСоставСтрок    = Ложь;
		
		Элементы.КонтекстноеМенюОбластьКорзиныТоварыДобавить.Доступность    = Ложь;
		Элементы.КонтекстноеМенюОбластьКорзиныТоварыСкопировать.Доступность = Ложь;

		Элементы.ТоварыУпаковкаЕдиницаИзмерения.ТолькоПросмотр = Истина;
		Элементы.ТоварыКоличествоУпаковок.ТолькоПросмотр = Истина;
		Элементы.ТоварыНоменклатура.ТолькоПросмотр       = Истина;
		Элементы.ТоварыШтрихкод.ТолькоПросмотр           = Истина;
		Элементы.ТоварыХарактеристика.ТолькоПросмотр     = Истина;
		Элементы.ТоварыПродавец.ТолькоПросмотр           = Истина;
	КонецЕсли;
	
	//-- Локализация
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Функция ТребуетсяОтложитьЧекПриЗавершенииОтменыОплатыЛокализация(ИнформацияОбОплате)
	Результат = Ложь;
	
	//++ Локализация
	Результат = (ИнформацияОбОплате.СБП > 0);
	//-- Локализация
	
	Возврат Результат;
КонецФункции

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

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

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

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

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

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

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

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

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

&НаСервере
Функция ПодбиратьКодыМаркировкиВскрытыхПотребительскихУпаковокПоFIFOЛокализация()
	
	//++ Локализация
	Возврат ОбщегоНазначенияИСМПКлиентСерверПовтИсп
				.НастройкиСканированияКодовМаркировки()
				.ПодбиратьКодыМаркировкиВскрытыхПотребительскихУпаковокПоFIFO;
	//-- Локализация
	
	Возврат Истина;
	
КонецФункции

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

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

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

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

&НаКлиенте
Процедура УказатьРазрешениеНаПродажуЛокализация()
	
	//++ Локализация
	
	Если Элементы.Товары.ВыделенныеСтроки.Количество() > 1 Тогда
		УказатьРазрешениеНаПродажуВСценарииНесколькихСтрок();
	ИначеЕсли Элементы.Товары.ВыделенныеСтроки.Количество() = 1 Тогда
		УказатьРазрешениеНаПродажуВСценарииОднойСтроки();
	КонецЕсли;
	
	//-- Локализация
	
КонецПроцедуры

#Область ДополнительноеОписаниеКеги

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

&НаКлиенте
Процедура ОбработатьПопыткуИзмененияКоличестваЛокализация()
	
	//++ Локализация
	Если НЕ АктивированаКолонкаКоличество Тогда
		Возврат;
	КонецЕсли;
	
	РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
	
	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	
	Если ТекущиеДанные <> Неопределено Тогда
	
		Отбор = Новый Структура();
		Отбор.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
		Отбор.Вставить("Характеристика", ТекущиеДанные.Характеристика);
		Отбор.Вставить("Серия", ТекущиеДанные.Серия);
		
		ВскрытиеУпаковкиПоНоменклатуре = ИнформацияПоВскрытымУпаковкам.НайтиСтроки(Отбор);
		
		Если ВскрытиеУпаковкиПоНоменклатуре.Количество() > 1 Тогда
			ТекстСообщения = НСтр("ru='Вскрыто несколько кег. Для увеличения количества продажи используйте функционал
						|быстрых товаров (кнопка «Быстрые товары») или форму подбора (кнопка «Подобрать»).
						|Для уменьшения количества используйте форму подбора и проверки (кнопка «Акцизные марки»).'");
			ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
		КонецЕсли;
		
	КонецЕсли;
	//-- Локализация
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция ДополнительноеОписаниеТовараДляИныхВидовПродукцииИС(
	КодМаркировки,
	УпаковкаЧастичногоВыбытия,
	ВскрытаОднаУпаковка,
	Остаток)
	
	ОписаниеУпаковки = "";
	
	Текст = СтрШаблон(НСтр("ru = '%1: остаток %2 %3;'"), КодМаркировки, Окр(Остаток, 0), УпаковкаЧастичногоВыбытия);
	Если ВскрытаОднаУпаковка Тогда
		Текст = СтрШаблон(НСтр("ru = 'остаток %1 %2;'"), Окр(Остаток, 0), УпаковкаЧастичногоВыбытия);
	КонецЕсли;
	
	ОписаниеУпаковки = Новый ФорматированнаяСтрока(Текст, , ЦветаТекстаПодсказки().Предупреждение);
	
	Возврат ОписаниеУпаковки;
	
КонецФункции

// Цвета текста подсказки остатка в упаковке.
// 
// Возвращаемое значение:
//  Структура - Цвета текста подсказки:
// * Проблема - Цвет - Выделение цветом текста в случае минусового остатка
// * Предупреждение - Цвет - Выделение цветом текста в случае остатка меньше либо равном заданного значения
&НаСервереБезКонтекста
Функция ЦветаТекстаПодсказки()
	
	ЦветаТекстаПодсказки = Новый Структура;
	ЦветаТекстаПодсказки.Вставить("Проблема", ЦветаСтиля["ЦветТекстаПроблема"]);
	ЦветаТекстаПодсказки.Вставить("Предупреждение", ЦветаСтиля["ЦветТекстаПредупреждениеEDI"]);
	
	Возврат ЦветаТекстаПодсказки;
	
КонецФункции

// Возвращает минимальный объем остатка в кеге для вывода подсказки (предупреждения) пользователю
// 
// Возвращаемое значение:
//  Число - Минимальный объем остатка в кеге для предупреждения
&НаСервереБезКонтекста
Функция МинимальныйОбъемОстаткаВКегеДляПредупреждения()
	
	Возврат 5;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

			Элементы.ОплатитьЭСФСС.Доступность = (Не ПолучитьИдентификаторКорзиныОплатыЭСФСС(Объект.ОплатаПлатежнымиКартами) = Неопределено);

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

			Элементы.ОплатитьЭСФСС.Доступность = Истина;
		КонецЕсли;
	
	КонецЕсли;
	
КонецПроцедуры

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

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

// Возвращаемое значене:
//	Структура:
// 	 *ВсеКодыТРУ - Соответствие:
//   **Ключ - СправочникСсылка.Номенклатура
//   **Значение - Булево
// 	 *КоличествоСтрокНаМоментОбработки - Число
&НаКлиентеНаСервереБезКонтекста
Функция НовыйКэшКодовТРУ()
	
	Результат = Новый Структура;
	Результат.Вставить("ВсеКодыТРУ", Новый Соответствие);
	Результат.Вставить("КоличествоСтрокНаМоментОбработки", 0);
	
	Возврат Результат;
	
КонецФункции


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

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

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

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

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

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

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

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

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

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

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

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

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