Чек ККМ коррекции / Форма документа / Модуль формы

файл

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ФискализацияЧекаКоррекции(Команда)
	
	ПровестиПробитьЧек();
	
КонецПроцедуры

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

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

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

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

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

#Область ОбработкаПроведения

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

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

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

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

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

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

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

&НаСервере
Функция ЗаписатьФискальнуюОперациюНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, ПараметрыФискализации)

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

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

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

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

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

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

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

&НаКлиенте
Процедура ФискальнаяОперацияСтатусОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	ФискальнаяОперацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ТоварыПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ТоварыКомитентПриИзменении(Элемент)

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

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

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

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


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


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

&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
	
	ОбщегоНазначенияУТКлиент.Записать(ЭтаФорма);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
	
	ОбщегоНазначенияУТКлиент.ПровестиИЗакрыть(ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	//

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

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма);
	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(
		ЭтаФорма,
		"РасхожденияХарактеристика",
		"Расхождения.ХарактеристикиИспользуются"
	);

	//

	НоменклатураСервер.УстановитьУсловноеОформлениеСерийНоменклатуры(ЭтаФорма, Ложь);
	НоменклатураСервер.УстановитьУсловноеОформлениеСерийНоменклатуры(
		ЭтаФорма, 
		Ложь,
		"РасхожденияСерия",
		"Расхождения.СтатусУказанияСерий",
		"Расхождения.ТипНоменклатуры"
	);

	//

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

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

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

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

&НаСервере
Процедура ОбновитьЗаголовокСтраницыРасхождения()
	
	РасхожденияКоличествоСтрок = Расхождения.Количество();
	
	Если РасхожденияКоличествоСтрок > 0 Тогда
		пЗаголовок = СтрШаблон(НСтр("ru = 'Расхождения (%1)'"), РасхожденияКоличествоСтрок);
	Иначе
		пЗаголовок = НСтр("ru = 'Расхождения'");
	КонецЕсли;
	
	Элементы.СтраницаРасхождения.Заголовок = пЗаголовок
	
КонецПроцедуры

&НаСервере
Функция ПараметрыКассыККМ()
	
	Возврат Новый ФиксированнаяСтруктура(Справочники.КассыККМ.ПараметрыКассыККМ(Объект.КассаККМ));
	
КонецФункции

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

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

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

		ФлагРазрешеноИзменятьНоменклатуру = Ложь;
	КонецЕсли;
	
	Возврат ФлагРазрешеноИзменятьНоменклатуру;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура НастроитьВидКоррекции()

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

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

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

&НаКлиенте
Функция РассчитатьЦену(Сумма, Количество, СуммаНДС, ЦенаВключаетНДС)

	Если ЦенаВключаетНДС Тогда
		Цена = Сумма / Количество;
	КонецЕсли;

	Если НЕ ЦенаВключаетНДС Тогда
		Цена = (Сумма - СуммаНДС) / Количество;
	КонецЕсли;
	
	Возврат Цена;

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

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

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

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

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

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

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

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

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

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