#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ОбработчикиСобытий
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Экспорт
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ЧекККМ") Тогда
ЗаполнитьДокументПоЧекуККМ(ДанныеЗаполнения);
ОбработкаЗаполненияЛокализация(ЭтотОбъект, ДанныеЗаполнения, СтандартнаяОбработка);
ИначеЕсли ТипДанныхЗаполнения = Тип("Структура") И ДанныеЗаполнения.Свойство("Товары") Тогда
ЗаполнитьДокументПоЧекуККМ(ДанныеЗаполнения.ЧекККМ);
ОбработкаЗаполненияЛокализация(ЭтотОбъект, ДанныеЗаполнения.ЧекККМ, СтандартнаяОбработка);
Товары.Очистить();
ВозвращаемыеТовары = ПолучитьИзВременногоХранилища(ДанныеЗаполнения.Товары);
Для Каждого СтрокаТЧ Из ВозвращаемыеТовары Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
КонецЦикла;
ИначеЕсли ТипДанныхЗаполнения = Тип("Структура") Тогда
Если Не ДанныеЗаполнения.Свойство("ЧтениеКомандФормы") Тогда
ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
КонецЕсли;
Иначе
Если Не ЗначениеЗаполнено(ЧекККМ) Тогда
ВызватьИсключение НСтр("ru = 'Чек ККМ коррекции необходимо вводить на основании чека ККМ'");
КонецЕсли;
КассаККМ = Справочники.КассыККМ.КассаККМФискальныйРегистраторДляРМК();
Если ЗначениеЗаполнено(КассаККМ) Тогда
ЗаполнитьДокументПоКассеККМ(КассаККМ);
Иначе
ВызватьИсключение НСтр("ru = 'Для текущего рабочего места не настроено подключаемое оборудование: Фискальный регистратор'");
КонецЕсли;
КонецЕсли;
ИнициализироватьДокумент(ДанныеЗаполнения);
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
Если Не ЗначениеЗаполнено(Статус) Тогда
Статус = Перечисления.СтатусыЧековККМ.ОтложенБезРезервирования;
КонецЕсли;
Если Статус = Перечисления.СтатусыЧековККМ.Пробит И РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
Отказ = Истина;
ТекстОшибки = НСтр("ru='Чек ККМ пробит. Отмена проведения невозможна'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект);
Возврат;
КонецЕсли;
НоменклатураСервер.ОкруглитьКоличествоШтучныхТоваров(ЭтотОбъект, РежимЗаписи);
СуммаДокумента = ЦенообразованиеКлиентСервер.ПолучитьСуммуДокумента(Товары, ЦенаВключаетНДС);
НоменклатураСервер.ОчиститьНеиспользуемыеСерии(ЭтотОбъект, НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.ЧекККМ));
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ОбработкаУдаленияПроведения(Отказ)
ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ПриКопировании(ОбъектКопирования)
ВызватьИсключение НСтр("ru = 'Копирование документа ""Чек ККМ коррекции"" запрещено!'");
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
НоменклатураСервер.ПроверитьЗаполнениеКоличества(ЭтотОбъект, ПроверяемыеРеквизиты, Отказ);
Если Не СкладыСервер.ИспользоватьСкладскиеПомещения(Склад,Дата) Тогда
МассивНепроверяемыхРеквизитов.Добавить("Товары.Помещение");
КонецЕсли;
Если ТипКоррекции = Перечисления.ТипыЧековКоррекции.Самостоятельно Тогда
ПроверяемыеРеквизиты.Добавить("ОписаниеКоррекции");
Иначе
ПроверяемыеРеквизиты.Добавить("НомерПредписанияНалоговогоОргана");
КонецЕсли;
НоменклатураСервер.ПроверитьЗаполнениеХарактеристик(ЭтотОбъект,МассивНепроверяемыхРеквизитов,Отказ);
НоменклатураСервер.ПроверитьЗаполнениеСерий(ЭтотОбъект,
НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Документы.ЧекККМ),
Отказ,
МассивНепроверяемыхРеквизитов);
ПродажиСервер.ПроверитьКорректностьЗаполненияДокументаПродажи(ЭтотОбъект, Отказ);
РозничныеПродажи.ПроверитьЗаполнениеОплатыПлатежнымиКартами(ЭтотОбъект, Отказ);
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты,МассивНепроверяемыхРеквизитов);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ИнициализацияИЗаполнение
Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)
Склад = ЗначениеНастроекПовтИсп.ПолучитьСкладПоУмолчанию(Склад);
Организация = ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию(Организация);
Если Не ЗначениеЗаполнено(Валюта) Тогда
Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
КонецЕсли;
Кассир = Пользователи.ТекущийПользователь();
ПараметрыЗаполнения = УчетНДСУПКлиентСервер.ПараметрыЗаполненияНалогообложенияНДСПродажи();
ПараметрыЗаполнения.Организация = Организация;
ПараметрыЗаполнения.Дата = Дата;
ПараметрыЗаполнения.Склад = Склад;
ПараметрыЗаполнения.РозничнаяПродажа = Истина;
УчетНДСУП.ЗаполнитьНалогообложениеНДСПродажи(НалогообложениеНДС, ПараметрыЗаполнения);
КонецПроцедуры
Процедура ЗаполнитьДокументПоКассеККМ(КассаККМ)
СостояниеКассовойСмены = РозничныеПродажи.ПолучитьСостояниеКассовойСмены(КассаККМ);
ЗаполнитьЗначенияСвойств(ЭтотОбъект, СостояниеКассовойСмены,,"Кассир");
КонецПроцедуры
Процедура ЗаполнитьДокументПоОтбору(ДанныеЗаполнения)
Если ДанныеЗаполнения.Свойство("КассаККМ") Тогда
ЗаполнитьДокументПоКассеККМ(ДанныеЗаполнения.КассаККМ);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьДокументПоЧекуККМ(ДокументОснование)
Если Документы.ЧекККМВозврат.ЕстьВозвратПоЧекуККМ(ДокументОснование) Тогда
ВызватьИсключение НСтр("ru = 'По Чеку ККМ введен Чек ККМ на возврат. Ввод Чека ККМ коррекции запрещен!'");
КонецЕсли;
Если Документы.ЧекККМКоррекции.ЕстьКоррекцияПоЧекуККМ(ДокументОснование) Тогда
ВызватьИсключение НСтр("ru = 'По Чеку ККМ введен Чек ККМ коррекции. Ввод нового Чека ККМ коррекции запрещен!'");
КонецЕсли;
Если Документы.ВозвратТоваровОтКлиента.ЕстьВозвратТоваровОтКлиентаПоЧекуККМ(ДокументОснование) Тогда
ВызватьИсключение НСтр("ru = 'По Чеку ККМ введен Возврат товаров от клиента. Ввод нового Чека ККМ коррекции запрещен!'");
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| ЧекККМ.Валюта КАК Валюта,
| ЧекККМ.Ссылка КАК ЧекККМ,
| ЧекККМ.Дата КАК ДатаЧекаККМ,
| ЧекККМ.ВидЦены КАК ВидЦены,
| ЧекККМ.Организация КАК Организация,
| ЧекККМ.КассаККМ КАК КассаККМ,
| ЧекККМ.Склад КАК Склад,
| ЧекККМ.ЦенаВключаетНДС КАК ЦенаВключаетНДС,
| ЧекККМ.НалогообложениеНДС КАК НалогообложениеНДС,
| ЧекККМ.ПолученоНаличными КАК ПолученоНаличными,
| ЧекККМ.Статус КАК Статус,
| ЧекККМ.Проведен КАК Проведен,
| ЧекККМ.Партнер КАК Партнер,
| ЧекККМ.ФормаОплаты КАК ФормаОплаты
|ИЗ
| Документ.ЧекККМ КАК ЧекККМ
|ГДЕ
| ЧекККМ.Ссылка = &Ссылка
|;
|
|
|ВЫБРАТЬ
| Товары.НоменклатураЕГАИС КАК НоменклатураЕГАИС,
| Товары.НоменклатураНабора КАК НоменклатураНабора,
| Товары.ХарактеристикаНабора КАК ХарактеристикаНабора,
| Товары.Номенклатура КАК Номенклатура,
| Товары.Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Товары.Характеристика КАК Характеристика,
| Товары.Серия КАК Серия,
| Товары.СтатусУказанияСерий КАК СтатусУказанияСерий,
| Товары.Упаковка КАК Упаковка,
| Товары.КоличествоУпаковок КАК КоличествоУпаковок,
| Товары.Количество КАК Количество,
| ВЫРАЗИТЬ(ВЫБОР
| КОГДА Товары.СуммаРучнойСкидки + Товары.СуммаАвтоматическойСкидки + Товары.СуммаБонусныхБалловКСписаниюВВалюте = 0
| ИЛИ Товары.КоличествоУпаковок = 0
| ТОГДА Товары.Цена
| ИНАЧЕ Товары.Сумма / Товары.КоличествоУпаковок
| КОНЕЦ КАК ЧИСЛО(31, 2)) КАК Цена,
| Товары.Сумма КАК Сумма,
| Товары.СтавкаНДС КАК СтавкаНДС,
| Товары.СуммаНДС КАК СуммаНДС,
| Товары.Помещение КАК Помещение,
| Товары.Продавец КАК Продавец,
| Товары.Комитент КАК Комитент,
| Товары.НомерСтроки
|ПОМЕСТИТЬ врТовары
|ИЗ
| Документ.ЧекККМ.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка
|;
|
|
|ВЫБРАТЬ
| Товары.НоменклатураЕГАИС КАК НоменклатураЕГАИС,
| Товары.НоменклатураНабора КАК НоменклатураНабора,
| Товары.ХарактеристикаНабора КАК ХарактеристикаНабора,
| Товары.Номенклатура КАК Номенклатура,
| Товары.Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Товары.Характеристика КАК Характеристика,
| Товары.Серия КАК Серия,
| Товары.СтатусУказанияСерий КАК СтатусУказанияСерий,
| Товары.Упаковка КАК Упаковка,
| Товары.СтавкаНДС КАК СтавкаНДС,
| Товары.Цена КАК Цена,
| Товары.Помещение КАК Помещение,
| Товары.Продавец КАК Продавец,
| Товары.Комитент КАК Комитент,
| Товары.КоличествоУпаковок КАК КоличествоУпаковок,
| Товары.Количество КАК Количество,
| Товары.Сумма КАК Сумма,
| Товары.СуммаНДС КАК СуммаНДС,
| Товары.НомерСтроки КАК НомерСтроки
|ИЗ
| врТовары КАК Товары
|ГДЕ
| Товары.Количество > 0
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки,
| Номенклатура,
| Характеристика,
| Серия,
| Упаковка,
| Помещение,
| Продавец,
| Комитент,
| Цена
|;
|
|
|ВЫБРАТЬ
| Серии.Номенклатура КАК Номенклатура,
| Серии.Характеристика КАК Характеристика,
| Серии.Серия КАК Серия,
| Серии.Помещение КАК Помещение,
| Серии.Количество КАК Количество
|ПОМЕСТИТЬ врСерии
|ИЗ
| Документ.ЧекККМ.Серии КАК Серии
|ГДЕ
| Серии.Ссылка = &Ссылка
|;
|
|
|ВЫБРАТЬ
| Серии.Номенклатура КАК Номенклатура,
| Серии.Характеристика КАК Характеристика,
| Серии.Серия КАК Серия,
| Серии.Помещение КАК Помещение,
| СУММА(Серии.Количество) КАК Количество
|ИЗ
| врСерии КАК Серии
|СГРУППИРОВАТЬ ПО
| Серии.Номенклатура,
| Серии.Характеристика,
| Серии.Серия,
| Серии.Помещение
|ИМЕЮЩИЕ
| СУММА(Серии.Количество) > 0
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура,
| Характеристика,
| Серия,
| Помещение
|;
|
|
|ВЫБРАТЬ
| АкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка,
| АкцизныеМарки.Справка2 КАК Справка2,
| АкцизныеМарки.ШтрихкодУпаковки КАК ШтрихкодУпаковки,
| АкцизныеМарки.КодАкцизнойМарки КАК КодАкцизнойМарки
|ИЗ
| Документ.ЧекККМ.АкцизныеМарки КАК АкцизныеМарки
|ГДЕ
| АкцизныеМарки.Ссылка = &Ссылка
|
|УПОРЯДОЧИТЬ ПО
| АкцизнаяМарка,
| ШтрихкодУпаковки,
| КодАкцизнойМарки
|;
|
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ОплатыПлатежнымиКартами.ВидОплаты КАК ВидОплаты,
| ОплатыПлатежнымиКартами.ЭквайринговыйТерминал КАК ЭквайринговыйТерминал,
| ОплатыПлатежнымиКартами.КодАвторизации КАК КодАвторизации,
| ОплатыПлатежнымиКартами.НомерПлатежнойКарты КАК НомерПлатежнойКарты,
| ОплатыПлатежнымиКартами.Сумма КАК Сумма
|ПОМЕСТИТЬ ВозвратОплатыПлатежнымиКартамиПоЧеку
|ИЗ
| Документ.ЧекККМВозврат КАК ЧекККМВозврат
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЧекККМВозврат.ОплатаПлатежнымиКартами КАК ОплатыПлатежнымиКартами
| ПО (ОплатыПлатежнымиКартами.Ссылка = ЧекККМВозврат.Ссылка)
|ГДЕ
| ЧекККМВозврат.ЧекККМ = &Ссылка
|
|ИНДЕКСИРОВАТЬ ПО
| ЭквайринговыйТерминал,
| КодАвторизации,
| НомерПлатежнойКарты,
| Сумма
|;
|
|
|ВЫБРАТЬ
| ОплатаПлатежнымиКартами.ВидОплаты КАК ВидОплаты,
| ОплатаПлатежнымиКартами.ЭквайринговыйТерминал КАК ЭквайринговыйТерминал,
| ОплатаПлатежнымиКартами.КодАвторизации КАК КодАвторизации,
| ОплатаПлатежнымиКартами.НомерПлатежнойКарты КАК НомерПлатежнойКарты,
| ОплатаПлатежнымиКартами.Сумма КАК Сумма,
| ОплатаПлатежнымиКартами.ИдентификаторКорзины КАК ИдентификаторКорзины,
| ОплатаПлатежнымиКартами.СсылочныйНомер КАК СсылочныйНомер,
| ОплатаПлатежнымиКартами.ДоговорПодключения КАК ДоговорПодключения,
| ОплатаПлатежнымиКартами.ИдентификаторПлатежнойСистемы КАК ИдентификаторПлатежнойСистемы,
| ОплатаПлатежнымиКартами.НомерЧекаЭТ КАК НомерЧекаЭТ
|ИЗ
| Документ.ЧекККМ.ОплатаПлатежнымиКартами КАК ОплатаПлатежнымиКартами
|ГДЕ
| ОплатаПлатежнымиКартами.Ссылка = &Ссылка
| И НЕ (ОплатаПлатежнымиКартами.ВидОплаты, ОплатаПлатежнымиКартами.ЭквайринговыйТерминал,
| ОплатаПлатежнымиКартами.КодАвторизации, ОплатаПлатежнымиКартами.НомерПлатежнойКарты, ОплатаПлатежнымиКартами.Сумма)
| В
| (ВЫБРАТЬ
| ВозвратОплатыПлатежнымиКартамиПоЧеку.ВидОплаты,
| ВозвратОплатыПлатежнымиКартамиПоЧеку.ЭквайринговыйТерминал,
| ВозвратОплатыПлатежнымиКартамиПоЧеку.КодАвторизации,
| ВозвратОплатыПлатежнымиКартамиПоЧеку.НомерПлатежнойКарты,
| ВозвратОплатыПлатежнымиКартамиПоЧеку.Сумма
| ИЗ
| ВозвратОплатыПлатежнымиКартамиПоЧеку КАК ВозвратОплатыПлатежнымиКартамиПоЧеку)
|
|УПОРЯДОЧИТЬ ПО
| ВидОплаты,
| ЭквайринговыйТерминал,
| НомерПлатежнойКарты,
| КодАвторизации,
| ИдентификаторКорзины,
| ДоговорПодключения,
| НомерЧекаЭТ
|;
|
|
|ВЫБРАТЬ
| ЧекККМПодарочныеСертификаты.ПодарочныйСертификат КАК ПодарочныйСертификат,
| ЧекККМПодарочныеСертификаты.Сумма КАК Сумма,
| ЧекККМПодарочныеСертификаты.СуммаВВалютеСертификата КАК СуммаВВалютеСертификата
|ИЗ
| Документ.ЧекККМ.ПодарочныеСертификаты КАК ЧекККМПодарочныеСертификаты
|ГДЕ
| ЧекККМПодарочныеСертификаты.Ссылка = &Ссылка
|
|УПОРЯДОЧИТЬ ПО
| ПодарочныйСертификат";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Ссылка", ДокументОснование);
РезультатЗапроса = Запрос.ВыполнитьПакет();
Выборка = РезультатЗапроса[0].Выбрать();
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(ЭтотОбъект, Выборка, ,"Статус, Проведен");
ДатаСовершенияКорректируемогоРасчета = Выборка.ДатаЧекаККМ;
СтруктураСостояниеКассовойСмены = РозничныеПродажи.ПолучитьСостояниеКассовойСмены(Выборка.КассаККМ);
КассоваяСмена = СтруктураСостояниеКассовойСмены.КассоваяСмена;
Если Не Выборка.Проведен Тогда
ТекстОшибки = НСтр("ru='Чек ККМ не проведен. Ввод на основании невозможен.'");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Товары.Загрузить(РезультатЗапроса[2].Выгрузить());
Серии.Загрузить(РезультатЗапроса[4].Выгрузить());
АкцизныеМарки.Загрузить(РезультатЗапроса[5].Выгрузить());
ОплатаПлатежнымиКартами.Загрузить(РезультатЗапроса[7].Выгрузить());
ПодарочныеСертификаты.Загрузить(РезультатЗапроса[8].Выгрузить());
Статус = Перечисления.СтатусыЧековККМ.ОтложенБезРезервирования;
СуммаДокумента = ЦенообразованиеКлиентСервер.ПолучитьСуммуДокумента(Товары, ЦенаВключаетНДС);
ПолученоНаличными = СуммаДокумента - ОплатаПлатежнымиКартами.Итог("Сумма") - ПодарочныеСертификаты.Итог("Сумма");
КонецПроцедуры
#КонецОбласти
#Область Прочее
#КонецОбласти
#Область Локализация
Процедура ОбработкаЗаполненияЛокализация(ЭтотОбъект, ДанныеЗаполнения, СтандартнаяОбработка)
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ЧекККМ") Тогда
ЧекККМЛокализация.ПроверитьВозможностьВводаНаОсновании(ДанныеЗаполнения);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецЕсли