&НаКлиенте
Перем КэшированныеЗначения;
&НаКлиенте
Перем ТекущиеДанныеИдентификатор;
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
ИспользоватьПодарочныеСертификаты = ПолучитьФункциональнуюОпцию("ИспользоватьПодарочныеСертификаты");
ИспользоватьОплатуПлатежнымиКартами = ПолучитьФункциональнуюОпцию("ИспользоватьОплатуПлатежнымиКартами");
ИспользоватьКартыЛояльности = ПолучитьФункциональнуюОпцию("ИспользоватьКартыЛояльности");
ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
ИспользоватьСерииНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатуры");
ИспользоватьНаборы = ПолучитьФункциональнуюОпцию("ИспользоватьНаборы");
Если ЗначениеЗаполнено(Объект.КассоваяСмена) Тогда
ИспользуетсяККТФЗ54 = РозничныеПродажиВызовСервера.ИспользуетсяККТФЗ54(Объект.КассоваяСмена);
Иначе
ИспользуетсяККТФЗ54 = Ложь;
КонецЕсли;
ДанныеФискальнойОперации = РозничныеПродажи.СтруктураДанныеФискальнойОперации();
КонтролироватьАссортимент = АссортиментСерверПовтИсп.КонтролироватьАссортимент(Объект.Склад, Объект.Дата);
ПоддерживаемыеТипыПодключаемогоОборудования = "СканерШтрихкода,
|ДисплейПокупателя,
|ФискальныйРегистратор,
|ККТ,
|ПринтерЧеков,
|ЭквайринговыйТерминал,
|ЭлектронныеВесы,
|СчитывательМагнитныхКарт";
ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование(ЭтотОбъект, "");
РозничныеПродажи.ЗаполнитьТаблицуОборудование(ЭтотОбъект, ПоддерживаемыеТипыПодключаемогоОборудования);
Если НЕ Справочники.КассыККМ.НастроенаКассаККМДляРМК() Тогда
Элементы.ГруппаНижняяКоманднаяПанельОплата.Доступность = Ложь;
КонецЕсли;
Если ИспользоватьПодключаемоеОборудование Тогда
ОборудованиеПодключено = МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам(
Неопределено,
Неопределено,
МенеджерОборудованияВызовСервера.ПолучитьРабочееМестоКлиента()).Количество() > 0;
ЗначениеОткрыватьФормуСПодключеннымОборудованием = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
"ЧекККМ", "ОткрыватьФормуСПодключеннымОборудованием");
Если ЗначениеОткрыватьФормуСПодключеннымОборудованием = Неопределено Тогда
ОткрыватьФормуСПодключеннымОборудованием = ОборудованиеПодключено;
Иначе
ОткрыватьФормуСПодключеннымОборудованием = ЗначениеОткрыватьФормуСПодключеннымОборудованием И ОборудованиеПодключено;
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМВозврат));
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект,ПараметрыУказанияСерий);
УстановитьВидимостьЭлементовСерий();
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ПараметрыКассыККМ = Новый ФиксированнаяСтруктура(Справочники.КассыККМ.ПараметрыКассыККМ(Объект.КассаККМ));
ВерсияФФД = МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетВерсиюФФД(ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
ПолучитьСсылкиНаОборудование();
ЗаполнитьДанныеПоЧекуККМ();
УстановитьВидимостьЭлементовФормы();
СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
РаботаСТабличнымиЧастями.ИнициализироватьКэшСтрок(Элементы.Товары);
ПолучитьСтатусОплатыСБППоЧекуКММ();
ПриСозданииЧека();
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ИспользоватьПодключаемоеОборудование Тогда
Если ОткрыватьФормуСПодключеннымОборудованием И ВладелецФормы = Неопределено Тогда
ПодключитьОбработчикОжидания("ОткрытьФормуПодключенноеОборудованиеОбработчикОжидания", 0.5, Истина);
Иначе
ПодключитьОбработчикОжидания("НачатьПодключениеОборудованияОбработчикОжидания", 0.1, Истина);
КонецЕсли;
КонецЕсли;
ПересчитатьДокументНаКлиенте();
Если ПринудительнаяАвторизация И ВладелецФормы = Неопределено Тогда
ПодключитьОбработчикОжидания("ОткрытьОкноАвторизации", 0.5, Истина);
КонецЕсли;
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
СтандартнаяОбработка = Ложь;
Если Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит") Тогда
Возврат;
КонецЕсли;
Если ПринудительноеЗавершениеРаботы Или ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
ПередЗакрытиемЧека(Отказ);
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии()
МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ОбработкаОповещенияНаСервере(ИмяСобытия, Параметр, Источник)
ДополнительныеПараметры = Новый Структура("ИмяСобытия, Параметр, Источник", ИмяСобытия, Параметр, Источник);
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Событие", ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("КэшированныеЗначения", КэшированныеЗначения);
ДополнительныеПараметры.Вставить("СтандартнаяОбработка", Истина);
ДополнительныеПараметры.Вставить("ТребуетсяСерверныйВызов", Ложь);
СобытияФормКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник, ДополнительныеПараметры);
КэшированныеЗначения = ДополнительныеПараметры.КэшированныеЗначения;
Если ДополнительныеПараметры.ТребуетсяСерверныйВызов Тогда
ОбработкаОповещенияНаСервере(ИмяСобытия, Параметр, Источник);
КонецЕсли;
Если Не ДополнительныеПараметры.СтандартнаяОбработка Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
Если Источник = "ПодключаемоеОборудование" И ВводДоступен()
И Не ТолькоПросмотр Тогда
Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("ИмяСобытия", ИмяСобытия);
ПараметрыОповещения.Вставить("Параметр", Параметр);
ПараметрыОповещения.Вставить("Источник", Источник);
ОписаниеОповещенияПодтверждения = Новый ОписаниеОповещения("ОбработкаОповещенияПодтверждениеЗавершение", ЭтотОбъект, ПараметрыОповещения);
ПодтверждениеИзмененияСоставаПозиций(ОписаниеОповещенияПодтверждения);
КонецЕсли;
КонецЕсли;
Если ИмяСобытия = "Закрытие_РедактированиеКомплекта"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
ПриОкончанииРедактированияНабора(Параметр.АдресВоВременномХранилище);
ПересчитатьДокументНаКлиенте();
КонецЕсли;
Если ИмяСобытия = "ВыбранБыстрыйТовар"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
ПараметрыТовара = ПодборТоваровКлиентСервер.ПараметрыТовара();
ЗаполнитьЗначенияСвойств(ПараметрыТовара, Параметр);
ПараметрыТовара.Продавец = ТекущийПродавец;
Если КассирМожетБытьПродавцом И НЕ МенеджерТорговогоЗалаМожетБытьПродавцом Тогда
ПараметрыТовара.Продавец = Объект.Кассир;
КонецЕсли;
ПараметрыТовара.КоличествоУпаковок = Параметр.КоличествоУпаковок;
ПараметрыТовара.Цена = ПолучитьЦенуПоОтбору(ПараметрыТовара.Номенклатура, ПараметрыТовара.Характеристика, ПараметрыТовара.Серия, ПараметрыТовара.Упаковка);
ДобавитьВКорзину(ПараметрыТовара);
КонецЕсли;
Если ИмяСобытия = "АвторизованПользователь" Тогда
Если Параметр.Режим = "СменитьПрава" Тогда
НастроитьПраваДляПользователя(Параметр.Пользователь);
ПересчитатьДокументНаКлиенте();
ИначеЕсли Параметр.Режим = "ЗакрытьЧекККМ" Тогда
ПринудительноеЗавершениеРаботы = Истина;
Если Открыта() Тогда
Закрыть();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ИмяСобытия = "ЧтениеКомандФормы"
И Параметр.Форма = УникальныйИдентификатор Тогда
Оповестить("ЧтениеКомандФормы", Новый Структура("Форма, ФормаВладелец, АдресВоВременномХранилище", Параметр.ФормаВладелец, УникальныйИдентификатор, ПолучитьКомандыФормы(Параметр.ФормаВладелец)));
КонецЕсли;
Если ИмяСобытия = "РедактироватьНабор"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
ПараметрыКомплекта = Новый Структура;
ПараметрыКомплекта.Вставить("НоменклатураНабора", Параметр.НоменклатураНабора);
ПараметрыКомплекта.Вставить("ХарактеристикаНабора", Параметр.ХарактеристикаНабора);
ПараметрыКомплекта.Вставить("КолонкиНабора", КолонкиНабора());
АдресНабораВоВременномХранилище = АдресНабораВоВременномХранилище(ПараметрыКомплекта);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("АдресВоВременномХранилище", АдресНабораВоВременномХранилище);
ПараметрыОткрытия.Вставить("НоменклатураНабора", Параметр.НоменклатураНабора);
ПараметрыОткрытия.Вставить("ХарактеристикаНабора", Параметр.ХарактеристикаНабора);
ПараметрыОткрытия.Вставить("ЦенаВключаетНДС", Объект.ЦенаВключаетНДС);
ПараметрыОткрытия.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
ПараметрыОткрытия.Вставить("Валюта", Объект.Валюта);
ПараметрыОткрытия.Вставить("ВидЦены", Объект.ВидЦены);
ПараметрыОткрытия.Вставить("Дата", Объект.Дата);
ПараметрыОткрытия.Вставить("Ссылка", Объект.Ссылка);
ПараметрыОткрытия.Вставить("Склад", Объект.Склад);
ПараметрыОткрытия.Вставить("СкрыватьКомандуОстаткиНаСкладах", Ложь);
ПараметрыОткрытия.Вставить("ЗапретРедактированияЦены", Истина);
ПараметрыОткрытия.Вставить("Организация", Объект.Организация);
ОткрытьФорму("Обработка.РедактированиеНабора.Форма.Форма", ПараметрыОткрытия, ЭтотОбъект, УникальныйИдентификатор);
КонецЕсли;
Если ИмяСобытия = "ОборудованиеПодключено" Тогда
РозничныеПродажиКлиент.ОбработатьСобытиеОборудованиеПодключено(ЭтотОбъект, Параметр, Источник);
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 1, Истина);
КонецЕсли;
Если ИмяСобытия = "ИзменениеКассовойСмены" Тогда
СтруктураСостояниеКассовойСмены = РозничныеПродажиВызовСервера.СостояниеКассовойСмены(Объект.КассаККМ);
ЗаполнитьЗначенияСвойств(Объект, СтруктураСостояниеКассовойСмены,, "Кассир");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если НоменклатураКлиент.ЭтоУказаниеСерий(ИсточникВыбора) Тогда
НоменклатураКлиент.ОбработатьУказаниеСерии(ЭтотОбъект, ПараметрыУказанияСерий, ВыбранноеЗначение);
ДополнительныеПараметры = Новый Структура;
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Товары", ДополнительныеПараметры);
Если ДополнительныеПараметры.Свойство("ТребуетсяСерверныйВызов") Тогда
КэшированныеЗначения.Вставить("СобытияФорм");
ТоварыПриОкончанииРедактированияНаСервере(Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор(), КэшированныеЗначения);
КонецЕсли;
КонецЕсли;
Если ИсточникВыбора.ИмяФормы = "Документ.ЧекККМВозврат.Форма.ВыборОтложенногоЧека" Тогда
ЗагрузитьНовыйЧек(ВыбранноеЗначение);
КонецЕсли;
Если ИсточникВыбора.ИмяФормы = "Обработка.ПодборТоваровВДокументПродажи.Форма.Форма" Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение);
ПересчитатьДокументНаКлиенте();
КонецЕсли;
Если Окно <> Неопределено Тогда
Окно.Активизировать();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМВозврат));
УстановитьВидимостьЭлементовСерий();
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ПараметрыКассыККМ = Новый ФиксированнаяСтруктура(Справочники.КассыККМ.ПараметрыКассыККМ(Объект.КассаККМ));
ВерсияФФД = МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетВерсиюФФД(ПараметрыКассыККМ.ИдентификаторУстройства);
СобытияФорм.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_ЧекККМВозврат", ПараметрыЗаписи, Объект.Ссылка);
МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтотОбъект, ПараметрыЗаписи);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(ТекущийОбъект, Документы.ЧекККМВозврат));
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ЗаполнитьСлужебныеРеквизитыПоЧеку();
Элементы.ЗаполнитьКоличествоПоЧеку.Доступность = (Не Объект.Статус = Перечисления.СтатусыЧековККМ.Пробит);
Если НЕ ПараметрыЗаписи.Свойство("РежимТранзакции") ИЛИ НЕ ПараметрыЗаписи.РежимТранзакции Тогда
УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
СобытияФорм.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары
&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если НаборыКлиент.БлокируемыйЭлемент(Поле)
Или ДополнительноБлокируемыйЭлементНаборов(Поле) Тогда
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ВыбраннаяСтрока);
Если ЗначениеЗаполнено(ТекущаяСтрока.НоменклатураНабора) Тогда
ПараметрОповещения = Новый Структура;
ПараметрОповещения.Вставить("НоменклатураНабора", ТекущаяСтрока.НоменклатураНабора);
ПараметрОповещения.Вставить("ХарактеристикаНабора", ТекущаяСтрока.ХарактеристикаНабора);
ПараметрОповещения.Вставить("ФормаВладелец", УникальныйИдентификатор);
Оповестить("РедактироватьНабор", ПараметрОповещения, ЭтотОбъект);
КонецЕсли;
ИначеЕсли Поле = Элементы.ТоварыНоменклатураНабора Тогда
ПоказатьЗначение(Неопределено, Элементы.Товары.ТекущиеДанные.НоменклатураНабора);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриАктивизацииЯчейки(Элемент)
СобытияФормКлиент.ПриАктивизацииЯчейки(ЭтотОбъект, Элемент);
Если Не Элемент.ТекущийЭлемент = Элементы.ТоварыШтрихкод Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Элементы.ТоварыШтрихкод.СписокВыбора.Очистить();
Возврат;
КонецЕсли;
Структура = Новый Структура;
Структура.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
Структура.Вставить("Характеристика", ТекущиеДанные.Характеристика);
Структура.Вставить("Упаковка", ТекущиеДанные.Упаковка);
Элементы.ТоварыШтрихкод.СписокВыбора.ЗагрузитьЗначения(РозничныеПродажиВызовСервера.ПолучитьШтрихкодыНоменклатуры(Структура));
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
Отказ = Истина;
ОткрытьПодбор(Неопределено);
Иначе
Если Копирование Тогда
НаборыКлиент.ПередУдалениемСтрокиТабличнойЧасти(ЭтотОбъект, "Товары", Отказ, Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
УстановитьДоступностьЭлементовРМК(ЭтотОбъект, РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(Элемент, КэшированныеЗначения, ПараметрыУказанияСерий, Копирование);
Если Копирование Тогда
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ЗначениеЗаполнено(ТекущиеДанные.ИдентификаторСтроки) Тогда
ТекущиеДанные.ИдентификаторСтроки = Строка(Новый УникальныйИдентификатор);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПередУдалением(Элемент, Отказ)
Если ИспользоватьОплатуПлатежнымиКартами Тогда
Если Объект.ОплатаПлатежнымиКартами.Количество() = 1
И ОбщаяСуммаОплатыПлатежнымиКартами > СуммаДокумента - Элементы.Товары.ТекущиеДанные.Сумма Тогда
ТекстСообщения = НСтр("ru = 'Нельзя удалить эту строку. Сумма оплаты платежными картами станет больше суммы товарных позиций. Операция не поддерживается.'");
Сообщить(ТекстСообщения);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
Отказ = Истина;
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(Элемент, КэшированныеЗначения, ПараметрыУказанияСерий, Ложь);
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока.КоличествоУпаковок <> 0 Тогда
ТекущаяСтрока.КоличествоУпаковок = 0;
ТоварыКоличествоУпаковокПриИзменении(Элементы.Товары);
ПересчитатьДокументНаКлиенте();
КонецЕсли;
Иначе
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(Элемент, КэшированныеЗначения, ПараметрыУказанияСерий);
НаборыКлиент.ПередУдалениемСтрокиТабличнойЧасти(ЭтотОбъект, "Товары", Отказ);
ДополнительныеРеквизиты = Новый Структура("ПередУдалением");
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Товары", ДополнительныеРеквизиты);
КонецЕсли;
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПослеУдаления(Элемент)
ПересчитатьДокументНаКлиенте();
ДополнительныеРеквизиты = Новый Структура("ТребуетсяСерверныйВызов, ПослеУдаления", Ложь);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Товары", ДополнительныеРеквизиты);
Если ДополнительныеРеквизиты.ТребуетсяСерверныйВызов Тогда
КэшированныеЗначения.Вставить("СобытияФорм");
КонецЕсли;
Если НоменклатураКлиент.НеобходимоОбновитьСтатусыСерий(Элемент, КэшированныеЗначения, ПараметрыУказанияСерий, Истина) Тогда
ДополнительныеРеквизиты.ТребуетсяСерверныйВызов = Истина;
КэшированныеЗначения.Вставить("НеобходимоОбновитьСтатусыСерий");
КонецЕсли;
Если ДополнительныеРеквизиты.ТребуетсяСерверныйВызов Тогда
ТоварыПриОкончанииРедактированияНаСервере(Неопределено, КэшированныеЗначения);
КонецЕсли;
Если ТипЗнч(КэшированныеЗначения) = Тип("Структура")
И КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(Элементы.Товары, КэшированныеЗначения, ПараметрыУказанияСерий);
КэшированныеЗначения.Удалить("НеобходимоОбновитьСтатусыСерий");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ПересчитатьДокументНаКлиенте();
ТекДанные = Элемент.ТекущиеДанные;
Если ТекДанные <> Неопределено
И КассирМожетБытьПродавцом И НЕ МенеджерТорговогоЗалаМожетБытьПродавцом
И ТекДанные.Продавец <> Объект.Кассир Тогда
ТекДанные.Продавец = Объект.Кассир;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Товары", ДополнительныеПараметры);
Если ДополнительныеПараметры.Свойство("ТребуетсяСерверныйВызов") Тогда
КэшированныеЗначения.Вставить("СобытияФорм");
КонецЕсли;
Если НоменклатураКлиент.НеобходимоОбновитьСтатусыСерий(Элемент, КэшированныеЗначения, ПараметрыУказанияСерий) Тогда
КэшированныеЗначения.Вставить("НеобходимоОбновитьСтатусыСерий");
ДополнительныеПараметры.Вставить("ТребуетсяСерверныйВызов");
КонецЕсли;
Если ДополнительныеПараметры.Свойство("ТребуетсяСерверныйВызов") Тогда
ПодключитьОбработчикОжидания("ТоварыПриОкончанииРедактированияДляСерверногоВызова", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактированияДляСерверногоВызова()
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
ТекущаяСтрокаИдентификатор = ТекущиеДанные.ПолучитьИдентификатор();
КонецЕсли;
ТоварыПриОкончанииРедактированияНаСервере(ТекущаяСтрокаИдентификатор, КэшированныеЗначения);
Если КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(Элементы.Товары, КэшированныеЗначения, ПараметрыУказанияСерий);
КэшированныеЗначения.Удалить("НеобходимоОбновитьСтатусыСерий");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ТоварыПриОкончанииРедактированияНаСервере(ИдентификаторСтроки, КэшированныеЗначения)
Если КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
ЗаполнитьСтатусыУказанияСерийПриОкончанииРедактированияСтрокиТЧ(ИдентификаторСтроки, КэшированныеЗначения);
КонецЕсли;
Если КэшированныеЗначения.Свойство("СобытияФорм") Тогда
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
КэшированныеЗначения.Удалить("СобытияФорм");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
ТоварыНоменклатураПриИзмененииСервер(ИдентификаторТекущейСтроки);
КонецПроцедуры
&НаСервере
Процедура ТоварыНоменклатураПриИзмененииСервер(ИдентификаторТекущейСтроки)
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
Если КонтролироватьАссортимент Тогда
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействий.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтотОбъект.ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыХарактеристикаПриИзменении(Элемент)
ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
ТоварыХарактеристикаПриИзмененииСервер(ИдентификаторТекущейСтроки);
КонецПроцедуры
&НаСервере
Процедура ТоварыХарактеристикаПриИзмененииСервер(ИдентификаторТекущейСтроки)
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);
СтруктураДействий = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ХарактеристикаПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ЭтотОбъект.ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Характеристика", СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСерияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОткрытьПодборСерий(Элемент.ТекстРедактирования);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока.Упаковка <> КэшированныеСтроки[Элементы.Товары.Имя].Упаковка Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Элемент", Элемент);
ДополнительныеПараметры.Вставить("ИдентификаторСтроки", ТекущаяСтрока.ПолучитьИдентификатор());
ОписаниеОповещенияПодтверждения = Новый ОписаниеОповещения("ТоварыУпаковкаПриИзмененииПодтверждениеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ПодтверждениеИзмененияСоставаПозиций(ОписаниеОповещенияПодтверждения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ПревышеноКоличествоУпаковокНевозвращенныхПозицийПоДаннымТекущейСтроки(ТекущаяСтрока) Тогда
КоличествоУпаковокПоЧеку = ?(ЗначениеЗаполнено(КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковокПоЧеку), КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковокПоЧеку,
КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковок);
ТекущаяСтрока.КоличествоУпаковок = КоличествоУпаковокПоЧеку;
КонецЕсли;
Если ТекущаяСтрока.КоличествоУпаковок <> КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковок Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Элемент", Элемент);
ДополнительныеПараметры.Вставить("ИдентификаторСтроки", ТекущаяСтрока.ПолучитьИдентификатор());
ОписаниеОповещенияПодтверждения = Новый ОписаниеОповещения("ТоварыКоличествоУпаковокПриИзмененииПодтверждениеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ПодтверждениеИзмененияСоставаПозиций(ОписаниеОповещенияПодтверждения);
КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСтавкаНДСПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСерияПриИзменении(Элемент)
ВыбранноеЗначение = НоменклатураКлиентСервер.ВыбраннаяСерия();
ВыбранноеЗначение.Значение = Элементы.Товары.ТекущиеДанные.Серия;
ВыбранноеЗначение.ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
НоменклатураКлиент.ОбработатьУказаниеСерии(ЭтотОбъект, ПараметрыУказанияСерий, ВыбранноеЗначение);
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Серия", СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущиеДанные, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПомещениеПриИзменении(Элемент)
РозничныеПродажиКлиент.ОбновитьПомещениеВСтрокахТабличнойЧастиСерии(ЭтотОбъект, Элементы.Товары.ТекущиеДанные, КэшированныеСтроки[Элементы.Товары.Имя].Помещение);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ПолучитьВес(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ТекущаяСтрока = МенеджерОборудованияУТКлиент.ТекущаяСтрока(ЭтотОбъект);
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
МенеджерОборудованияКлиент.НачатьПолученияВесаСЭлектронныхВесов(
Новый ОписаниеОповещения("ПолучитьВесЗавершение", ЭтотОбъект, ТекущаяСтрока),
УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКоличествоВДокументе(Результат, ДополнительныеПараметры) Экспорт
Если ТолькоПросмотр Тогда
Возврат;
КонецЕсли;
ВыгруженаТолькоНеМаркируемаяПродукция = Ложь;
ПараметрыОткрытия = Новый Структура;
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПроверитьКоличествоВДокументе", ПараметрыОткрытия);
ПараметрыОткрытия.Вставить("АдресВоВременномХранилище", ПоместитьТабличнуюЧастьТоварыВоВременноеХранилищеДляПроверкиКоличества(ВыгруженаТолькоНеМаркируемаяПродукция));
ПараметрыОткрытия.Вставить("ПревышениеКоличестваТоваровРазрешено", Истина);
ПараметрыОткрытия.Вставить("ПараметрыУказанияСерий", ПараметрыУказанияСерий);
ПараметрыОткрытия.Вставить("Склад", Объект.Склад);
ПараметрыОткрытия.Вставить("ИмяТабличнойЧасти", "Товары");
ПараметрыОткрытия.Вставить("Ссылка", Объект.Ссылка);
ОткрытьФорму(
"ОбщаяФорма.ПроверкаЗаполненияДокументов",
ПараметрыОткрытия,
ЭтаФорма,,,,
Новый ОписаниеОповещения("ПроверитьКоличествоВДокументеЗавершение", ЭтотОбъект),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКоличествоВДокументеЗавершение(Результат, ДополнительныеПараметры) Экспорт
ВозвращаемыеПараметры = Результат;
Если ВозвращаемыеПараметры <> Неопределено Тогда
ИзменитьТабличнуюЧастьПоРезультатамПроверки(ВозвращаемыеПараметры,
?(КэшированныеЗначения = Неопределено, ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения(), КэшированныеЗначения));
ПересчитатьДокументНаКлиенте();
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоискПоШтрихкодуВыполнить(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОписаниеОповещенияПодтверждения = Новый ОписаниеОповещения("ПоискПоШтрихкодуВыполнитьПодтверждениеЗавершение", ЭтотОбъект, Неопределено);
ПодтверждениеИзмененияСоставаПозиций(ОписаниеОповещенияПодтверждения);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура СоставНабора(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяСтрока = Элементы.Товары.ТекущаяСтрока;
Если ВыбраннаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ВыбраннаяСтрока);
Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.НоменклатураНабора) Тогда
ПоказатьПредупреждение(,НСтр("ru = 'Открытие состава набора возможно только для набора.'"));
Возврат;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Команда", Команда);
ДополнительныеПараметры.Вставить("ИдентификаторСтроки", ВыбраннаяСтрока);
ОписаниеОповещенияПодтверждения = Новый ОписаниеОповещения("СоставНабораПодтверждениеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ПодтверждениеИзмененияСоставаПозиций(ОписаниеОповещенияПодтверждения);
КонецПроцедуры
&НаКлиенте
Процедура УказатьСерии(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
ОткрытьПодборСерий();
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПодборСерий(Текст = "", ТекущиеДанные = Неопределено, ОповещениеПриЗавершении = Неопределено)
Если НоменклатураКлиент.ДляУказанияСерийНуженСерверныйВызов(ЭтотОбъект,ПараметрыУказанияСерий,Текст, ТекущиеДанные)Тогда
Если ТекущиеДанные = Неопределено Тогда
ТекущиеДанныеИдентификатор = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
Иначе
ТекущиеДанныеИдентификатор = ТекущиеДанные.ПолучитьИдентификатор();
КонецЕсли;
ПараметрыФормыУказанияСерий = ПараметрыФормыУказанияСерий(ТекущиеДанныеИдентификатор);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПараметрыФормыУказанияСерий", ПараметрыФормыУказанияСерий);
ДополнительныеПараметры.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
ОткрытьФорму(
ПараметрыФормыУказанияСерий.ИмяФормы,
ПараметрыФормыУказанияСерий,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ОткрытьПодборСерийЗавершение", ЭтотОбъект, ДополнительныеПараметры),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПодборСерийЗавершение(Результат, ДополнительныеПараметры) Экспорт
ПараметрыФормыУказанияСерий = ДополнительныеПараметры.ПараметрыФормыУказанияСерий;
Если Результат <> Неопределено Тогда
ОбработатьУказаниеСерийСервер(ПараметрыФормыУказанияСерий);
КонецЕсли;
Если ДополнительныеПараметры.Свойство("ОповещениеПриЗавершении") Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеПриЗавершении);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьМенюОперацииСККМ(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытияФормы.Вставить("Кассир", Объект.Кассир);
ПараметрыОткрытияФормы.Вставить("ИзменитьКассуККМ", Истина);
ПараметрыОткрытияФормы.Вставить("ОграничитьДоступныеКассыККМОднойОрганизацией", ЗначениеЗаполнено(Объект.ЧекККМ));
ОткрытьФорму("Документ.ЧекККМ.Форма.МенюОперацииСККМ", ПараметрыОткрытияФормы, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьМенюПрочихОпераций(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытияФормы.Вставить("Кассир", Объект.Кассир);
ПараметрыОткрытияФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр);
ПараметрыОткрытияФормы.Вставить("Документ", Объект.Ссылка);
ПараметрыОткрытияФормы.Вставить("Организация", Объект.Организация);
ПараметрыОткрытияФормы.Вставить("ПроверитьКоличествоВДокументе", Истина);
ПараметрыОткрытияФормы.Вставить("ПродажаПодарочногоСертификата", ИспользоватьПодарочныеСертификаты);
ПараметрыОткрытияФормы.Вставить("ВозвратПодарочногоСертификата", ИспользоватьПодарочныеСертификаты);
ПараметрыОткрытияФормы.Вставить("Заблокировать", ПринудительнаяАвторизация);
ПараметрыОткрытияФормы.Вставить("АдресКомандПечатиВоВременномХранилище", АдресКомандПечатиВоВременномХранилище);
ОткрытьФорму("Документ.ЧекККМ.Форма.МенюПрочиеОперации", ПараметрыОткрытияФормы, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура БыстрыеТовары(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОткрытьФорму("Документ.ЧекККМ.Форма.БыстрыеТовары", Новый Структура("ГорячиеКлавиши", ГорячиеКлавиши), ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПодключенноеОборудование(Команда)
РозничныеПродажиКлиент.ОткрытьФормуПодключенноеОборудование(ЭтотОбъект, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПодбор(Команда)
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
Возврат;
КонецЕсли;
ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
"Документ.ЧекККМВозврат.ФормаДокументаРМК.Команда.ОткрытьПодбор");
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ПараметрыФормы = Новый Структура;
ИмяФормыПодбора = "Обработка.ПодборТоваровВДокументПродажи.Форма";
ОповещениеОЗакрытии = Неопределено;
ПараметрЗаголовок = НСтр("ru = 'Подбор товаров в %Документ%'");
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПараметрЗаголовок = СтрЗаменить(ПараметрЗаголовок, "%Документ%", Объект.Ссылка);
Иначе
ПараметрЗаголовок = СтрЗаменить(ПараметрЗаголовок, "%Документ%", НСтр("ru = 'чек ККМ'"));
КонецЕсли;
ПараметрыФормы.Вставить("ВидЦены", Объект.ВидЦены);
ПараметрыФормы.Вставить("РежимПодбораБезСоглашенийСКлиентами", Истина);
ПараметрыФормы.Вставить("ВариантАнализаНоменклатурыПродаваемойСовместно", ПредопределенноеЗначение("Перечисление.ВариантыАнализаНоменклатурыПродаваемойСовместно.РозничнаяТорговля"));
ПараметрыФормы.Вставить("РежимОтбораПоАссортименту", КонтролироватьАссортимент);
ПараметрыФормы.Вставить("ЦенаВключаетНДС", Объект.ЦенаВключаетНДС);
ПараметрыФормы.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
ПараметрыФормы.Вставить("РежимПодбораИспользоватьСкладыВТабличнойЧасти", Ложь);
ПараметрыФормы.Вставить("ИспользоватьДатыОтгрузки", Ложь);
ПараметрыФормы.Вставить("Склад", Объект.Склад);
ПараметрыФормы.Вставить("Валюта", Объект.Валюта);
ПараметрыФормы.Вставить("Заголовок", ПараметрЗаголовок);
ПараметрыФормы.Вставить("Дата", Объект.Дата);
ПараметрыФормы.Вставить("Документ", Объект.Ссылка);
ПараметрыФормы.Вставить("СкрыватьКолонкуВидЦены", Истина);
ПараметрыФормы.Вставить("ПараметрыУказанияСерий", ПараметрыУказанияСерий);
ОткрытьФорму(ИмяФормыПодбора,
ПараметрыФормы,
ЭтотОбъект,
УникальныйИдентификатор,
,
,
ОповещениеОЗакрытии
,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПродавца(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ВыборПродавца",,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ИзменитьПродавцаЗавершение", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПомещение(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Если Элементы.Товары.ВыделенныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ВыделенныеСтроки[0]);
Отбор = Новый Структура("Владелец", Объект.Склад);
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("РежимВыбора", Истина);
ПараметрыОткрытия.Вставить("Отбор", Отбор);
ПараметрыОткрытия.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
ПараметрыОткрытия.Вставить("Характеристика", СтрокаТЧ.Характеристика);
ОткрытьФорму(
"Справочник.СкладскиеПомещения.Форма.ФормаВыбораСОстатками",
ПараметрыОткрытия,,,,,
Новый ОписаниеОповещения("ИзменитьПомещениеЗавершение", ЭтотОбъект, Новый Структура("СтрокаТЧ", СтрокаТЧ)),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьНаличными(Команда)
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОплатитьНаличнымиОбработкаОповещения", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьПлатежнойКартой(Команда)
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Если ОбщаяСуммаОплатыПлатежнымиКартами > СуммаДокумента Тогда
ТекстСообщения = НСтр("ru = 'Сумма оплаты платежными картами больше суммы товарных позиций. Операция не поддерживается.'");
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
Иначе
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОтменитьОплатуПлатежнымиКартамиОбработкаОповещения", ЭтотОбъект));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СмешаннаяОплата(Команда)
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяФормаОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("СмешаннаяОплатаОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОплатыПлатежнымиКартами(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ВыполнитьОбработкуОповещения(
Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартами", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьЭСФСС(Команда)
ОплатитьЭСФССЛокализация();
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьСБП(Команда)
ОплатитьСБПЛокализация();
КонецПроцедуры
&НаКлиенте
Процедура ПоказыватьТолькоВозвращаемыеПозиции(Команда)
Элементы.ПоказыватьТолькоВозвращаемыеПозиции.Пометка = Не Элементы.ПоказыватьТолькоВозвращаемыеПозиции.Пометка;
РежимОтображенияТоваровПоЧеку = Не Элементы.ПоказыватьТолькоВозвращаемыеПозиции.Пометка;
Элементы.ТоварыКоличествоУпаковокПоЧеку.Видимость = РежимОтображенияТоваровПоЧеку;
Элементы.ТоварыКоличествоУпаковок.Заголовок = НСтр("ru= 'К возврату'");
Если Не РежимОтображенияТоваровПоЧеку Тогда
Элементы.ТоварыКоличествоУпаковок.Заголовок = НСтр("ru= 'Количество'");
КонецЕсли;
УстановитьОтборСтрокТаблицыТовары(РежимОтображенияТоваровПоЧеку, Элементы.Товары);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьКоличествоУпаковокПоЧеку(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗаполнитьКоличествоУпаковокПоЧекуЗавершение", ЭтотОбъект);
ТекстСообщения = НСтр("ru = 'В строках количество к возврату будет заполнено данными по чеку. Продолжить?'");
ПоказатьВопрос(ОповещениеОЗавершении, ТекстСообщения, РежимДиалогаВопрос.ДаНет, 15,,,КодВозвратаДиалога.Нет);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьКоличествоУпаковокПоЧекуЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ТребуетсяПересчет = Ложь;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий, Объект);
Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
Если Не СтрокаТаблицы.КоличествоУпаковок = СтрокаТаблицы.КоличествоУпаковокПоЧеку Тогда
ТребуетсяПересчет = Истина;
СтрокаТаблицы.КоличествоУпаковок = СтрокаТаблицы.КоличествоУпаковокПоЧеку;
СтрокаТаблицы.Количество = СтрокаТаблицы.КоличествоПоЧеку;
СтрокаТаблицы.ВозвращаемаяПозиция = Истина;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(СтрокаТаблицы, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
КонецЦикла;
Если ТребуетсяПересчет Тогда
ПересчитатьДокументНаКлиенте();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура ВыбранБыстрыйТовар(Команда)
НайденныеСтроки = БыстрыеТовары.НайтиСтроки(Новый Структура("ИмяКоманды", Команда.Имя));
ПараметрыОповещения = Новый Структура();
ПараметрыОповещения.Вставить("Номенклатура", НайденныеСтроки[0].Номенклатура);
ПараметрыОповещения.Вставить("Характеристика", НайденныеСтроки[0].Характеристика);
ПараметрыОповещения.Вставить("Серия", ПредопределенноеЗначение("Справочник.СерииНоменклатуры.ПустаяСсылка"));
ПараметрыОповещения.Вставить("Упаковка", НайденныеСтроки[0].Упаковка);
ПараметрыОповещения.Вставить("ТипНоменклатуры", НайденныеСтроки[0].ТипНоменклатуры);
ПараметрыОповещения.Вставить("КоличествоУпаковок", 1);
ПараметрыОповещения.Вставить("ФормаВладелец", УникальныйИдентификатор);
Если НайденныеСтроки.Количество() > 0 Тогда
Оповестить("ВыбранБыстрыйТовар", ПараметрыОповещения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытьИнформационнуюПанельОшибкиПриПечатиЧека(Команда)
Элементы.ИнформационнаяПанельОшибкаПриПечатиЧека.Заголовок = "";
ИнформационнаяПанельОшибкаПриПечатиЧекаТекст = "";
Элементы.ГруппаИнформационнаяПанельОшибкаПриПечатиЧека.Видимость = Ложь;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Функция ДополнительноБлокируемыйЭлементНаборов(Поле)
Результат = Ложь;
Если Поле.Имя = Элементы.ТоварыКоличествоУпаковокПоЧеку.Имя Тогда
Результат = Истина;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтотОбъект);
НоменклатураСервер.УстановитьУсловноеОформлениеСерийНоменклатуры(ЭтотОбъект, Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтотОбъект);
НоменклатураСервер.УстановитьУсловноеОформлениеСтатусовУказанияСерий(ЭтотОбъект, Ложь);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковок.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыСумма.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ЧекККМ");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличествоУпаковок.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыУпаковка.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.НоменклатураНабора");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
ЭтоВозвратПоЧеку = ЗначениеЗаполнено(Объект.ЧекККМ);
Элементы.ФормаБыстрыеТовары.Доступность = Не ЭтоВозвратПоЧеку;
Элементы.ФормаГорячиеКлавишиБыстрыеТовары.Доступность = Не ЭтоВозвратПоЧеку;
КонецПроцедуры
#Область ШтрихкодыИТорговоеОборудование
&НаКлиенте
Процедура ОбработатьШтрихкоды(ДанныеШтрихкодов, ЗагрузкаИзТСД = Ложь)
Если Не ШтрихкодированиеНоменклатурыКлиент.ШтрихкодыВалидны(ДанныеШтрихкодов) Тогда
Возврат;
КонецЕсли;
ИзменятьКоличество = Не (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"));
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
Иначе
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
СтруктураДействийСДобавленнымиСтроками.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСДобавленнымиСтроками, Объект);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействийСДобавленнымиСтроками);
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСИзмененнымиСтроками, Объект);
СтруктураДействий = ШтрихкодированиеНоменклатурыКлиент.ПараметрыОбработкиШтрихкодов();
СтруктураДействий.Штрихкоды = ДанныеШтрихкодов;
СтруктураДействий.СтруктураДействийСДобавленнымиСтроками = СтруктураДействийСДобавленнымиСтроками;
СтруктураДействий.СтруктураДействийСИзмененнымиСтроками = СтруктураДействийСИзмененнымиСтроками;
СтруктураДействий.ПараметрыУказанияСерий = ПараметрыУказанияСерий;
СтруктураДействий.ИзменятьКоличество = ИзменятьКоличество;
СтруктураДействий.РассчитыватьНаборы = Истина;
СтруктураДействий.МаркируемаяПродукцияВТЧ = Истина;
СтруктураДействий.ШтрихкодыВТЧ = Истина;
СтруктураДействий.ЗагрузкаИзТСД = ЗагрузкаИзТСД;
ОбработатьШтрихкодыСервер(СтруктураДействий,КэшированныеЗначения);
ДанныеДляОбработки = СтруктураДействий;
Подключаемый_ПослеОбработкиШтрихкодов();
КонецПроцедуры
&НаСервере
Процедура ОбработатьШтрихкодыСервер(СтруктураПараметровДействия,КэшированныеЗначения)
ШтрихкодированиеНоменклатурыСервер.ОбработатьШтрихкоды(ЭтотОбъект,Объект,СтруктураПараметровДействия,КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПолучитьСсылкиНаОборудование()
РабочееМесто = МенеджерОборудованияВызовСервера.РабочееМестоКлиента();
ЭквайринговыеТерминалы.Очистить();
ЭквайринговыеТерминалы = Справочники.ЭквайринговыеТерминалы.ПараметрыЭквайринговыхТерминаловПоОрганизации(Объект.Организация, РабочееМесто, ИспользоватьПодключаемоеОборудование);
Если ИспользоватьПодключаемоеОборудование Тогда
Дисплеи.ЗагрузитьЗначения(МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам("ДисплейПокупателя"));
КонецЕсли;
ПараметрыКассыККМ = Новый ФиксированнаяСтруктура(Справочники.КассыККМ.ПараметрыКассыККМ(Объект.КассаККМ));
ВерсияФФД = МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетВерсиюФФД(ПараметрыКассыККМ.ИдентификаторУстройства);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуПодключенноеОборудованиеОбработчикОжидания()
РозничныеПродажиКлиент.ОткрытьФормуПодключенноеОборудование(ЭтотОбъект, Истина);
КонецПроцедуры
&НаКлиенте
Процедура НачатьПодключениеОборудованияОбработчикОжидания()
ОписаниеЗавершения = Новый ОписаниеОповещения("НачатьПодключениеОборудованиеПриОткрытииФормыЗавершение", РозничныеПродажиКлиент, Новый Структура("Форма", ЭтотОбъект));
МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(ОписаниеЗавершения, ЭтотОбъект, ПоддерживаемыеТипыПодключаемогоОборудования);
КонецПроцедуры
&НаКлиенте
Процедура ВывестиИнформациюНаДисплейПокупателя()
Если Не ВводДоступен() Тогда
Возврат;
КонецЕсли;
КоличествоСтрокВТЧ = Объект.Товары.Количество();
ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
Если ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ > 0 Тогда
ТекущиеДанные = Объект.Товары[КоличествоСтрокВТЧ - 1];
Элементы.Товары.ТекущаяСтрока = ТекущиеДанные.ПолучитьИдентификатор();
ИначеЕсли ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ = 0 Тогда
ТекущиеДанные = Неопределено;
Иначе
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
ДПТекст1 = НСтр("ru = 'Здравствуйте!'");
Если ТекущиеДанные <> Неопределено Тогда
ДПТекст1 = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(
ТекущиеДанные.Номенклатура,
ТекущиеДанные.Характеристика,
,
ТекущиеДанные.Серия);
КонецЕсли;
ДПТекст2 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(
НСтр("ru='Итог:'"), СуммаДокумента);
РозничныеПродажиКлиент.ВывестиТекстНаДисплеиПокупателя(
ЭтотОбъект,
Дисплеи,
ДПТекст1 + Символы.ПС + ДПТекст2);
КонецПроцедуры
&НаКлиенте
Процедура ПоискПоШтрихкодуЗавершение(ДанныеШтрихкода, ДополнительныеПараметры) Экспорт
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Если ДанныеШтрихкода = Неопределено Тогда
Возврат;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("СтандартнаяОбработка", Истина);
ДополнительныеПараметры.Вставить("ДанныеШтрихкода", ДанныеШтрихкода);
ДополнительныеПараметры.Вставить("КэшированныеЗначения", КэшированныеЗначения);
ДополнительныеПараметры.Вставить("ТребуетсяСерверныйВызов", Ложь);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ТоварыПоискПоШтрихкоду", ДополнительныеПараметры);
Если ДополнительныеПараметры.ТребуетсяСерверныйВызов Тогда
ПоискПоШтрихкодуЗавершениеНаСервере(ДополнительныеПараметры);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ЗавершитьОбработкуШтрихкода", ДополнительныеПараметры);
КонецЕсли;
Если Не ДополнительныеПараметры.СтандартнаяОбработка Тогда
Если Не (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит")) Тогда
ПересчитатьДокументНаКлиенте();
КонецЕсли;
Возврат;
КонецЕсли;
ДанныеШтрихкодов = Новый Массив;
ДанныеШтрихкодов.Добавить(ДанныеШтрихкода);
ОбработатьШтрихкоды(ДанныеШтрихкодов);
КонецПроцедуры
&НаСервере
Процедура ПоискПоШтрихкодуЗавершениеНаСервере(ДополнительныеПараметры)
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработатьДанныеШтрихкода", ДополнительныеПараметры);
ПослеОбработкиШтрихкодов(ДополнительныеПараметры);
ДополнительныеПараметры.РезультатОбработкиШтрихкода.ДобавленныеСтроки = Новый Массив;
ДополнительныеПараметры.РезультатОбработкиШтрихкода.ИзмененныеСтроки = Новый Массив;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаКодаМаркировкиВыполнитьДействие(Результат, ДополнительныеПараметры) Экспорт
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработкаКодаМаркировкиВыполнитьДействие", Результат);
ОбработкаКодаМаркировкиВыполнитьДействиеСервер(Результат);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ЗавершитьОбработкуШтрихкода", Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОткрытьФормуУточненияДанных()
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ДанныеДляОбработки", ДанныеДляОбработки());
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Подключаемый_ОткрытьФормуУточненияДанных", ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПослеОбработкиШтрихкодов()
ИзменятьКоличество = Не (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"));
ШтрихкодированиеНоменклатурыКлиент.ОбработатьНеизвестныеШтрихкоды(ДанныеДляОбработки(),КэшированныеЗначения,ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("КэшированныеЗначения", КэшированныеЗначения);
ДополнительныеПараметры.Вставить("ДанныеДляОбработки", ДанныеДляОбработки);
ДополнительныеПараметры.Вставить("СтандартнаяОбработка", Истина);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПослеОбработкиШтрихкодов", ДополнительныеПараметры);
КэшированныеЗначения = ДополнительныеПараметры.КэшированныеЗначения;
Если Не ДополнительныеПараметры.СтандартнаяОбработка Тогда
Возврат;
КонецЕсли;
Если ШтрихкодированиеНоменклатурыКлиент.НужноОткрытьФормуУказанияСерийПослеОбработкиШтрихкодов(ДанныеДляОбработки()) Тогда
ТекущиеДанныеИдентификатор = ДанныеДляОбработки().МассивСтрокССериями[0];
Если ТекущиеДанныеИдентификатор <> Неопределено Тогда
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущиеДанныеИдентификатор);
Элементы.Товары.ТекущаяСтрока = ТекущиеДанныеИдентификатор;
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
ОткрытьПодборСерий(,ТекущиеДанные);
КонецЕсли;
КонецЕсли;
Если ИзменятьКоличество Тогда
ПересчитатьДокументНаКлиенте();
КонецЕсли;
Если ДанныеДляОбработки().ТекущаяСтрока <> Неопределено Тогда
Элементы.Товары.ТекущаяСтрока = ДанныеДляОбработки().ТекущаяСтрока;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьСтрокиТЧ(ДобавленныеСтроки, ИзмененныеСтроки, КэшированныеЗначения = Неопределено, ДействияПриИзмененииКоличества = Неопределено) Экспорт
Если ДействияПриИзмененииКоличества = Неопределено Тогда
ДействияПриИзмененииКоличества = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваЕдиниц(ДействияПриИзмененииКоличества, Объект);
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажиПоАссортименту",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
Иначе
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажи",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
ИспользоватьСкладскиеПомещения = СкладыСервер.ИспользоватьСкладскиеПомещения(Объект.Склад,
?(ЗначениеЗаполнено(Объект.Дата), Объект.Дата, ТекущаяДатаСеанса()));
Если ИспользоватьСкладскиеПомещения Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("НоменклатураПриИзмененииПереопределяемый",
Новый Структура("ИмяФормы, ИмяТабличнойЧасти", ИмяФормы, "Товары"));
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(СтруктураДействийСДобавленнымиСтроками,
ДействияПриИзмененииКоличества, Истина);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект,
"Номенклатура", СтруктураДействийСДобавленнымиСтроками);
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(СтруктураДействийСИзмененнымиСтроками,
ДействияПриИзмененииКоличества, Истина);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ДобавленныеСтроки,
СтруктураДействийСДобавленнымиСтроками,
Объект.Товары,
КэшированныеЗначения);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ИзмененныеСтроки,
СтруктураДействийСИзмененнымиСтроками,
Объект.Товары,
КэшированныеЗначения);
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
Если ДобавленныеСтроки.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = ДобавленныеСтроки[ДобавленныеСтроки.Количество() - 1].ПолучитьИдентификатор();
ИначеЕсли ИзмененныеСтроки.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = ИзмененныеСтроки[ИзмененныеСтроки.Количество() - 1].ПолучитьИдентификатор();
КонецЕсли;
Если ДобавленныеСтроки.Количество()>0 Или ИзмененныеСтроки.Количество()>0 Тогда
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПослеОбработкиШтрихкодов(ДополнительныеПараметры)
РезультатОбработкиШтрихкода = ДополнительныеПараметры.РезультатОбработкиШтрихкода;
КэшированныеЗначения = ДополнительныеПараметры.КэшированныеЗначения;
Если РезультатОбработкиШтрихкода.Свойство("ТребуетсяОбработкаШтрихкода") И РезультатОбработкиШтрихкода.ТребуетсяОбработкаШтрихкода Тогда
ЗагрузкаИзТСД = Ложь;
Если ТипЗнч(РезультатОбработкиШтрихкода.ИсходныеДанные) = Тип("Структура") Тогда
ДанныеШтрихкодов = Новый Массив;
ДанныеШтрихкодов.Добавить(РезультатОбработкиШтрихкода.ИсходныеДанные);
Иначе
ДанныеШтрихкодов = РезультатОбработкиШтрихкода.ИсходныеДанные;
КонецЕсли;
ИзменятьКоличество = Не (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"));
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
Иначе
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
СтруктураДействийСДобавленнымиСтроками.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСДобавленнымиСтроками, Объект);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействийСДобавленнымиСтроками);
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСИзмененнымиСтроками, Объект);
ДанныеДляОбработки = ШтрихкодированиеНоменклатурыКлиентСервер.ПараметрыОбработкиШтрихкодов();
ДанныеДляОбработки.Штрихкоды = ДанныеШтрихкодов;
ДанныеДляОбработки.СтруктураДействийСДобавленнымиСтроками = СтруктураДействийСДобавленнымиСтроками;
ДанныеДляОбработки.СтруктураДействийСИзмененнымиСтроками = СтруктураДействийСИзмененнымиСтроками;
ДанныеДляОбработки.ПараметрыУказанияСерий = ПараметрыУказанияСерий;
ДанныеДляОбработки.ИзменятьКоличество = ИзменятьКоличество;
ДанныеДляОбработки.РассчитыватьНаборы = Истина;
ДанныеДляОбработки.МаркируемаяПродукцияВТЧ = Истина;
ДанныеДляОбработки.ШтрихкодыВТЧ = Истина;
ДанныеДляОбработки.ЗагрузкаИзТСД = ЗагрузкаИзТСД;
ОбработатьШтрихкодыСервер(ДанныеДляОбработки, КэшированныеЗначения);
ИзмененныеСтроки = ИсправитьПревышениеКоличестваУпаковокПоДаннымНевозвращенныхПозиций(ДополнительныеПараметры);
Если ИзмененныеСтроки.Количество() Тогда
ДействияПриИзмененииКоличества = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(ДействияПриИзмененииКоличества, Объект);
ОбработатьСтрокиТЧ(
Новый Массив,
ИзмененныеСтроки,
КэшированныеЗначения,
ДействияПриИзмененииКоличества);
КонецЕсли;
Иначе
ОбработатьСтрокиТЧ(
РезультатОбработкиШтрихкода.ДобавленныеСтроки,
РезультатОбработкиШтрихкода.ИзмененныеСтроки,
КэшированныеЗначения);
Если ЗначениеЗаполнено(Объект.ЧекККМ)
И РезультатОбработкиШтрихкода.Свойство("ТребуетсяСопоставлениеНоменклатуры")
И РезультатОбработкиШтрихкода.ТребуетсяСопоставлениеНоменклатуры
И РезультатОбработкиШтрихкода.ШтрихкодыПродукцииДляСопоставления.Количество() Тогда
Для Каждого ШтрихкодДляСопоставления Из РезультатОбработкиШтрихкода.ШтрихкодыПродукцииДляСопоставления Цикл
СообщитьПользователюЧтоШтрихкодНеНайденВЧекеПродажи(ШтрихкодДляСопоставления.Штрихкод);
КонецЦикла;
КонецЕсли;
КонецЕсли;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ЗаполнитьСлужебныеРеквизитыПоЧеку();
Возврат РезультатОбработкиШтрихкода;
КонецФункции
&НаКлиенте
Процедура ПолучитьВесЗавершение(РезультатВыполнения, ТекущаяСтрока) Экспорт
Если РезультатВыполнения.Результат Тогда
ТекущаяСтрока.КоличествоУпаковок = РезультатВыполнения.Вес;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
Иначе
МенеджерОборудованияУТКлиент.СообщитьОбОшибке(РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзТСДЗавершение(Результат, Параметры) Экспорт
Если Результат.Результат Тогда
ОбработатьШтрихкоды(Результат.ТаблицаТоваров, Истина);
Иначе
МенеджерОборудованияУТКлиент.СообщитьОбОшибке(Результат);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ДанныеДляОбработки()
Возврат ДанныеДляОбработки;
КонецФункции
&НаСервере
Процедура ОбработкаКодаМаркировкиВыполнитьДействиеСервер(Результат)
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработкаКодаМаркировкиВыполнитьДействиеСервер", Результат);
ПослеОбработкиШтрихкодов(Результат);
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработкаКодаМаркировкиВыполнитьДействиеЗавершениеСервер", Результат);
КонецПроцедуры
#КонецОбласти
#Область Серии
&НаСервере
Процедура УстановитьВидимостьЭлементовСерий()
Элементы.ТоварыСтатусУказанияСерий.Видимость = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
Элементы.УказатьСерии.Видимость = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
Элементы.ТоварыСерия.Видимость = ПараметрыУказанияСерий.УчитыватьСебестоимостьПоСериям;
Элементы.ТоварыСерияДополнительно.Видимость = ПараметрыУказанияСерий.УчитыватьСебестоимостьПоСериям;
КонецПроцедуры
&НаСервере
Процедура ОбработатьУказаниеСерийСервер(ПараметрыФормыУказанияСерий)
НоменклатураСервер.ОбработатьУказаниеСерий(Объект, ПараметрыУказанияСерий, ПараметрыФормыУказанияСерий);
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Серии");
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСтатусыУказанияСерийПриОкончанииРедактированияСтрокиТЧ(ТекущаяСтрокаИдентификатор, КэшированныеЗначения)
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерийПриОкончанииРедактированияСтрокиТЧ(Объект, ПараметрыУказанияСерий, ТекущаяСтрокаИдентификатор, КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Функция ПараметрыФормыУказанияСерий(ТекущиеДанныеИдентификатор)
Возврат НоменклатураСервер.ПараметрыФормыУказанияСерий(Объект, ПараметрыУказанияСерий, ТекущиеДанныеИдентификатор, ЭтотОбъект);
КонецФункции
#КонецОбласти
#Область Наборы
&НаКлиентеНаСервереБезКонтекста
Функция КолонкиНабора()
Колонки = Новый Массив;
Колонки.Добавить("Номенклатура");
Колонки.Добавить("Характеристика");
Колонки.Добавить("Цена");
Колонки.Добавить("Упаковка");
Колонки.Добавить("Количество");
Колонки.Добавить("КоличествоУпаковок");
Колонки.Добавить("СтавкаНДС");
Колонки.Добавить("СуммаНДС");
Колонки.Добавить("Сумма");
Возврат Колонки;
КонецФункции
&НаКлиенте
Процедура ПриУдаленииКомплектующих(Действие, ДополнительныйПараметр) Экспорт
Если НаборыКлиент.ДействиеРедактироватьНабор(Действие) Тогда
НаборыКлиент.ПриУдаленииКомплектующих(ЭтотОбъект, "Товары", ДополнительныйПараметр);
ИначеЕсли НаборыКлиент.ДействиеУдалитьВесьНабор(Действие) Тогда
ПриУдаленииКомплектующихНаСервере("Товары", ДополнительныйПараметр);
КонецЕсли;
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаСервере
Процедура ПриУдаленииКомплектующихНаСервере(ИмяТЧ, ДополнительныйПараметр)
НаборыСервер.ПриУдаленииКомплектующих(ЭтотОбъект, ИмяТЧ, ДополнительныйПараметр);
КонецПроцедуры
&НаСервере
Функция АдресНабораВоВременномХранилище(Параметры)
АдресВоВременномХранилище = НаборыСервер.АдресНабораВоВременномХранилище(ЭтотОбъект, Параметры, "Товары");
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
Комплектующие = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
СтрокиСНулевымКоличествомУпаковок = Комплектующие.НайтиСтроки(Новый Структура("КоличествоУпаковок", 0));
Если СтрокиСНулевымКоличествомУпаковок.Количество() Тогда
Для Каждого СтрокаСНулевымКоличеством Из СтрокиСНулевымКоличествомУпаковок Цикл
Комплектующие.Удалить(СтрокаСНулевымКоличеством);
КонецЦикла;
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Комплектующие, АдресВоВременномХранилище);
КонецЕсли;
КонецЕсли;
Возврат АдресВоВременномХранилище;
КонецФункции
&НаСервере
Процедура ПриОкончанииРедактированияНабора(АдресВоВременномХранилище)
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
Данные = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
ЗаполнитьСлужебныеРеквизиты = Ложь;
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
Данные.ОтвязатьОтНабора = Ложь;
ИзменилиКоличествоУпаковок = Ложь;
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействийДляПересчета = Новый Структура;
СтруктураДействийДляПересчета.Вставить("ПересчитатьКоличествоУпаковок");
МассивСтрокДляОбработки = Новый Массив;
Для Каждого СтрокаКомплектующего Из Данные.Комплектующие Цикл
ОтборПоНоменклатуре = ОтборДляПоискаПоНоменклатуре(СтрокаКомплектующего, ИспользоватьХарактеристикиНоменклатуры, Ложь, ИспользоватьНаборы);
СтрокиТоваров = Объект.Товары.НайтиСтроки(ОтборПоНоменклатуре);
Если СтрокиТоваров.Количество()
И СтрокаКомплектующего.Упаковка <> СтрокиТоваров[0].Упаковка Тогда
МассивСтрокДляОбработки.Добавить(СтрокиТоваров[0]);
КонецЕсли;
КонецЦикла;
СтрокиДляУдаления = Новый Массив;
Для Каждого СтрокаКомплектующего Из Данные.Комплектующие Цикл
ОтборПоНоменклатуре = ОтборДляПоискаПоНоменклатуре(СтрокаКомплектующего, ИспользоватьХарактеристикиНоменклатуры, Ложь, ИспользоватьНаборы);
СтрокиТоваров = Объект.Товары.НайтиСтроки(ОтборПоНоменклатуре);
Если СтрокиТоваров.Количество() Тогда
НайденнаяСтрокаТоваров = СтрокиТоваров[0];
Если Не МассивСтрокДляОбработки.Найти(НайденнаяСтрокаТоваров) = Неопределено Тогда
ДанныеДляПересчета = Новый Структура;
ДанныеДляПересчета.Вставить("Упаковка", СтрокаКомплектующего.Упаковка);
ДанныеДляПересчета.Вставить("Номенклатура", СтрокаКомплектующего.Номенклатура);
ДанныеДляПересчета.Вставить("Количество", НайденнаяСтрокаТоваров.КоличествоПоЧеку);
ДанныеДляПересчета.Вставить("КоличествоУпаковок", НайденнаяСтрокаТоваров.КоличествоУпаковокПоЧеку);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(
ДанныеДляПересчета, СтруктураДействийДляПересчета, КэшированныеЗначения);
НайденнаяСтрокаТоваров.КоличествоУпаковокПоЧеку = ДанныеДляПересчета.КоличествоУпаковок;
КонецЕсли;
КонецЕсли;
ПроверкаПревышения = ПревышеноКоличествоУпаковокНевозвращенныхПозиций(Объект, ОтборПоНоменклатуре, СтрокаКомплектующего.КоличествоУпаковок, Ложь);
Если ПроверкаПревышения.Результат Тогда
Если ПроверкаПревышения.НайденнаяСтрока = Неопределено Тогда
СтрокиДляУдаления.Добавить(СтрокаКомплектующего);
Иначе
ИзменилиКоличествоУпаковок = Истина;
СтрокаКомплектующего.КоличествоУпаковок = ПроверкаПревышения.НайденнаяСтрока.КоличествоУпаковокПоЧеку;
СтрокаКомплектующего.Количество = ПроверкаПревышения.НайденнаяСтрока.КоличествоПоЧеку;
КонецЕсли;
КонецЕсли;
Если Не ПроверкаПревышения.НайденнаяСтрока = Неопределено
И СтрокаКомплектующего.НомерСтрокиДокумента = 0 Тогда
СтрокаКомплектующего.НомерСтрокиДокумента = ПроверкаПревышения.НайденнаяСтрока.НомерСтроки;
Если СтрокаКомплектующего.Цена <> ПроверкаПревышения.НайденнаяСтрока.Цена Тогда
ИзменилиКоличествоУпаковок = Истина;
СтрокаКомплектующего.Цена = ПроверкаПревышения.НайденнаяСтрока.Цена;
КонецЕсли;
Если СтрокаКомплектующего.Упаковка <> ПроверкаПревышения.НайденнаяСтрока.Упаковка Тогда
СтрокаКомплектующего.Упаковка = ПроверкаПревышения.НайденнаяСтрока.Упаковка;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаДляУдаления Из СтрокиДляУдаления Цикл
Данные.Комплектующие.Удалить(СтрокаДляУдаления);
КонецЦикла;
Если ИзменилиКоличествоУпаковок Тогда
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСИзмененнымиСтроками, Объект);
КонецЕсли;
СоставИсходногоНабора = Объект.Товары.НайтиСтроки(Новый Структура("НоменклатураНабора,ХарактеристикаНабора", Данные.НоменклатураНабора, Данные.ХарактеристикаНабора));
Если СоставИсходногоНабора.Количество() <> Данные.Комплектующие.Количество() Тогда
Для Каждого КомплектующееИсходногоНабора Из СоставИсходногоНабора Цикл
ОтборПоНоменклатуре = ОтборДляПоискаПоНоменклатуре(КомплектующееИсходногоНабора, ИспользоватьХарактеристикиНоменклатуры, Ложь, ИспользоватьНаборы);
НайденныеСтрокиКомплектующих = Данные.Комплектующие.НайтиСтроки(ОтборПоНоменклатуре);
Если НайденныеСтрокиКомплектующих.Количество() = 0 Тогда
ЗаполнитьСлужебныеРеквизиты = Истина;
КомплектующееИсходногоНабора.КоличествоУпаковок = 0;
КомплектующееИсходногоНабора.Количество = 0;
КомплектующееИсходногоНабора.Сумма = 0;
КомплектующееИсходногоНабора.СуммаНДС = 0;
НовоеКомплектующее = Данные.Комплектующие.Добавить();
ЗаполнитьЗначенияСвойств(НовоеКомплектующее, КомплектующееИсходногоНабора);
НовоеКомплектующее.НомерСтрокиДокумента = КомплектующееИсходногоНабора.НомерСтроки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
ПараметрыДанных = Новый Структура;
ПараметрыДанных.Вставить("Данные", Данные);
ПараметрыДанных.Вставить("СтруктураДействийСИзмененнымиСтроками", СтруктураДействийСИзмененнымиСтроками);
ПараметрыДанных.Вставить("СтруктураДействийСДобавленнымиСтроками", СтруктураДействийСДобавленнымиСтроками);
ПараметрыДанных.Вставить("КолонкиНабора", КолонкиНабора());
НаборыСервер.ПриОкончанииРедактированияНабора(ЭтотОбъект, "Товары", ПараметрыДанных);
Если ЗначениеЗаполнено(Объект.ЧекККМ) И ЗаполнитьСлужебныеРеквизиты Тогда
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ЗаполнитьСлужебныеРеквизитыПоЧеку();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ПечатьЧека
&НаСервере
Функция ПараметрыОперацииФискализацииЧекаНаСервере()
Возврат ПараметрыОперацииФискализацииЧекаНаСервереЛокализация();
КонецФункции
&НаКлиенте
Функция ПараметрыОперацииФискализацииЧека()
Возврат ПараметрыОперацииФискализацииЧекаНаСервере();
КонецФункции
&НаКлиенте
Процедура ПробитьЧек()
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ЕстьОшибки = Ложь;
Если Объект.ПометкаУдаления Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Документ помечен на удаление'"), Объект.Ссылка,,,ЕстьОшибки);
КонецЕсли;
Модифицированность = Истина;
Если ЕстьОшибки Или Не ПроверитьЗаполнение() Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ПараметрыОперацииФискализацииЧека = ПараметрыОперацииФискализацииЧека();
ПечатьЧекаПослеЗаписиИзмененийЛокализация(ПараметрыОперацииФискализацииЧека);
КонецПроцедуры
#Область ФискальнаяОперация
&НаСервере
Функция ЗаписатьФискальнуюОперациюНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, РеквизитыФискальнойОперацииКассовогоУзла)
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
ПараметрыЗаписи.Вставить("РежимПроведения", РежимПроведенияДокумента.Оперативный);
ПараметрыЗаписи.Вставить("РежимТранзакции", Истина);
Результат = РозничныеПродажи.ЗаписатьФискальнуюОперациюНаСервере(ЭтотОбъект, РеквизитыФискальнойОперацииКассовогоУзла, ПараметрыЗаписи);
Если Результат Тогда
ПараметрыЗаписи.Вставить("РежимТранзакции", Ложь);
ПослеЗаписиНаСервере(РеквизитФормыВЗначение("Объект"), ПараметрыЗаписи);
Иначе
ТребуетсяПовторнаяПопыткаЗаписи = Истина;
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМВозврат));
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область Прочее
&НаКлиенте
Процедура ОткрытьОкноАвторизации()
ОткрытьФорму("Документ.ЧекККМ.Форма.Авторизация", Новый Структура("Режим", "СменитьПрава"), ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПодтверждениеИзмененияСоставаПозиций(ОписаниеОповещенияОЗавершении)
Если ЗначениеЗаполнено(Объект.ЧекККМ) И ЭтоПолныйВозвратВСменуПродажи И ОбщаяСуммаОплатыПлатежнымиКартами <> 0 Тогда
ТекстСообщения = НСтр("ru = 'По чеку возврата можно выполнить отмену оплаты. Изменение товарных позиций сделает эту операцию недоступной. Продолжить изменение?'");
ПоказатьВопрос(ОписаниеОповещенияОЗавершении, ТекстСообщения, РежимДиалогаВопрос.ДаНет);
Иначе
ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗавершении, КодВозвратаДиалога.Да);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоискПоШтрихкодуВыполнитьПодтверждениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Оповещение = Новый ОписаниеОповещения("ПоискПоШтрихкодуЗавершение", ЭтотОбъект);
ШтрихкодированиеНоменклатурыКлиент.ПоказатьВводШтрихкода(Оповещение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СоставНабораПодтверждениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
ПараметрыКомплекта = Новый Структура;
ПараметрыКомплекта.Вставить("НоменклатураНабора", ТекущаяСтрока.НоменклатураНабора);
ПараметрыКомплекта.Вставить("ХарактеристикаНабора", ТекущаяСтрока.ХарактеристикаНабора);
ПараметрыКомплекта.Вставить("КолонкиНабора", КолонкиНабора());
АдресНабораВоВременномХранилище = АдресНабораВоВременномХранилище(ПараметрыКомплекта);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("АдресВоВременномХранилище", АдресНабораВоВременномХранилище);
ПараметрыОткрытия.Вставить("НоменклатураНабора", ТекущаяСтрока.НоменклатураНабора);
ПараметрыОткрытия.Вставить("ХарактеристикаНабора", ТекущаяСтрока.ХарактеристикаНабора);
ПараметрыОткрытия.Вставить("ЦенаВключаетНДС", Объект.ЦенаВключаетНДС);
ПараметрыОткрытия.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
ПараметрыОткрытия.Вставить("Валюта", Объект.Валюта);
ПараметрыОткрытия.Вставить("ВидЦены", Объект.ВидЦены);
ПараметрыОткрытия.Вставить("Дата", Объект.Дата);
ПараметрыОткрытия.Вставить("Ссылка", Объект.Ссылка);
ПараметрыОткрытия.Вставить("Склад", Объект.Склад);
ПараметрыОткрытия.Вставить("СкрыватьКомандуОстаткиНаСкладах", Ложь);
ПараметрыОткрытия.Вставить("ЗапретРедактированияЦены", Истина);
ПараметрыОткрытия.Вставить("Организация", Объект.Организация);
ОткрытьФорму("Обработка.РедактированиеНабора.Форма.Форма", ПараметрыОткрытия, ЭтотОбъект, УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзмененииПодтверждениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
Если Результат = КодВозвратаДиалога.Да Тогда
ТекущаяСтрока.ВозвращаемаяПозиция = (ТекущаяСтрока.КоличествоУпаковок > 0);
УстановитьОтборСтрокТаблицыТовары(РежимОтображенияТоваровПоЧеку, Элементы.Товары);
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий, Объект);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПересчитатьДокументНаКлиенте();
Иначе
ТекущаяСтрока.КоличествоУпаковок = КэшированныеСтроки[Элементы.Товары.Имя].КоличествоУпаковок;
ТекущаяСтрока.Количество = КэшированныеСтроки[Элементы.Товары.Имя].Количество;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыУпаковкаПриИзмененииПодтверждениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
Если Результат = КодВозвратаДиалога.Да Тогда
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
ДанныеДляПересчета = Новый Структура;
ДанныеДляПересчета.Вставить("Упаковка", ТекущаяСтрока.Упаковка);
ДанныеДляПересчета.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
ДанныеДляПересчета.Вставить("Количество", ТекущаяСтрока.КоличествоПоЧеку);
ДанныеДляПересчета.Вставить("КоличествоУпаковок", ТекущаяСтрока.КоличествоУпаковокПоЧеку);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ДанныеДляПересчета, СтруктураДействий, КэшированныеЗначения);
ТекущаяСтрока.КоличествоУпаковокПоЧеку = ДанныеДляПересчета.КоличествоУпаковок;
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ТекущаяСтрока.КоличествоУпаковок = ДанныеДляПересчета.КоличествоУпаковок;
Если ТекущаяСтрока.КоличествоУпаковок > ТекущаяСтрока.КоличествоУпаковокПоЧеку Тогда
ТекущаяСтрока.КоличествоУпаковок = ТекущаяСтрока.КоличествоУпаковокПоЧеку;
КонецЕсли;
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
Если ТекущаяСтрока.Количество > 0 И Не ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
СтруктураДействий.Вставить("ПересчитатьЦенуЗаУпаковку", ТекущаяСтрока.Количество);
ИначеЕсли ЗначениеЗаполнено(Объект.ВидЦены) Тогда
Если КонтролироватьАссортимент Тогда
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
КонецЕсли;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПересчитатьДокументНаКлиенте();
Иначе
ТекущаяСтрока.Упаковка = КэшированныеСтроки[Элементы.Товары.Имя].Упаковка;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещенияПодтверждениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ДанныеШтрихкодов = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(ДополнительныеПараметры.Параметр);
ОбработатьШтрихкоды(ДанныеШтрихкодов);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОшибкаПриПроведенииЧекаВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Отмена Тогда
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
Если ДополнительныеПараметры.ИмяПроцедуры = "ЗаписатьНаСервере" Тогда
РезультатОперации = ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
ИначеЕсли ДополнительныеПараметры.ИмяПроцедуры = "ОтложитьНаСервере" Тогда
РезультатОперации = ОтложитьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
ИначеЕсли ДополнительныеПараметры.ИмяПроцедуры = "ЗаписатьФискальнуюОперациюНаСервере" Тогда
РезультатОперации = ЗаписатьФискальнуюОперациюНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, ДополнительныеПараметры.РеквизитыФискальнойОперацииКассовогоУзла);
КонецЕсли;
Если РезультатОперации Тогда
ВыполнитьОбработкуОповещения(
ДополнительныеПараметры.ОписаниеОповещения,
?(ДополнительныеПараметры.ВозвращатьРезультатФункции, РезультатОперации, ДополнительныеПараметры.РезультатПриУспешномПроведении));
Иначе
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметры),
ДополнительныеПараметры.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
КонецЕсли;
Иначе
ВыполнитьОбработкуОповещения(
ДополнительныеПараметры.ОписаниеОповещения,
?(ДополнительныеПараметры.ВозвращатьРезультатФункции, ДополнительныеПараметры.РезультатОперации, ДополнительныеПараметры.РезультатПриОтмене));
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи = Неопределено)
Объект.Дата = ТекущаяДатаСеанса();
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
Значение = РеквизитФормыВЗначение("Объект", Тип("ДокументОбъект.ЧекККМВозврат"));
Значение.УстановитьСсылкуНового(Документы.ЧекККМВозврат.ПолучитьСсылку());
ЗначениеВДанныеФормы(Значение, Объект);
КонецЕсли;
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "Документ.ЧекККМВозврат";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Ссылка", Объект.Ссылка);
Блокировка.Заблокировать();
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
ПараметрыЗаписи.Вставить("РежимПроведения", РежимПроведенияДокумента.Оперативный);
ПараметрыЗаписи.Вставить("РежимТранзакции", Истина);
Результат = Записать(ПараметрыЗаписи);
ЗафиксироватьТранзакцию();
ПараметрыЗаписи.Вставить("РежимТранзакции", Ложь);
ПослеЗаписиНаСервере(РеквизитФормыВЗначение("Объект"), ПараметрыЗаписи);
Исключение
ОтменитьТранзакцию();
ТребуетсяПовторнаяПопыткаЗаписи = Истина;
Возврат Ложь;
КонецПопытки;
Если Не Результат Тогда
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМВозврат));
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Функция ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи = Неопределено)
Если Модифицированность Тогда
Если Объект.Товары.Итог("КоличествоУпаковок") = 0 Тогда
ТекстСообщения = НСтр("ru = 'Необходимо указать хотя бы одну возвращаемую позицию.'");
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
Возврат Ложь;
КонецЕсли;
Результат = ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
Если Результат Тогда
Оповестить("Запись_ЧекККМВозврат", Новый Структура, Неопределено);
КонецЕсли;
Возврат Результат;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
&НаСервере
Функция ПоместитьТабличнуюЧастьТоварыВоВременноеХранилищеДляПроверкиКоличества(ВыгруженаТолькоНеМаркируемаяПродукция = Ложь)
ТабличнаяЧастьТовары = Объект.Товары.Выгрузить();
Если ТабличнаяЧастьТовары.Колонки.Найти("МаркируемаяПродукция") <> Неопределено Тогда
НомерТекущейСтроки = ТабличнаяЧастьТовары.Количество()-1;
Пока НомерТекущейСтроки >= 0 Цикл
Если ТабличнаяЧастьТовары[НомерТекущейСтроки].МаркируемаяПродукция Тогда
ТабличнаяЧастьТовары.Удалить(НомерТекущейСтроки);
ВыгруженаТолькоНеМаркируемаяПродукция = Истина;
КонецЕсли;
НомерТекущейСтроки = НомерТекущейСтроки - 1;
КонецЦикла;
КонецЕсли;
ТабличнаяЧастьТовары.Свернуть("ИдентификаторСтроки, НоменклатураНабора, ХарактеристикаНабора, НоменклатураЕГАИС, Номенклатура, Характеристика, Серия, СтатусУказанияСерий, ТипНоменклатуры, ХарактеристикиИспользуются, Упаковка, КоличествоУпаковок, Количество");
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ТабличнаяЧастьТовары, УникальныйИдентификатор);
Возврат АдресВоВременномХранилище;
КонецФункции
&НаСервере
Процедура ИзменитьТабличнуюЧастьПоРезультатамПроверки(ВозвращаемыеПараметры, КэшированныеЗначения)
ТаблицаТовары = ПолучитьИзВременногоХранилища(ВозвращаемыеПараметры.Товары);
УдаляемыеСтроки = Новый Массив;
ИзмененныеСтрокиДляОбработки = Новый Массив;
ДобавленныеСтрокиДляОбработки = Новый Массив;
Для Каждого СтрокаИсточник Из ТаблицаТовары Цикл
Отбор = Новый Структура("НоменклатураНабора, ХарактеристикаНабора, Номенклатура, Характеристика, Серия, ХарактеристикиИспользуются, Упаковка");
ЗаполнитьЗначенияСвойств(Отбор, СтрокаИсточник);
НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл
Если СтрокаИсточник.КоличествоУпаковок = 0 Тогда
Прервать;
КонецЕсли;
Если СтрокаТЧ.КоличествоУпаковок = 0
И СтрокаИсточник.КоличествоУпаковок < 0 Тогда
Продолжить;
КонецЕсли;
Если СтрокаИсточник.КоличествоУпаковок >= 0 Тогда
СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + СтрокаИсточник.КоличествоУпаковок;
СтрокаИсточник.КоличествоУпаковок = 0;
Иначе
КоличествоКСписанию = -СтрокаИсточник.КоличествоУпаковок;
КоличествоВСтроке = СтрокаТЧ.КоличествоУпаковок;
Если КоличествоКСписанию > КоличествоВСтроке Тогда
СтрокаИсточник.КоличествоУпаковок = КоличествоВСтроке - КоличествоКСписанию;
СтрокаТЧ.КоличествоУпаковок = 0;
Иначе
СтрокаИсточник.КоличествоУпаковок = 0;
СтрокаТЧ.КоличествоУпаковок = КоличествоВСтроке - КоличествоКСписанию;
КонецЕсли;
КонецЕсли;
Если СтрокаТЧ.КоличествоУпаковок = 0 Тогда
Если УдаляемыеСтроки.Найти(СтрокаТЧ) = Неопределено Тогда
УдаляемыеСтроки.Добавить(СтрокаТЧ);
КонецЕсли;
Иначе
ИзмененныеСтрокиДляОбработки.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
Если НайденныеСтроки.Количество() = 0 Тогда
СтрокаТЧ = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаИсточник);
ДобавленныеСтрокиДляОбработки.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
КэшированныеЗначенияДляПакетнойОбработки = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ИзмененныеСтрокиДляОбработки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначенияДляПакетнойОбработки);
КэшированныеЗначенияДляПакетнойОбработки = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
Если КонтролироватьАссортимент Тогда
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ДобавленныеСтрокиДляОбработки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначенияДляПакетнойОбработки);
Для Каждого СтрокаТЧ Из УдаляемыеСтроки Цикл
Объект.Товары.Удалить(СтрокаТЧ);
КонецЦикла;
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ЗавершенаПроверкаКоличества", ВозвращаемыеПараметры);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий, Объект)
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваЕдиниц(СтруктураДействий, Объект)
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПересчитатьСумму");
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоНоменклатуре()
ЗаполнитьПризнакХарактеристикиИспользуются = Новый Структура("Номенклатура", "ХарактеристикиИспользуются");
ЗаполнитьПризнакТипНоменклатуры = Новый Структура("Номенклатура", "ТипНоменклатуры");
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", ЗаполнитьПризнакХарактеристикиИспользуются);
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", ЗаполнитьПризнакТипНоменклатуры);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "НоменклатураПризнаки", СтруктураДействий);
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(Объект.Товары, СтруктураДействий);
НаборыСервер.ЗаполнитьСлужебныеРеквизиты(ЭтотОбъект);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ИнформацияОбОплате(Форма)
ОплатаПлатежнымиКартамиОтменено = 0;
ОплатыПлатежнымиКартами = РозничныеПродажиКлиентСервер.СтрокиОплатыПлатежнымиКартами(Форма.Объект.ОплатаПлатежнымиКартами);
Для Каждого СтрокаТЧ Из ОплатыПлатежнымиКартами Цикл
Если СтрокаТЧ.ОплатаОтменена Тогда
ОплатаПлатежнымиКартамиОтменено = ОплатаПлатежнымиКартамиОтменено + СтрокаТЧ.Сумма;
КонецЕсли;
КонецЦикла;
Форма.СуммаДокумента = ЦенообразованиеКлиентСервер.ПолучитьСуммуДокумента(Форма.Объект.Товары, Форма.Объект.ЦенаВключаетНДС);
Если Форма.Объект.ЦенаВключаетНДС Тогда
СуммаБезСкидки = Форма.СуммаДокумента;
Иначе
СуммаБезСкидки = Форма.СуммаДокумента - Форма.Объект.Товары.Итог("СуммаНДС");
КонецЕсли;
ИнформацияОбОплате = Новый Структура;
ИнформацияОбОплате.Вставить("Документ", Форма.Объект.Ссылка);
ИнформацияОбОплате.Вставить("Наличные", Форма.Объект.ВыданоНаличными);
ИнформацияОбОплате.Вставить("ПлатежныеКарты", Форма.ОбщаяСуммаОплатыПлатежнымиКартами);
ИнформацияОбОплате.Вставить("ПлатежныеКартыОтменено", ОплатаПлатежнымиКартамиОтменено);
ИнформацияОбОплате.Вставить("ПодарочныеСертификаты", 0);
ИнформацияОбОплате.Вставить("БонусныеБаллы", 0);
ИнформацияОбОплате.Вставить("СуммаДокумента", Форма.СуммаДокумента);
ИнформацияОбОплате.Вставить("СуммаКОплате", СуммаБезСкидки);
ИнформацияОбОплате.Вставить("СуммаСкидки", 0);
ИнформацияОбОплате.Вставить("ДоступныеВидыОплаты", РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(Форма));
ИнформацияОбОплате.Вставить("ИтогоОплачено", ИнформацияОбОплате.Наличные + ОплатаПлатежнымиКартамиОтменено);
ИнформацияОбОплатеЛокализация(Форма, ИнформацияОбОплате);
СуммаДоплатыРасчетная = Макс(ИнформацияОбОплате.СуммаДокумента - ИнформацияОбОплате.ИтогоОплачено, 0);
Форма.ОбщаяСуммаОплатыПлатежнымиКартами = 0;
Если Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит") Тогда
Форма.ОбщаяСуммаОплатыПлатежнымиКартами = ОплатаПлатежнымиКартамиОтменено;
Иначе
Для Каждого КомбинацияСуммНеотмененныхОплат Из Форма.ДанныеПоЧекуККМ.КомбинацииСуммНеотмененныхОплатПлатежнымиКартами Цикл
Если КомбинацияСуммНеотмененныхОплат <= СуммаДоплатыРасчетная
И КомбинацияСуммНеотмененныхОплат > Форма.ОбщаяСуммаОплатыПлатежнымиКартами Тогда
Форма.ОбщаяСуммаОплатыПлатежнымиКартами = КомбинацияСуммНеотмененныхОплат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ИнформацияОбОплате;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьОтборСтрокТаблицыТовары(РежимОтображенияТоваровПоЧеку, ЭлементыТовары)
ТоварыОтборСтрок = Новый Структура;
Если Не РежимОтображенияТоваровПоЧеку Тогда
ТоварыОтборСтрок.Вставить("ВозвращаемаяПозиция", Истина);
КонецЕсли;
ЭлементыТовары.ОтборСтрок = Новый ФиксированнаяСтруктура(ТоварыОтборСтрок);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоЧеку()
НевозвращенныеПозицииПоЧеку = Неопределено;
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
НевозвращенныеПозицииПоЧеку = ПолучитьИзВременногоХранилища(ДанныеПоЧекуККМ.АдресТаблицыНевозвращенныхПозиций);
КонецЕсли;
ОписанияЧисловогоТипа = Новый ОписаниеТипов("Число",,,
Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Неотрицательный));
ТаблицаДанныхДляПересчета = Новый ТаблицаЗначений();
ТаблицаДанныхДляПересчета.Колонки.Добавить("Упаковка", Новый ОписаниеТипов("СправочникСсылка.УпаковкиЕдиницыИзмерения"));
ТаблицаДанныхДляПересчета.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаДанныхДляПересчета.Колонки.Добавить("Количество", ОписанияЧисловогоТипа);
ТаблицаДанныхДляПересчета.Колонки.Добавить("КоличествоУпаковок", ОписанияЧисловогоТипа);
ТаблицаДанныхДляПересчета.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(10)));
Если Не НевозвращенныеПозицииПоЧеку = Неопределено Тогда
Для Каждого СтрокаТовары Из Объект.Товары Цикл
Если СтрокаТовары.КоличествоУпаковок > 0 Тогда
ДанныеНевозвращеннойПозиции = НевозвращенныеПозицииПоЧеку[СтрокаТовары.ПолучитьИдентификатор()];
Если Не ДанныеНевозвращеннойПозиции = Неопределено
И ДанныеНевозвращеннойПозиции.Упаковка <> СтрокаТовары.Упаковка Тогда
ДанныеДляПересчета = ТаблицаДанныхДляПересчета.Добавить();
ДанныеДляПересчета.Упаковка = СтрокаТовары.Упаковка;
ДанныеДляПересчета.Номенклатура = СтрокаТовары.Номенклатура;
ДанныеДляПересчета.Количество = ДанныеНевозвращеннойПозиции.Количество;
ДанныеДляПересчета.КоличествоУпаковок = ДанныеНевозвращеннойПозиции.КоличествоУпаковок;
ДанныеДляПересчета.ИдентификаторСтроки = СтрокаТовары.ПолучитьИдентификатор();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ТаблицаДанныхДляПересчета.Количество() Тогда
ТаблицаДанныхДляПересчета.Индексы.Добавить("ИдентификаторСтроки");
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(ТаблицаДанныхДляПересчета, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
КонецЕсли;
Для Каждого СтрокаТовары Из Объект.Товары Цикл
НовоеЗначениеКоличествоУпаковокПоЧеку = 0;
НовоеЗначениеКоличествоПоЧеку = 0;
НовоеЗначениеВозвращаемаяПозиция = Истина;
Если Не НевозвращенныеПозицииПоЧеку = Неопределено Тогда
ИдентификаторСтроки = СтрокаТовары.ПолучитьИдентификатор();
ДанныеНевозвращеннойПозиции = НевозвращенныеПозицииПоЧеку[ИдентификаторСтроки];
Если Не ДанныеНевозвращеннойПозиции = Неопределено Тогда
НовоеЗначениеКоличествоУпаковокПоЧеку = ДанныеНевозвращеннойПозиции.КоличествоУпаковок;
НовоеЗначениеКоличествоПоЧеку = ДанныеНевозвращеннойПозиции.Количество;
НайденныеДанныеДляПересчета = ТаблицаДанныхДляПересчета.НайтиСтроки(Новый Структура("ИдентификаторСтроки", ИдентификаторСтроки));
Если НайденныеДанныеДляПересчета.Количество() > 0 Тогда
НовоеЗначениеКоличествоУпаковокПоЧеку = НайденныеДанныеДляПересчета[0].КоличествоУпаковок;
КонецЕсли;
КонецЕсли;
НовоеЗначениеВозвращаемаяПозиция = (СтрокаТовары.КоличествоУпаковок > 0);
КонецЕсли;
Если СтрокаТовары.КоличествоУпаковокПоЧеку <> НовоеЗначениеКоличествоУпаковокПоЧеку Тогда
СтрокаТовары.КоличествоУпаковокПоЧеку = НовоеЗначениеКоличествоУпаковокПоЧеку;
КонецЕсли;
Если СтрокаТовары.КоличествоПоЧеку <> НовоеЗначениеКоличествоПоЧеку Тогда
СтрокаТовары.КоличествоПоЧеку = НовоеЗначениеКоличествоПоЧеку;
КонецЕсли;
Если СтрокаТовары.ВозвращаемаяПозиция <> НовоеЗначениеВозвращаемаяПозиция Тогда
СтрокаТовары.ВозвращаемаяПозиция = НовоеЗначениеВозвращаемаяПозиция;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#Область ОтменаОплатыПлатежнымиКартами
&НаКлиенте
Процедура ДополнитьПараметрыОтменыОплатыПлатежнымиКартами(ДополнительныеПараметры)
ДополнительныеПараметры.Вставить("Форма", ЭтотОбъект);
ДополнительныеПараметры.Вставить("ДокументОснование", Объект.Ссылка);
ДополнительныеПараметры.Вставить("Валюта", Объект.Валюта);
ДополнительныеПараметры.Вставить("ПараметрыКассыККМ", ПараметрыКассыККМ);
Если ЭтоПолныйВозвратВСменуПродажи
И ДанныеПоЧекуККМ.КоличествоНеотмененныхОплатПлатежнымиКартами > 0 Тогда
ДополнительныеПараметры.Вставить("ТипТранзакции", "AuthorizeVoid");
Иначе
ДополнительныеПараметры.Вставить("ТипТранзакции", "AuthorizeRefund");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатыПлатежнымиКартами(Результат, ДополнительныеПараметры) Экспорт
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("АдресВХранилище", ДанныеПоЧекуККМ.АдресТаблицыНеотмененныхОплатПлатежнымиКартами);
ПараметрыФормы.Вставить("ПоказатьКнопкуОтменитьОплатыПоследовательно", Истина);
Если СуммаДокумента < ОбщаяСуммаОплатыПлатежнымиКартами Тогда
ПараметрыФормы.Вставить("ПоказатьКнопкуОтменитьОплату", Ложь);
ПараметрыФормы.Вставить("ПоказатьКнопкуОтменитьОплатыПоследовательно", Ложь);
ПараметрыФормы.Вставить("ТолькоПросмотр", Истина);
КонецЕсли;
ПараметрыФормы.Вставить("ПоказатьКолонкуОплатаОтменена", Истина);
ПараметрыФормы.Вставить("ЭтоВозврат", Истина);
ПараметрыФормы.Вставить("ЭтоПолныйВозвратВСменуПродажи", ЭтоПолныйВозвратВСменуПродажи);
СуммаДоплатыРасчетная = Макс(ИнформацияОбОплате.СуммаДокумента - ИнформацияОбОплате.ИтогоОплачено, 0);
ПараметрыФормы.Вставить("СуммаДокумента", СуммаДоплатыРасчетная);
Если ДополнительныеПараметры.Свойство("ПолученоНаличными") Тогда
Объект.ВыданоНаличными = ДополнительныеПараметры.ПолученоНаличными;
КонецЕсли;
ФормаВладелец = ЭтотОбъект;
Если ДополнительныеПараметры.Свойство("Форма") Тогда
ФормаВладелец = ДополнительныеПараметры.Форма;
КонецЕсли;
ДополнитьПараметрыОтменыОплатыПлатежнымиКартами(ДополнительныеПараметры);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ТабличнаяЧастьОплатаПлатежнымиКартами",
ПараметрыФормы,ФормаВладелец,,,,
Новый ОписаниеОповещения("ДобавитьОтменуОплатыКартойЗавершение", ЭтотОбъект, ДополнительныеПараметры),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатыПлатежнымиКартамиЗавершение(Результат, ДополнительныеПараметры) Экспорт
ДополнительныеПараметры.Вставить("РезультатОтменыОплатыПлатежнымиКартами", Результат);
ОповещениеПослеЗаписи = Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартамиЗавершениеПослеЗаписи", ЭтотОбъект, ДополнительныеПараметры);
Если Результат.ВыполненаОперацияНаУстройстве И Не Результат.ИзмененныеДанныеЗаписаны Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Данные", ДополнительныеПараметры.Форма.Объект.Ссылка);
ПараметрыФормы.Вставить("ДанныеДляЖурналаРегистрации", ДополнительныеПараметры.Форма.ДанныеДляЖурналаРегистрации);
ПараметрыФормы.Вставить("ТекстСообщения",
НСтр("ru = 'ВНИМАНИЕ! Произошла исключительная ситуация:
|Отмена оплаты не зафиксирована в системе.'"));
ОткрытьФорму("Документ.ЧекККМ.Форма.ОшибкаЗаписи", ПараметрыФормы, ДополнительныеПараметры.Форма);
ИначеЕсли Не Результат.ВыполненаОперацияНаУстройстве И Результат.Свойство("ДанныеОтменыОплатыКартой") Тогда
Если Результат.ДанныеОтменыОплатыКартой.Свойство("СтрокаОплаты") Тогда
Объект.ОплатаПлатежнымиКартами.Удалить(Результат.ДанныеОтменыОплатыКартой.СтрокаОплаты);
ИначеЕсли Результат.ДанныеОтменыОплатыКартой.Свойство("ТекущиеДанные") Тогда
Объект.ОплатаПлатежнымиКартами.Удалить(Результат.ДанныеОтменыОплатыКартой.ТекущиеДанные.НомерСтроки-1);
КонецЕсли;
Если Результат.Свойство("ИспользуемыйТерминалСоответствуетНастройкам")
И Не Результат.ИспользуемыйТерминалСоответствуетНастройкам Тогда
ШаблонСообщения = НСтр("ru = 'Текущий эквайринговый терминал (%1) отключен или изменен.
|Если настройки оборудования изменены, то для их применения следует закрыть РМК и открыть заново.'");
ТекстСообщения = СтрШаблон(ШаблонСообщения, ДополнительныеПараметры.ТекущиеДанные.ЭквайринговыйТерминал);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Данные", Объект.Ссылка);
ПараметрыФормы.Вставить("ДанныеДляЖурналаРегистрации", ДополнительныеПараметры.Форма.ДанныеДляЖурналаРегистрации);
ПараметрыФормы.Вставить("ТекстСообщения", ТекстСообщения);
ОткрытьФорму("Документ.ЧекККМ.Форма.ОшибкаЗаписи", ПараметрыФормы, ДополнительныеПараметры.Форма);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(ОповещениеПослеЗаписи, НСтр("ru = 'Перед открытием формы возврата оплаты не удалось записать документ.'"));
Иначе
ВыполнитьОбработкуОповещения(ОповещениеПослеЗаписи, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатыПлатежнымиКартамиЗавершениеПослеЗаписи(Результат, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Если ЗначениеЗаполнено(Объект.ЧекККМ)
И ЗначениеЗаполнено(ДанныеПоЧекуККМ.АдресТаблицыНеотмененныхОплатПлатежнымиКартами)
И ДанныеПоЧекуККМ.КоличествоНеотмененныхОплатПлатежнымиКартами Тогда
Если ДополнительныеПараметры.Свойство("РезультатОтменыОплатыПлатежнымиКартами")
И ДополнительныеПараметры.РезультатОтменыОплатыПлатежнымиКартами.ВыполненаОперацияНаУстройстве
И ДополнительныеПараметры.РезультатОтменыОплатыПлатежнымиКартами.Свойство("ДанныеОтменыОплатыКартой") Тогда
ИдентификаторСтрокиОплаты = ДополнительныеПараметры.РезультатОтменыОплатыПлатежнымиКартами.ДанныеОтменыОплатыКартой.СтрокаОплаты.ПолучитьИдентификатор();
НомерСтрокиОтменяемойОплатыПлатежнойКартой = ДанныеПоЧекуККМ.НомераСтрокОтменяемыхОплатПлатежнойКартой[ИдентификаторСтрокиОплаты];
СуммаОтмененнойОплаты = ДополнительныеПараметры.РезультатОтменыОплатыПлатежнымиКартами.ДанныеОтменыОплатыКартой.СтрокаОплаты.Сумма;
РезультатПересчета = РозничныеПродажиВызовСервера.ПересчитатьДанныеНеотмененныхОплатПлатежнымиКартами(ДанныеПоЧекуККМ.АдресТаблицыНеотмененныхОплатПлатежнымиКартами, НомерСтрокиОтменяемойОплатыПлатежнойКартой, СуммаОтмененнойОплаты);
ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами = РезультатПересчета.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами;
ДанныеПоЧекуККМ.КоличествоНеотмененныхОплатПлатежнымиКартами = РезультатПересчета.КоличествоНеотмененныхОплатПлатежнымиКартами;
ДанныеПоЧекуККМ.КомбинацииСуммНеотмененныхОплатПлатежнымиКартами = РезультатПересчета.КомбинацииСуммНеотмененныхОплатПлатежнымиКартами;
ДанныеПоЧекуККМ.НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой = РезультатПересчета.НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой;
ДанныеПоЧекуККМ.НомераСтрокОтменяемыхОплатПлатежнойКартой.Удалить(ИдентификаторСтрокиОплаты);
КонецЕсли;
КонецЕсли;
Если ДополнительныеПараметры.Свойство("Действие") И ДополнительныеПараметры.Действие = "ОтменитьОплатыПоследовательно"
И ДополнительныеПараметры.Свойство("СтрокиОплатыПлатежнымиКартами") И ДополнительныеПараметры.СтрокиОплатыПлатежнымиКартами.Количество() Тогда
ВыполнитьОбработкуОповещения(Новый ОписаниеОповещения("ОтменитьОплатуПлатежнымиКартамиПоследовательно", РозничныеПродажиКлиент, ДополнительныеПараметры)
, ДополнительныеПараметры.РезультатОтменыОплатыПлатежнымиКартами);
Иначе
ОповещениеВФормуСмешаннойОплаты = Неопределено;
ПараметрыОповещения = ДополнительныеПараметры;
Пока ЗначениеЗаполнено(ПараметрыОповещения) Цикл
Если ПараметрыОповещения.Свойство("ОповещениеВФормуОплаты", ОповещениеВФормуСмешаннойОплаты) Тогда
Прервать;
ИначеЕсли ПараметрыОповещения.Свойство("ОповещениеПриЗавершении") Тогда
ПараметрыОповещенияОповещениеПриЗавершении = ПараметрыОповещения.ОповещениеПриЗавершении;
ПараметрыОповещения = ПараметрыОповещенияОповещениеПриЗавершении.ДополнительныеПараметры;
Иначе
ПараметрыОповещения = Неопределено;
КонецЕсли;
КонецЦикла;
Если ОповещениеВФормуСмешаннойОплаты = Неопределено Тогда
СмешаннаяОплата(Неопределено);
Иначе
ВыполнитьОбработкуОповещения(ОповещениеВФормуСмешаннойОплаты, ИнформацияОбОплате(ЭтотОбъект));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуПлатежнойКартой(Результат, ДополнительныеПараметры) Экспорт
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОтменитьОплатуКартой", РозничныеПродажиКлиент, ДополнительныеПараметры),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуПлатежнойКартойЗавершение(Результат, ДополнительныеПараметры) Экспорт
ДанныеДляЖурналаРегистрации = Новый Структура;
ДанныеДляЖурналаРегистрации.Вставить("СуммаОперации", ДополнительныеПараметры.СуммаОперации);
ДанныеДляЖурналаРегистрации.Вставить("СсылочныйНомер", ДополнительныеПараметры.СсылочныйНомер);
ДанныеДляЖурналаРегистрации.Вставить("НомерЧекаЭТ", ДополнительныеПараметры.НомерЧека);
СтрокаОплаты = Объект.ОплатаПлатежнымиКартами.Получить(Объект.ОплатаПлатежнымиКартами.Индекс(ДополнительныеПараметры.СтрокаОплаты));
СтрокаОплаты.ОплатаОтменена = Истина;
Если ДополнительныеПараметры.Свойство("ВозвратНаПлатежнуюКартуПроизвольнойСуммы") И ДополнительныеПараметры.ВозвратНаПлатежнуюКартуПроизвольнойСуммы = Истина Тогда
СтрокаОплаты.НомерПлатежнойКарты = ДополнительныеПараметры.НомерКарты;
СтрокаОплаты.СсылочныйНомер = ДополнительныеПараметры.СсылочныйНомер;
СтрокаОплаты.НомерЧекаЭТ = ДополнительныеПараметры.НомерЧека;
СтрокаОплаты.КодАвторизации = ДополнительныеПараметры.КодАвторизации;
КонецЕсли;
Модифицированность = Истина;
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметрыПовторЗаписи = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыПовторЗаписи.ОписаниеОповещения = ДополнительныеПараметры.ОповещениеПриЗавершении;
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения = НСтр("ru = 'После выполнения операции отмены оплаты не удалось записать документ.'");
ДополнительныеПараметрыПовторЗаписи.ВозвращатьРезультатФункции = Ложь;
ДополнительныеПараметрыПовторЗаписи.РезультатПриУспешномПроведении = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны, ДанныеОтменыОплатыКартой", Истина, Истина, ДополнительныеПараметры);
ДополнительныеПараметрыПовторЗаписи.РезультатПриОтмене = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны, ДанныеОтменыОплатыКартой", Истина, Ложь, ДополнительныеПараметры);
ДополнительныеПараметрыПовторЗаписи.ИмяПроцедуры = "ЗаписатьНаСервере";
ДополнительныеПараметрыПовторЗаписи.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыПовторЗаписи);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыПовторЗаписи),
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ВыполнитьОбработкуОповещения(
ДополнительныеПараметры.ОповещениеПриЗавершении,
Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны, ДанныеОтменыОплатыКартой",
Истина, Истина, ДополнительныеПараметры));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплату(Результат, ДополнительныеПараметры) Экспорт
ВыполнитьОбработкуОповещения(
Новый ОписаниеОповещения("ДобавитьОтменуОплатыКартой", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуСторно(Результат, ДополнительныеПараметры) Экспорт
СтруктураПоиска = Новый Структура("ВидОплаты", ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта"));
НайденныеСтроки = Объект.ОплатаПлатежнымиКартами.НайтиСтроки(СтруктураПоиска);
НужноЗаписать = Ложь;
Если НайденныеСтроки.Количество() Тогда
НужноЗаписать = Истина;
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
Объект.ОплатаПлатежнымиКартами.Удалить(НайденнаяСтрока);
КонецЦикла;
ЗаполнитьДанныеНеотмененныхОплатПлатежнымиКартамиПоЧекуККМ();
КонецЕсли;
СтруктураПоиска = Новый Структура("ОплатаОтменена", Истина);
НайденныеСтроки = Объект.ОплатаПлатежнымиКартами.НайтиСтроки(СтруктураПоиска);
Если НайденныеСтроки.Количество() Тогда
НужноЗаписать = Истина;
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
НайденнаяСтрока.ОплатаОтменена = Ложь;
КонецЦикла;
КонецЕсли;
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ОтменитьОплатуЗавершение", ЭтотОбъект, ДополнительныеПараметры);
Если НужноЗаписать Тогда
Модифицированность = Истина;
ВыполнитьДействиеПослеЗаписи(ОповещениеПриЗавершении
, НСтр("ru = 'После закрытия формы возврата оплаты не удалось записать документ.'"));
Иначе
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьОтменуОплатыКартой(Результат, ПараметрыЗавершения) Экспорт
ДанныеПоЧекуККМ.НомераСтрокОтменяемыхОплатПлатежнойКартой.Очистить();
Если Результат = Ложь Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
ТекстСообщения = НСтр("ru = 'Перед добавлением данных для отмены операции оплаты картой не удалось записать документ.'");
РозничныеПродажиВызовСервера.ЗаписьВЖурналРегистрации(
ТекстСообщения, "ЧекККМВозвраты.ФормаДокументаРМК.ДобавитьОтменуОплатыКартой", Объект.Ссылка);
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
Возврат;
КонецЕсли;
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
СуммаДоплатыРасчетная = Макс(ИнформацияОбОплате.СуммаДокумента - ИнформацияОбОплате.ИтогоОплачено, 0);
РезультатДляПродолжения = Неопределено;
ДополнительныеПараметры = ПараметрыЗавершения;
Если ДополнительныеПараметры = Неопределено Тогда
ДополнительныеПараметры = Новый Структура;
КонецЕсли;
ДополнительныеПараметры.Вставить("ВозвратНаПлатежнуюКартуПроизвольнойСуммы", Ложь);
Если ДанныеПоЧекуККМ.КоличествоНеотмененныхОплатПлатежнымиКартами <= 1
Или ДанныеПоЧекуККМ.НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой > СуммаДоплатыРасчетная Тогда
Если ДанныеПоЧекуККМ.КоличествоНеотмененныхОплатПлатежнымиКартами = 1
И ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами <> Неопределено
И ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами.Сумма <= СуммаДоплатыРасчетная Тогда
ПоследовательнаяОтмена = Ложь;
РезультатДляПродолжения = Новый Структура;
СтрокаОплатыКартой = Объект.ОплатаПлатежнымиКартами.Добавить();
СтрокаОплатыКартой.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта");
СтрокаОплатыКартой.ЭквайринговыйТерминал = ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами.ЭквайринговыйТерминал;
СтрокаОплатыКартой.НомерПлатежнойКарты = ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами.НомерПлатежнойКарты;
СтрокаОплатыКартой.Сумма = ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами.Сумма;
СтрокаОплатыКартой.СсылочныйНомер = ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами.СсылочныйНомер;
СтрокаОплатыКартой.НомерЧекаЭТ = ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами.НомерЧекаЭТ;
СтрокаОплатыКартой.КодАвторизации = ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами.КодАвторизации;
РезультатДляПродолжения.Вставить("Действие", "ОтменитьОплату");
РезультатДляПродолжения.Вставить("ВыбраннаяСтрока", СтрокаОплатыКартой);
ДанныеПоЧекуККМ.НомераСтрокОтменяемыхОплатПлатежнойКартой.Вставить(СтрокаОплатыКартой.ПолучитьИдентификатор(), ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами.НомерСтроки);
ДополнитьПараметрыОтменыОплатыПлатежнымиКартами(ДополнительныеПараметры);
ОповещениеПродолжения = Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартамиВыборСтрокиОплатыЗавершение", РозничныеПродажиКлиент, ДополнительныеПараметры);
Иначе
ОповещениеОЗавершении = Новый ОписаниеОповещения("ДобавитьОтменуОплатыКартойЗавершение", ЭтотОбъект, ПараметрыЗавершения);
Если ЗначениеЗаполнено(ПараметрыЗавершения) Тогда
Если ПараметрыЗавершения.Свойство("ОповещениеОЗавершении") Тогда
ОповещениеОЗавершении = ПараметрыЗавершения.ОповещениеОЗавершении;
КонецЕсли;
КонецЕсли;
ДополнительныеПараметры.Вставить("ОповещениеОЗавершении", ОповещениеОЗавершении);
ДополнительныеПараметры.Вставить("Форма", ЭтотОбъект);
ДополнительныеПараметры.Вставить("ЭквайринговыеТерминалы", ЭквайринговыеТерминалы);
ДополнительныеПараметры.Вставить("ПараметрыКассыККМ", ПараметрыКассыККМ);
ДополнительныеПараметры.Вставить("Валюта", Объект.Валюта);
ДополнительныеПараметры.Вставить("СтруктураЭквайринговыйТерминал");
ДополнительныеПараметры.Вставить("ИдентификаторУстройстваЭТ");
ДополнительныеПараметры.Вставить("ТолькоЗаполнитьРезультатОплатыКартой", Истина);
УказаноКОплатеНаличными = 0;
Если ДополнительныеПараметры.Свойство("ПолученоНаличными") Тогда
УказаноКОплатеНаличными = ДополнительныеПараметры.ПолученоНаличными;
КонецЕсли;
ДополнительныеПараметры.Вставить("ФормаАвторизации_Сумма", ИнформацияОбОплате.СуммаКОплате - ИнформацияОбОплате.ИтогоОплачено - УказаноКОплатеНаличными);
ДополнительныеПараметры.Вставить("ФормаАвторизации_ПределСуммы", ИнформацияОбОплате.СуммаКОплате - ИнформацияОбОплате.ИтогоОплачено);
ОповещениеПродолжения = Новый ОписаниеОповещения("ДобавитьОплатуКартой", РозничныеПродажиКлиент, ДополнительныеПараметры);
РезультатДляПродолжения = Истина;
КонецЕсли;
Иначе
ОповещениеПродолжения = Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартами", ЭтотОбъект, ДополнительныеПараметры);
КонецЕсли;
ВыполнитьОбработкуОповещения(ОповещениеПродолжения, РезультатДляПродолжения);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьОтменуОплатыКартойЗавершение(Результат, ДополнительныеПараметры) Экспорт
ДанныеПоЧекуККМ.НомераСтрокОтменяемыхОплатПлатежнойКартой.Очистить();
Если Не ЗначениеЗаполнено(Результат) Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДополнительныеПараметры) Тогда
ДополнительныеПараметры = Новый Структура;
КонецЕсли;
ДополнительныеПараметры.Вставить("ВозвратНаПлатежнуюКартуПроизвольнойСуммы", Ложь);
ПоследовательнаяОтмена = Ложь;
РезультатВыбора = Новый Структура;
МассивСтрокОтменяемыхОплатПлатежнымиКартами = Новый Массив;
Если Не Результат.Свойство("Действие") Тогда
СтрокаОплатыКартой = Объект.ОплатаПлатежнымиКартами.Добавить();
СтрокаОплатыКартой.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта");
СтрокаОплатыКартой.ЭквайринговыйТерминал = Результат.ЭквайринговыйТерминал;
СтрокаОплатыКартой.НомерПлатежнойКарты = Результат.НомерКарты;
СтрокаОплатыКартой.Сумма = Результат.СуммаОперации;
СтрокаОплатыКартой.СсылочныйНомер = Результат.СсылочныйНомер;
СтрокаОплатыКартой.НомерЧекаЭТ = Результат.НомерЧека;
СтрокаОплатыКартой.КодАвторизации = Результат.КодАвторизации;
МассивСтрокОтменяемыхОплатПлатежнымиКартами.Добавить(СтрокаОплатыКартой);
ДополнительныеПараметры.ВозвратНаПлатежнуюКартуПроизвольнойСуммы = Истина;
РезультатВыбора.Вставить("Действие", "ОтменитьОплату");
Иначе
ВыбранныеСтрокиОтменыОплатыДляДобавления = Новый Массив;
РезультатВыбора.Вставить("Действие", Результат.Действие);
Если Результат.Действие = "ОтменитьОплату" Тогда
ВыбранныеСтрокиОтменыОплатыДляДобавления.Добавить(Результат.ВыбраннаяСтрока);
ИначеЕсли Результат.Действие = "ОтменитьОплатыПоследовательно" Тогда
ПоследовательнаяОтмена = Истина;
ВыбранныеСтрокиОтменыОплатыДляДобавления = Результат.ВыбранныеСтроки;
КонецЕсли;
Если ВыбранныеСтрокиОтменыОплатыДляДобавления.Количество() Тогда
Для Каждого СтрокаДляОтмены Из ВыбранныеСтрокиОтменыОплатыДляДобавления Цикл
СтрокаОплатыКартой = Объект.ОплатаПлатежнымиКартами.Добавить();
СтрокаОплатыКартой.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта");
СтрокаОплатыКартой.ЭквайринговыйТерминал = СтрокаДляОтмены.ЭквайринговыйТерминал;
СтрокаОплатыКартой.НомерПлатежнойКарты = СтрокаДляОтмены.НомерПлатежнойКарты;
СтрокаОплатыКартой.Сумма = СтрокаДляОтмены.Сумма;
СтрокаОплатыКартой.СсылочныйНомер = СтрокаДляОтмены.СсылочныйНомер;
СтрокаОплатыКартой.НомерЧекаЭТ = СтрокаДляОтмены.НомерЧекаЭТ;
СтрокаОплатыКартой.КодАвторизации = СтрокаДляОтмены.КодАвторизации;
МассивСтрокОтменяемыхОплатПлатежнымиКартами.Добавить(СтрокаОплатыКартой);
ДанныеПоЧекуККМ.НомераСтрокОтменяемыхОплатПлатежнойКартой.Вставить(СтрокаОплатыКартой.ПолучитьИдентификатор(), СтрокаДляОтмены.НомерСтроки);
КонецЦикла;
Иначе
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
КонецЕсли;
Если ПоследовательнаяОтмена Тогда
РезультатВыбора.Вставить("ВыбраннаяСтрока", МассивСтрокОтменяемыхОплатПлатежнымиКартами);
Иначе
РезультатВыбора.Вставить("ВыбраннаяСтрока", МассивСтрокОтменяемыхОплатПлатежнымиКартами[0]);
КонецЕсли;
ДополнитьПараметрыОтменыОплатыПлатежнымиКартами(ДополнительныеПараметры);
ОписаниеОповещения = Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартамиВыборСтрокиОплатыЗавершение", РозничныеПродажиКлиент, ДополнительныеПараметры);
ВыполнитьОбработкуОповещения(ОписаниеОповещения, РезультатВыбора);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуЗавершение(Результат, ДополнительныеПараметры) Экспорт
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеВФормуОплаты, ИнформацияОбОплате(ЭтотОбъект));
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура ПересчитатьДокументНаКлиенте()
Элементы.Товары.ИзменятьСоставСтрок = ПраваДоступа.КорректировкаСтрок;
Элементы.КонтекстноеМенюОбластьКорзиныТоварыДобавить.Доступность = Не ЗначениеЗаполнено(Объект.ЧекККМ) И ПраваДоступа.КорректировкаСтрок;
Элементы.КонтекстноеМенюОбластьКорзиныТоварыСкопировать.Доступность = Не ЗначениеЗаполнено(Объект.ЧекККМ) И ПраваДоступа.КорректировкаСтрок;
Элементы.ТоварыКоличествоУпаковок.ТолькоПросмотр = Не ПраваДоступа.КорректировкаСтрок;
Элементы.ТоварыЦена.ТолькоПросмотр = Не ПраваДоступа.КорректировкаСтрок
Или ЗначениеЗаполнено(Объект.ЧекККМ)
Или Не ПраваДоступа.РазрешитьИзменениеЦеныПриВозвратеБезЧека;
ТолькоПросмотрПолейТаблицыТовары = (Не ПраваДоступа.КорректировкаСтрок Или ЗначениеЗаполнено(Объект.ЧекККМ));
Элементы.ТоварыНоменклатура.ТолькоПросмотр = ТолькоПросмотрПолейТаблицыТовары;
Элементы.ТоварыШтрихкод.ТолькоПросмотр = ТолькоПросмотрПолейТаблицыТовары;
Элементы.ТоварыХарактеристика.ТолькоПросмотр = ТолькоПросмотрПолейТаблицыТовары;
Элементы.ТоварыПродавец.ТолькоПросмотр = ТолькоПросмотрПолейТаблицыТовары;
Элементы.ТоварыПомещение.ТолькоПросмотр = ТолькоПросмотрПолейТаблицыТовары;
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПраваДоступа");
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
ОбновитьЗаголовкиКнопокФормы();
УстановитьДоступностьЭлементовРМК(ЭтотОбъект, РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект));
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьДанныеИнформационнойПанели(Форма, ОтобразитьСдачу = Ложь)
ИнформацияОбОплате = ИнформацияОбОплате(Форма);
ЭтоПолныйВозвратВСменуПродажиСтароеЗначение = Форма.ЭтоПолныйВозвратВСменуПродажи;
Форма.ЭтоПолныйВозвратВСменуПродажи = (ЗначениеЗаполнено(Форма.Объект.ЧекККМ)
И Форма.СуммаДокумента = Форма.ДанныеПоЧекуККМ.СуммаДокумента
И Форма.Объект.КассоваяСмена = Форма.ДанныеПоЧекуККМ.КассоваяСмена);
Если Форма.ЗаголовкиКнопокНастроены Тогда
Форма.ЗаголовкиКнопокНастроены = (ЭтоПолныйВозвратВСменуПродажиСтароеЗначение = Форма.ЭтоПолныйВозвратВСменуПродажи);
КонецЕсли;
Форма.ИнформационнаяПанельСуммаКВозврату = ИнформацияОбОплате.СуммаКОплате;
Форма.ИнформационнаяПанельСуммаКВозвратуПлатежнымиКартами = 0;
СуммаПоВидуОплатыПлатежнаяКарта = ?(Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"),
ИнформацияОбОплате.ПлатежныеКартыОтменено, ИнформацияОбОплате.ПлатежныеКарты);
Если СуммаПоВидуОплатыПлатежнаяКарта = 0 Тогда
Форма.ИнформационнаяПанельСуммаКВозвратуНаличными = ИнформацияОбОплате.СуммаКОплате;
Иначе
Форма.ИнформационнаяПанельСуммаКВозвратуНаличными = ИнформацияОбОплате.СуммаКОплате - СуммаПоВидуОплатыПлатежнаяКарта;
Форма.ИнформационнаяПанельСуммаКВозвратуПлатежнымиКартами = СуммаПоВидуОплатыПлатежнаяКарта;
КонецЕсли;
ИнформационнаяПанельЛокализация(Форма, ИнформацияОбОплате);
КоличествоСтрокВТЧ = Форма.Объект.Товары.Количество();
ТекущаяСтрока = Форма.Элементы.Товары.ТекущаяСтрока;
Если ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ > 0 Тогда
ТекущиеДанные = Форма.Объект.Товары[КоличествоСтрокВТЧ - 1];
Форма.Элементы.Товары.ТекущаяСтрока = ТекущиеДанные.ПолучитьИдентификатор();
ИначеЕсли ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ = 0 Тогда
ТекущиеДанные = Неопределено;
Иначе
ТекущиеДанные = Форма.Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
НаименованиеТовара = "";
Если ТекущиеДанные <> Неопределено Тогда
НаименованиеТовара = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(
ТекущиеДанные.Номенклатура,
ТекущиеДанные.Характеристика,
,
ТекущиеДанные.Серия);
КонецЕсли;
ОбязательныеРеквизиты = Новый Массив;
ДанныеСтроки = Новый Структура;
ПродавецТолькоКассир = Форма.КассирМожетБытьПродавцом И Не Форма.МенеджерТорговогоЗалаМожетБытьПродавцом;
Если Не ПродавецТолькоКассир И ТекущиеДанные <> Неопределено Тогда
ИмяРеквизитаИнформационнойПанели = "Продавец";
ОбязательныеРеквизиты.Добавить(ИмяРеквизитаИнформационнойПанели);
ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, ТекущиеДанные.Продавец);
КонецЕсли;
Если Форма.ПараметрыКассыККМ.ИспользоватьСкладскиеПомещения И ТекущиеДанные <> Неопределено Тогда
ИмяРеквизитаИнформационнойПанели = "Помещение";
ОбязательныеРеквизиты.Добавить(ИмяРеквизитаИнформационнойПанели);
ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, ТекущиеДанные.Помещение);
КонецЕсли;
Если Форма.ИспользоватьКартыЛояльности И ТекущиеДанные <> Неопределено Тогда
ИмяРеквизитаИнформационнойПанели = "Карта";
ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, Форма.Объект.КартаЛояльности);
КонецЕсли;
СуммовыеПараметры = Новый Структура;
СуммовыеПараметры.Вставить("Количество", 0);
СуммовыеПараметры.Вставить("Цена", 0);
СуммовыеПараметры.Вставить("СуммаРучнойСкидки", 0);
СуммовыеПараметры.Вставить("СуммаАвтоматическойСкидки", 0);
СуммовыеПараметры.Вставить("Сумма", 0);
Если ТекущиеДанные <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(СуммовыеПараметры, ТекущиеДанные);
КонецЕсли;
Данные = Новый Структура;
Данные.Вставить("НаименованиеТовара", НаименованиеТовара);
Данные.Вставить("ДанныеСтроки", ДанныеСтроки);
Данные.Вставить("СуммовыеПараметры", СуммовыеПараметры);
Данные.Вставить("ОбязательныеРеквизиты", ОбязательныеРеквизиты);
Если ОтобразитьСдачу Тогда
ТекстСдача = Новый ФорматированнаяСтрока(
СтрШаблон(НСтр("ru = 'Получить сдачу: %1'"),
Формат(ИнформацияОбОплате.ИтогоОплачено - ИнформацияОбОплате.СуммаКОплате, "ЧДЦ=2; ЧН=0.00")));
Данные.Вставить("ОтобразитьСдачу", Истина);
Данные.Вставить("ТекстСдача", ТекстСдача);
Иначе
Данные.Вставить("ОтобразитьСдачу", Ложь);
КонецЕсли;
РозничныеПродажиКлиентСервер.ОбновитьДанныеИнформационнойПанели(Форма, Данные);
КонецПроцедуры
&НаСервере
Процедура НастроитьПраваДляПользователя(Пользователь)
ПраваДоступа = НастройкиПродажДляПользователейСервер.ПраваДоступаРМК(Пользователь);
Объект.Кассир = Пользователь;
РеквизитыКассира = РозничныеПродажи.РеквизитыКассира(Пользователь, Объект.Организация);
Если КассирМожетБытьПродавцом И Не МенеджерТорговогоЗалаМожетБытьПродавцом Тогда
ТекущийПродавец = Пользователь;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.Продавец = Пользователь;
КонецЦикла;
КонецЕсли;
ОбновитьЗаголовокФормы();
КонецПроцедуры
&НаСервере
Процедура ОбновитьЗаголовокФормы()
Заголовок = НСтр("ru = 'Возврат (Кассир: %Кассир%, Продавец: %Продавец%)'");
Заголовок = СтрЗаменить(Заголовок, "%Кассир%", Объект.Кассир);
Заголовок = СтрЗаменить(Заголовок, "%Продавец%", ?(ЗначениеЗаполнено(ТекущийПродавец),ТекущийПродавец, НСтр("ru='<Не выбран>'")));
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗаголовкиКнопокФормы()
Если ЗаголовкиКнопокНастроены Тогда
Возврат;
КонецЕсли;
ОбновитьЗаголовкиКнопокФормыНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбновитьЗаголовкиКнопокФормыНаСервере(ПодписатьГорячиеКлавишиНаКнопках = Истина)
Команда = Команды.ОплатитьПлатежнойКартой;
СочетаниеКлавишПредставление = ОбщегоНазначенияУТ.ПредставлениеСочетанияКлавиш(Команда.СочетаниеКлавиш);
СтрокиЗаголовка = Новый Массив;
СтрокиЗаголовка.Добавить(НСтр("ru = 'Вернуть'"));
СтрокиЗаголовка.Добавить(НСтр("ru = 'оплату на карту'"));
ТекстПодсказки = НСтр("ru = 'Вернуть оплату на платежную карту'");
Если ЭтоПолныйВозвратВСменуПродажи И ОбщаяСуммаОплатыПлатежнымиКартами <> 0 Тогда
СтрокиЗаголовка.Очистить();
СтрокиЗаголовка.Добавить(НСтр("ru = 'Отменить'"));
СтрокиЗаголовка.Добавить(НСтр("ru = 'оплату картами'"));
ТекстПодсказки = НСтр("ru = 'Отменить оплату платежными картами'");
КонецЕсли;
Команда.Подсказка = ТекстПодсказки;
Команда.Заголовок = СтрСоединить(СтрокиЗаголовка, Символы.ПС);
Если ПодписатьГорячиеКлавишиНаКнопках Тогда
РозничныеПродажи.ПодписатьГорячуюКлавишуНаКнопке(Команда);
КонецЕсли;
ЗаголовкиКнопокНастроены = Истина;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииЧека()
ИспользуетсяЦенообразование25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25();
Если ИспользуетсяЦенообразование25 Тогда
ОбъектХраненияУсловийПродаж = АссортиментСерверПовтИсп.ФорматМагазинаПоСкладу(Объект.Склад, Объект.Дата);
Иначе
ОбъектХраненияУсловийПродаж = Объект.Склад;
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМВозврат));
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
УстановитьВидимостьЭлементовСерий();
КонецЕсли;
СтруктураСостояниеКассовойСмены = РозничныеПродажиВызовСервера.СостояниеКассовойСмены(Объект.КассаККМ);
ЗаполнитьЗначенияСвойств(Объект, СтруктураСостояниеКассовойСмены,, "Кассир");
РозничныеПродажи.ОчиститьДанныеФискальнойОперации(ДанныеФискальнойОперации);
ОбновитьЗаголовокФормы();
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
НастроитьРМК();
КонецПроцедуры
&НаСервере
Процедура ПолучитьСтатусОплатыСБППоЧекуКММ()
СтатусОплатыСБПЧекаПродажи = Перечисления.ТипыСтатусовОплатыСБП.ПустаяСсылка();
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЧекККМОплатаПлатежнымиКартами.СтатусОплатыСБП КАК СтатусОплатыСБП
|ИЗ
| Документ.ЧекККМ.ОплатаПлатежнымиКартами КАК ЧекККМОплатаПлатежнымиКартами
|ГДЕ
| ЧекККМОплатаПлатежнымиКартами.Ссылка = &Ссылка
| И ЧекККМОплатаПлатежнымиКартами.ВидОплаты = &ВидОплаты";
Запрос.УстановитьПараметр("Ссылка", Объект.ЧекККМ);
Запрос.УстановитьПараметр("ВидОплаты", Перечисления.ТипыПлатежнойСистемыККТ.СистемаБыстрыхПлатежей);
ТаблицаОплатаСБП = Запрос.Выполнить().Выбрать();
Если ТаблицаОплатаСБП.Следующий() Тогда
СтатусОплатыСБПЧекаПродажи = ТаблицаОплатаСБП.СтатусОплатыСБП;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьДействиеПослеЗаписи(ОповещениеПриЗавершении, ТекстСообщения)
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметры = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметры.ОписаниеОповещения = ОповещениеПриЗавершении;
ДополнительныеПараметры.ТекстСообщения = ТекстСообщения;
ДополнительныеПараметры.ВозвращатьРезультатФункции = Истина;
ДополнительныеПараметры.ИмяПроцедуры = "ЗаписатьНаСервере";
ДополнительныеПараметры.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметры);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметры),
ДополнительныеПараметры.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьНаличнымиОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ОбновитьСостояниеКассовойСмены();
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОткрытьФормуОплатыНаличными", ЭтотОбъект));
ОповещениеОЗавершении = Новый ОписаниеОповещения("НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЗавершение", ЭтотОбъект, ПараметрыОповещения);
НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуОплатыНаличными(ИзмененныеДанныеЗаписаны, ДополнительныеПараметры) Экспорт
Если Не ИзмененныеДанныеЗаписаны Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("ИнформацияОбОплате", ИнформацияОбОплате(ЭтотОбъект));
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("ДоступнаПередачаДанных", ПараметрыКассыККМ.ДоступнаПередачаДанных);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаОплатыНаличными",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ЗавершениеОплаты", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуПлатежнымиКартамиЗавершение(Результат, ДополнительныеПараметры) Экспорт
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуПлатежнымиКартамиОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ОбновитьСостояниеКассовойСмены();
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ДобавитьОтменуОплатыКартой", ЭтотОбъект));
ОповещениеОЗавершении = Новый ОписаниеОповещения("НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЗавершение", ЭтотОбъект, ПараметрыОповещения);
НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура СмешаннаяОплатаОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ОбновитьСостояниеКассовойСмены();
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОткрытьФормуСмешаннойОплаты", ЭтотОбъект));
ОповещениеОЗавершении = Новый ОписаниеОповещения("НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЗавершение", ЭтотОбъект, ПараметрыОповещения);
НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуСмешаннойОплаты(ИзмененныеДанныеЗаписаны, ДополнительныеПараметры) Экспорт
Если Не ИзмененныеДанныеЗаписаны Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("ИнформацияОбОплате", ИнформацияОбОплате(ЭтотОбъект));
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("ДоступнаПередачаДанных", ПараметрыКассыККМ.ДоступнаПередачаДанных);
ПараметрыОткрытияФормы.Вставить("ЭтоПолныйВозвратВСменуПродажи", ЭтоПолныйВозвратВСменуПродажи);
ПараметрыОткрытияФормы.Вставить("СтатусОплатыСБПЧекаПродажи", СтатусОплатыСБПЧекаПродажи);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаСмешаннойОплаты",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ЗавершениеОплаты", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеОплаты(РезультатОплаты, ДополнительныеПараметры) Экспорт
Если ТипЗнч(РезультатОплаты) = Тип("Структура")
И РезультатОплаты.Свойство("ПолученоНаличными")
И РезультатОплаты.Свойство("ДанныеЭлектронногоЧека") Тогда
Объект.ВыданоНаличными = РезультатОплаты.ПолученоНаличными;
Объект.Партнер = РезультатОплаты.ДанныеЭлектронногоЧека.Партнер;
ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = РезультатОплаты.ДанныеЭлектронногоЧека.ВариантОтправкиЭлектронногоЧека;
ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = РезультатОплаты.ДанныеЭлектронногоЧека.КонтактныеДанныеЭлектронногоЧека;
ИначеЕсли РезультатОплаты = "Отмена" Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
РазблокироватьДанныеФормыДляРедактирования();
ПересчитатьДокументНаКлиенте();
Возврат;
ИначеЕсли ТипЗнч(ДополнительныеПараметры) = Тип("Структура")
И ДополнительныеПараметры.Свойство("ЗавершениеРаботы")
И ДополнительныеПараметры.ЗавершениеРаботы = Истина Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
РазблокироватьДанныеФормыДляРедактирования();
Возврат;
КонецЕсли;
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьДобавлениеОплаты(ДополнительныеПараметры)
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
Если ДополнительныеПараметры = Неопределено Тогда
Если Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит") Тогда
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина);
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Иначе
Если ИнформацияОбОплате.ИтогоОплачено >= ИнформацияОбОплате.СуммаКОплате
И ЗначениеЗаполнено(ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека) Тогда
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина);
ПробитьЧек();
ИначеЕсли ИнформацияОбОплате.ИтогоОплачено > 0 Тогда
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОткрытьФормуСмешаннойОплаты", ЭтотОбъект),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
Иначе
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
КонецЕсли;
КонецЕсли;
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеВФормуОплаты, ИнформацияОбОплате);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьКомандыФормы(УникальныйИдентификатор)
КомандыФормы = Новый Массив;
Для Каждого КомандаФормы Из Команды Цикл
Если НЕ КомандаФормы.СочетаниеКлавиш.Клавиша = Клавиша.Нет Тогда
КомандыФормы.Добавить(Новый Структура("ИмяКоманды, Заголовок, СочетаниеКлавиш", КомандаФормы.Имя, КомандаФормы.Заголовок, КомандаФормы.СочетаниеКлавиш));
КонецЕсли;
КонецЦикла;
Возврат ПоместитьВоВременноеХранилище(КомандыФормы, УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение)
ТаблицаТоваров = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище);
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу");
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу");
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
СтруктураДействий.Вставить("ПересчитатьСуммуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус",
Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый",
Новый Структура("ИмяФормы, ИмяТабличнойЧасти", ЭтотОбъект.ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(
ЭтотОбъект, "Номенклатура", СтруктураДействий);
ОбрабатываемыеСтроки = Новый Массив;
Для каждого СтрокаТовара Из ТаблицаТоваров Цикл
ТекущаяСтрока = Объект.Товары.Добавить();
СписокСвойств = "НоменклатураНабора, ХарактеристикаНабора, Номенклатура, Характеристика, Упаковка, Цена, КоличествоУпаковок, Серия";
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара, СписокСвойств);
Если КассирМожетБытьПродавцом И НЕ МенеджерТорговогоЗалаМожетБытьПродавцом
И ТекущаяСтрока.Продавец <> Объект.Кассир Тогда
ТекущаяСтрока.Продавец = Объект.Кассир;
КонецЕсли;
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
Если ТекущаяСтрока <> Неопределено Тогда
Элементы.Товары.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();
КонецЕсли;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект,НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМВозврат));
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
Если ТаблицаТоваров.Количество() Тогда
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьКомандуПечати(ИмяКоманды, ДополнительныеПараметры) Экспорт
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команды[ИмяКоманды], Объект);
КонецПроцедуры
&НаКлиенте
Процедура ИнформационнаяПанельПрочиеПараметрыЗначениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если НавигационнаяСсылкаФорматированнойСтроки = "ПродавецЗначениеНеЗаполнено"
Или НавигационнаяСсылкаФорматированнойСтроки = "Продавец" Тогда
ОткрытьФорму(
"Справочник.Пользователи.ФормаВыбора",
Новый Структура("РежимВыбора", Истина),,,,,
Новый ОписаниеОповещения("ИзменитьПродавцаЗавершение", ЭтотОбъект), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
Если НавигационнаяСсылкаФорматированнойСтроки = "ПомещениеЗначениеНеЗаполнено"
Или НавигационнаяСсылкаФорматированнойСтроки = "Помещение" Тогда
ИзменитьПомещение(Неопределено);
КонецЕсли;
Если НавигационнаяСсылкаФорматированнойСтроки = "Карта" Тогда
ПоказатьЗначение(,Объект.КартаЛояльности);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИнформационнаяПанельОшибкаПриПечатиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если НавигационнаяСсылкаФорматированнойСтроки = "ПоказатьПолностьюОшибкуПриПечатиЧека" Тогда
ПоказатьЗначение(Неопределено, ИнформационнаяПанельОшибкаПриПечатиЧекаТекст);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПомещениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
СтрокаТЧ = ДополнительныеПараметры.СтрокаТЧ;
Помещение = Результат;
Если Не ЗначениеЗаполнено(Помещение) Тогда
Возврат;
КонецЕсли;
СтароеЗначениеПомещения = СтрокаТЧ.Помещение;
СтрокаТЧ.Помещение = Помещение;
РозничныеПродажиКлиент.ОбновитьПомещениеВСтрокахТабличнойЧастиСерии(ЭтотОбъект, СтрокаТЧ, СтароеЗначениеПомещения);
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьНовыйЧек(Ссылка)
Если Объект.Статус <> ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит") Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Ссылка", Ссылка);
Отказ = Ложь;
ПередЗакрытиемЧека(
Отказ,
Новый ОписаниеОповещения("ЗагрузитьНовыйЧекЗавершение", ЭтотОбъект, ДополнительныеПараметры));
Если Отказ Тогда
Возврат;
КонецЕсли;
Иначе
НовыйЧекНаСервере(Ссылка);
ЗагрузитьНовыйЧекФрагмент();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьНовыйЧекФрагмент()
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьНовыйЧекЗавершение(Результат, ДополнительныеПараметры) Экспорт
НовыйЧекНаСервере(ДополнительныеПараметры.Ссылка);
ЗагрузитьНовыйЧекФрагмент();
КонецПроцедуры
&НаСервере
Функция ОтложитьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи)
ОтложитьВыполнено = Истина;
СтарыйСтатус = Объект.Статус;
Объект.Статус = Перечисления.СтатусыЧековККМ.ОтложенБезРезервирования;
Попытка
ОтложитьВыполнено = ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ОтложитьВыполнено Тогда
Объект.Статус = СтарыйСтатус;
КонецЕсли;
Исключение
Объект.Статус = СтарыйСтатус;
ОтложитьВыполнено = Ложь;
КонецПопытки;
Возврат ОтложитьВыполнено;
КонецФункции
&НаКлиенте
Процедура ОтложитьНаКлиенте(ОповещениеПриЗавершении)
Модифицированность = Истина;
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
Результат = ОтложитьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не Результат Тогда
ДополнительныеПараметрыПопытка = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыПопытка.ОписаниеОповещения = ОповещениеПриЗавершении;
ДополнительныеПараметрыПопытка.ТекстСообщения = НСтр("ru = 'Не удалось записать документ.'");
ДополнительныеПараметрыПопытка.ВозвращатьРезультатФункции = Истина;
ДополнительныеПараметрыПопытка.ИмяПроцедуры = "ОтложитьНаСервере";
ДополнительныеПараметрыПопытка.РезультатОперации = Результат;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыПопытка);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыПопытка),
ДополнительныеПараметрыПопытка.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(ЭтотОбъект.УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЧека(Отказ, ОписаниеОповещения = Неопределено)
Кнопки = Новый СписокЗначений;
Если Не ТолькоПросмотр И (Модифицированность ИЛИ ЗначениеЗаполнено(Объект.Ссылка)) Тогда
Если Модифицированность И ПраваДоступа.Отложить Тогда
Кнопки.Добавить(1, НСтр("ru = 'Отложить'"));
КонецЕсли;
Если ПраваДоступа.КорректировкаСтрок Тогда
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Кнопки.Добавить(4, НСтр("ru = 'Удалить чек'"));
КонецЕсли;
Если Модифицированность Тогда
Кнопки.Добавить(3, НСтр("ru = 'Закрыть без сохранения'"));
Иначе
Кнопки.Добавить(3, НСтр("ru = 'Закрыть'"));
КонецЕсли;
КонецЕсли;
Кнопки.Добавить(99, НСтр("ru = 'Отмена'"));
КонецЕсли;
Если Кнопки.Количество() > 0 Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОписаниеОповещения", ОписаниеОповещения);
Отказ = Истина;
ПоказатьВопрос(
Новый ОписаниеОповещения("ВопросПередЗакрытиемЧекаЗавершение", ЭтотОбъект, ДополнительныеПараметры),
НСтр("ru = 'Выберите действие перед закрытием.'"),
Кнопки);
Иначе
Если ОписаниеОповещения <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОписаниеОповещения, Неопределено);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВопросПередЗакрытиемОперацияЗавершение(Результат, ДополнительныеПараметры) Экспорт
Оповестить("Запись_ЧекККМВозврат", Новый Структура, Неопределено);
Если Результат Тогда
Если ДополнительныеПараметры.ОписаниеОповещения = Неопределено Тогда
ПринудительноеЗавершениеРаботы = Истина;
Закрыть(Неопределено);
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещения, Неопределено);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВопросПередЗакрытиемЧекаЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = 1 Тогда
ОтложитьНаКлиенте(Новый ОписаниеОповещения("ВопросПередЗакрытиемОперацияЗавершение", ЭтотОбъект, ДополнительныеПараметры));
ИначеЕсли РезультатВопроса = 3 Тогда
Если ДополнительныеПараметры.ОписаниеОповещения = Неопределено Тогда
ПринудительноеЗавершениеРаботы = Истина;
Закрыть(Неопределено);
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещения, Неопределено);
КонецЕсли;
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(ЭтотОбъект.УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
ИначеЕсли РезультатВопроса = 4 Тогда
УдалениеВыполнено = РозничныеПродажиВызовСервера.УдалитьДокументПриОтменеФискальнойОперации(Объект.Ссылка);
Если УдалениеВыполнено Тогда
Оповестить("Запись_ЧекККМВозврат", Новый Структура, Неопределено);
Если ДополнительныеПараметры.ОписаниеОповещения = Неопределено Тогда
ПринудительноеЗавершениеРаботы = Истина;
Закрыть(Неопределено);
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещения, Неопределено);
КонецЕсли;
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(ЭтотОбъект.УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура НовыйЧекНаСервере(Ссылка = Неопределено)
НовыйЧек = Ссылка.ПолучитьОбъект();
НовыйЧек.Дата = ТекущаяДатаСеанса();
РазблокироватьДанныеФормыДляРедактирования();
ЗначениеВДанныеФормы(НовыйЧек, Объект);
ТолькоПросмотр = Ложь;
Модифицированность = Ложь;
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМВозврат));
ЗаполнитьДанныеПоЧекуККМ();
ПриСозданииЧека();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьЭлементовРМК(Форма, ДоступныеВидыОплаты)
ЕстьВозвращаемыеПозиции = (Форма.Объект.Товары.Количество() > 0);
Форма.Элементы.ОплатитьНаличными.Доступность = ЕстьВозвращаемыеПозиции;
Форма.Элементы.ОплатитьКартой.Доступность = ЕстьВозвращаемыеПозиции;
Форма.Элементы.СмешаннаяОплата.Доступность = ЕстьВозвращаемыеПозиции;
Если ДоступныеВидыОплаты.ПлатежныеКарты Тогда
Если Форма.ОбщаяСуммаОплатыПлатежнымиКартами > Форма.СуммаДокумента Тогда
Форма.Элементы.ОплатитьКартой.Доступность = Ложь;
КонецЕсли;
КонецЕсли;
УстановитьДоступностьЭлементовРМКЛокализация(Форма, ДоступныеВидыОплаты);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьКассуККМЗавершение(КассаККМ, ДополнительныеПараметры) Экспорт
Если Не ЗначениеЗаполнено(КассаККМ) Тогда
Возврат;
КонецЕсли;
Если Объект.КассаККМ <> КассаККМ Тогда
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
ИзменитьКассуККМ(КассаККМ);
ПересчитатьДокументНаКлиенте();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ИзменитьКассуККМ(КассаККМ)
Объект.КассаККМ = КассаККМ;
ПараметрыКассыККМ = Новый ФиксированнаяСтруктура(Справочники.КассыККМ.ПараметрыКассыККМ(Объект.КассаККМ));
ВерсияФФД = МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетВерсиюФФД(ПараметрыКассыККМ.ИдентификаторУстройства);
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
СостояниеКассовойСмены = РозничныеПродажи.ПолучитьСостояниеКассовойСмены(Объект.КассаККМ);
ЗаполнитьЗначенияСвойств(Объект, СостояниеКассовойСмены,,"Кассир");
Иначе
НовыйЧек = Документы.ЧекККМВозврат.СоздатьДокумент();
НовыйЧек.Партнер = Справочники.Партнеры.РозничныйПокупатель;
НовыйЧек.ОбработкаЗаполнения(Новый Структура("КассаККМ", Объект.КассаККМ), Истина);
НовыйЧек.Дата = ТекущаяДатаСеанса();
Кассир = ?(ЗначениеЗаполнено(Объект.Кассир), Объект.Кассир, НовыйЧек.Кассир);
ЗначениеВДанныеФормы(НовыйЧек, Объект);
Прочитать();
СобытияФорм.ПриЧтенииНаСервере(ЭтотОбъект, НовыйЧек);
Объект.Кассир = Кассир;
КонецЕсли;
ТолькоПросмотр = Ложь;
Модифицированность = Ложь;
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМВозврат));
РозничныеПродажи.ОчиститьДанныеФискальнойОперации(ДанныеФискальнойОперации);
ОбновитьЗаголовокФормы();
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
НастроитьРМК();
КонецПроцедуры
&НаКлиенте
Функция ПревышеноКоличествоУпаковокНевозвращенныхПозицийПоДаннымТекущейСтроки(ДанныеТекущейСтроки)
Результат = Ложь;
Если ЗначениеЗаполнено(Объект.ЧекККМ) И Не ДанныеТекущейСтроки = Неопределено Тогда
ОтборНоменклатурыПоДаннымСтроки = ОтборДляПоискаПоНоменклатуре(ДанныеТекущейСтроки, ИспользоватьХарактеристикиНоменклатуры, ИспользоватьСерииНоменклатуры, ИспользоватьНаборы);
Результат = ПревышеноКоличествоУпаковокНевозвращенныхПозиций(Объект, ОтборНоменклатурыПоДаннымСтроки).Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция ИсправитьПревышениеКоличестваУпаковокПоДаннымНевозвращенныхПозиций(ДополнительныеПараметры)
ИзмененныеСтроки = Новый Массив;
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
НевозвращенныеПозицииПоЧеку = ПолучитьИзВременногоХранилища(ДанныеПоЧекуККМ.АдресТаблицыНевозвращенныхПозиций);
СтрокиДляУдаления = Новый Массив;
Для Каждого СтрокаТовары Из Объект.Товары Цикл
ДанныеНевозвращеннойПозиции = НевозвращенныеПозицииПоЧеку[СтрокаТовары.ПолучитьИдентификатор()];
Если ДанныеНевозвращеннойПозиции = Неопределено Тогда
ОтборПоНоменклатуре = ОтборДляПоискаПоНоменклатуре(СтрокаТовары, ИспользоватьХарактеристикиНоменклатуры, ИспользоватьСерииНоменклатуры, ИспользоватьНаборы);
СообщитьПользователюЧтоПозицияНеУказанаВЧекеПродажи(ОтборПоНоменклатуре);
СтрокиДляУдаления.Добавить(СтрокаТовары);
ИначеЕсли ПревышеноКоличествоУпаковокНевозвращенныхПозицийВСтроке(СтрокаТовары, СтрокаТовары.КоличествоУпаковок) Тогда
СтрокаТовары.КоличествоУпаковок = ДанныеНевозвращеннойПозиции.КоличествоУпаковок;
СтрокаТовары.Количество = ДанныеНевозвращеннойПозиции.Количество;
ИзмененныеСтроки.Добавить(СтрокаТовары);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаДляУдаления Из СтрокиДляУдаления Цикл
Объект.Товары.Удалить(СтрокаДляУдаления);
КонецЦикла;
КонецЕсли;
Возврат ИзмененныеСтроки;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПревышеноКоличествоУпаковокНевозвращенныхПозиций(Объект, ОтборПоНоменклатуре, КоличествоУпаковок = 0, ЭтоДобавляемоеКоличество = Истина)
ПроверкаПревышения = Новый Структура("Результат,НайденнаяСтрока", Ложь, Неопределено);
СтрокиТоваров = Объект.Товары.НайтиСтроки(ОтборПоНоменклатуре);
Если СтрокиТоваров.Количество() Тогда
ПроверкаПревышения.НайденнаяСтрока = СтрокиТоваров[0];
КоличествоУпаковокДляПроверки = КоличествоУпаковок;
Если ЭтоДобавляемоеКоличество = Истина Тогда
КоличествоУпаковокДляПроверки = СтрокиТоваров[0].КоличествоУпаковок + КоличествоУпаковок;
КонецЕсли;
ПроверкаПревышения.Результат = ПревышеноКоличествоУпаковокНевозвращенныхПозицийВСтроке(ПроверкаПревышения.НайденнаяСтрока, КоличествоУпаковокДляПроверки);
Иначе
ПроверкаПревышения.Результат = Истина;
СообщитьПользователюЧтоПозицияНеУказанаВЧекеПродажи(ОтборПоНоменклатуре);
КонецЕсли;
Возврат ПроверкаПревышения;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПревышеноКоличествоУпаковокНевозвращенныхПозицийВСтроке(СтрокаДляПроверки, КоличествоУпаковокДляПроверки)
Результат = Ложь;
Если КоличествоУпаковокДляПроверки > СтрокаДляПроверки.КоличествоУпаковокПоЧеку Тогда
Результат = Истина;
ТекстОшибки = НСтр("ru = 'Возвращаемое количество ""%Номенклатура%"" не может быть больше, чем указано в чеке продажи.'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Номенклатура%", СтрокаДляПроверки.Номенклатура);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстОшибки,
,
,
,);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ОтборДляПоискаПоНоменклатуре(ДанныеДляЗаполнения, ИспользоватьХарактеристикиНоменклатуры, ИспользоватьСерииНоменклатуры, ИспользоватьНаборы)
ОтборДляПоиска = Новый Структура;
ОтборДляПоиска.Вставить("Номенклатура", ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка"));
Если ИспользоватьХарактеристикиНоменклатуры Тогда
ОтборДляПоиска.Вставить("Характеристика", ПредопределенноеЗначение("Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка"));
КонецЕсли;
Если ИспользоватьСерииНоменклатуры Тогда
ОтборДляПоиска.Вставить("Серия", ПредопределенноеЗначение("Справочник.СерииНоменклатуры.ПустаяСсылка"));
КонецЕсли;
Если ИспользоватьНаборы Тогда
ОтборДляПоиска.Вставить("НоменклатураНабора", ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка"));
ОтборДляПоиска.Вставить("ХарактеристикаНабора", ПредопределенноеЗначение("Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка"));
КонецЕсли;
ЗаполнитьЗначенияСвойств(ОтборДляПоиска, ДанныеДляЗаполнения);
Возврат ОтборДляПоиска;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователюЧтоПозицияНеУказанаВЧекеПродажи(ОтборПоНоменклатуре)
ТекстОшибки = НСтр("ru = 'Нельзя вернуть позицию ""%Номенклатура%"", так как она не указана в чеке продажи.'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Номенклатура%", ОтборПоНоменклатуре.Номенклатура);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстОшибки,
,
,
,);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователюЧтоШтрихкодНеНайденВЧекеПродажи(Штрихкод)
ТекстОшибки = НСтр("ru = 'Позиция со штрихкодом ""%Штрихкод%"" не найдена в чеке продажи.'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Штрихкод%", Штрихкод);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстОшибки,
,
,
,);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ИспользоватьСкладскиеПомещения(Склад, Дата)
Возврат СкладыСервер.ИспользоватьСкладскиеПомещения(Склад,
?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
КонецФункции
&НаСервере
Функция ПолучитьЦенуПоОтбору(Номенклатура, Характеристика, Серия, Упаковка)
СтруктураПараметровОтбора = Новый Структура;
СтруктураПараметровОтбора.Вставить("Валюта", Объект.Валюта);
СтруктураПараметровОтбора.Вставить("Дата", ТекущаяДатаСеанса());
СтруктураПараметровОтбора.Вставить("ВидЦены", Объект.ВидЦены);
СтруктураПараметровОтбора.Вставить("Номенклатура", Номенклатура);
СтруктураПараметровОтбора.Вставить("Характеристика", Характеристика);
СтруктураПараметровОтбора.Вставить("Серия", Серия);
СтруктураПараметровОтбора.Вставить("Упаковка", Упаковка);
Возврат ЦеныПредприятияЗаполнениеСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
КонецФункции
&НаСервере
Процедура ДобавитьПроверкуАссортиментаВСтруктуруДействий(СтруктураДействий)
СтруктураПроверкиАссортимента = АссортиментКлиентСервер.ПараметрыПроверкиАссортимента();
СтруктураПроверкиАссортимента.Ссылка = Объект.Ссылка;
СтруктураПроверкиАссортимента.Склад = Объект.Склад;
СтруктураПроверкиАссортимента.Дата = Объект.Дата;
СтруктураПроверкиАссортимента.ТекстСообщения = НСтр("ru = 'Товар %1 не включен в ассортимент магазина или запрещен к продаже.'");
СтруктураПроверкиАссортимента.ИмяРесурсаАссортимента = "РазрешеныПродажи";
СтруктураПроверкиАссортимента.ПровереноМожноДобавлять = Истина;
СтруктураПроверкиАссортимента.РазрешатьДобавление = Ложь;
СтруктураДействий.Вставить("ПроверитьАссортиментСтроки", СтруктураПроверкиАссортимента);
КонецПроцедуры
#КонецОбласти
&НаСервере
Процедура НастроитьРМК()
УстановитьПривилегированныйРежим(Истина);
ПолучитьСсылкиНаОборудование();
Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
Элементы.СуммаКВозврату.Ширина = 22;
Элементы.СуммаКВозвратуПлатежнымиКартами.Ширина = 22;
Элементы.СуммаКВозвратуНаличными.Ширина = 22;
КонецЕсли;
ОбновитьЗаголовкиКнопокФормыНаСервере(Ложь);
РозничныеПродажи.ПодписатьГорячиеКлавишиНаКнопках(ЭтотОбъект);
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(НастройкиРМК.ГорячиеКлавиши, Неопределено) КАК ГорячиеКлавиши,
| ЕСТЬNULL(НастройкиРМК.ГорячиеКлавиши.БыстрыеТовары, Неопределено) КАК БыстрыеТовары,
| ЕСТЬNULL(НастройкиРМК.ГорячиеКлавиши.КомандыФормы, Неопределено) КАК КомандыФормы,
| НастройкиРМК.КассирМожетБытьПродавцом КАК КассирМожетБытьПродавцом,
| НастройкиРМК.МенеджерТорговогоЗалаМожетБытьПродавцом КАК МенеджерТорговогоЗалаМожетБытьПродавцом,
| НастройкиРМК.ИспользоватьАвторизацию КАК ИспользоватьАвторизацию
|ИЗ
| Справочник.НастройкиРМК КАК НастройкиРМК
|ГДЕ
| НастройкиРМК.РабочееМесто = &РабочееМесто
| И НастройкиРМК.Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ Т.Ссылка ИЗ Справочник.НастройкиРМК.КассыККМ КАК Т ГДЕ Т.КассаККМ = &КассаККМ)
|");
Запрос.УстановитьПараметр("РабочееМесто", МенеджерОборудованияВызовСервера.РабочееМестоКлиента());
Запрос.УстановитьПараметр("КассаККМ", Объект.КассаККМ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
ГорячиеКлавиши = Выборка.ГорячиеКлавиши;
МенеджерТорговогоЗалаМожетБытьПродавцом = Выборка.МенеджерТорговогоЗалаМожетБытьПродавцом;
КассирМожетБытьПродавцом = Выборка.КассирМожетБытьПродавцом;
ПринудительнаяАвторизация = Выборка.ИспользоватьАвторизацию;
Если ЗначениеЗаполнено(ГорячиеКлавиши) Тогда
РозничныеПродажи.НастроитьБыстрыеТоварыИГорячиеКлавиши(ЭтотОбъект, Выборка);
КонецЕсли;
Иначе
ГорячиеКлавиши = Неопределено;
ПринудительнаяАвторизация = Ложь;
МенеджерТорговогоЗалаМожетБытьПродавцом = Ложь;
КассирМожетБытьПродавцом = Истина;
КонецЕсли;
НастроитьПраваДляПользователя(Объект.Кассир);
ПродавецТолькоКассир = КассирМожетБытьПродавцом И Не МенеджерТорговогоЗалаМожетБытьПродавцом;
Элементы.ТоварыПродавец.Видимость = Не ПродавецТолькоКассир;
Элементы.БыстрыеТовары.Видимость = ЭтотОбъект.БыстрыеТовары.Количество() > 0;
Элементы.ИзменитьПродавца.Видимость = Не ПродавецТолькоКассир;
Элементы.ИзменитьПомещение.Видимость = ПараметрыКассыККМ.ИспользоватьСкладскиеПомещения;
Элементы.ТоварыПомещение.Видимость = ПараметрыКассыККМ.ИспользоватьСкладскиеПомещения;
Элементы.СоставНабора.Видимость = ПолучитьФункциональнуюОпцию("ИспользоватьНаборы");
Элементы.УказатьСерии.Видимость = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование(ЭтотОбъект, "");
ДоступныеВидыОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
Если Объект.ОплатаПлатежнымиКартами.Количество() > 0
И Не (Объект.ОплатаПлатежнымиКартами.Количество() = 1 И ОбщаяСуммаОплатыПлатежнымиКартами < СуммаДокумента) Тогда
Элементы.Товары.ТолькоПросмотр = Истина;
Элементы.ПоискПоШтрихкоду.Доступность = Ложь;
Элементы.ОткрытьПодбор.Доступность = Ложь;
КонецЕсли;
УстановитьДоступностьЭлементовРМК(ЭтотОбъект, ДоступныеВидыОплаты);
Элементы.ОплатитьНаличными.Видимость = ДоступныеВидыОплаты.Наличные;
Элементы.ОплатитьКартой.Видимость = ДоступныеВидыОплаты.ПлатежныеКарты;
Элементы.СмешаннаяОплата.Видимость = ДоступныеВидыОплаты.ПлатежныеКарты;
Элементы.ПоказыватьТолькоВозвращаемыеПозиции.Видимость = Ложь;
Элементы.ЗаполнитьКоличествоПоЧеку.Видимость = Ложь;
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
УстановитьОтборСтрокТаблицыТовары(РежимОтображенияТоваровПоЧеку, Элементы.Товары);
Элементы.ОткрытьПодбор.Видимость = Ложь;
Элементы.ПоказыватьТолькоВозвращаемыеПозиции.Видимость = Истина;
Элементы.ЗаполнитьКоличествоПоЧеку.Видимость = Истина;
Если Не Элементы.Товары.КонтекстноеМеню.ПодчиненныеЭлементы.Найти("ТоварыКонтекстноеМенюДобавить") = Неопределено Тогда
Элементы.Товары.КонтекстноеМеню.ПодчиненныеЭлементы.ТоварыКонтекстноеМенюДобавить.Видимость = Ложь;
КонецЕсли;
Если Не Элементы.Товары.КонтекстноеМеню.ПодчиненныеЭлементы.Найти("ТоварыКонтекстноеМенюСкопировать") = Неопределено Тогда
Элементы.Товары.КонтекстноеМеню.ПодчиненныеЭлементы.ТоварыКонтекстноеМенюСкопировать.Видимость = Ложь;
КонецЕсли;
Для Каждого ПодчиненныйЭлементТаблицыТовары Из Элементы.Товары.ПодчиненныеЭлементы Цикл
Если ПодчиненныйЭлементТаблицыТовары = Элементы.ТоварыКоличествоУпаковок
Или ПодчиненныйЭлементТаблицыТовары = Элементы.ТоварыУпаковкаЕдиницаИзмерения
Или ПодчиненныйЭлементТаблицыТовары = Элементы.ТоварыУпаковка Тогда
Продолжить;
КонецЕсли;
ПодчиненныйЭлементТаблицыТовары.ТолькоПросмотр = Истина;
КонецЦикла;
Иначе
РежимОтображенияТоваровПоЧеку = Истина;
КонецЕсли;
Элементы.ОтменитьОплатыПлатежнымиКартами.Доступность = (ДанныеПоЧекуККМ.НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой > 0);
Элементы.ДекоративноеПолеГруппаСуммаКВозврату1.Видимость = Не Элементы.ОплатитьКартой.Видимость;
Элементы.ДекоративноеПолеГруппаСуммаКВозврату2.Видимость = Истина;
Элементы.СуммаКВозвратуПлатежнымиКартами.Видимость = Элементы.ОплатитьКартой.Видимость;
ЭлементыНаПерегруппировку = Новый Массив;
ЭлементыНаПерегруппировку.Добавить(Элементы.БыстрыеТовары);
Для Каждого Подгруппа Из Элементы.ГруппаНижняяКоманднаяПанельКонтекстныеКоманды.ПодчиненныеЭлементы Цикл
Для Каждого Элемент Из Подгруппа.ПодчиненныеЭлементы Цикл
ЭлементыНаПерегруппировку.Добавить(Элемент);
КонецЦикла;
КонецЦикла;
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьНаличными);
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьКартой);
ЭлементыНаПерегруппировку.Добавить(Элементы.СмешаннаяОплата);
НастроитьРМКЛокализация(ДоступныеВидыОплаты, ЭлементыНаПерегруппировку);
РозничныеПродажи.ПерегруппироватьКнопкиФормы(ЭтотОбъект, ЭлементыНаПерегруппировку);
РозничныеПродажи.НастроитьКомандыПечати(ЭтотОбъект, Элементы.ПеремещаемыеКнопки);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПродавцаЗавершение(Продавец, ДополнительныеПараметры) Экспорт
Если Не ЗначениеЗаполнено(Продавец) Тогда
Возврат;
КонецЕсли;
ТекущийПродавец = Продавец;
Для Каждого ВыделеннаяСтрока Из Элементы.Товары.ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ВыделеннаяСтрока);
СтрокаТЧ.Продавец = ТекущийПродавец;
КонецЦикла;
ОбновитьЗаголовокФормы();
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаСервере
Процедура ОбновитьСостояниеКассовойСмены()
Если ЗначениеЗаполнено(Объект.КассаККМ)
И Объект.Статус <> Перечисления.СтатусыЧековККМ.Пробит Тогда
СтруктураСостояниеКассовойСмены = РозничныеПродажи.ПолучитьСостояниеКассовойСмены(Объект.КассаККМ);
Если Объект.КассоваяСмена <> СтруктураСостояниеКассовойСмены.КассоваяСмена Тогда
ЗаполнитьЗначенияСвойств(Объект, СтруктураСостояниеКассовойСмены,,"Кассир");
КонецЕсли;
ТекущийПользователь = Пользователи.ТекущийПользователь();
Если Объект.Кассир <> ТекущийПользователь
И НЕ ЗначениеЗаполнено(Объект.Кассир) Тогда
Объект.Кассир = ТекущийПользователь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДанныеПоЧекуККМ()
ДанныеПоЧекуККМ = Новый Структура;
ДанныеПоЧекуККМ.Вставить("КассоваяСмена", ПредопределенноеЗначение("Документ.КассоваяСмена.ПустаяСсылка"));
ДанныеПоЧекуККМ.Вставить("СтатусКассовойСмены", ПредопределенноеЗначение("Перечисление.СтатусыКассовойСмены.ПустаяСсылка"));
ДанныеПоЧекуККМ.Вставить("СуммаДокумента", 0);
ДанныеПоЧекуККМ.Вставить("АдресТаблицыНеотмененныхОплатПлатежнымиКартами", "");
ДанныеПоЧекуККМ.Вставить("АдресТаблицыНевозвращенныхПозиций", "");
ДанныеПоЧекуККМ.Вставить("КомбинацииСуммНеотмененныхОплатПлатежнымиКартами", Новый Массив);
ДанныеПоЧекуККМ.Вставить("НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой", 0);
ДанныеПоЧекуККМ.Вставить("КоличествоНеотмененныхОплатПлатежнымиКартами", 0);
ДанныеПоЧекуККМ.Вставить("ДанныеПервойНеотмененнойОплатыПлатежнымиКартами", Неопределено);
ДанныеПоЧекуККМ.Вставить("НомераСтрокОтменяемыхОплатПлатежнойКартой", Новый Соответствие);
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
РеквизитыЧекККМ = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.ЧекККМ, "КассоваяСмена,СуммаДокумента");
ДанныеПоЧекуККМ.КассоваяСмена = РеквизитыЧекККМ.КассоваяСмена;
ДанныеПоЧекуККМ.СуммаДокумента = РеквизитыЧекККМ.СуммаДокумента;
СтатусКассовойСмены = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеПоЧекуККМ.КассоваяСмена, "Статус");
ДанныеПоЧекуККМ.СтатусКассовойСмены = СтатусКассовойСмены;
ТаблицаНевозвращенныхТоваров = Новый ТаблицаЗначений;
ЭтоОтложенныйЧекККМВозврат = (ЗначениеЗаполнено(Объект.Ссылка) И Объект.Статус <> Перечисления.СтатусыЧековККМ.Пробит);
Если ЭтоОтложенныйЧекККМВозврат Тогда
ПараметрыОтбора = Документы.ЧекККМ.ПараметрыДляПолученияНевозвращенныхПозицийПоЧекуККМ();
ПараметрыОтбора.ИспользуетсяККТФЗ54 = ИспользуетсяККТФЗ54;
ПараметрыОтбора.КассаККМИспользуетсяБезПодключенияОборудования = ПараметрыКассыККМ.ИспользоватьБезПодключенияОборудования;
ПараметрыОтбора.КассоваяСмена = Объект.КассоваяСмена;
ПараметрыОтбора.ЧекККМ = Объект.ЧекККМ;
ТаблицаНевозвращенныхТоваров = Документы.ЧекККМ.ТаблицаНевозвращенныхПозицийПоЧекуККМ(ПараметрыОтбора);
КонецЕсли;
НевозвращенныеПозицииПоЧеку = Новый Соответствие;
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
МассивСтрокДляОбработки = Новый Массив;
Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
СтрокаТаблицы.ВозвращаемаяПозиция = (СтрокаТаблицы.КоличествоУпаковок > 0);
СтрокаТаблицы.КоличествоУпаковокПоЧеку = СтрокаТаблицы.КоличествоУпаковок;
СтрокаТаблицы.КоличествоПоЧеку = СтрокаТаблицы.Количество;
Если ЭтоОтложенныйЧекККМВозврат Тогда
ОтборНоменклатурыПоДаннымСтроки = ОтборДляПоискаПоНоменклатуре(СтрокаТаблицы, ИспользоватьХарактеристикиНоменклатуры, ИспользоватьСерииНоменклатуры, ИспользоватьНаборы);
СтрокиНевозвращенныхТоваров = ТаблицаНевозвращенныхТоваров.НайтиСтроки(ОтборНоменклатурыПоДаннымСтроки);
Если СтрокиНевозвращенныхТоваров.Количество() Тогда
СтрокаТаблицы.КоличествоУпаковокПоЧеку = СтрокиНевозвращенныхТоваров[0].КоличествоУпаковок;
СтрокаТаблицы.КоличествоПоЧеку = СтрокиНевозвращенныхТоваров[0].Количество;
Если СтрокиНевозвращенныхТоваров[0].Упаковка <> СтрокаТаблицы.Упаковка Тогда
МассивСтрокДляОбработки.Добавить(СтрокаТаблицы);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
Для Каждого СтрокаТаблицы Из Объект.Товары Цикл
Если Не МассивСтрокДляОбработки.Найти(СтрокаТаблицы) = Неопределено Тогда
ДанныеДляПересчета = Новый Структура;
ДанныеДляПересчета.Вставить("Упаковка", СтрокаТаблицы.Упаковка);
ДанныеДляПересчета.Вставить("Номенклатура", СтрокаТаблицы.Номенклатура);
ДанныеДляПересчета.Вставить("Количество", СтрокаТаблицы.КоличествоПоЧеку);
ДанныеДляПересчета.Вставить("КоличествоУпаковок", СтрокаТаблицы.КоличествоУпаковокПоЧеку);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(
ДанныеДляПересчета, СтруктураДействий, КэшированныеЗначения);
СтрокаТаблицы.КоличествоУпаковокПоЧеку = ДанныеДляПересчета.КоличествоУпаковок;
КонецЕсли;
ДанныеНевозвращеннойПозиции = Новый Структура("Упаковка,КоличествоУпаковок,Количество", СтрокаТаблицы.Упаковка, СтрокаТаблицы.КоличествоУпаковокПоЧеку, СтрокаТаблицы.КоличествоПоЧеку);
НевозвращенныеПозицииПоЧеку.Вставить(СтрокаТаблицы.ПолучитьИдентификатор(), ДанныеНевозвращеннойПозиции);
КонецЦикла;
ДанныеПоЧекуККМ.АдресТаблицыНевозвращенныхПозиций = ПоместитьВоВременноеХранилище(НевозвращенныеПозицииПоЧеку, УникальныйИдентификатор);
ЗаполнитьДанныеНеотмененныхОплатПлатежнымиКартамиПоЧекуККМ();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимостьЭлементовФормы()
Элементы.ОплатитьЭСФСС.Видимость = Ложь;
Элементы.ОплатитьСБП.Видимость = Ложь;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДанныеНеотмененныхОплатПлатежнымиКартамиПоЧекуККМ()
ДанныеПоЧекуККМ.Вставить("КомбинацииСуммНеотмененныхОплатПлатежнымиКартами", Новый Массив);
ДанныеПоЧекуККМ.Вставить("НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой", 0);
ДанныеПоЧекуККМ.Вставить("КоличествоНеотмененныхОплатПлатежнымиКартами", 0);
ДанныеПоЧекуККМ.Вставить("ДанныеПервойНеотмененнойОплатыПлатежнымиКартами", Неопределено);
ДанныеПоЧекуККМ.Вставить("НомераСтрокОтменяемыхОплатПлатежнойКартой", Новый Соответствие);
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
МассивВидовОплат = Новый Массив;
МассивВидовОплат.Добавить(Перечисления.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта);
Запрос = Новый Запрос(Документы.ЧекККМ.ТекстЗапросаДляПолученияНеотмененныхОплатПоЧекуККМ(Истина, Ложь));
Запрос.УстановитьПараметр("Ссылка", Объект.ЧекККМ);
Запрос.УстановитьПараметр("ВидыОплат", МассивВидовОплат);
ТаблицаНеотмененныхОплатПлатежнымиКартами = Запрос.Выполнить().Выгрузить();
НастроенныеЭквайринговыеТерминалы = Новый Соответствие;
Для Каждого Терминал Из ЭквайринговыеТерминалы Цикл
ТерминалЗначение = Терминал.Значение;
НастроенныеЭквайринговыеТерминалы.Вставить(ТерминалЗначение.Ссылка, Терминал.Значение);
КонецЦикла;
МассивСтрокДляУдаления = Новый Массив;
Для Каждого НеотмененнаяОплатаПлатежнойКартой Из ТаблицаНеотмененныхОплатПлатежнымиКартами Цикл
Если НеотмененнаяОплатаПлатежнойКартой.Сумма > Объект.СуммаДокумента
Или НастроенныеЭквайринговыеТерминалы[НеотмененнаяОплатаПлатежнойКартой.ЭквайринговыйТерминал] = Неопределено Тогда
МассивСтрокДляУдаления.Добавить(НеотмененнаяОплатаПлатежнойКартой);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаДляУдаления Из МассивСтрокДляУдаления Цикл
ТаблицаНеотмененныхОплатПлатежнымиКартами.Удалить(СтрокаДляУдаления);
КонецЦикла;
ТаблицаНеотмененныхОплатПлатежнымиКартами.Колонки.Добавить("НомерСтроки");
НомерСтрокиНеотмененнойОплаты = 0;
Для Каждого СтрокаНеотмененныхОплат Из ТаблицаНеотмененныхОплатПлатежнымиКартами Цикл
СтрокаНеотмененныхОплат.НомерСтроки = НомерСтрокиНеотмененнойОплаты;
НомерСтрокиНеотмененнойОплаты = НомерСтрокиНеотмененнойОплаты + 1;
КонецЦикла;
ДанныеПоЧекуККМ.АдресТаблицыНеотмененныхОплатПлатежнымиКартами = ПоместитьВоВременноеХранилище(ТаблицаНеотмененныхОплатПлатежнымиКартами, УникальныйИдентификатор);
РезультатПересчета = РозничныеПродажиВызовСервера.ПересчитатьДанныеНеотмененныхОплатПлатежнымиКартами(ДанныеПоЧекуККМ.АдресТаблицыНеотмененныхОплатПлатежнымиКартами);
ДанныеПоЧекуККМ.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами = РезультатПересчета.ДанныеПервойНеотмененнойОплатыПлатежнымиКартами;
ДанныеПоЧекуККМ.КоличествоНеотмененныхОплатПлатежнымиКартами = РезультатПересчета.КоличествоНеотмененныхОплатПлатежнымиКартами;
ДанныеПоЧекуККМ.КомбинацииСуммНеотмененныхОплатПлатежнымиКартами = РезультатПересчета.КомбинацииСуммНеотмененныхОплатПлатежнымиКартами;
ДанныеПоЧекуККМ.НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой = РезультатПересчета.НаименьшаяСуммаНеотмененнойОплатыПлатежнойКартой;
КонецЕсли;
КонецПроцедуры
#Область БыстрыеТоварыИОбработкаПроверкиКоличества
&НаСервере
Процедура ДобавитьВКорзинуНаСервере(ПараметрыТовара, НовыеСтроки)
ИспользоватьСкладскиеПомещения = ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата);
ДобавленныеСтрокиДляОбработки = Новый Массив;
СвязьДобавленныхИНовыхСтрок = Новый Соответствие;
Погрешности = Новый Соответствие();
ИзмененныеСтрокиДляОбработки = Новый Массив;
Для Каждого СтрокаТовара Из НовыеСтроки Цикл
Если СтрокаТовара.Упаковка.Пустая() Тогда
СтрокаТовара.Упаковка = ПодборТоваровВызовСервера.ПолучитьУпаковкуХранения(СтрокаТовара.Номенклатура);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаТовара.Цена) И ПараметрыТовара.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Набор Тогда
СтрокаТовара.Цена = ПолучитьЦенуПоОтбору(СтрокаТовара.Номенклатура, СтрокаТовара.Характеристика, СтрокаТовара.Серия, СтрокаТовара.Упаковка);
КонецЕсли;
Отбор = Новый Структура;
Отбор.Вставить("НоменклатураНабора", СтрокаТовара.НоменклатураНабора);
Отбор.Вставить("ХарактеристикаНабора", СтрокаТовара.ХарактеристикаНабора);
Отбор.Вставить("Номенклатура", СтрокаТовара.Номенклатура);
Отбор.Вставить("Характеристика", СтрокаТовара.Характеристика);
Отбор.Вставить("Упаковка", СтрокаТовара.Упаковка);
Отбор.Вставить("Цена", СтрокаТовара.Цена);
Отбор.Вставить("Помещение", СтрокаТовара.Помещение);
РезультатПоиска = Объект.Товары.НайтиСтроки(Отбор);
Если РезультатПоиска.Количество() = 0 ИЛИ СтрокаТовара.Погрешность <> 0 Тогда
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, ПараметрыТовара);
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
ТекущаяСтрока.ИндексНабора = ?(ЗначениеЗаполнено(ТекущаяСтрока.НоменклатураНабора), 1, 0);
ДобавленныеСтрокиДляОбработки.Добавить(ТекущаяСтрока);
Погрешности.Вставить(ТекущаяСтрока, СтрокаТовара.Погрешность);
СвязьДобавленныхИНовыхСтрок.Вставить(ТекущаяСтрока, СтрокаТовара);
Иначе
ТекущаяСтрока = РезультатПоиска[0];
ТекущаяСтрока.КоличествоУпаковок = СтрокаТовара.КоличествоУпаковок + ТекущаяСтрока.КоличествоУпаковок;
ИзмененныеСтрокиДляОбработки.Добавить(ТекущаяСтрока);
КонецЕсли;
КонецЦикла;
Если ДобавленныеСтрокиДляОбработки.Количество() Или ИзмененныеСтрокиДляОбработки.Количество() Тогда
Если ДобавленныеСтрокиДляОбработки.Количество() Тогда
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
Если ИспользоватьСкладскиеПомещения Тогда
СтруктураДействий.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
КонецЕсли;
Если КассирМожетБытьПродавцом И НЕ МенеджерТорговогоЗалаМожетБытьПродавцом Тогда
СтруктураДействий.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
КонецЕсли;
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
Если КонтролироватьАссортимент Тогда
ДобавитьПроверкуАссортиментаВСтруктуруДействий(СтруктураДействий);
КонецЕсли;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий,Объект);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействий);
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу");
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомПогрешностиОкругления",
Новый Структура("ПогрешностиПоСтрокам", Погрешности));
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ДобавленныеСтрокиДляОбработки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
КонецЕсли;
Если ИзмененныеСтрокиДляОбработки.Количество() Тогда
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий, Объект);
Если КонтролироватьАссортимент Тогда
ДобавитьПроверкуАссортиментаВСтруктуруДействий(СтруктураДействий);
КонецЕсли;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ИзмененныеСтрокиДляОбработки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
КонецЕсли;
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
КонецЕсли;
Если ТекущаяСтрока <> Неопределено Тогда
Элементы.Товары.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();
КонецЕсли;
Если НовыеСтроки.Количество() Тогда
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКорзину(ПараметрыТовара)
Если ТолькоПросмотр Тогда
Возврат;
КонецЕсли;
НовыеСтроки = Новый Массив;
Если ПараметрыТовара.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Набор") Тогда
ПараметрыКомплектующих = ПодборТоваровКлиентСервер.ПараметрыТовара();
ЗаполнитьЗначенияСвойств(ПараметрыКомплектующих, ПараметрыТовара);
ПараметрыКомплектующих.НоменклатураНабора = ПараметрыТовара.Номенклатура;
ПараметрыКомплектующих.ХарактеристикаНабора = ПараметрыТовара.Характеристика;
ПараметрыКомплектующих.Вставить("ВариантКомплектацииНоменклатуры", Неопределено);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Дата", Объект.Дата);
ДополнительныеПараметры.Вставить("Валюта", Объект.Валюта);
ДополнительныеПараметры.Вставить("ВидЦены", Объект.ВидЦены);
ДополнительныеПараметры.Вставить("Цена", ПараметрыТовара.Цена);
ДополнительныеПараметры.Вставить("Организация", Объект.Организация);
ПодобранныеТовары = НаборыВызовСервера.Комплектующие(ПараметрыКомплектующих, ДополнительныеПараметры);
Для Каждого ПодобранныйТовар Из ПодобранныеТовары Цикл
НовыеСтроки.Добавить(ПодобранныйТовар);
КонецЦикла;
Иначе
Если Не ЗначениеЗаполнено(ПараметрыТовара.Упаковка) Тогда
ПараметрыТовара.Упаковка = ПодборТоваровВызовСервера.ПолучитьУпаковкуХранения(ПараметрыТовара.Номенклатура);
КонецЕсли;
НовыеСтроки.Добавить(ПараметрыТовара);
КонецЕсли;
ПараметрыДанных = Новый Структура;
ПараметрыДанных.Вставить("НовыеСтроки", НовыеСтроки);
ПараметрыДанных.Вставить("ПараметрыТовара", ПараметрыТовара);
ДобавитьВКорзинуФрагмент(ПараметрыДанных);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКорзинуПослеВыбораКоличества(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
НовыеСтроки = Новый Массив;
Для Каждого ПодобранныйТовар Из Результат.ПодобранныеТовары Цикл
НоваяСтрока = ПодборТоваровКлиентСервер.ПараметрыТовара();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ДополнительныеПараметры);
ЗаполнитьЗначенияСвойств(НоваяСтрока, ПодобранныйТовар);
НовыеСтроки.Добавить(НоваяСтрока);
КонецЦикла;
ПараметрыДанных = Новый Структура;
ПараметрыДанных.Вставить("НовыеСтроки", НовыеСтроки);
ПараметрыДанных.Вставить("ПараметрыТовара", ДополнительныеПараметры.ПараметрыТовара);
ДобавитьВКорзинуФрагмент(ПараметрыДанных);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКорзинуФрагмент(ПараметрыДанных)
НовыеСтроки = ПараметрыДанных.НовыеСтроки;
ПараметрыТовара = ПараметрыДанных.ПараметрыТовара;
ДобавитьВКорзинуНаСервере(ПараметрыТовара, НовыеСтроки);
ПересчитатьДокументНаКлиенте();
Модифицированность = Истина;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область Локализация
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьЭлементовРМКЛокализация(Форма, ДоступныеВидыОплаты)
ЕстьВозвращаемыеПозиции = (Форма.Объект.Товары.Количество() > 0);
Форма.Элементы.ОплатитьЭСФСС.Доступность = ЕстьВозвращаемыеПозиции;
Если ДоступныеВидыОплаты.ЭСФСС Тогда
ОплатыЭСФСС = ОплатыЭСФСС(Форма.Объект.ОплатаПлатежнымиКартами);
Если (ОплатыЭСФСС.Количество() > 0 И ОплатыЭСФСС[0].ОплатаОтменена = Истина)
Или Форма.ОбщаяСуммаОплатыЭСФСС > Форма.СуммаДокумента Тогда
Форма.Элементы.ОплатитьЭСФСС.Доступность = Ложь;
КонецЕсли;
КонецЕсли;
Если Форма.СтатусОплатыСБПЧекаПродажи = ПредопределенноеЗначение("Перечисление.ТипыСтатусовОплатыСБП.ОжидаетПодтверждение") Тогда
Форма.Элементы.ОплатитьСБП.Видимость = Ложь;
Форма.ИспользоватьОплатуСБП = Ложь;
Иначе
Форма.Элементы.ОплатитьСБП.Доступность = ЕстьВозвращаемыеПозиции;
Форма.Элементы.ОплатитьСБП.Видимость = (ДоступныеВидыОплаты.СБП И Форма.ОбщаяСуммаОплатыСБП > 0)
ИЛИ ДоступныеВидыОплаты.СБП И НЕ ЗначениеЗаполнено(Форма.Объект.ЧекККМ);
КонецЕсли;
Если Форма.ОбщаяСуммаОплатыЭСФСС > 0
ИЛИ Форма.СтатусОплатыСБПЧекаПродажи = ПредопределенноеЗначение("Перечисление.ТипыСтатусовОплатыСБП.ОжидаетПодтверждение") Тогда
Форма.Элементы.Товары.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура НастроитьРМКЛокализация(ДоступныеВидыОплаты, ЭлементыНаПерегруппировку)
Элементы.ОплатитьСБП.Видимость = ДоступныеВидыОплаты.СБП И ОбщаяСуммаОплатыСБП > 0
ИЛИ ДоступныеВидыОплаты.СБП И Не ЗначениеЗаполнено(Объект.ЧекККМ);
Элементы.ОплатитьНаличными.Видимость = Элементы.ОплатитьНаличными.Видимость И ОбщаяСуммаОплатыЭСФСС = 0
ИЛИ Элементы.ОплатитьСБП.Видимость;
Элементы.ОплатитьКартой.Видимость = Элементы.ОплатитьКартой.Видимость И ОбщаяСуммаОплатыЭСФСС = 0;
Элементы.ОплатитьСБП.Видимость = Элементы.ОплатитьСБП.Видимость И ОбщаяСуммаОплатыЭСФСС = 0;
Элементы.СмешаннаяОплата.Видимость = Элементы.СмешаннаяОплата.Видимость
ИЛИ (Элементы.ОплатитьСБП.Видимость И ОбщаяСуммаОплатыЭСФСС = 0 И СуммаДокумента <> ОбщаяСуммаОплатыСБП);
Элементы.ОплатитьЭСФСС.Видимость = ДоступныеВидыОплаты.ЭСФСС И ОбщаяСуммаОплатыЭСФСС > 0;
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьЭСФСС);
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьСБП);
Элементы.ДекоративноеПолеГруппаСуммаКВозврату2.Видимость = Не Элементы.ОплатитьСБП.Видимость;
Элементы.СуммаКВозвратуСБП.Видимость = Элементы.ОплатитьСБП.Видимость;
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьЭСФССЛокализация()
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяФормаОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОплатаЭСФССОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьСБПЛокализация()
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяФормаОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
Если СуммаДокумента <= ОбщаяСуммаОплатыСБП Тогда
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОплатаСБПОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
Иначе
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("СмешаннаяОплатаОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ИнформацияОбОплатеЛокализация(Форма, ИнформацияОбОплате)
Форма.ЭтоОплатаЭСФСС = СуммаОплатыЭСФССПоДокументу(Форма.Объект.ОплатаПлатежнымиКартами) > 0;
ОплатаЭСФССОтменено = 0;
Форма.ОбщаяСуммаОплатыЭСФСС = 0;
ОплатыЭСФСС = ОплатыЭСФСС(Форма.Объект.ОплатаПлатежнымиКартами);
Для Каждого СтрокаТЧ Из ОплатыЭСФСС Цикл
Форма.ОбщаяСуммаОплатыЭСФСС = Форма.ОбщаяСуммаОплатыЭСФСС + СтрокаТЧ.Сумма;
Если СтрокаТЧ.ОплатаОтменена Тогда
ОплатаЭСФССОтменено = ОплатаЭСФССОтменено + СтрокаТЧ.Сумма;
КонецЕсли;
КонецЦикла;
ИнформацияОбОплате.Вставить("ЭСФСС", Форма.ОбщаяСуммаОплатыЭСФСС);
ИнформацияОбОплате.Вставить("ЭСФССОтменено", ОплатаЭСФССОтменено);
Форма.ЕстьОплатаСБП = РозничныеПродажиКлиентСерверЛокализация.СуммаОплатыСБППоДокументу(Форма.Объект.ОплатаПлатежнымиКартами) > 0;
ОплатаСБПОтменено = 0;
Форма.ОбщаяСуммаОплатыСБП = 0;
ОплатыСБП = РозничныеПродажиКлиентСерверЛокализация.СтрокиОплатыСБП(Форма.Объект.ОплатаПлатежнымиКартами);
Для Каждого СтрокаТЧ Из ОплатыСБП Цикл
Если Не Форма.СтатусОплатыСБПЧекаПродажи = ПредопределенноеЗначение("Перечисление.ТипыСтатусовОплатыСБП.ОжидаетПодтверждение") Тогда
Форма.ОбщаяСуммаОплатыСБП = Форма.ОбщаяСуммаОплатыСБП + СтрокаТЧ.Сумма;
КонецЕсли;
Если СтрокаТЧ.ОплатаОтменена Тогда
ОплатаСБПОтменено = ОплатаСБПОтменено + СтрокаТЧ.Сумма;
КонецЕсли;
КонецЦикла;
Форма.ОбщаяСуммаОплатыСБП = Мин(ИнформацияОбОплате.СуммаКОплате,Форма.ОбщаяСуммаОплатыСБП);
ИнформацияОбОплате.Вставить("СБП", Форма.ОбщаяСуммаОплатыСБП);
ИнформацияОбОплате.Вставить("СБПОтменено", ОплатаСБПОтменено);
ИтогоОплачено = ИнформацияОбОплате.ИтогоОплачено + ОплатаЭСФССОтменено + ОплатаСБПОтменено;
ИнформацияОбОплате.Вставить("ИтогоОплачено", ИтогоОплачено);
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧекаПослеЗаписиИзмененийЛокализация(ПараметрыОперацииФискализацииЧека)
ФорматноЛогическийКонтрольКлиентСервер.ПровестиФорматноЛогическийКонтроль(ПараметрыОперацииФискализацииЧека, ПараметрыКассыККМ.ИдентификаторУстройства);
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ПробитьЧекПослеПроведения", ЭтотОбъект, ПараметрыОперацииФискализацииЧека),
НСтр("ru = 'Перед выполнением операции пробития чека не удалось провести документ.'"));
Возврат;
УстановитьФискальныйСтатусПробит();
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
КонецПроцедуры
&НаСервере
Функция ПараметрыОперацииФискализацииЧекаНаСервереЛокализация()
ПараметрыОперацииФискализацииЧека = Новый Структура;
ПараметрыОперацииФискализацииЧека = ФормированиеПараметровФискальногоЧекаСервер.ПараметрыОперацииФискализацииЧека(Объект.Ссылка, Объект.Организация);
ПараметрыОперацииФискализацииЧека.Вставить("ВерсияФФД", ВерсияФФД);
ПараметрыОперацииФискализацииЧека.Вставить("ИдентификаторУстройства", ПараметрыКассыККМ.ИдентификаторУстройства);
ПараметрыОперацииФискализацииЧека.Вставить("ЭтоОплатаЭСФСС", ЭтоОплатаЭСФСС);
ФормированиеПараметровФискальногоЧекаСервер.ПараметрыФискальногоЧекаЗаполнитьТипРасчета(
ПараметрыОперацииФискализацииЧека,
Перечисления.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств);
ФормированиеПараметровФискальногоЧекаСервер.ПараметрыФискальногоЧекаЗаполнитьСерийныйНомерОборудования(
ПараметрыОперацииФискализацииЧека,
ПараметрыКассыККМ.СерийныйНомер);
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаМестоРасчетов(
ПараметрыОперацииФискализацииЧека,
Объект.Организация,
СтруктураСостояниеКассовойСмены.КассаККМ,
ПараметрыКассыККМ.ИдентификаторУстройства);
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаПозицийЧекаККМ(ПараметрыОперацииФискализацииЧека, Объект.Ссылка);
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаТаблицаОплатЧекаККМ(
ПараметрыОперацииФискализацииЧека,
ИнформацияОбОплате(ЭтотОбъект));
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаСертификатыФСС(
ПараметрыОперацииФискализацииЧека,
Объект.ОплатаПлатежнымиКартами);
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаСБП(
ПараметрыОперацииФискализацииЧека,
РозничныеПродажиКлиентСерверЛокализация.СтрокиОплатыСБП(Объект.ОплатаПлатежнымиКартами));
ФормированиеПараметровФискальногоЧекаСервер.ПараметрыФискальногоЧекаЗаполнитьПараметрыОтправкиЭлектронногоЧека(
ПараметрыОперацииФискализацииЧека,
ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека,
ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека);
Возврат ПараметрыОперацииФискализацииЧека;
КонецФункции
&НаКлиенте
Процедура УстановитьФискальныйСтатусПробит()
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит");
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
ПараметрыЗаписи.Вставить("РежимПроведения", РежимПроведенияДокумента.Оперативный);
Записать(ПараметрыЗаписи);
ТолькоПросмотр = Истина;
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'Функционал печати чека для документа не реализован. Обратитесь к разработчикам.'"));
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ИнформационнаяПанельЛокализация(Форма, ИнформацияОбОплате)
СуммаПоВидуОплатыСБП = ?(Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит"),
ИнформацияОбОплате.СБПОтменено, ИнформацияОбОплате.СБП);
Если СуммаПоВидуОплатыСБП > 0 Тогда
ОбщаяСуммаОплатыПлатежнымиКартамиИСБП = Мин(ИнформацияОбОплате.СуммаКОплате, Форма.ИнформационнаяПанельСуммаКВозвратуПлатежнымиКартами + СуммаПоВидуОплатыСБП);
Форма.ИнформационнаяПанельСуммаКВозвратуНаличными = ИнформацияОбОплате.СуммаКОплате - ОбщаяСуммаОплатыПлатежнымиКартамиИСБП;
КонецЕсли;
Форма.ИнформационнаяПанельСуммаКВозвратуСБП = СуммаПоВидуОплатыСБП;
КонецПроцедуры
&НаКлиенте
Процедура НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении)
Если Не ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
ПродолжитьВыполнение = РозничныеПродажиКлиентЛокализация.ПодтверждениеНоменклатурыНеподлежащейПродажеПоПатенту(ЭтотОбъект, ОповещениеОЗавершении);
Если Не ПродолжитьВыполнение Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, КодВозвратаДиалога.Да);
КонецПроцедуры
&НаКлиенте
Процедура НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ВыполнитьДействиеПослеЗаписи(
ДополнительныеПараметры.ОповещениеОЗавершении,
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПробитьЧекПослеПроведения(Проведен, ПараметрыОперацииФискализацииЧека) Экспорт
Если НЕ Проведен Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПробитьЧекЗавершение", ЭтотОбъект);
Результат = МенеджерОборудованияУТКлиент.ОборудованиеПодключено(ПараметрыКассыККМ.ИдентификаторУстройства);
Если Результат Или ПараметрыКассыККМ.ИспользоватьБезПодключенияОборудования Тогда
Если Не ПараметрыКассыККМ.ИспользоватьБезПодключенияОборудования Тогда
ПроверитьКодМаркировкиСредствамиККТ(ПараметрыОперацииФискализацииЧека);
Иначе
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОписаниеОповещения", ОписаниеОповещения);
РезультатВыполнения = Новый Структура;
РезультатВыполнения.Вставить("Результат", Истина);
ПечатьЧека_Завершение(
РезультатВыполнения,
ДополнительныеПараметры);
КонецЕсли;
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'Фискальное устройство не подключено. Чек не напечатан.'"));
ВыполнитьОбработкуОповещения(
ОписаниеОповещения,
Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны",
Ложь, Ложь));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧека_ПослеОткрытияЧека(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ПараметрыЛокализации = Новый Структура;
ПараметрыЛокализации.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
ПараметрыЛокализации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
ПараметрыЛокализации.Вставить("СтандартнаяОбработка", Истина);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПечатьЧека_ПослеОткрытияЧека", ПараметрыЛокализации);
Если ПараметрыЛокализации.СтандартнаяОбработка Тогда
ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОповещениеПродолжения, ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧека_ПослеОшибкиПечатиЧека(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ПараметрыЛокализации = Новый Структура;
ПараметрыЛокализации.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
ПараметрыЛокализации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
ПараметрыЛокализации.Вставить("СтандартнаяОбработка", Истина);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПечатьЧека_ПослеОшибкиПечатиЧека", ПараметрыЛокализации);
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(ЭтотОбъект.УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧека_Завершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
ИзмененныеДанныеЗаписаны = Ложь;
ВыполненаОперацияНаУстройстве = Ложь;
Если РезультатВыполнения.Результат Тогда
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит");
Если РезультатВыполнения.Свойство("НомерЧекаККТ") Тогда
Объект.НомерЧекаККМ = Число(РезультатВыполнения.НомерЧекаККТ);
КонецЕсли;
ДанныеДляЖурналаРегистрации = Новый Структура;
ДанныеДляЖурналаРегистрации.Вставить("Дата", Объект.Дата);
ДанныеДляЖурналаРегистрации.Вставить("Статус", Объект.Статус);
ПараметрыФискализации = Неопределено;
Если РезультатВыполнения.Свойство("ВыходныеПараметры")
И РезультатВыполнения.ВыходныеПараметры.Количество() > 1 Тогда
ДанныеДляЖурналаРегистрации.Вставить("НомерЧекаККМ", РезультатВыполнения.ВыходныеПараметры[1]);
Объект.НомерЧекаККМ = Число(ДанныеДляЖурналаРегистрации.НомерЧекаККМ);
Если РезультатВыполнения.ВыходныеПараметры.Количество() > 8 Тогда
ПараметрыФискализации = РезультатВыполнения.ВыходныеПараметры[8];
КонецЕсли;
КонецЕсли;
ВыполненаОперацияНаУстройстве = Истина;
Модифицированность = Истина;
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьФискальнуюОперациюНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи, ПараметрыФискализации);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметрыПовторЗаписи = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыПовторЗаписи.РеквизитыФискальнойОперацииКассовогоУзла = ПараметрыФискализации;
ДополнительныеПараметрыПовторЗаписи.ОписаниеОповещения = ДополнительныеПараметры.ОписаниеОповещения;
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения = НСтр("ru = 'После пробития чека на ФР не удалось сохранить документ.'");
ДополнительныеПараметрыПовторЗаписи.ВозвращатьРезультатФункции = Ложь;
ДополнительныеПараметрыПовторЗаписи.РезультатПриУспешномПроведении = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Истина);
ДополнительныеПараметрыПовторЗаписи.РезультатПриОтмене = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Ложь);
ДополнительныеПараметрыПовторЗаписи.ИмяПроцедуры = "ЗаписатьНаСервере";
ДополнительныеПараметрыПовторЗаписи.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыПовторЗаписи);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыПовторЗаписи),
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
КонецЕсли;
Иначе
РозничныеПродажиКлиент.СообщитьОбОшибкеПриПечатиЧека(ЭтотОбъект, РезультатВыполнения, Истина);
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(ЭтотОбъект.УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
ВыполнитьОбработкуОповещения(
ДополнительныеПараметры.ОписаниеОповещения,
Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны",
ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны));
КонецПроцедуры
&НаКлиенте
Процедура ПробитьЧекЗавершение(Результат, ДополнительныеПараметры) Экспорт
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Если Результат.ВыполненаОперацияНаУстройстве
И Результат.ИзмененныеДанныеЗаписаны Тогда
ТолькоПросмотр = Истина;
Если ЭтоОплатаЭСФСС Тогда
ТоварыФССКОплате = ТоварыФССКОплате();
ОтправитьПодтверждениеНСПКНаКлиенте(ТоварыФССКОплате);
КонецЕсли;
Иначе
Если Результат.ВыполненаОперацияНаУстройстве И Не Результат.ИзмененныеДанныеЗаписаны Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Данные", Объект.Ссылка);
ПараметрыФормы.Вставить("ДанныеДляЖурналаРегистрации", ДанныеДляЖурналаРегистрации);
ПараметрыФормы.Вставить("ТекстСообщения",
НСтр("ru = 'ВНИМАНИЕ! Произошла исключительная ситуация:
|Чек ККМ пробит, но не зафиксирован в системе.'"));
ОткрытьФорму("Документ.ЧекККМ.Форма.ОшибкаЗаписи", ПараметрыФормы, ЭтотОбъект);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКодМаркировкиСредствамиККТ(ПараметрыОперацииФискализацииЧека)
ПозицииЧека = ПараметрыОперацииФискализацииЧека.ПозицииЧека;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПараметрыОперацииФискализацииЧека", ПараметрыОперацииФискализацииЧека);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ПроверитьКодМаркировкиСредствамиККТЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ТекстКнопки = НСтр("ru = 'Пробить чек'");
РозничныеПродажиКлиент.ПроверитьКодМаркировкиСредствамиККТ(ПозицииЧека, ЭтотОбъект, ТекстКнопки, ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКодМаркировкиСредствамиККТЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если ШтрихкодированиеИСМПКлиент.РезультатПроверкиСредствамиККТТребуетФискализации(Результат)
И ТипЗнч(ДополнительныеПараметры) = Тип("Структура")
И ДополнительныеПараметры.Свойство("ПараметрыОперацииФискализацииЧека") Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ПробитьЧекЗавершение", ЭтотОбъект);
ПараметрыОперацииФискализацииЧека = ДополнительныеПараметры.ПараметрыОперацииФискализацииЧека;
РозничныеПродажиКлиентЛокализация.ОбновитьПараметрыФискальногоЧекаЗапросПроверкиКодаПозицийЧека(
ПараметрыОперацииФискализацииЧека,
Результат);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОписаниеОповещения", ОписаниеОповещения);
ДополнительныеПараметры.Вставить("ПараметрыОперацииФискализацииЧека", ПараметрыОперацииФискализацииЧека);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПробитьЧекПослеПроведения", ДополнительныеПараметры);
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ПечатьЧека_Завершение", ЭтотОбъект, ДополнительныеПараметры);
ОповещениеПослеОткрытииЧека = Новый ОписаниеОповещения("ПечатьЧека_ПослеОткрытияЧека", ЭтотОбъект, ДополнительныеПараметры);
ОповещениеПриОшибкеПечатиЧека = Новый ОписаниеОповещения("ПечатьЧека_ПослеОшибкиПечатиЧека", ЭтотОбъект, ДополнительныеПараметры);
ДополнительныеПараметры = МенеджерОборудованияКлиентСервер.ДополнительныеПараметрыОперации();
ДополнительныеПараметры.ОповещениеПослеОткрытииЧека = ОповещениеПослеОткрытииЧека;
ДополнительныеПараметры.ОповещениеПриОшибкеПечатиЧека = ОповещениеПриОшибкеПечатиЧека;
ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаНаФискальномУстройстве(
ОповещениеПриЗавершении,
УникальныйИдентификатор,
ПараметрыКассыККМ.ИдентификаторУстройства,
ПараметрыОперацииФискализацииЧека,
ДополнительныеПараметры);
Иначе
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(ЭтотОбъект.УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ЗаписатьФискальнуюОперациюНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи, РеквизитыФискальнойОперацииКассовогоУзла)
Результат = ЗаписатьФискальнуюОперациюНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, РеквизитыФискальнойОперацииКассовогоУзла);
Если Результат Тогда
Оповестить("Запись_ЧекККМВозврат", Новый Структура, Неопределено);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Функция ЭквайринговыйТерминалПоПодключенномуОборудованию(ИдентификаторУстройства)
РабочееМесто = МенеджерОборудованияВызовСервера.РабочееМестоКлиента();
Возврат Справочники.ЭквайринговыеТерминалы.ЭквайринговыйТерминалПоПодключенномуОборудованию(
РабочееМесто, ИдентификаторУстройства);
КонецФункции
&НаКлиенте
Процедура ОбработатьРезультатОплатыЭСФСС(Знач РезультатВыполнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт
Если РезультатВыполнения = Неопределено
ИЛИ РезультатВыполнения = "Отмена"
ИЛИ НЕ РезультатВыполнения.Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
Объект.ВыданоНаличными = ДополнительныеПараметры.ИнформацияОбОплате.Наличные;
Если РезультатВыполнения.Свойство("СуммаЭлектронногоСертификата")
И РезультатВыполнения.СуммаЭлектронногоСертификата > 0 Тогда
НомерСтрокиОплатыЭСФСС = Неопределено;
ОплатыЭСФСС = ОплатыЭСФСС(Объект.ОплатаПлатежнымиКартами);
Если ОплатыЭСФСС.Количество() > 0 Тогда
НомерСтрокиОплатыЭСФСС = ОплатыЭСФСС[0].НомерСтроки;
Объект.ОплатаПлатежнымиКартами[НомерСтрокиОплатыЭСФСС - 1].ОплатаОтменена = Истина;
КонецЕсли;
КонецЕсли;
Если РезультатВыполнения.Свойство("СуммаСобственныхСредств")
И РезультатВыполнения.СуммаСобственныхСредств > 0 Тогда
СтрокаПКНСПК = Объект.ОплатаПлатежнымиКартами.Добавить();
СтрокаПКНСПК.ЭквайринговыйТерминал = ЭквайринговыйТерминалПоПодключенномуОборудованию(РезультатВыполнения.ИдентификаторУстройства);
СтрокаПКНСПК.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта");
СтрокаПКНСПК.НомерПлатежнойКарты = РезультатВыполнения.НомерКарты;
СтрокаПКНСПК.СсылочныйНомер = РезультатВыполнения.СсылочныйНомер;
СтрокаПКНСПК.КодАвторизации = РезультатВыполнения.КодАвторизации;
СтрокаПКНСПК.НомерЧекаЭТ = РезультатВыполнения.НомерЧекаЭТ;
СтрокаПКНСПК.Сумма = РезультатВыполнения.СуммаСобственныхСредств;
СтрокаПКНСПК.ОплатаОтменена = Истина;
КонецЕсли;
Если РезультатВыполнения.Свойство("Наличными") И РезультатВыполнения.Наличными > 0 Тогда
Объект.ВыданоНаличными = РезультатВыполнения.Наличными;
КонецЕсли;
Объект.Партнер = РезультатВыполнения.ДанныеЭлектронногоЧека.Партнер;
ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = РезультатВыполнения.ДанныеЭлектронногоЧека.ВариантОтправкиЭлектронногоЧека;
ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = РезультатВыполнения.ДанныеЭлектронногоЧека.КонтактныеДанныеЭлектронногоЧека;
Модифицированность = Истина;
ПересчитатьДокументНаКлиенте();
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметрыЗавершение = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыЗавершение.ОписаниеОповещения = ДополнительныеПараметры.ОповещениеПриЗавершении;
ДополнительныеПараметрыЗавершение.ТекстСообщения = НСтр("ru = 'После выполнения операции отмены оплаты не удалось записать документ.'");
ДополнительныеПараметрыЗавершение.ВозвращатьРезультатФункции = Ложь;
ДополнительныеПараметрыЗавершение.РезультатПриУспешномПроведении = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Истина);
ДополнительныеПараметрыЗавершение.РезультатПриОтмене = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Ложь);
ДополнительныеПараметрыЗавершение.ИмяПроцедуры = "ЗаписатьНаСервере";
ДополнительныеПараметрыЗавершение.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыЗавершение);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыЗавершение),
ДополнительныеПараметрыЗавершение.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ОбработатьДобавлениеОплаты(Неопределено);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПараметрыПередачиДанныхФискальногоЧека(ДокументОснование, СуммаСертификатамиЭСФСС)
Возврат ЭлектронныеСертификатыНСПКУТ.ПараметрыПередачиДанныхФискальногоЧека(ДокументОснование, СуммаСертификатамиЭСФСС);
КонецФункции
&НаКлиенте
Процедура ОтправитьПодтверждениеНСПКНаКлиенте(ТоварыФССКОплате)
СуммаОплатыСертификатамиФСС = СуммаОплатыЭСФССПоДокументу(Объект.ОплатаПлатежнымиКартами);
ПараметрыОперации = ПараметрыПередачиДанныхФискальногоЧека(Объект.Ссылка, СуммаОплатыСертификатамиФСС);
Если ПараметрыОперации = Неопределено Тогда
ТекстСообщения = СтрШаблон(НСтр("ru = 'Отсутствуют данные о фискализации чека: %1'"), СокрЛП(Объект.Ссылка));
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
Иначе
ОповещениеМетода = Новый ОписаниеОповещения("ПередатьДанныеФискальногоЧекаНСПКЗавершение", ЭтотОбъект, ПараметрыОперации);
ЭлектронныеСертификатыНСПККлиент.НачатьПередачуДанныхФискальногоЧека(ОповещениеМетода, ПараметрыОперации);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередатьДанныеФискальногоЧекаНСПКЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
РезультатПередачи = Новый Структура("Результат, КодРезультата, ОписаниеОшибки", Ложь, 999, "");
ЗаполнитьЗначенияСвойств(РезультатПередачи, РезультатВыполнения);
Если Не РезультатПередачи.Результат Тогда
ТекстСообщения = СтрШаблон(
НСтр("ru = 'При отправке подтверждения операции %1 на сервер произошла ошибка (код %2):
|%3'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
ДополнительныеПараметры.ИдентификаторКорзины,
Строка(РезультатПередачи.КодРезультата),
РезультатПередачи.ОписаниеОшибки);
ДобавитьЗаписьПоНеотправленномуВНСПКФискальномуЧеку(Объект.Ссылка, ТекстСообщения);
РозничныеПродажиВызовСервера.ЗаписьВЖурналРегистрации(
ТекстСообщения, "ПередатьДанныеФискальногоЧекаНСПКЗавершение", Объект.Ссылка);
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ДобавитьЗаписьПоНеотправленномуВНСПКФискальномуЧеку(ЧекККМ, ТекстСообщения)
ЭлектронныеСертификатыНСПКУТ.ДобавитьЗаписьПоНеотправленномуВНСПКФискальномуЧеку(ЧекККМ, ТекстСообщения);
КонецПроцедуры
&НаКлиенте
Процедура ОплатаЭСФССОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ОбновитьСостояниеКассовойСмены();
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОткрытьФормуОплатыЭСФСС", ЭтотОбъект));
ОповещениеОЗавершении = Новый ОписаниеОповещения("НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЗавершение", ЭтотОбъект, ПараметрыОповещения);
НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуОплатыЭСФСС(ИзмененныеДанныеЗаписаны, ДополнительныеПараметры) Экспорт
Если Не ИзмененныеДанныеЗаписаны Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("ИнформацияОбОплате", ИнформацияОбОплате);
ПараметрыОткрытияФормы.Вставить("Организация", Объект.Организация);
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытияФормы.Вставить("ДоступнаПередачаДанных", ПараметрыКассыККМ.ДоступнаПередачаДанных);
ПараметрыОткрытияФормы.Вставить("ТоварныеПозиции", ТоварыФССКОплате());
ПараметрыОткрытияФормы.Вставить("ИдентификаторКорзины", ОплатыЭСФСС(Объект.ОплатаПлатежнымиКартами)[0].ИдентификаторКорзины);
ПараметрыОткрытияФормы.Вставить("СсылочныйНомер", ОплатыЭСФСС(Объект.ОплатаПлатежнымиКартами)[0].СсылочныйНомер);
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатОплатыЭСФСС", ЭтотОбъект, ПараметрыОткрытияФормы);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаОплатыЭСФСС",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
ОписаниеОповещения);
КонецПроцедуры
&НаСервере
Функция ТоварыФССКОплате()
Возврат ЧекККМВозвратЛокализация.ТоварыФССВДокументеКОплате(
Объект.Товары.Выгрузить(),
Объект.ЦенаВключаетНДС);
КонецФункции
&НаСервереБезКонтекста
Функция СуммаОплатыЭСФССПоДокументу(ЗНАЧ ОплатыПлатежнойКартой)
Возврат РозничныеПродажиЛокализация.СуммаОплатыЭСФССПоДокументу(ОплатыПлатежнойКартой.Выгрузить());
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ОплатыЭСФСС(ЗНАЧ ОплатаПлатежнымиКартами)
ОтборОплатыЭСФСС = Новый Структура("ВидОплаты", ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.СертификатНСПК"));
Возврат ОплатаПлатежнымиКартами.НайтиСтроки(ОтборОплатыЭСФСС);
КонецФункции
&НаКлиенте
Процедура ОплатаСБПОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ОбновитьСостояниеКассовойСмены();
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОткрытьФормуОплатыСБП", ЭтотОбъект));
ОповещениеОЗавершении = Новый ОписаниеОповещения("НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЗавершение", ЭтотОбъект, ПараметрыОповещения);
НачатьВыполнениеДополнительныхДействийПередВозвратомОплатыЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуОплатыСБП(ИзмененныеДанныеЗаписаны, ПараметрыЗавершения) Экспорт
Если Не ИзмененныеДанныеЗаписаны Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("ИнформацияОбОплате", ИнформацияОбОплате);
ПараметрыОткрытияФормы.Вставить("Организация", Объект.Организация);
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытияФормы.Вставить("ДатаВозврата", Объект.Дата);
ПараметрыОткрытияФормы.Вставить("Валюта", Объект.Валюта);
ПараметрыОткрытияФормы.Вставить("ДокументОплаты", Объект.ЧекККМ);
УказаноКОплатеНаличными = 0;
Если ПараметрыЗавершения <> Неопределено и ПараметрыЗавершения.Свойство("ПолученоНаличными") Тогда
УказаноКОплатеНаличными = ПараметрыЗавершения.ПолученоНаличными;
КонецЕсли;
ПараметрыОткрытияФормы.Вставить("ПолученоНаличными", УказаноКОплатеНаличными);
Если ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
Если Не (ИнформацияОбОплате.СБП = 0 И ИнформацияОбОплате.СБПОтменено = 0) Тогда
СтрокаОплатыСБП = РозничныеПродажиКлиентСерверЛокализация.СтрокиОплатыСБП(Объект.ОплатаПлатежнымиКартами)[0];
ПараметрыОткрытияФормы.Вставить("ДоговорПодключения", СтрокаОплатыСБП.ДоговорПодключения);
ПараметрыОткрытияФормы.Вставить("Магазин", СкладКассыККМ(Объект.КассаККМ));
ПараметрыОткрытияФормы.Вставить("СсылочныйНомер", СтрокаОплатыСБП.СсылочныйНомер);
КонецЕсли;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатВозвратаОплатыСБП", ЭтотОбъект, ПараметрыЗавершения);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаОплатыСБП",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
ОписаниеОповещения);
КонецПроцедуры
&НаСервере
Функция СкладКассыККМ(КассаККМ)
РеквизитСклада = "Склад";
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КассаККМ, РеквизитСклада);
КонецФункции
&НаКлиенте
Процедура ОбработатьРезультатВозвратаОплатыСБП(РезультатВыполнения, ПараметрыЗавершения) Экспорт
Если РезультатВыполнения = Неопределено
ИЛИ РезультатВыполнения = КодВозвратаДиалога.Отмена
ИЛИ НЕ РезультатВыполнения.Результат Тогда
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
Если РезультатВыполнения.Свойство("СуммаВозврата")
И РезультатВыполнения.СуммаВозврата > 0 Тогда
НомерСтрокиОплатыСБП = Неопределено;
ОплатыСБП = РозничныеПродажиКлиентСерверЛокализация.СтрокиОплатыСБП(Объект.ОплатаПлатежнымиКартами);
Если ОплатыСБП.Количество() > 0 Тогда
НомерСтрокиОплатыСБП = ОплатыСБП[0].НомерСтроки;
Объект.ОплатаПлатежнымиКартами[НомерСтрокиОплатыСБП - 1].ОплатаОтменена = Истина;
Объект.ОплатаПлатежнымиКартами[НомерСтрокиОплатыСБП - 1].Сумма = РезультатВыполнения.СуммаВозврата;
ИначеЕсли Не ЗначениеЗаполнено(Объект.ЧекККМ) Тогда
СтрокаСБП = Объект.ОплатаПлатежнымиКартами.Добавить();
СтрокаСБП.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.СистемаБыстрыхПлатежей");
СтрокаСБП.Сумма = РезультатВыполнения.СуммаВозврата;
СтрокаСБП.СсылочныйНомер = ИдентификаторыОперацииОплаты(РезультатВыполнения.НастройкаПодключения, Объект.Ссылка);
СтрокаСБП.ДоговорПодключения = РезультатВыполнения.ДоговорПодключения;
СтрокаСБП.ОплатаОтменена = Истина;
КонецЕсли;
КонецЕсли;
ПересчитатьДокументНаКлиенте();
ОбработатьДобавлениеОплаты(ПараметрыЗавершения);
КонецПроцедуры
&НаСервере
Функция ИдентификаторыОперацииОплаты(ТорговаяТочка, ДокументВозврата)
ИдентификаторОплаты = "";
Попытка
Если ЗначениеЗаполнено(ДокументВозврата) Тогда
ИдентификаторОплаты = ПереводыСБПc2b.ИдентификаторыОперацииОплаты(ДокументВозврата);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации(
НСтр("ru = 'ИдентификаторыОперацииОплаты'",
ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
Метаданные.РегистрыСведений.НастройкиИнтеграцииСПлатежнымиСистемамиУТ,
,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат ИдентификаторОплаты;
КонецФункции
#КонецОбласти