#Область ОписаниеПеременных
&НаКлиенте
Перем КэшированныеЗначения;
&НаКлиенте
Перем ТекущиеДанныеИдентификатор;
&НаКлиенте
Перем КэшКодовТРУ;
&НаКлиенте
Перем УИДЗамераПроверкаКодаМаркировкиСредствамиККТ;
&НаКлиенте
Перем УИДЗамераПечатьСлипЧека;
&НаКлиенте
Перем УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
ИспользоватьАвтоматическиеСкидкиВПродажах = ПолучитьФункциональнуюОпцию("ИспользоватьАвтоматическиеСкидкиВПродажах");
ИспользоватьРучныеСкидкиВПродажах = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВПродажах");
НазначатьСкидкиПоКнопкеРасчетВЧекеККМ = ПолучитьФункциональнуюОпцию("НазначатьСкидкиПоКнопкеРасчетВЧекеККМ");
ИспользоватьОплатуПлатежнымиКартами = ПолучитьФункциональнуюОпцию("ИспользоватьОплатуПлатежнымиКартами");
ИспользоватьПодарочныеСертификаты = ПолучитьФункциональнуюОпцию("ИспользоватьПодарочныеСертификаты");
ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
ИспользоватьНесколькоСкладов = ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоСкладов");
ИспользоватьКартыЛояльности = ПолучитьФункциональнуюОпцию("ИспользоватьКартыЛояльности");
ИспользуетсяЦенообразование25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25();
ДанныеФискальнойОперации = РозничныеПродажи.СтруктураДанныеФискальнойОперации();
КонтролироватьАссортимент = АссортиментСерверПовтИсп.КонтролироватьАссортимент(Объект.Склад, Объект.Дата);
ПоддерживаемыеТипыПодключаемогоОборудования = "СканерШтрихкода,
|ДисплейПокупателя,
|ФискальныйРегистратор,
|ЭквайринговыйТерминал,
|ЭлектронныеВесы,
|СчитывательМагнитныхКарт,
|ПринтерЧеков,
|ККТ";
ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование(ЭтотОбъект, "");
РозничныеПродажи.ЗаполнитьТаблицуОборудование(ЭтотОбъект, ПоддерживаемыеТипыПодключаемогоОборудования);
Если НЕ Справочники.КассыККМ.НастроенаКассаККМДляРМК() Тогда
Элементы.ГруппаНижняяКоманднаяПанельОплата.Доступность = Ложь;
ТекстСообщения = НСтр("ru='Для текущего рабочего места не указана Касса ККМ. Пробитие чека недоступно.'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
Если ИспользоватьПодключаемоеОборудование Тогда
ОборудованиеПодключено = МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам(
Неопределено,
Неопределено,
МенеджерОборудованияВызовСервера.РабочееМестоКлиента()).Количество() > 0;
ЗначениеОткрыватьФормуСПодключеннымОборудованием = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
"ЧекККМ", "ОткрыватьФормуСПодключеннымОборудованием");
Если ЗначениеОткрыватьФормуСПодключеннымОборудованием = Неопределено Тогда
ОткрыватьФормуСПодключеннымОборудованием = ОборудованиеПодключено;
Иначе
ОткрыватьФормуСПодключеннымОборудованием = ЗначениеОткрыватьФормуСПодключеннымОборудованием И ОборудованиеПодключено;
КонецЕсли;
КонецЕсли;
ОбновитьКэшИнформацияПоВскрытымУпаковкам();
УстановитьЗначенияПоНастройкам();
УстановитьВидимостьЭлементовФормы();
СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
РаботаСТабличнымиЧастями.ИнициализироватьКэшСтрок(Элементы.Товары);
ПриСозданииЧека();
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЗначениеЗаполнено(Объект.ВидЦены)
И НЕ ВидЦеныВключаетСуммаНДС(Объект.ВидЦены) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Вид цены, используемый для продажи в розницу, должен включать в цене НДС.'"));
ТолькоПросмотр = Истина;
Возврат;
КонецЕсли;
Если ИспользоватьПодключаемоеОборудование Тогда
Если ОткрыватьФормуСПодключеннымОборудованием Тогда
ПодключитьОбработчикОжидания("ОткрытьФормуПодключенноеОборудованиеОбработчикОжидания", 0.5, Истина);
Иначе
ПодключитьОбработчикОжидания("НачатьПодключениеОборудованияОбработчикОжидания", 0.1, Истина);
КонецЕсли;
КонецЕсли;
ПересчитатьДокументНаКлиенте();
Если ПринудительнаяАвторизация Тогда
ПодключитьОбработчикОжидания("ОткрытьОкноАвторизации", 0.5, Истина);
КонецЕсли;
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит") Тогда
Возврат;
КонецЕсли;
Если ПринудительноеЗавершениеРаботы Или ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
ПередЗакрытиемЧека(Отказ);
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии()
МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПриЗакрытииФормы(Неопределено, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если НоменклатураКлиент.ЭтоУказаниеСерий(ИсточникВыбора) Тогда
НоменклатураКлиент.ОбработатьУказаниеСерии(ЭтотОбъект, ПараметрыУказанияСерий, ВыбранноеЗначение);
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ВыбранноеЗначение.ИдентификаторТекущейСтроки);
ОбработатьСтрокуПриИзмененииСерии(ТекущаяСтрока);
ДополнительныеПараметры = Новый Структура;
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Товары", ДополнительныеПараметры);
Если ДополнительныеПараметры.Свойство("ТребуетсяСерверныйВызов") Тогда
КэшированныеЗначения.Вставить("СобытияФорм");
ТоварыПриОкончанииРедактированияНаСервере(Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор(), КэшированныеЗначения);
КонецЕсли;
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
КонецЕсли;
Если ИсточникВыбора.ИмяФормы = "Обработка.ПодборТоваровВДокументПродажи.Форма.Форма" Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение);
ПересчитатьДокументНаКлиенте();
ПодключитьОбработчикОжидания("УстановитьТекущийЭлементНаТабличнуюЧастьТовары", 0.1, Истина);
КонецЕсли;
Если ИсточникВыбора.ИмяФормы = "Документ.ЧекККМ.Форма.ВыборОтложенногоЧека" Тогда
ЗагрузитьНовыйЧек(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработкаОповещенияНаСервере(ИмяСобытия, Параметр, Источник)
ДополнительныеПараметры = Новый Структура("ИмяСобытия, Параметр, Источник", ИмяСобытия, Параметр, Источник);
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Событие", ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("КэшированныеЗначения", КэшированныеЗначения);
ДополнительныеПараметры.Вставить("СтандартнаяОбработка", Истина);
ДополнительныеПараметры.Вставить("ТребуетсяСерверныйВызов", Ложь);
СобытияФормКлиент.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник, ДополнительныеПараметры);
КэшированныеЗначения = ДополнительныеПараметры.КэшированныеЗначения;
Если ДополнительныеПараметры.ТребуетсяСерверныйВызов Тогда
ОбработкаОповещенияНаСервере(ИмяСобытия, Параметр, Источник);
КонецЕсли;
Если Не ДополнительныеПараметры.СтандартнаяОбработка Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
Если Источник = "ПодключаемоеОборудование" И ВводДоступен()
И Не ТолькоПросмотр Тогда
Если ИмяСобытия = "ScanData" И МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие() Тогда
ДанныеШтрихкодов = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр);
ОбработатьШтрихкоды(ДанныеШтрихкодов);
КонецЕсли;
КонецЕсли;
Если Источник = "ПодключаемоеОборудование"
И ИмяСобытия = "НеизвестныеШтрихкоды"
И Параметр.Свойство("ФормаВладелец")
И Параметр.ФормаВладелец = УникальныйИдентификатор
И Не ТолькоПросмотр Тогда
Если ЗначениеЗаполнено(КэшированныеЗначения) И КэшированныеЗначения.Свойство("Штрихкоды") Тогда
КэшированныеЗначения.Штрихкоды.Очистить();
КонецЕсли;
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ЭтотОбъект,"КодМаркировкиДляУточнения")
И ЗначениеЗаполнено(ОбщегоНазначенияКлиентСервер.ПолучитьРеквизитФормыПоПути(ЭтотОБъект, "КодМаркировкиДляУточнения")) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Есть код маркировки для уточнения. Автоматическое добавление новых позиций невозможно.'"));
Возврат;
КонецЕсли;
ДанныеШтрихкодов = Новый Массив;
Для Каждого ПолученныйШтрихкод Из Параметр.ПолученыНовыеШтрихкоды Цикл
ДанныеШтрихкодов.Добавить(ПолученныйШтрихкод);
КонецЦикла;
Для Каждого ПолученныйШтрихкод Из Параметр.ЗарегистрированныеШтрихкоды Цикл
ДанныеШтрихкодов.Добавить(ПолученныйШтрихкод);
КонецЦикла;
ОбработатьШтрихкоды(ДанныеШтрихкодов,, Истина);
КонецЕсли;
Если ИмяСобытия = "СчитанаКартаЛояльности"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
СчитанаКартаЛояльности(Параметр.КартаЛояльности);
КонецЕсли;
Если ИмяСобытия = "ПолученыСообщения"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
ПолученыСообщения(Параметр.Сообщения);
ПересчитатьДокументНаКлиенте();
КонецЕсли;
Если ИмяСобытия = "ВыбранБыстрыйТовар"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
ПараметрыТовара = ПодборТоваровКлиентСервер.ПараметрыТовара();
ЗаполнитьЗначенияСвойств(ПараметрыТовара, Параметр);
ПараметрыТовара.Продавец = ТекущийПродавец;
ПараметрыТовара.КоличествоУпаковок = Параметр.КоличествоУпаковок;
ПараметрыТовара.Цена = ПолучитьЦенуПоОтбору(ПараметрыТовара.Номенклатура, ПараметрыТовара.Характеристика, ПараметрыТовара.Серия, ПараметрыТовара.Упаковка);
ДобавитьВКорзину(ПараметрыТовара);
КонецЕсли;
Если ИмяСобытия = "АвторизованПользователь" Тогда
Если Параметр.Режим = "СменитьПрава" Тогда
НастроитьПраваДляПользователя(Параметр.Пользователь);
ПересчитатьДокументНаКлиенте();
ИначеЕсли Параметр.Режим = "ЗакрытьЧекККМ" Тогда
ПринудительноеЗавершениеРаботы = Истина;
Если Открыта() Тогда
Закрыть();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ИмяСобытия = "ЧтениеКомандФормы"
И Параметр.Форма = УникальныйИдентификатор Тогда
Оповестить("ЧтениеКомандФормы", Новый Структура("Форма, ФормаВладелец, АдресВоВременномХранилище", Параметр.ФормаВладелец, УникальныйИдентификатор, ПолучитьКомандыФормы(Параметр.ФормаВладелец)));
КонецЕсли;
Если ИмяСобытия = "Закрытие_РедактированиеКомплекта"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
ПриОкончанииРедактированияНабора(Параметр.АдресВоВременномХранилище);
ПересчитатьДокументНаКлиенте();
КонецЕсли;
Если ИмяСобытия = "РедактироватьНабор"
И Параметр.ФормаВладелец = УникальныйИдентификатор Тогда
ПараметрыКомплекта = Новый Структура;
ПараметрыКомплекта.Вставить("НоменклатураНабора", Параметр.НоменклатураНабора);
ПараметрыКомплекта.Вставить("ХарактеристикаНабора", Параметр.ХарактеристикаНабора);
ПараметрыКомплекта.Вставить("КолонкиНабора", КолонкиНабора(ЭтотОбъект));
АдресНабораВоВременномХранилище = АдресНабораВоВременномХранилище(ПараметрыКомплекта);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("АдресВоВременномХранилище", АдресНабораВоВременномХранилище);
ПараметрыОткрытия.Вставить("НоменклатураНабора", Параметр.НоменклатураНабора);
ПараметрыОткрытия.Вставить("ХарактеристикаНабора", Параметр.ХарактеристикаНабора);
ПараметрыОткрытия.Вставить("ЦенаВключаетНДС", Объект.ЦенаВключаетНДС);
ПараметрыОткрытия.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
ПараметрыОткрытия.Вставить("Валюта", Объект.Валюта);
ПараметрыОткрытия.Вставить("ВидЦены", Объект.ВидЦены);
ПараметрыОткрытия.Вставить("Дата", Объект.Дата);
ПараметрыОткрытия.Вставить("Ссылка", Объект.Ссылка);
ПараметрыОткрытия.Вставить("Склад", Объект.Склад);
ПараметрыОткрытия.Вставить("ЗапретРедактированияЦены", Истина);
ПараметрыОткрытия.Вставить("СкрыватьКомандуОстаткиНаСкладах", Ложь);
ПараметрыОткрытия.Вставить("Организация", Объект.Организация);
ОткрытьФорму("Обработка.РедактированиеНабора.Форма.Форма", ПараметрыОткрытия, ЭтотОбъект, УникальныйИдентификатор);
КонецЕсли;
Если ИмяСобытия = "ОборудованиеПодключено" Тогда
РозничныеПродажиКлиент.ОбработатьСобытиеОборудованиеПодключено(ЭтотОбъект, Параметр, Источник);
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 1, Истина);
КонецЕсли;
Если ИмяСобытия = "ИзмененоРабочееМестоТекущегоСеанса" Тогда
НастроитьРМК();
Если (НЕ ПараметрыКассыККМ.ИспользоватьБезПодключенияОборудования И Не ЗначениеЗаполнено(ПараметрыКассыККМ.ИдентификаторУстройства))
ИЛИ Не ЗначениеЗаполнено(ПараметрыКассыККМ.НастройкиРМК) Тогда
ПоказатьПредупреждение(
Новый ОписаниеОповещения("ОбработкаОповещенияИзмененоРабочееМестоТекущегоСеансаЗавершение", ЭтотОбъект, Новый Структура("ИмяСобытия, Параметр", ИмяСобытия, Параметр)),
НСтр("ru = 'Изменено рабочее место подключаемого оборудования. Для данного рабочего места не настроено оборудование.'"));
Возврат;
КонецЕсли;
КонецЕсли;
Если ИмяСобытия = "ИзменениеКассовойСмены" Тогда
СтруктураСостояниеКассовойСмены = РозничныеПродажиВызовСервера.СостояниеКассовойСмены(Объект.КассаККМ);
ЗаполнитьЗначенияСвойств(Объект, СтруктураСостояниеКассовойСмены,, "Кассир");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМ));
УстановитьВидимостьЭлементовСерий();
ПараметрыКассыККМ = Новый ФиксированнаяСтруктура(Справочники.КассыККМ.ПараметрыКассыККМ(Объект.КассаККМ));
ВерсияФФД = МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетВерсиюФФД(ПараметрыКассыККМ.ИдентификаторУстройства);
КонтролироватьАссортимент = АссортиментСерверПовтИсп.КонтролироватьАссортимент(Объект.Склад, Объект.Дата);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
СобытияФорм.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
СобытияФорм.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект, Отказ, ПараметрыЗаписи);
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(ТекущийОбъект, Документы.ЧекККМ));
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
Если НЕ ПараметрыЗаписи.Свойство("РежимТранзакции") ИЛИ НЕ ПараметрыЗаписи.РежимТранзакции Тогда
УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
СобытияФорм.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
ОбеспечениеВДокументахСервер.ПроверитьЗапуститьФоновоеЗаданиеРаспределенияЗапасов();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_ЧекККМ", ПараметрыЗаписи, Объект.Ссылка);
МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтотОбъект, ПараметрыЗаписи);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары
&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если НаборыКлиент.БлокируемыйЭлемент(Поле) Тогда
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ВыбраннаяСтрока);
Если ЗначениеЗаполнено(ТекущаяСтрока.НоменклатураНабора) Тогда
ПараметрОповещения = Новый Структура;
ПараметрОповещения.Вставить("НоменклатураНабора", ТекущаяСтрока.НоменклатураНабора);
ПараметрОповещения.Вставить("ХарактеристикаНабора", ТекущаяСтрока.ХарактеристикаНабора);
ПараметрОповещения.Вставить("ФормаВладелец", УникальныйИдентификатор);
Оповестить("РедактироватьНабор", ПараметрОповещения, ЭтотОбъект);
КонецЕсли;
ИначеЕсли Поле = Элементы.ТоварыНоменклатураНабора Тогда
ПоказатьЗначение(Неопределено, Элементы.Товары.ТекущиеДанные.НоменклатураНабора);
КонецЕсли;
Если Элементы.Найти("ТоварыРеквизитыРазрешенияНаПродажу") <> Неопределено
И Поле = Элементы.ТоварыРеквизитыРазрешенияНаПродажу Тогда
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ВыбраннаяСтрока);
Если ТекущаяСтрока.ПродаетсяПоРазрешению Тогда
СтруктураПоиска = Новый Структура("ИдентификаторСтроки", ТекущаяСтрока.ИдентификаторСтроки);
СтрокиРазрешенияНаПродажу = Объект.РазрешенияНаПродажу.НайтиСтроки(СтруктураПоиска);
ДанныеРазрешения = Новый Структура;
ДанныеРазрешения.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
ДанныеРазрешения.Вставить("ИдентификаторСтроки", ТекущаяСтрока.ИдентификаторСтроки);
Если СтрокиРазрешенияНаПродажу.Количество() Тогда
ДанныеРазрешения.Вставить("ТипДокумента", СтрокиРазрешенияНаПродажу[0].ТипДокумента);
ДанныеРазрешения.Вставить("НомерДокумента", СтрокиРазрешенияНаПродажу[0].НомерДокумента);
ДанныеРазрешения.Вставить("ДатаДокумента", СтрокиРазрешенияНаПродажу[0].ДатаДокумента);
КонецЕсли;
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаРазрешениеНаПродажу",
ДанныеРазрешения,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ОткрытьФормуУказанияДокументаОтпускаПрепаратаЗавершение", ЭтотОбъект),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецЕсли;
ОтменитьИзменениеВПравахРедактированияКоличестваЛокализация();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриАктивизацииЯчейки(Элемент)
СобытияФормКлиент.ПриАктивизацииЯчейки(ЭтотОбъект, Элемент);
Если Элемент.ТекущийЭлемент = Элементы.ТоварыКоличествоУпаковок Тогда
АктивированаКолонкаКоличество = Истина;
Иначе
АктивированаКолонкаКоличество = Ложь;
КонецЕсли;
Если Не Элемент.ТекущийЭлемент = Элементы.ТоварыШтрихкод Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Элементы.ТоварыШтрихкод.СписокВыбора.Очистить();
Возврат;
КонецЕсли;
Структура = Новый Структура;
Структура.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
Структура.Вставить("Характеристика", ТекущиеДанные.Характеристика);
Структура.Вставить("Упаковка", ТекущиеДанные.Упаковка);
Элементы.ТоварыШтрихкод.СписокВыбора.ЗагрузитьЗначения(РозничныеПродажиВызовСервера.ПолучитьШтрихкодыНоменклатуры(Структура));
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
Если ПринудительноеЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
ОтменитьИзменениеВПравахРедактированияКоличестваЛокализация();
КонтрольКодовТРУ(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
Если Копирование Тогда
НаборыКлиент.ПередУдалениемСтрокиТабличнойЧасти(ЭтотОбъект, "Товары", Отказ, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
КонтрольКодовТРУ();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(
Элемент,
КэшированныеЗначения,
ПараметрыУказанияСерий,
Копирование);
Если Копирование Тогда
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ЗначениеЗаполнено(ТекущиеДанные.ИдентификаторСтроки) Тогда
ТекущиеДанные.ИдентификаторСтроки = Строка(Новый УникальныйИдентификатор);
КонецЕсли;
КонецЕсли;
НастроитьПравоРедактированияКоличестваЛокализация();
ОбработатьПопыткуИзмененияКоличестваЛокализация();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ПересчитатьДокументНаКлиенте();
ДополнительныеПараметры = Новый Структура;
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Товары", ДополнительныеПараметры);
Если ДополнительныеПараметры.Свойство("ТребуетсяСерверныйВызов") Тогда
КэшированныеЗначения.Вставить("СобытияФорм");
КонецЕсли;
Если НоменклатураКлиент.НеобходимоОбновитьСтатусыСерий(Элемент, КэшированныеЗначения, ПараметрыУказанияСерий) Тогда
КэшированныеЗначения.Вставить("НеобходимоОбновитьСтатусыСерий");
ДополнительныеПараметры.Вставить("ТребуетсяСерверныйВызов");
КонецЕсли;
ТоварыПриОкончанииРедактированияЛокализация(
Элемент, НоваяСтрока, ОтменаРедактирования, КэшированныеЗначения, ДополнительныеПараметры);
Если ДополнительныеПараметры.Свойство("ТребуетсяСерверныйВызов") Тогда
ПодключитьОбработчикОжидания("ТоварыПриОкончанииРедактированияДляСерверногоВызова", 0.1, Истина);
КонецЕсли;
ОтменитьИзменениеВПравахРедактированияКоличестваЛокализация();
КонтрольКодовТРУ();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактированияДляСерверногоВызова()
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТипЗнч(КэшированныеЗначения) = Тип("Структура") И КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
ТекущаяСтрокаИдентификатор = ТекущиеДанные.ПолучитьИдентификатор();
КонецЕсли;
ТоварыПриОкончанииРедактированияНаСервере(ТекущаяСтрокаИдентификатор, КэшированныеЗначения);
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
Если ТипЗнч(КэшированныеЗначения) = Тип("Структура") И КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(Элементы.Товары, КэшированныеЗначения, ПараметрыУказанияСерий);
КэшированныеЗначения.Удалить("НеобходимоОбновитьСтатусыСерий");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ТоварыПриОкончанииРедактированияНаСервере(ИдентификаторСтроки, КэшированныеЗначения)
Если НЕ ТипЗнч(КэшированныеЗначения) = Тип("Структура") Тогда
Возврат;
КонецЕсли;
Если КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
ЗаполнитьСтатусыУказанияСерийПриОкончанииРедактированияСтрокиТЧ(ИдентификаторСтроки, КэшированныеЗначения);
КонецЕсли;
Если КэшированныеЗначения.Свойство("СобытияФорм") Тогда
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
КэшированныеЗначения.Удалить("СобытияФорм");
КонецЕсли;
ТоварыПриОкончанииРедактированияНаСервереЛокализация(ИдентификаторСтроки, КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПередУдалением(Элемент, Отказ)
Если Не ПраваДоступа.КорректировкаСтрок Тогда
Отказ = Истина;
КонецЕсли;
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(
Элемент,
КэшированныеЗначения,
ПараметрыУказанияСерий);
НаборыКлиент.ПередУдалениемСтрокиТабличнойЧасти(ЭтотОбъект, "Товары", Отказ);
ДополнительныеРеквизиты = Новый Структура("ПередУдалением");
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Товары", ДополнительныеРеквизиты);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПослеУдаления(Элемент)
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
ДополнительныеРеквизиты = Новый Структура("ТребуетсяСерверныйВызов, ПослеУдаления", Ложь);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Товары", ДополнительныеРеквизиты);
Если ТипЗнч(КэшированныеЗначения) = Тип("Структура")
И ДополнительныеРеквизиты.ТребуетсяСерверныйВызов Тогда
КэшированныеЗначения.Вставить("СобытияФорм");
КонецЕсли;
Если НоменклатураКлиент.НеобходимоОбновитьСтатусыСерий(Элемент, КэшированныеЗначения, ПараметрыУказанияСерий, Истина) Тогда
ДополнительныеРеквизиты.ТребуетсяСерверныйВызов = Истина;
Если ТипЗнч(КэшированныеЗначения) = Тип("Структура") Тогда
КэшированныеЗначения.Вставить("НеобходимоОбновитьСтатусыСерий");
КонецЕсли;
КонецЕсли;
Если ДополнительныеРеквизиты.ТребуетсяСерверныйВызов Тогда
ТоварыПриОкончанииРедактированияНаСервере(Неопределено, КэшированныеЗначения);
КонецЕсли;
Если ТипЗнч(КэшированныеЗначения) = Тип("Структура")
И КэшированныеЗначения.Свойство("НеобходимоОбновитьСтатусыСерий") Тогда
НоменклатураКлиент.ОбновитьКешированныеЗначенияДляУчетаСерий(Элементы.Товары, КэшированныеЗначения, ПараметрыУказанияСерий);
КэшированныеЗначения.Удалить("НеобходимоОбновитьСтатусыСерий");
КонецЕсли;
КонтрольКодовТРУ();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
ТоварыНоменклатураПриИзмененииСервер(ИдентификаторТекущейСтроки);
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
КонтрольКодовТРУ();
КонецПроцедуры
&НаСервере
Процедура ТоварыНоменклатураПриИзмененииСервер(ИдентификаторТекущейСтроки)
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
Если КонтролироватьАссортимент Тогда
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
ИначеЕсли ИспользуетсяЦенообразование25 Тогда
СтруктураДействий.Вставить("ЗаполнитьУсловияРозничныхПродаж", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийРозничныхПродажВСтрокеТЧ(Объект, ОбъектХраненияУсловийПродаж));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
Если ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата) Тогда
СтруктураДействий.Вставить("ЗаполнитьПомещение", Новый Структура("Склад, Номенклатура, Характеристика", Объект.Склад, ТекущаяСтрока.Номенклатура, ТекущаяСтрока.Характеристика));
КонецЕсли;
СтруктураДействий.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
Если КонтролироватьАссортимент Тогда
СтруктураПроверкиАссортимента = АссортиментКлиентСервер.ПараметрыПроверкиАссортимента();
СтруктураПроверкиАссортимента.Ссылка = Объект.Ссылка;
СтруктураПроверкиАссортимента.Склад = Объект.Склад;
СтруктураПроверкиАссортимента.Дата = Объект.Дата;
СтруктураПроверкиАссортимента.ТекстСообщения = НСтр("ru = 'Товар %1 не включен в ассортимент магазина или запрещен к продаже.'");
СтруктураПроверкиАссортимента.ИмяРесурсаАссортимента = "РазрешеныПродажи";
СтруктураПроверкиАссортимента.ПровереноМожноДобавлять = Истина;
СтруктураПроверкиАссортимента.РазрешатьДобавление = Ложь;
СтруктураДействий.Вставить("ПроверитьАссортиментСтроки", СтруктураПроверкиАссортимента);
КонецЕсли;
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
Если НЕ ПодбиратьКодыМаркировкиВскрытыхПотребительскихУпаковокПоFIFOЛокализация() Тогда
ОбработатьВскрытыеПотребительскиеУпаковкиПоТаблицеТоваровЛокализация(Объект.Товары.Выгрузить());
КонецЕсли;
РозничныеПродажиЛокализация.ОбновитьСтатусИРазрешенниеНаПродажу(ТекущаяСтрока, Объект);
РозничныеПродажиЛокализация.УдалитьРазрешениеНаПродажуБезСвязанногоТовара(ТекущаяСтрока, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыХарактеристикаПриИзменении(Элемент)
ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
ТоварыХарактеристикаПриИзмененииСервер(ИдентификаторТекущейСтроки);
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаСервере
Процедура ТоварыХарактеристикаПриИзмененииСервер(ИдентификаторТекущейСтроки)
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);
СтруктураДействий = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
ИначеЕсли ИспользуетсяЦенообразование25 Тогда
СтруктураДействий.Вставить("ЗаполнитьУсловияРозничныхПродаж", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийРозничныхПродажВСтрокеТЧ(Объект, ОбъектХраненияУсловийПродаж));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействий.Вставить("ПересчитатьСумму");
Если ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата) Тогда
СтруктураДействий.Вставить("ЗаполнитьПомещение", Новый Структура("Склад, Номенклатура, Характеристика", Объект.Склад, ТекущаяСтрока.Номенклатура, ТекущаяСтрока.Характеристика));
КонецЕсли;
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ХарактеристикаПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Характеристика", СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
Если ЗначениеЗаполнено(Объект.ВидЦены) Тогда
Если КонтролироватьАссортимент Тогда
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
ИначеЕсли ИспользуетсяЦенообразование25 Тогда
СтруктураДействий.Вставить("ЗаполнитьУсловияРозничныхПродаж", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийРозничныхПродажВСтрокеТЧ(Объект, ОбъектХраненияУсловийПродаж));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
КонецЕсли;
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий,Объект);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСерияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОткрытьПодборСерий(Элемент.ТекстРедактирования);
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСерияПриИзменении(Элемент)
ВыбранноеЗначение = НоменклатураКлиентСервер.ВыбраннаяСерия();
ВыбранноеЗначение.Значение = Элементы.Товары.ТекущиеДанные.Серия;
ВыбранноеЗначение.ИдентификаторТекущейСтроки = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
НоменклатураКлиент.ОбработатьУказаниеСерии(ЭтотОбъект, ПараметрыУказанияСерий, ВыбранноеЗначение);
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ОбработатьСтрокуПриИзмененииСерии(ТекущиеДанные);
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПроцентРучнойСкидкиПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСуммуРучнойСкидки");
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыСуммаРучнойСкидкиПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьПроцентРучнойСкидки");
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать, ПересчитыватьСуммуРучнойСкидки", Ложь, Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПомещениеПриИзменении(Элемент)
РозничныеПродажиКлиент.ОбновитьПомещениеВСтрокахТабличнойЧастиСерии(ЭтотОбъект, Элементы.Товары.ТекущиеДанные, КэшированныеСтроки[Элементы.Товары.Имя].Помещение);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовФормы
&НаКлиенте
Процедура ИнформационнаяПанельПрочиеПараметрыЗначениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если НавигационнаяСсылкаФорматированнойСтроки = "ПродавецЗначениеНеЗаполнено"
Или НавигационнаяСсылкаФорматированнойСтроки = "Продавец" Тогда
ОткрытьФорму(
"Справочник.Пользователи.ФормаВыбора",
Новый Структура("РежимВыбора", Истина),,,,,
Новый ОписаниеОповещения("ИзменитьПродавцаГиперссылкаЗавершение", ЭтотОбъект), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
Если НавигационнаяСсылкаФорматированнойСтроки = "ПомещениеЗначениеНеЗаполнено"
Или НавигационнаяСсылкаФорматированнойСтроки = "Помещение" Тогда
ИзменитьПомещение(Неопределено);
КонецЕсли;
Если НавигационнаяСсылкаФорматированнойСтроки = "Карта" Тогда
ПоказатьЗначение(,Объект.КартаЛояльности);
КонецЕсли;
Если НавигационнаяСсылкаФорматированнойСтроки = "Сообщения" Тогда
СкидкиНаценкиЗаполнениеКлиент.ОткрытьФормуСообщений(СтруктураСообщений, ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИнформационнаяПанельРасчетСуммыОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Если НавигационнаяСсылкаФорматированнойСтроки = "РучнаяСкидка" Тогда
ОткрытьФормуНазначенияРучныхСкидок();
КонецЕсли;
Если НавигационнаяСсылкаФорматированнойСтроки = "АвтоматическаяСкидка" Тогда
Если Не Объект.СкидкиРассчитаны Тогда
ПоказатьВопрос(
Новый ОписаниеОповещения("ОткрытьИнформациюОСкидкахЗавершение", ЭтотОбъект),
НСтр("ru = 'Скидки (наценки) не рассчитаны, рассчитать?'"), РежимДиалогаВопрос.ДаНет);
Иначе
ОткрытьИнформациюОСкидкахФрагмент();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИнформационнаяПанельОшибкаПриПечатиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если НавигационнаяСсылкаФорматированнойСтроки = "ПоказатьПолностьюОшибкуПриПечатиЧека" Тогда
ПоказатьЗначение(Неопределено, ИнформационнаяПанельОшибкаПриПечатиЧекаТекст);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура НазначитьАвтоматическиеСкидки(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Если НЕ ОпределятьПринадлежностьТовараИСтавкуНДСПриПодборе
И ИспользоватьКомиссиюПриЗакупках
И НЕ Объект.СкидкиРассчитаны Тогда
ОпределятьПринадлежностьТовараИСтавкуНДСПередОплатойЛокализация();
КонецЕсли;
Объект.ФормаОплаты = ПредопределенноеЗначение("Перечисление.ФормыОплаты.ПустаяСсылка");
Оповещение = Новый ОписаниеОповещения("НазначитьАвтоматическиеСкидкиЗавершение", ЭтотОбъект);
Если ПараметрыПримененияСкидок.НазначеныУправляемыеСкидки Тогда
СкидкиНаценкиЗаполнениеКлиент.ОткрытьФормуНазначенияУправляемыхСкидокНаценок(
ВыполнитьПредварительныйРасчетСкидокНаСервере(),
Оповещение);
Иначе
ВыполнитьОбработкуОповещения(Оповещение, УправляемыеСкидки);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НапечататьПоследнийСлипЧек(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
СтрокаСлипЧека = "";
Если Не МенеджерОборудованияКлиент.ПодключаемоеОборудование().Свойство("ПоследнийСлипЧек", СтрокаСлипЧека)
Или ТипЗнч(СтрокаСлипЧека) <> Тип("Строка")
Или ПустаяСтрока(СтрокаСлипЧека) Тогда
ТекстСообщения =
НСтр("ru='Слип-чек отсутствует.
|Возможно для данного сеанса еще не выполнялась эквайринговая операция.'");
РозничныеПродажиВызовСервера.ЗаписьВЖурналРегистрации(
ТекстСообщения, "НапечататьПоследнийСлипЧек", Объект.Ссылка);
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
Возврат;
КонецЕсли;
ОборудованиеПодключено = МенеджерОборудованияУТКлиент.ОборудованиеПодключено(ПараметрыКассыККМ.ИдентификаторУстройства);
Если ОборудованиеПодключено Тогда
УИДЗамераПечатьСлипЧека = ОценкаПроизводительностиКлиент.ЗамерВремени("Документ.ЧекККМ.Форма.ФормаДокументаРМК.НапечататьПоследнийСлипЧек");
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияПечатиСлипЧека", ЭтотОбъект);
ПараметрыОперации = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПечатиТекста(СтрокаСлипЧека);
ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьПечатьТекста(
ОповещениеПриЗавершении,
УникальныйИдентификатор,
ПараметрыКассыККМ.ИдентификаторУстройства,
ПараметрыОперации);
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'Фискальное устройство не подключено.'"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВозвратТовараБезЧека(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОбработкаОповещения = Новый ОписаниеОповещения("ВозвратТовараБезЧекаОбработкаОповещения", ЭтотОбъект);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(ЭтотОбъект, ОбработкаОповещения);
КонецПроцедуры
&НаКлиенте
Процедура НовыйЧек(Команда)
ЗагрузитьНовыйЧек();
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьИнформациюОСкидках(Команда)
Если Не Объект.СкидкиРассчитаны Тогда
ПоказатьВопрос(
Новый ОписаниеОповещения("ОткрытьИнформациюОСкидкахЗавершение", ЭтотОбъект),
НСтр("ru = 'Скидки (наценки) не рассчитаны, рассчитать?'"), РежимДиалогаВопрос.ДаНет);
Иначе
ОткрытьИнформациюОСкидкахФрагмент();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоискПоШтрихкодуВыполнить(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Оповещение = Новый ОписаниеОповещения("ПоискПоШтрихкодуЗавершение", ЭтотОбъект);
ШтрихкодированиеНоменклатурыКлиент.ПоказатьВводШтрихкода(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСообщения(Команда)
СкидкиНаценкиЗаполнениеКлиент.ОткрытьФормуСообщений(СтруктураСообщений(), ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьВес(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ТекущаяСтрока = МенеджерОборудованияУТКлиент.ТекущаяСтрока(ЭтотОбъект);
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
МенеджерОборудованияКлиент.НачатьПолученияВесаСЭлектронныхВесов(
Новый ОписаниеОповещения("ПолучитьВесЗавершение", ЭтотОбъект, ТекущаяСтрока),
УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура СчитатьКартуЛояльности(Команда)
Если ТолькоПросмотр Тогда
Возврат;
КонецЕсли;
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Организация", Объект.Организация);
ПараметрыОткрытия.Вставить("НеИспользоватьРучнойВвод", Не ПраваДоступа.ИзменениеКартЛояльности);
ПараметрыОткрытия.Вставить("НеПодключатьОборудование", Истина);
ОткрытьФорму(
"Справочник.КартыЛояльности.Форма.СчитываниеКартыЛояльности",
ПараметрыОткрытия,
ЭтотОбъект,
УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура УказатьСерии(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
ОткрытьПодборСерий();
КонецПроцедуры
&НаКлиенте
Процедура ВыбранБыстрыйТовар(Команда)
НайденныеСтроки = БыстрыеТовары.НайтиСтроки(Новый Структура("ИмяКоманды", Команда.Имя));
ПараметрыОповещения = Новый Структура();
ПараметрыОповещения.Вставить("Номенклатура", НайденныеСтроки[0].Номенклатура);
ПараметрыОповещения.Вставить("Характеристика", НайденныеСтроки[0].Характеристика);
ПараметрыОповещения.Вставить("Серия", ПредопределенноеЗначение("Справочник.СерииНоменклатуры.ПустаяСсылка"));
ПараметрыОповещения.Вставить("Упаковка", НайденныеСтроки[0].Упаковка);
ПараметрыОповещения.Вставить("ТипНоменклатуры", НайденныеСтроки[0].ТипНоменклатуры);
ПараметрыОповещения.Вставить("КоличествоУпаковок", 1);
ПараметрыОповещения.Вставить("ФормаВладелец", УникальныйИдентификатор);
Если НайденныеСтроки.Количество() > 0 Тогда
Оповестить("ВыбранБыстрыйТовар", ПараметрыОповещения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура БыстрыеТовары(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОткрытьФорму("Документ.ЧекККМ.Форма.БыстрыеТовары", Новый Структура("ГорячиеКлавиши", ГорячиеКлавиши), ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ВозвратТовара(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОбработкаОповещения = Новый ОписаниеОповещения("ВозвратТовараОбработкаОповещения", ЭтотОбъект);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(ЭтотОбъект, ОбработкаОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПомещение(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Если Элементы.Товары.ВыделенныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ВыделенныеСтроки[0]);
Отбор = Новый Структура("Владелец", Объект.Склад);
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("РежимВыбора", Истина);
ПараметрыОткрытия.Вставить("Отбор", Отбор);
ПараметрыОткрытия.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
ПараметрыОткрытия.Вставить("Характеристика", СтрокаТЧ.Характеристика);
ОткрытьФорму(
"Справочник.СкладскиеПомещения.Форма.ФормаВыбораСОстатками",
ПараметрыОткрытия,,,,,
Новый ОписаниеОповещения("ИзменитьПомещениеЗавершение", ЭтотОбъект, Новый Структура("СтрокаТЧ", СтрокаТЧ)),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПродавца(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ВыборПродавца",,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ИзменитьПродавцаЗавершение", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура СоставНабора(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяСтрока = Элементы.Товары.ТекущаяСтрока;
Если ВыбраннаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ВыбраннаяСтрока);
Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.НоменклатураНабора) Тогда
ПоказатьПредупреждение(,НСтр("ru = 'Открытие состава набора возможно только для набора.'"));
Возврат;
КонецЕсли;
ПараметрыКомплекта = Новый Структура;
ПараметрыКомплекта.Вставить("НоменклатураНабора", ТекущаяСтрока.НоменклатураНабора);
ПараметрыКомплекта.Вставить("ХарактеристикаНабора", ТекущаяСтрока.ХарактеристикаНабора);
ПараметрыКомплекта.Вставить("КолонкиНабора", КолонкиНабора(ЭтотОбъект));
АдресНабораВоВременномХранилище = АдресНабораВоВременномХранилище(ПараметрыКомплекта);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("АдресВоВременномХранилище", АдресНабораВоВременномХранилище);
ПараметрыОткрытия.Вставить("НоменклатураНабора", ТекущаяСтрока.НоменклатураНабора);
ПараметрыОткрытия.Вставить("ХарактеристикаНабора", ТекущаяСтрока.ХарактеристикаНабора);
ПараметрыОткрытия.Вставить("ЦенаВключаетНДС", Объект.ЦенаВключаетНДС);
ПараметрыОткрытия.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
ПараметрыОткрытия.Вставить("Валюта", Объект.Валюта);
ПараметрыОткрытия.Вставить("ВидЦены", Объект.ВидЦены);
ПараметрыОткрытия.Вставить("Дата", Объект.Дата);
ПараметрыОткрытия.Вставить("Ссылка", Объект.Ссылка);
ПараметрыОткрытия.Вставить("Склад", Объект.Склад);
ПараметрыОткрытия.Вставить("ЗапретРедактированияЦены", Истина);
ПараметрыОткрытия.Вставить("СкрыватьКомандуОстаткиНаСкладах", Ложь);
ПараметрыОткрытия.Вставить("Организация", Объект.Организация);
ОткрытьФорму("Обработка.РедактированиеНабора.Форма.Форма", ПараметрыОткрытия, ЭтотОбъект, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПодключенноеОборудование(Команда)
РозничныеПродажиКлиент.ОткрытьФормуПодключенноеОборудование(ЭтотОбъект, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьМенюОперацииСККМ(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытияФормы.Вставить("Кассир", Объект.Кассир);
ПараметрыОткрытияФормы.Вставить("ИзменитьКассуККМ", Истина);
ОткрытьФорму("Документ.ЧекККМ.Форма.МенюОперацииСККМ", ПараметрыОткрытияФормы, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьМенюПрочихОпераций(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытияФормы.Вставить("Кассир", Объект.Кассир);
ПараметрыОткрытияФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр);
ПараметрыОткрытияФормы.Вставить("Документ", Объект.Ссылка);
ПараметрыОткрытияФормы.Вставить("Организация", Объект.Организация);
ПараметрыОткрытияФормы.Вставить("ПроверитьКоличествоВДокументе", Истина);
ПараметрыОткрытияФормы.Вставить("ПродажаПодарочногоСертификата", ИспользоватьПодарочныеСертификаты);
ПараметрыОткрытияФормы.Вставить("ВозвратПодарочногоСертификата", ИспользоватьПодарочныеСертификаты);
ПараметрыОткрытияФормы.Вставить("Заблокировать", ПринудительнаяАвторизация);
ПараметрыОткрытияФормы.Вставить("АдресКомандПечатиВоВременномХранилище", АдресКомандПечатиВоВременномХранилище);
ОткрытьФорму("Документ.ЧекККМ.Форма.МенюПрочиеОперации", ПараметрыОткрытияФормы, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьПодарочнымСертификатом(Команда)
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяФормаОплаты = СтруктураФормыОплаты();
ВыбраннаяФормаОплаты.Вставить("ПодарочныеСертификаты", Истина);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОплатитьПодарочнымСертификатомОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьПлатежнойКартой(Команда)
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяФормаОплаты = СтруктураФормыОплаты();
ВыбраннаяФормаОплаты.Вставить("ПлатежныеКарты", Истина);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОплатитьПлатежнойКартойОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура СмешаннаяОплата(Команда)
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("СмешаннаяОплатаОбработкаОповещения", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьНаличными(Команда)
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяФормаОплаты = СтруктураФормыОплаты();
ВыбраннаяФормаОплаты.Вставить("Наличные", Истина);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОплатитьНаличнымиОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПодбор(Команда)
ОценкаПроизводительностиКлиент.ЗамерВремени("Документ.ЧекККМ.ФормаДокументаРМК.Команда.ОткрытьПодбор");
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ПараметрЗаголовок = НСтр("ru = 'Подбор товаров в %Документ%'");
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПараметрЗаголовок = СтрЗаменить(ПараметрЗаголовок, "%Документ%", Объект.Ссылка);
Иначе
ПараметрЗаголовок = СтрЗаменить(ПараметрЗаголовок, "%Документ%", НСтр("ru='чек ККМ'"));
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ВидЦены", Объект.ВидЦены);
ПараметрыФормы.Вставить("РежимПодбораБезСоглашенийСКлиентами", Истина);
ПараметрыФормы.Вставить("ВариантАнализаНоменклатурыПродаваемойСовместно", ПредопределенноеЗначение("Перечисление.ВариантыАнализаНоменклатурыПродаваемойСовместно.РозничнаяТорговля"));
ПараметрыФормы.Вставить("РежимОтбораПоАссортименту", КонтролироватьАссортимент);
Если ИспользуетсяЦенообразование25 Тогда
ПараметрыФормы.Вставить("РежимОтбораДляРозничныхПродаж", Истина);
КонецЕсли;
ПараметрыФормы.Вставить("ЦенаВключаетНДС", Объект.ЦенаВключаетНДС);
ПараметрыФормы.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
ПараметрыФормы.Вставить("РежимПодбораИспользоватьСкладыВТабличнойЧасти", Ложь);
ПараметрыФормы.Вставить("ИспользоватьДатыОтгрузки", Ложь);
ПараметрыФормы.Вставить("Склад", Объект.Склад);
ПараметрыФормы.Вставить("Валюта", Объект.Валюта);
ПараметрыФормы.Вставить("Заголовок", ПараметрЗаголовок);
ПараметрыФормы.Вставить("Дата", Объект.Дата);
ПараметрыФормы.Вставить("Документ", Объект.Ссылка);
ПараметрыФормы.Вставить("СкрыватьКолонкуВидЦены", Истина);
ПараметрыФормы.Вставить("ПараметрыУказанияСерий", ПараметрыУказанияСерий);
ОткрытьФорму("Обработка.ПодборТоваровВДокументПродажи.Форма", ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура РучныеСкидки(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ОткрытьФормуНазначенияРучныхСкидок();
КонецПроцедуры
&НаКлиенте
Процедура ПримененныеСкидки(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Если НЕ Объект.СкидкиРассчитаны Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Скидки не рассчитаны. Перед открытием отчета необходимо рассчитать скидки.'"));
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОткрытьФормуОтчетаПримененныхСкидкок", ЭтотОбъект),
НСтр("ru = 'Перед открытием отчета примененных скидок не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуОтчетаПримененныхСкидкок(ИзмененныеДанныеЗаписаны, ДополнительныеПараметры) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПараметрКоманды", Объект.Ссылка);
ОткрытьФорму("Отчет.ПримененныеСкидкиВДокументе.Форма.ФормаОтчета", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОплатыПлатежнымиКартами(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ВыполнитьОбработкуОповещения(
Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартами", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтотОбъект, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьЭСФСС(Команда)
ОплатитьЭСФССЛокализация();
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьСБП(Команда)
ОплатитьСБПЛокализация();
КонецПроцедуры
&НаКлиенте
Процедура УказатьРазрешениеНаПродажу(Команда)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
УказатьРазрешениеНаПродажуЛокализация();
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытьИнформационнуюПанельОшибкиПриПечатиЧека(Команда)
Элементы.ИнформационнаяПанельОшибкаПриПечатиЧека.Заголовок = "";
ИнформационнаяПанельОшибкаПриПечатиЧекаТекст = "";
Элементы.ГруппаИнформационнаяПанельОшибкаПриПечатиЧека.Видимость = Ложь;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыХарактеристика.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ХарактеристикиИспользуются");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветТекстаОтмененнойСтрокиДокумента);
Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<характеристики не используются>'"));
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
НоменклатураСервер.УстановитьУсловноеОформлениеСерийНоменклатуры(ЭтотОбъект, Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеСтатусовУказанияСерий(ЭтотОбъект, Ложь);
НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтотОбъект);
НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтотОбъект);
НаборыСервер.УстановитьУсловноеОформление(ЭтотОбъект, "Товары");
КонецПроцедуры
#Область Наборы
&НаКлиентеНаСервереБезКонтекста
Функция КолонкиНабора(Форма)
Колонки = Новый Массив;
Колонки.Добавить("Номенклатура");
Колонки.Добавить("Характеристика");
Колонки.Добавить("Цена");
Колонки.Добавить("Упаковка");
Колонки.Добавить("Количество");
Колонки.Добавить("КоличествоУпаковок");
Если Форма.ИспользоватьРучныеСкидкиВПродажах Тогда
Колонки.Добавить("ПроцентРучнойСкидки");
Колонки.Добавить("СуммаРучнойСкидки");
КонецЕсли;
Если Форма.ИспользоватьАвтоматическиеСкидкиВПродажах Тогда
Колонки.Добавить("ПроцентАвтоматическойСкидки");
Колонки.Добавить("СуммаАвтоматическойСкидки");
КонецЕсли;
Колонки.Добавить("СтавкаНДС");
Колонки.Добавить("СуммаНДС");
Колонки.Добавить("Сумма");
Возврат Колонки;
КонецФункции
&НаКлиенте
Процедура ПриУдаленииКомплектующих(Действие, ДополнительныйПараметр) Экспорт
Если НаборыКлиент.ДействиеРедактироватьНабор(Действие) Тогда
НаборыКлиент.ПриУдаленииКомплектующих(ЭтотОбъект, "Товары", ДополнительныйПараметр);
ИначеЕсли НаборыКлиент.ДействиеУдалитьВесьНабор(Действие) Тогда
ПриУдаленииКомплектующихНаСервере("Товары", ДополнительныйПараметр, КэшированныеЗначения);
КонецЕсли;
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаСервере
Процедура ПриУдаленииКомплектующихНаСервере(ИмяТЧ, ДополнительныйПараметр, КэшированныеЗначения)
НаборыСервер.ПриУдаленииКомплектующих(ЭтотОбъект, ИмяТЧ, ДополнительныйПараметр);
КэшированныеЗначения.Вставить("СобытияФорм");
ТоварыПриОкончанииРедактированияНаСервере(Неопределено, КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Функция АдресНабораВоВременномХранилище(Параметры)
Возврат НаборыСервер.АдресНабораВоВременномХранилище(ЭтотОбъект, Параметры, "Товары");
КонецФункции
&НаСервере
Процедура ПриОкончанииРедактированияНабора(АдресВоВременномХранилище)
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
Если ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата) Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ПараметрыДанных = Новый Структура;
ПараметрыДанных.Вставить("Данные", ПолучитьИзВременногоХранилища(АдресВоВременномХранилище));
ПараметрыДанных.Вставить("СтруктураДействийСИзмененнымиСтроками", СтруктураДействийСИзмененнымиСтроками);
ПараметрыДанных.Вставить("СтруктураДействийСДобавленнымиСтроками", СтруктураДействийСДобавленнымиСтроками);
ПараметрыДанных.Вставить("КолонкиНабора", КолонкиНабора(ЭтотОбъект));
НаборыСервер.ПриОкончанииРедактированияНабора(ЭтотОбъект, "Товары", ПараметрыДанных);
КонецПроцедуры
#КонецОбласти
#Область РасчетСкидок
&НаКлиенте
Процедура РассчитатьСкидкиНаценкиИОткрытьФормуОплаты(ДополнительныеПараметры)
ТекущийЭлемент = Элементы.Еще;
Если ИспользоватьАвтоматическиеСкидкиВПродажах
И (ПараметрыПримененияСкидок.ФормаОплатыВлияетНаРасчетСкидок ИЛИ ПараметрыПримененияСкидок.ОплатаБалламиВлияетНаНачислениеБаллов)
И ПараметрыПримененияСкидок.НазначеныСкидки Тогда
Если Не ДополнительныеПараметры.Свойство("ВыбраннаяФормаОплаты") Тогда
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
ДоступныеВидыОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить(
"Наличные",
Новый Структура("Значение, Видимость", Истина, ДоступныеВидыОплаты.Наличные));
ПараметрыОткрытияФормы.Вставить(
"ПлатежныеКарты",
Новый Структура("Значение, Видимость", Ложь, ДоступныеВидыОплаты.ПлатежныеКарты));
ПараметрыОткрытияФормы.Вставить(
"БонусныеБаллы",
Новый Структура("Значение, Видимость, Параметр", Ложь, ДоступныеВидыОплаты.БонусныеБаллы, Объект.КартаЛояльности));
ПараметрыОткрытияФормы.Вставить(
"ПодарочныеСертификаты",
Новый Структура("Значение, Видимость", Ложь, ДоступныеВидыОплаты.ПодарочныеСертификаты));
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ВыборФормыОплаты",
Новый Структура("Параметр", ПараметрыОткрытияФормы),
ЭтотОбъект,
УникальныйИдентификатор,,,
Новый ОписаниеОповещения("ВыборФормыОплатыОплатыЗавершение", ЭтотОбъект, ДополнительныеПараметры));
Иначе
ОбновитьДаннныеОФормеОплаты(ЭтотОбъект, ДополнительныеПараметры.ВыбраннаяФормаОплаты);
РасчетФрагмент(ДополнительныеПараметры);
КонецЕсли;
Иначе
Если Не ДополнительныеПараметры.Свойство("ВыбраннаяФормаОплаты") Тогда
ВыбраннаяФормаОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
Иначе
ВыбраннаяФормаОплаты = ДополнительныеПараметры.ВыбраннаяФормаОплаты;
КонецЕсли;
ОбновитьДаннныеОФормеОплаты(ЭтотОбъект, ВыбраннаяФормаОплаты);
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
РасчетФрагмент(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьРасчет(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Если ПараметрыПримененияСкидок <> Неопределено
И ПараметрыПримененияСкидок.НазначеныСкидки
И НЕ Объект.СкидкиРассчитаны
И Объект.Товары.Количество() > 0 Тогда
ОписаниеОповещения = Новый ОписаниеОповещения(
"НеобходимоРассчитатьСкидкиНаценкиВопросЗавершение",
ЭтотОбъект,
ДополнительныеПараметры);
ТесктВопроса = НСтр("ru='Предварительно необходимо рассчитать скидки (наценки). Выполнить расчет?'");
ПоказатьВопрос(ОписаниеОповещения, ТесктВопроса, РежимДиалогаВопрос.ДаНет);
Иначе
РассчитатьСкидкиНаценкиИОткрытьФормуОплаты(ДополнительныеПараметры);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НачатьВыполнениеДополнительныхДействийПередОплатойЛокализация(ОповещениеОЗавершении)
Если НЕ ОпределятьПринадлежностьТовараИСтавкуНДСПриПодборе
И ИспользоватьКомиссиюПриЗакупках
И НЕ Объект.СкидкиРассчитаны Тогда
ОпределятьПринадлежностьТовараИСтавкуНДСПередОплатойЛокализация();
КонецЕсли;
ПродолжитьВыполнение = РозничныеПродажиКлиентЛокализация.ПодтверждениеНоменклатурыНеподлежащейПродажеПоПатенту(ЭтотОбъект, ОповещениеОЗавершении);
Если Не ПродолжитьВыполнение Тогда
Возврат;
КонецЕсли;
ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, КодВозвратаДиалога.Да);
КонецПроцедуры
&НаКлиенте
Процедура НеобходимоРассчитатьСкидкиНаценкиВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
РассчитатьСкидкиНаценкиИОткрытьФормуОплаты(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ВыборФормыОплатыОплатыЗавершение(ВыбраннаяФормаОплаты, ДополнительныеПараметры) Экспорт
Если Не ЗначениеЗаполнено(ВыбраннаяФормаОплаты) Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
ВыбраннаяФормаОплатыЛокализация(ВыбраннаяФормаОплаты);
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
ОбновитьДаннныеОФормеОплаты(ЭтотОбъект, ВыбраннаяФормаОплаты);
РасчетФрагмент(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура РасчетФрагмент(ДополнительныеПараметры)
Если ИспользоватьАвтоматическиеСкидкиВПродажах
И ПараметрыПримененияСкидок.НазначеныСкидки
И (ПараметрыПримененияСкидок.НазначеныУправляемыеСкидки И Не Объект.СкидкиРассчитаны)
И НазначатьСкидкиПоКнопкеРасчетВЧекеККМ Тогда
Оповещение = Новый ОписаниеОповещения("РасчетПослеВыбораУправляемыхСкидок", ЭтотОбъект, ДополнительныеПараметры);
СкидкиНаценкиЗаполнениеКлиент.ОткрытьФормуНазначенияУправляемыхСкидокНаценок(
ВыполнитьПредварительныйРасчетСкидокНаСервере(),
Оповещение);
Иначе
РасчетСкидокНаКлиенте(УправляемыеСкидки, ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РасчетПослеВыбораУправляемыхСкидок(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
РасчетСкидокНаКлиенте(Результат, ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура РасчетСкидокНаКлиенте(ВозвращенноеЗначениеУправляемыеСкидки, ДополнительныеПараметры)
Если (ИспользоватьАвтоматическиеСкидкиВПродажах
И ПараметрыПримененияСкидок.НазначеныСкидки)
Или (Не КонтрольНаСкладеОтключен) Тогда
УИДЗамера = ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЧекККМ.Форма.ФормаДокументаРМК.РасчетСкидокНаКлиенте",, Ложь);
Объект.ИспользоватьОплатуБонуснымиБаллами = ДополнительныеПараметры.ВыбраннаяФормаОплаты.БонусныеБаллы;
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
Результат = ВыполнитьЧастьРасчетаНаСервере(ВозвращенноеЗначениеУправляемыеСкидки, ТребуетсяПовторнаяПопыткаЗаписи);
ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамера, Не Результат.РасчетВыполненУспешно);
Если Не Результат.РасчетВыполненУспешно Тогда
ДополнительныеПараметрыПопыткаЗаписи = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыПопыткаЗаписи.ОписаниеОповещения = Новый ОписаниеОповещения("РасчетСкидокНаКлиентеПовторнаяЗаписьЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ДополнительныеПараметрыПопыткаЗаписи.ТекстСообщения = НСтр("ru = 'При выполнении операции резервирования не удалось записать документ.'");
ДополнительныеПараметрыПопыткаЗаписи.ВозвращатьРезультатФункции = Истина;
ДополнительныеПараметрыПопыткаЗаписи.ИмяПроцедуры = "ВыполнитьЧастьРасчетаНаСервере";
ДополнительныеПараметрыПопыткаЗаписи.ПараметрыПроцедуры = ВозвращенноеЗначениеУправляемыеСкидки;
ДополнительныеПараметрыПопыткаЗаписи.РезультатОперации = Результат;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыПопыткаЗаписи);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыПопыткаЗаписи),
ДополнительныеПараметрыПопыткаЗаписи.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
КонецЕсли;
Если Результат.СтруктураСообщений <> Неопределено И Результат.СтруктураСообщений.Сообщения.Количество() > 0 И Результат.СтруктураСообщений.АвтоматическиОткрывать Тогда
Элементы.ПоказатьСообщения.Видимость = Результат.СтруктураСообщений.Сообщения.Количество() > 0;
ДанныеОткрытияФормы = Результат.СтруктураСообщений;
ДанныеОткрытияФормы.Вставить("ПередВыполнениемОплатыВЧекеККМ", Истина);
ДанныеОткрытияФормы.Вставить("ВыбраннаяФормаОплаты", ДополнительныеПараметры.ВыбраннаяФормаОплаты);
ОткрытьФорму(
"ОбщаяФорма.СообщенияСкидокНаценок",
ДанныеОткрытияФормы,
ЭтотОбъект,
УникальныйИдентификатор,,,
Новый ОписаниеОповещения("СообщенияСкидокНаценокЗавершение", ЭтотОбъект, ДополнительныеПараметры));
Возврат;
КонецЕсли;
КонецЕсли;
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, ДополнительныеПараметры.ВыбраннаяФормаОплаты);
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура СообщенияСкидокНаценокЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено И Результат <> Ложь Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Результат);
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Ложь);
КонецЕсли;
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура РасчетСкидокНаКлиентеПовторнаяЗаписьЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат.РасчетВыполненУспешно Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Ложь);
Возврат;
КонецЕсли;
Если Результат.СтруктураСообщений <> Неопределено И Результат.СтруктураСообщений.Сообщения.Количество() > 0 И Результат.СтруктураСообщений.АвтоматическиОткрывать Тогда
Элементы.ПоказатьСообщения.Видимость = Результат.СтруктураСообщений.Сообщения.Количество() > 0;
ОткрытьФорму("ОбщаяФорма.СообщенияСкидокНаценок", Результат.СтруктураСообщений, ЭтотОбъект, УникальныйИдентификатор);
КонецЕсли;
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Истина);
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
#КонецОбласти
#Область ПечатьЧека
&НаСервере
Функция ПараметрыОперацииФискализацииЧекаНаСервере()
Возврат ПараметрыОперацииФискализацииЧекаНаСервереЛокализация();
КонецФункции
&НаКлиенте
Функция ПараметрыОперацииФискализацииЧека()
Возврат ПараметрыОперацииФискализацииЧекаНаСервере();
КонецФункции
&НаКлиенте
Процедура ПробитьЧек()
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ЕстьОшибки = Ложь;
Если Объект.ПометкаУдаления Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Документ помечен на удаление'"), Объект.Ссылка,,,ЕстьОшибки);
КонецЕсли;
Модифицированность = Истина;
Если ЕстьОшибки Или Не ПроверитьЗаполнение() Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ПечатьЧекаПослеЗаписиИзменений", ЭтотОбъект),
НСтр("ru = 'Перед выполнением операции пробития чека не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧекаПослеЗаписиИзменений(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ПараметрыОперацииФискализацииЧека = ПараметрыОперацииФискализацииЧека();
ПечатьЧекаПослеЗаписиИзмененийЛокализация(ПараметрыОперацииФискализацииЧека);
КонецПроцедуры
#Область ФискальнаяОперация
&НаСервере
Функция ЗаписатьФискальнуюОперациюНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, ПараметрыФискализации)
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
ПараметрыЗаписи.Вставить("РежимПроведения", РежимПроведенияДокумента.Оперативный);
ПараметрыЗаписи.Вставить("РежимТранзакции", Истина);
Результат = РозничныеПродажи.ЗаписатьФискальнуюОперациюНаСервере(ЭтотОбъект, ПараметрыФискализации, ПараметрыЗаписи);
Если Результат Тогда
ПараметрыЗаписи.Вставить("РежимТранзакции", Ложь);
ПослеЗаписиНаСервере(РеквизитФормыВЗначение("Объект"), ПараметрыЗаписи);
Иначе
ТребуетсяПовторнаяПопыткаЗаписи = Истина;
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМ));
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область ПриИзмененииРеквизитов
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий,Объект)
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВСтруктуруДействияПриИзмененииКоличестваЕдиниц(СтруктураДействий,Объект)
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьСтрокуПриИзмененииСерии(ТекущаяСтрока)
СтруктураДействий = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
ИначеЕсли ИспользуетсяЦенообразование25 Тогда
СтруктураДействий.Вставить("ЗаполнитьУсловияРозничныхПродаж",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийРозничныхПродажВСтрокеТЧ(
Объект, ОбъектХраненияУсловийПродаж));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Серия", СтруктураДействий);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
КонецПроцедуры
#КонецОбласти
#Область ЦенообразованиеИСкидки
&НаСервере
Процедура НазначитьРучнуюСкидкуНаСервере(СуммаСкидкиНаценки, Знач ВыделенныеСтроки, АдресВоВременномХранилище)
ПараметрыСкидки = СкидкиНаценкиЗаполнениеСервер.НовыйПараметрыНазначитьРучнуюСкидку();
ПараметрыСкидки.ИспользуютсяАвтоматическиеСкидки = Истина;
ПараметрыСкидки.ВыделенныеСтроки = ВыделенныеСтроки;
ПараметрыСкидки.АдресВоВременномХранилище = АдресВоВременномХранилище;
СкидкиНаценкиЗаполнениеСервер.НазначитьРучнуюСкидку(Объект, "Товары", СуммаСкидкиНаценки, ПараметрыСкидки);
КонецПроцедуры
&НаСервере
Функция ПоместитьТабличнуюЧастьОплатыПлатежнымиКартамиВХранилище()
Возврат ПоместитьВоВременноеХранилище(Объект.ОплатаПлатежнымиКартами.Выгрузить(), УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура РассчитатьСкидкиБезПримененияКОбъекту()
Объект.Дата = ТекущаяДатаСеанса();
ПараметрыРасчета = СкидкиНаценкиЗаполнениеСервер.НовыйПараметрыРассчитать();
ПримененныеСкидки = СкидкиНаценкиЗаполнениеСервер.Рассчитать(Объект, ПараметрыРасчета);
АдресПримененныхСкидокВоВременномХранилище = ПоместитьВоВременноеХранилище(ПримененныеСкидки, УникальныйИдентификатор);
КонецПроцедуры
&НаСервере
Функция ВыполнитьПредварительныйРасчетСкидокНаСервере()
Объект.Дата = ТекущаяДатаСеанса();
СтруктураПараметры = СкидкиНаценкиЗаполнениеСервер.НовыйПараметрыРассчитать();
СтруктураПараметры.ПрименятьКОбъекту = Ложь;
СтруктураПараметры.ТолькоПредварительныйРасчет = Истина;
СтруктураПараметры.ВосстанавливатьУправляемыеСкидки = Истина;;
СтруктураПараметры.УправляемыеСкидки = УправляемыеСкидки;
Возврат ПоместитьВоВременноеХранилище(
СкидкиНаценкиЗаполнениеСервер.Рассчитать(Объект, СтруктураПараметры), УникальныйИдентификатор);
КонецФункции
&НаСервере
Функция РассчитатьСкидкиНаценкиНаСервере(СтруктураПараметры)
Объект.Дата = ТекущаяДатаСеанса();
ПримененныеСкидки = СкидкиНаценкиЗаполнениеСервер.Рассчитать(Объект, СтруктураПараметры);
АдресПримененныхСкидокВоВременномХранилище = ПоместитьВоВременноеХранилище(ПримененныеСкидки, УникальныйИдентификатор);
Модифицированность = Истина;
Возврат СкидкиНаценкиЗаполнениеСервер.СтруктураСообщений(Объект);
КонецФункции
&НаСервере
Процедура ОтменитьСкидкиНаценкиНаСервере()
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.СуммаБонусныхБалловКСписанию = 0;
СтрокаТЧ.СуммаБонусныхБалловКСписаниюВВалюте = 0;
КонецЦикла;
СкидкиНаценкиЗаполнениеСервер.ОтменитьСкидки(Объект, "Товары", Ложь,, Истина);
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Функция ПараметрыПримененияСкидокНаценок(Объект, Дата)
УстановитьПривилегированныйРежим(Истина);
ГруппыСкладов = Новый Массив;
Если ИспользоватьНесколькоСкладов Тогда
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Ссылка.Родитель КАК Ссылка
|ИЗ
| Справочник.Склады КАК Т
|ГДЕ
| Т.Ссылка В (&Склад)
|ИТОГИ ПО
| Ссылка ТОЛЬКО ИЕРАРХИЯ
|");
Запрос.Параметры.Вставить("Склад", Объект.Склад);
ГруппыСкладов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецЕсли;
ТекстЗапроса = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| СписокСкидок.СкидкаНаценка КАК СкидкаНаценка,
| СписокСкидок.Управляемая КАК Управляемая
|ПОМЕСТИТЬ СписокСкидок
|ИЗ
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| Таблица.СкидкаНаценка КАК СкидкаНаценка,
| Таблица.СкидкаНаценка.Управляемая КАК Управляемая
| ИЗ
| РегистрСведений.ДействиеСкидокНаценок.СрезПоследних(
| &ТекущаяДата,
| Источник = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| ИЛИ &ИспользоватьНесколькоСкладов
| ) КАК Таблица
| ГДЕ
| Таблица.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДействияСкидок.Действует)
|) КАК СписокСкидок
|";
Если ИспользоватьНесколькоСкладов Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЛИ &ИспользоватьНесколькоСкладов", " ИЛИ Источник = &Склад ИЛИ Источник В (&ГруппыСкладов)");
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЛИ &ИспользоватьНесколькоСкладов", "");
КонецЕсли;
Если ИспользоватьКартыЛояльности Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ") КАК СписокСкидок", "");
ТекстЗапроса = ТекстЗапроса + "
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Таблица.СкидкаНаценка,
| Таблица.СкидкаНаценка.Управляемая
|ИЗ
| РегистрСведений.ДействиеСкидокНаценок.СрезПоследних(&ТекущаяДата, Источник ССЫЛКА Справочник.ВидыКартЛояльности) КАК Таблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.КартыЛояльности КАК КартыЛояльности
| ПО (КартыЛояльности.Владелец = Таблица.Источник)
| И (КартыЛояльности.Ссылка = &КартаЛояльности)
|ГДЕ
| КартыЛояльности.Владелец.ДатаНачалаДействия <= &ТекущаяДата
| И ВЫБОР
| КОГДА КартыЛояльности.Владелец.ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ИСТИНА
| ИНАЧЕ КОНЕЦПЕРИОДА(КартыЛояльности.Владелец.ДатаОкончанияДействия, ДЕНЬ) >= &ТекущаяДата
| КОНЕЦ
| И Таблица.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДействияСкидок.Действует)
|";
ТекстЗапроса = ТекстЗапроса + "
|) КАК СписокСкидок
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| СписокСкидок.СкидкаНаценка
|ИЗ
| СписокСкидок КАК СписокСкидок
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| СписокСкидок.СкидкаНаценка
|ИЗ
| СписокСкидок КАК СписокСкидок
|ГДЕ
| СписокСкидок.Управляемая
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| СкидкиНаценкиУсловияПредоставления.УсловиеПредоставления КАК УсловиеПредоставления
|ИЗ
| Справочник.СкидкиНаценки.УсловияПредоставления КАК СкидкиНаценкиУсловияПредоставления
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписокСкидок КАК СписокСкидок
| ПО СкидкиНаценкиУсловияПредоставления.Ссылка = СписокСкидок.СкидкаНаценка
|ГДЕ
| СкидкиНаценкиУсловияПредоставления.УсловиеПредоставления.УсловиеПредоставления = &УсловиеПредоставления
|";
Если ИспользоватьБонусныеПрограммыЛояльности И ИспользоватьКартыЛояльности Тогда
ТекстЗапроса = ТекстЗапроса + "
|;
|
|ВЫБРАТЬ
| ЕСТЬNULL(КартыЛояльности.Владелец.БонуснаяПрограммаЛояльности.НеНачислятьБаллыПриОплатеБонусами, Ложь) КАК НеНачислятьБаллыПриОплатеБонусами
|ИЗ
| Справочник.КартыЛояльности КАК КартыЛояльности
|ГДЕ
| КартыЛояльности.Ссылка = &КартаЛояльности
| И ЕСТЬNULL(КартыЛояльности.Владелец.БонуснаяПрограммаЛояльности.НеНачислятьБаллыПриОплатеБонусами, Ложь) = ИСТИНА
|";
КонецЕсли;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.Параметры.Вставить("ТекущаяДата", Дата);
Запрос.Параметры.Вставить("УсловиеПредоставления", Перечисления.УсловияПредоставленияСкидокНаценок.ЗаФормуОплаты);
Если ИспользоватьНесколькоСкладов Тогда
Запрос.Параметры.Вставить("Склад", Объект.Склад);
Запрос.Параметры.Вставить("ГруппыСкладов", ГруппыСкладов);
КонецЕсли;
Если ИспользоватьКартыЛояльности Тогда
Запрос.Параметры.Вставить("КартаЛояльности", Объект.КартаЛояльности);
КонецЕсли;
Результат = Запрос.ВыполнитьПакет();
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("НазначеныСкидки", Ложь);
СтруктураПараметров.Вставить("НазначеныУправляемыеСкидки", Ложь);
СтруктураПараметров.Вставить("ФормаОплатыВлияетНаРасчетСкидок", Ложь);
СтруктураПараметров.Вставить("ОплатаБалламиВлияетНаНачислениеБаллов", Ложь);
СтруктураПараметров.НазначеныСкидки = НЕ Результат[1].Пустой();
СтруктураПараметров.НазначеныУправляемыеСкидки = НЕ Результат[2].Пустой();
СтруктураПараметров.ФормаОплатыВлияетНаРасчетСкидок = НЕ Результат[3].Пустой();
Если ИспользоватьБонусныеПрограммыЛояльности И ИспользоватьКартыЛояльности Тогда
СтруктураПараметров.ОплатаБалламиВлияетНаНачислениеБаллов = НЕ Результат[4].Пустой() И (ЗначениеЗаполнено(Объект.КартаЛояльности));
КонецЕсли;
Возврат СтруктураПараметров;
КонецФункции
&НаСервере
Процедура НастроитьАвтоматическиеСкидкиНаценки()
ПараметрыПримененияСкидок = ПараметрыПримененияСкидокНаценок(Объект, Объект.Дата);
Элементы.ТоварыПроцентАвтоматическойСкидки.Видимость = ПараметрыПримененияСкидок.НазначеныСкидки;
Элементы.ТоварыСуммаАвтоматическойСкидки.Видимость = ПараметрыПримененияСкидок.НазначеныСкидки;
Элементы.ТоварыКонтекстноеМенюОткрытьИнформациюОСкидках.Видимость = ПараметрыПримененияСкидок.НазначеныСкидки;
КонецПроцедуры
&НаСервере
Функция СчитанаКартаЛояльностиНаСервере(КартаЛояльности)
Результат = Истина;
ДанныеКартыЛояльности = КартыЛояльностиВызовСервера.ПолучитьДанныеКартыЛояльности(КартаЛояльности, Ложь);
Если ЗначениеЗаполнено(ДанныеКартыЛояльности.Ссылка) Тогда
Объект.КартаЛояльности = КартаЛояльности;
Если ЗначениеЗаполнено(ДанныеКартыЛояльности.Партнер) И ДанныеКартыЛояльности.Партнер <> Объект.Партнер Тогда
Объект.Партнер = ДанныеКартыЛояльности.Партнер;
ИначеЕсли Не ЗначениеЗаполнено(ДанныеКартыЛояльности.Партнер) Тогда
Объект.Партнер = ПредопределенноеЗначение("Справочник.Партнеры.РозничныйПокупатель");
КонецЕсли;
АнализВозможностиОплатыБонуснымиБаллами(Истина);
НастроитьАвтоматическиеСкидкиНаценки();
Иначе
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура СчитанаКартаЛояльности(КартаЛояльности)
Если СчитанаКартаЛояльностиНаСервере(КартаЛояльности) Тогда
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НазначитьАвтоматическиеСкидкиЗавершение(ВозвращенноеЗначение, ДополнительныеПараметры) Экспорт
Если ВозвращенноеЗначение <> Неопределено Тогда
УправляемыеСкидки = ВозвращенноеЗначение;
СтруктураПараметры = Новый Структура;
СтруктураПараметры.Вставить("ПрименятьКОбъекту", Истина);
СтруктураПараметры.Вставить("ТолькоПредварительныйРасчет", Ложь);
СтруктураПараметры.Вставить("ВосстанавливатьУправляемыеСкидки", Ложь);
СтруктураПараметры.Вставить("УправляемыеСкидки", УправляемыеСкидки);
СтруктураСообщений = РассчитатьСкидкиНаценкиНаСервере(СтруктураПараметры);
Элементы.ПоказатьСообщения.Видимость = СтруктураСообщений.Сообщения.Количество() > 0;
ПересчитатьДокументНаКлиенте();
ПоказатьОповещениеПользователя(
НСтр("ru = 'Скидки (наценки)'"),
,
НСтр("ru = 'Скидки (наценки) рассчитаны'"),
БиблиотекаКартинок.Информация32);
Если СтруктураСообщений.Сообщения.Количество() > 0
И СтруктураСообщений.АвтоматическиОткрывать Тогда
ОткрытьФорму(
"ОбщаяФорма.СообщенияСкидокНаценок",
СтруктураСообщений,
ЭтотОбъект,
УникальныйИдентификатор);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьИнформациюОСкидкахЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
Результат = РезультатВопроса;
Если Результат = КодВозвратаДиалога.Нет Тогда
Возврат;
Иначе
СтруктураПараметры = Новый Структура;
СтруктураПараметры.Вставить("ПрименятьКОбъекту", Истина);
СтруктураПараметры.Вставить("ТолькоПредварительныйРасчет", Ложь);
СтруктураПараметры.Вставить("ВосстанавливатьУправляемыеСкидки", Истина);
СтруктураПараметры.Вставить("УправляемыеСкидки", УправляемыеСкидки);
СтруктураСообщений = РассчитатьСкидкиНаценкиНаСервере(СтруктураПараметры);
Элементы.ПоказатьСообщения.Видимость = СтруктураСообщений.Сообщения.Количество() > 0;
ПересчитатьДокументНаКлиенте();
Если СтруктураСообщений.Сообщения.Количество() > 0 И СтруктураСообщений.АвтоматическиОткрывать Тогда
ОткрытьФорму("ОбщаяФорма.СообщенияСкидокНаценок", СтруктураСообщений, ЭтотОбъект, УникальныйИдентификатор);
КонецЕсли;
КонецЕсли;
ОткрытьИнформациюОСкидкахФрагмент();
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьИнформациюОСкидкахФрагмент()
Перем ТекущиеДанные;
Если Не ЗначениеЗаполнено(АдресПримененныхСкидокВоВременномХранилище) Тогда
РассчитатьСкидкиБезПримененияКОбъекту();
КонецЕсли;
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
СкидкиНаценкиЗаполнениеКлиент.ОткрытьФормуПримененныеСкидки(ТекущиеДанные, Объект, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура НазначитьРучнуюСкидкуДляВыделенныхСтрокЗавершение(СуммаРучнойСкидкиНаценки, ДополнительныеПараметры) Экспорт
АдресВоВременномХранилище = ДополнительныеПараметры.АдресВоВременномХранилище;
Если СуммаРучнойСкидкиНаценки <> Неопределено Тогда
Модифицированность = Истина;
НазначитьРучнуюСкидкуНаСервере(СуммаРучнойСкидкиНаценки, Элементы.Товары.ВыделенныеСтроки, АдресВоВременномХранилище);
СкидкиНаценкиЗаполнениеКлиент.ОповеститьОбОкончанииНазначенияРучныхСкидокНаценок(СуммаРучнойСкидкиНаценки, Объект.Валюта);
КонецЕсли;
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаСервере
Функция СтруктураСообщений()
Возврат СкидкиНаценкиЗаполнениеСервер.СтруктураСообщений(Объект);
КонецФункции
&НаСервере
Процедура ПолученыСообщения(Сообщения)
СкидкиНаценкиЗаполнениеСервер.СохранитьОтработанныеСообщения(Объект, Сообщения);
СтруктураСообщений = СкидкиНаценкиЗаполнениеСервер.СтруктураСообщений(Объект);
Элементы.ПоказатьСообщения.Видимость = СтруктураСообщений.Сообщения.Количество() > 0;
КонецПроцедуры
&НаСервере
Функция АдресДанныхДляРасчетаРучныхСкидокВоВременномХранилище(ТолькоВыделенныеСтроки)
СтруктураПараметров = СкидкиНаценкиЗаполнениеСервер.НовыйПараметрыАдресДанныхДляРасчетаРучныхСкидок();
СтруктураПараметров.ИмяТаблицы = "Товары";
СтруктураПараметров.ТолькоДляВыделенныхСтрок = ТолькоВыделенныеСтроки;
СтруктураПараметров.ИмяТаблицыВыделенныхСтрок = "Товары";
Возврат СкидкиНаценкиЗаполнениеСервер.АдресДанныхДляРасчетаРучныхСкидокВоВременномХранилище(
ЭтотОбъект, УникальныйИдентификатор, СтруктураПараметров);
КонецФункции
&НаКлиенте
Процедура ОткрытьФормуНазначенияРучныхСкидок()
Если Не СкидкиНаценкиЗаполнениеКлиент.ВозможноНазначениеРучнойСкидкиНаценки(Объект, "Товары", НСтр("ru='Товары'")) Тогда
Возврат;
КонецЕсли;
АдресВоВременномХранилище = АдресДанныхДляРасчетаРучныхСкидокВоВременномХранилище(Истина);
Оповещение = Новый ОписаниеОповещения(
"НазначитьРучнуюСкидкуДляВыделенныхСтрокЗавершение",
ЭтотОбъект,
Новый Структура("АдресВоВременномХранилище", АдресВоВременномХранилище));
СкидкиНаценкиЗаполнениеКлиент.ОткрытьФормуНазначенияРучныхСкидок(
АдресВоВременномХранилище,
Объект.Валюта,
Оповещение);
КонецПроцедуры
&НаСервере
Функция АдресТабличнойЧастьПодарочныеСертификаты()
Возврат ПоместитьВоВременноеХранилище(Объект.ПодарочныеСертификаты.Выгрузить(), УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ЗагрузитьТабличнуюЧастьПодарочныеСертификатыИзХранилища(АдресВХранилище)
Объект.ПодарочныеСертификаты.Загрузить(ПолучитьИзВременногоХранилища(АдресВХранилище));
КонецПроцедуры
&НаСервере
Процедура ПрименитьОплатуБонуснымиБаллами(АдресВоВременномХранилище)
УдалениеОплаты = Ложь;
Если АдресВоВременномХранилище <> Неопределено Тогда
ТаблицаТоваров = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
Иначе
ТаблицаТоваров = Объект.Товары;
УдалениеОплаты = Истина;
КонецЕсли;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки",
Новый Структура("Очищать, ПересчитыватьСуммуРучнойСкидки", Ложь, Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
ОбрабатываемыеСтроки = Новый Массив;
Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл
Если УдалениеОплаты Тогда
СтрокаТЧ = СтрокаТаблицы;
СтрокаТЧ.СуммаБонусныхБалловКСписанию = 0;
СтрокаТЧ.СуммаБонусныхБалловКСписаниюВВалюте = 0;
Иначе
СтрокаТЧ = Объект.Товары.НайтиСтроки(Новый Структура("КлючСвязи", СтрокаТаблицы.КлючСвязи))[0];
СтрокаТЧ.СуммаБонусныхБалловКСписанию = СтрокаТаблицы.СуммаБонусныхБалловКСписанию;
СтрокаТЧ.СуммаБонусныхБалловКСписаниюВВалюте = СтрокаТаблицы.СуммаБонусныхБалловКСписаниюВВалюте;
КонецЕсли;
ОбрабатываемыеСтроки.Добавить(СтрокаТЧ);
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары);
Если Не ЗначениеЗаполнено(АдресПримененныхСкидокВоВременномХранилище) Тогда
РассчитатьСкидкиБезПримененияКОбъекту();
КонецЕсли;
ПримененныеСкидки = ПолучитьИзВременногоХранилища(АдресПримененныхСкидокВоВременномХранилище);
СкидкиНаценкиЗаполнениеСервер.ПрименитьРезультатРасчета(Объект, ПримененныеСкидки);
КонецПроцедуры
#КонецОбласти
#Область БыстрыеТоварыИОбработкаПроверкиКоличества
&НаСервере
Функция ДобавитьВКорзинуНаСервере(ПараметрыТовара, НовыеСтроки)
ИспользоватьСкладскиеПомещения = ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата);
СтруктураДействийСуществующаяСтрока = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСуществующаяСтрока, Объект);
Если КонтролироватьАссортимент Тогда
ДобавитьПроверкуАссортиментаВСтруктуруДействий(СтруктураДействийСуществующаяСтрока);
КонецЕсли;
СтруктураДействийНоваяСтрока = Новый Структура;
СтруктураДействийНоваяСтрока.Вставить("ПроверитьХарактеристикуПоВладельцу");
СтруктураДействийНоваяСтрока.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу");
Если ИспользоватьСкладскиеПомещения Тогда
СтруктураДействийНоваяСтрока.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
КонецЕсли;
СтруктураДействийНоваяСтрока.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействийНоваяСтрока.Вставить("ЗаполнитьСтавкуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
Если КонтролироватьАссортимент Тогда
ДобавитьПроверкуАссортиментаВСтруктуруДействий(СтруктураДействийНоваяСтрока);
КонецЕсли;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийНоваяСтрока,Объект);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(
ЭтотОбъект, "Номенклатура", СтруктураДействийНоваяСтрока);
Отбор = Новый Структура;
Отбор.Вставить("НоменклатураНабора");
Отбор.Вставить("ХарактеристикаНабора");
Отбор.Вставить("Номенклатура");
Отбор.Вставить("Характеристика");
Отбор.Вставить("Упаковка");
Отбор.Вставить("Цена");
Отбор.Вставить("Помещение");
GTINДляУказанияВскрытойУпаковки = Неопределено;
КоличествоПропущенныхСтрок = 0;
ОбрабатываемыеСтроки = Новый Массив;
ДобавляемыеСтроки = Новый Массив;
Погрешности = Новый Соответствие();
Для Каждого СтрокаТовара Из НовыеСтроки Цикл
Если ЭтоМаркированныйТоварСЧастичнымВыбытиемЛокализация(СтрокаТовара.Номенклатура)
И НЕ ПодбиратьКодыМаркировкиВскрытыхПотребительскихУпаковокПоFIFOЛокализация() Тогда
Результат = ВскрытыеПотребительскиеУпаковкиПоТоваруЛокализация(СтрокаТовара);
GTINДляУказанияВскрытойУпаковки = Результат.GTINДляУказанияВскрытойУпаковки;
Если НЕ Результат.ДобавитьВТабличнуюЧасть Тогда
КоличествоПропущенныхСтрок = КоличествоПропущенныхСтрок + 1;
Продолжить;
КонецЕсли;
КонецЕсли;
Если СтрокаТовара.Упаковка.Пустая() Тогда
СтрокаТовара.Упаковка = ПодборТоваровВызовСервера.ПолучитьУпаковкуХранения(СтрокаТовара.Номенклатура);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаТовара.Цена) И ПараметрыТовара.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Набор Тогда
СтрокаТовара.Цена = ПолучитьЦенуПоОтбору(СтрокаТовара.Номенклатура, СтрокаТовара.Характеристика, СтрокаТовара.Серия, СтрокаТовара.Упаковка);
КонецЕсли;
ЗаполнитьЗначенияСвойств(Отбор, СтрокаТовара);
РезультатПоиска = Объект.Товары.НайтиСтроки(Отбор);
Если РезультатПоиска.Количество() = 0 ИЛИ СтрокаТовара.Погрешность <> 0 Тогда
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, ПараметрыТовара);
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара);
ТекущаяСтрока.ИндексНабора = ?(ЗначениеЗаполнено(ТекущаяСтрока.НоменклатураНабора), 1, 0);
Погрешности.Вставить(ТекущаяСтрока, СтрокаТовара.Погрешность);
ДобавляемыеСтроки.Добавить(ТекущаяСтрока);
Иначе
ТекущаяСтрока = РезультатПоиска[0];
ТекущаяСтрока.КоличествоУпаковок = СтрокаТовара.КоличествоУпаковок + ТекущаяСтрока.КоличествоУпаковок;
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЕсли;
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействийСуществующаяСтрока,
Объект.Товары);
СтруктураДействийНоваяСтрока.Вставить("ПересчитатьСуммуСУчетомПогрешностиОкругления",
Новый Структура("ПогрешностиПоСтрокам", Погрешности));
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ДобавляемыеСтроки,
СтруктураДействийНоваяСтрока,
Объект.Товары);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
Если ТекущаяСтрока <> Неопределено Тогда
Элементы.Товары.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();
КонецЕсли;
РозничныеПродажиЛокализация.ОбработатьРазрешенияНаПродажуТоваров(ЭтотОбъект);
Если (НовыеСтроки.Количество() - КоличествоПропущенныхСтрок) > 0 Тогда
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ПриИзмененииНоменклатурыХарактеристикиКоличестваЛокализация();
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
КонецЕсли;
Возврат GTINДляУказанияВскрытойУпаковки;
КонецФункции
&НаКлиенте
Процедура ДобавитьВКорзину(ПараметрыТовара)
Если ТолькоПросмотр Тогда
Возврат;
КонецЕсли;
НовыеСтроки = Новый Массив;
Если ЗапрашиватьКоличество Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Склад");
ПараметрыФормы.Вставить("Номенклатура");
ПараметрыФормы.Вставить("Характеристика");
ПараметрыФормы.Вставить("ВидЦены");
ПараметрыФормы.Вставить("Упаковка");
ПараметрыФормы.Вставить("Цена");
ПараметрыФормы.Вставить("Дата");
ПараметрыФормы.Вставить("Валюта");
ПараметрыФормы.Вставить("Организация");
ПараметрыФормы.Вставить("РедактироватьЦену");
ПараметрыФормы.Вставить("РедактироватьВидЦены");
ЗаполнитьЗначенияСвойств(ПараметрыФормы, ПараметрыТовара);
ПараметрыФормы.Склад = Объект.Склад;
ПараметрыФормы.Дата = Объект.Дата;
ПараметрыФормы.Валюта = Объект.Валюта;
ПараметрыФормы.Организация = Объект.Организация;
ПараметрыФормы.РедактироватьЦену = Ложь;
ПараметрыФормы.РедактироватьВидЦены = Ложь;
ПараметрыФормы.ВидЦены = Объект.ВидЦены;
Если ПараметрыТовара.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Набор") Тогда
ИмяФормыЗапросаКоличества = "Документ.ЧекККМ.Форма.ЗапросКоличестваНабор";
Иначе
ИмяФормыЗапросаКоличества = "Документ.ЧекККМ.Форма.ЗапросКоличества";
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("НовыеСтроки", НовыеСтроки);
ДополнительныеПараметры.Вставить("ПараметрыТовара", ПараметрыТовара);
ОткрытьФорму(
ИмяФормыЗапросаКоличества,
ПараметрыФормы,
ЭтотОбъект,
УникальныйИдентификатор,,,
Новый ОписаниеОповещения("ДобавитьВКорзинуПослеВыбораКоличества", ЭтотОбъект, ДополнительныеПараметры));
Иначе
Если ПараметрыТовара.ТипНоменклатуры = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Набор") Тогда
ПараметрыКомплектующих = ПодборТоваровКлиентСервер.ПараметрыТовара();
ЗаполнитьЗначенияСвойств(ПараметрыКомплектующих, ПараметрыТовара);
ПараметрыКомплектующих.НоменклатураНабора = ПараметрыТовара.Номенклатура;
ПараметрыКомплектующих.ХарактеристикаНабора = ПараметрыТовара.Характеристика;
ПараметрыКомплектующих.Вставить("ВариантКомплектацииНоменклатуры", Неопределено);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Дата", Объект.Дата);
ДополнительныеПараметры.Вставить("Валюта", Объект.Валюта);
ДополнительныеПараметры.Вставить("ВидЦены", Объект.ВидЦены);
ДополнительныеПараметры.Вставить("Цена", ПараметрыТовара.Цена);
ДополнительныеПараметры.Вставить("Организация", Объект.Организация);
ПодобранныеТовары = НаборыВызовСервера.Комплектующие(ПараметрыКомплектующих, ДополнительныеПараметры);
Для Каждого ПодобранныйТовар Из ПодобранныеТовары Цикл
НовыеСтроки.Добавить(ПодобранныйТовар);
КонецЦикла;
Иначе
Если Не ЗначениеЗаполнено(ПараметрыТовара.Упаковка) Тогда
ПараметрыТовара.Упаковка = ПодборТоваровВызовСервера.ПолучитьУпаковкуХранения(ПараметрыТовара.Номенклатура);
КонецЕсли;
НовыеСтроки.Добавить(ПараметрыТовара);
КонецЕсли;
ПараметрыДанных = Новый Структура;
ПараметрыДанных.Вставить("НовыеСтроки", НовыеСтроки);
ПараметрыДанных.Вставить("ПараметрыТовара", ПараметрыТовара);
ДобавитьВКорзинуФрагмент(ПараметрыДанных);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКорзинуПослеВыбораКоличества(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
НовыеСтроки = Новый Массив;
Для Каждого ПодобранныйТовар Из Результат.ПодобранныеТовары Цикл
НоваяСтрока = ПодборТоваровКлиентСервер.ПараметрыТовара();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ДополнительныеПараметры);
ЗаполнитьЗначенияСвойств(НоваяСтрока, ПодобранныйТовар);
НовыеСтроки.Добавить(НоваяСтрока);
КонецЦикла;
ПараметрыДанных = Новый Структура;
ПараметрыДанных.Вставить("НовыеСтроки", НовыеСтроки);
ПараметрыДанных.Вставить("ПараметрыТовара", ДополнительныеПараметры.ПараметрыТовара);
ДобавитьВКорзинуФрагмент(ПараметрыДанных);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКорзинуФрагмент(ПараметрыДанных)
НовыеСтроки = ПараметрыДанных.НовыеСтроки;
ПараметрыТовара = ПараметрыДанных.ПараметрыТовара;
GTINДляУказанияВскрытойУпаковки = ДобавитьВКорзинуНаСервере(ПараметрыТовара, НовыеСтроки);
Если GTINДляУказанияВскрытойУпаковки <> Неопределено Тогда
ПоискПоШтрихкодуЗавершение(
Новый Структура("Количество, Штрихкод", 1, GTINДляУказанияВскрытойУпаковки),
Неопределено);
КонецЕсли;
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Функция ПоместитьТабличнуюЧастьТоварыВоВременноеХранилищеДляПроверкиКоличества(ВыгруженаТолькоНеМаркируемаяПродукция = Ложь)
ТабличнаяЧастьТовары = Объект.Товары.Выгрузить();
Если ТабличнаяЧастьТовары.Колонки.Найти("МаркируемаяПродукция") <> Неопределено Тогда
НомерТекущейСтроки = ТабличнаяЧастьТовары.Количество()-1;
Пока НомерТекущейСтроки >= 0 Цикл
Если ТабличнаяЧастьТовары[НомерТекущейСтроки].МаркируемаяПродукция Тогда
ТабличнаяЧастьТовары.Удалить(НомерТекущейСтроки);
ВыгруженаТолькоНеМаркируемаяПродукция = Истина;
КонецЕсли;
НомерТекущейСтроки = НомерТекущейСтроки - 1;
КонецЦикла;
КонецЕсли;
ТабличнаяЧастьТовары.Свернуть("ИдентификаторСтроки, НоменклатураНабора, ХарактеристикаНабора, НоменклатураЕГАИС, Номенклатура, Характеристика, Серия, Помещение, СтатусУказанияСерий, ТипНоменклатуры, ХарактеристикиИспользуются, Упаковка, КоличествоУпаковок, Количество");
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ТабличнаяЧастьТовары, УникальныйИдентификатор);
Возврат АдресВоВременномХранилище;
КонецФункции
&НаСервере
Процедура ИзменитьТабличнуюЧастьПоРезультатамПроверки(ВозвращаемыеПараметры, КэшированныеЗначения)
ТаблицаТовары = ПолучитьИзВременногоХранилища(ВозвращаемыеПараметры.Товары);
УдаляемыеСтроки = Новый Массив;
ИзмененныеСтрокиДляОбработки = Новый Массив;
ДобавленныеСтрокиДляОбработки = Новый Массив;
ИспользоватьСкладскиеПомещения = ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата);
Для Каждого СтрокаИсточник Из ТаблицаТовары Цикл
Отбор = Новый Структура;
Отбор.Вставить("НоменклатураНабора");
Отбор.Вставить("ХарактеристикаНабора");
Отбор.Вставить("Номенклатура");
Отбор.Вставить("Характеристика");
Отбор.Вставить("Серия");
Отбор.Вставить("ХарактеристикиИспользуются");
Отбор.Вставить("Упаковка");
ЗаполнитьЗначенияСвойств(Отбор, СтрокаИсточник);
НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл
Если СтрокаИсточник.КоличествоУпаковок = 0 Тогда
Прервать;
КонецЕсли;
Если СтрокаТЧ.КоличествоУпаковок = 0
И СтрокаИсточник.КоличествоУпаковок < 0 Тогда
Продолжить;
КонецЕсли;
Если СтрокаИсточник.КоличествоУпаковок >= 0 Тогда
СтрокаТЧ.КоличествоУпаковок = СтрокаТЧ.КоличествоУпаковок + СтрокаИсточник.КоличествоУпаковок;
СтрокаИсточник.КоличествоУпаковок = 0;
Иначе
КоличествоКСписанию = -СтрокаИсточник.КоличествоУпаковок;
КоличествоВСтроке = СтрокаТЧ.КоличествоУпаковок;
Если КоличествоКСписанию > КоличествоВСтроке Тогда
СтрокаИсточник.КоличествоУпаковок = КоличествоВСтроке - КоличествоКСписанию;
СтрокаТЧ.КоличествоУпаковок = 0;
Иначе
СтрокаИсточник.КоличествоУпаковок = 0;
СтрокаТЧ.КоличествоУпаковок = КоличествоВСтроке - КоличествоКСписанию;
КонецЕсли;
КонецЕсли;
Если СтрокаТЧ.КоличествоУпаковок = 0 Тогда
Если УдаляемыеСтроки.Найти(СтрокаТЧ) = Неопределено Тогда
УдаляемыеСтроки.Добавить(СтрокаТЧ);
КонецЕсли;
Иначе
ИзмененныеСтрокиДляОбработки.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
Если НайденныеСтроки.Количество() = 0 Тогда
СтрокаТЧ = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаИсточник);
Если СтрокаТЧ.Упаковка.Пустая() Тогда
СтрокаТЧ.Упаковка = ПодборТоваровВызовСервера.ПолучитьУпаковкуХранения(СтрокаТЧ.Номенклатура);
КонецЕсли;
ДобавленныеСтрокиДляОбработки.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий,Объект);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ИзмененныеСтрокиДляОбработки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
СтруктураДействий = СтруктураДействийПриИзмененииНоменклатурыТабличнойЧастиТовары();
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий, Объект);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ДобавленныеСтрокиДляОбработки,
СтруктураДействий,
Объект.Товары,
КэшированныеЗначения);
Для Каждого СтрокаТЧ Из УдаляемыеСтроки Цикл
Объект.Товары.Удалить(СтрокаТЧ);
КонецЦикла;
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект,ПараметрыУказанияСерий);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ПриИзмененииНоменклатурыХарактеристикиКоличестваЛокализация();
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ЗавершенаПроверкаКоличества", ВозвращаемыеПараметры);
КонецПроцедуры
#КонецОбласти
#Область ШтрихкодыИТорговоеОборудование
&НаКлиенте
Процедура ОбработатьШтрихкоды(ДанныеШтрихкодов, ЗагрузкаИзТСД = Ложь, НеизвестныеШтрихкоды = Ложь)
Если Не ШтрихкодированиеНоменклатурыКлиент.ШтрихкодыВалидны(ДанныеШтрихкодов) Тогда
Возврат;
КонецЕсли;
ИзменятьКоличество = Не ТолькоПросмотр;
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
ИначеЕсли ИспользуетсяЦенообразование25 Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьУсловияРозничныхПродаж", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийРозничныхПродажВСтрокеТЧ(Объект, ОбъектХраненияУсловийПродаж));
Иначе
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
Если ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата) Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСДобавленнымиСтроками, Объект);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействийСДобавленнымиСтроками);
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСИзмененнымиСтроками,Объект);
СтруктураДействий = ШтрихкодированиеНоменклатурыКлиент.ПараметрыОбработкиШтрихкодов();
СтруктураДействий.Штрихкоды = ДанныеШтрихкодов;
СтруктураДействий.СтруктураДействийСДобавленнымиСтроками = СтруктураДействийСДобавленнымиСтроками;
СтруктураДействий.СтруктураДействийСИзмененнымиСтроками = СтруктураДействийСИзмененнымиСтроками;
СтруктураДействий.ПараметрыУказанияСерий = ПараметрыУказанияСерий;
СтруктураДействий.ИзменятьКоличество = ИзменятьКоличество И Не НеизвестныеШтрихкоды;
СтруктураДействий.РассчитыватьНаборы = Истина;
СтруктураДействий.МаркируемаяПродукцияВТЧ = Истина;
СтруктураДействий.ШтрихкодыВТЧ = Истина;
СтруктураДействий.ЗагрузкаИзТСД = ЗагрузкаИзТСД;
Если КонтролироватьАссортимент Тогда
СтруктураПроверкиАссортимента = АссортиментКлиентСервер.ПараметрыПроверкиАссортимента();
СтруктураПроверкиАссортимента.Ссылка = Объект.Ссылка;
СтруктураПроверкиАссортимента.Склад = Объект.Склад;
СтруктураПроверкиАссортимента.Дата = Объект.Дата;
СтруктураПроверкиАссортимента.ТекстСообщения = НСтр("ru = 'Товар %1 не включен в ассортимент магазина или запрещен к продаже.'");
СтруктураПроверкиАссортимента.ИмяРесурсаАссортимента = "РазрешеныПродажи";
СтруктураПроверкиАссортимента.ПровереноМожноДобавлять = Истина;
СтруктураПроверкиАссортимента.РазрешатьДобавление = Ложь;
СтруктураДействий.ПараметрыПроверкиАссортимента = СтруктураПроверкиАссортимента;
КонецЕсли;
ОбработатьШтрихкодыСервер(СтруктураДействий,КэшированныеЗначения);
ДанныеДляОбработки = СтруктураДействий;
Подключаемый_ПослеОбработкиШтрихкодов();
КонецПроцедуры
&НаСервере
Процедура ОбработатьШтрихкодыСервер(СтруктураПараметровДействия,КэшированныеЗначения)
ШтрихкодированиеНоменклатурыСервер.ОбработатьШтрихкоды(ЭтотОбъект,Объект,СтруктураПараметровДействия,КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ПолучитьСсылкиНаОборудование()
РабочееМесто = МенеджерОборудованияВызовСервера.РабочееМестоКлиента();
ЭквайринговыеТерминалы.Очистить();
ЭквайринговыеТерминалы = Справочники.ЭквайринговыеТерминалы.ПараметрыЭквайринговыхТерминаловПоОрганизации(Объект.Организация, РабочееМесто, ИспользоватьПодключаемоеОборудование);
Если ИспользоватьПодключаемоеОборудование Тогда
Дисплеи.ЗагрузитьЗначения(МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам("ДисплейПокупателя"));
КонецЕсли;
ПараметрыКассыККМ = Новый ФиксированнаяСтруктура(Справочники.КассыККМ.ПараметрыКассыККМ(Объект.КассаККМ));
ВерсияФФД = МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетВерсиюФФД(ПараметрыКассыККМ.ИдентификаторУстройства);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуПодключенноеОборудованиеОбработчикОжидания()
РозничныеПродажиКлиент.ОткрытьФормуПодключенноеОборудование(ЭтотОбъект, Истина);
КонецПроцедуры
&НаКлиенте
Процедура НачатьПодключениеОборудованияОбработчикОжидания()
ОписаниеЗавершения = Новый ОписаниеОповещения("НачатьПодключениеОборудованиеПриОткрытииФормыЗавершение", РозничныеПродажиКлиент, Новый Структура("Форма", ЭтотОбъект));
МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(ОписаниеЗавершения, ЭтотОбъект, ПоддерживаемыеТипыПодключаемогоОборудования);
КонецПроцедуры
&НаКлиенте
Процедура ВывестиИнформациюНаДисплейПокупателя()
Если Не ВводДоступен() Тогда
Возврат;
КонецЕсли;
Если ВывестиКОплатеНаДисплейПокупателя Тогда
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
ДПТекст1 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(
НСтр("ru='К оплате:'"), ИнформацияОбОплате.СуммаКОплате);
ДПТекст2 = "";
Иначе
КоличествоСтрокВТЧ = Объект.Товары.Количество();
ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
Если ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ > 0 Тогда
ТекущиеДанные = Объект.Товары[КоличествоСтрокВТЧ - 1];
Элементы.Товары.ТекущаяСтрока = ТекущиеДанные.ПолучитьИдентификатор();
ИначеЕсли ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ = 0 Тогда
ТекущиеДанные = Неопределено;
Иначе
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
ДПТекст1 = НСтр("ru = 'Здравствуйте!'");
Если ТекущиеДанные <> Неопределено Тогда
ДПТекст1 = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(
ТекущиеДанные.Номенклатура,
ТекущиеДанные.Характеристика,
,
ТекущиеДанные.Серия);
КонецЕсли;
ДПТекст2 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(
НСтр("ru='Итог:'"), СуммаДокумента);
КонецЕсли;
РозничныеПродажиКлиент.ВывестиТекстНаДисплеиПокупателя(
ЭтотОбъект,
Дисплеи,
ДПТекст1 + Символы.ПС + ДПТекст2);
КонецПроцедуры
&НаКлиенте
Процедура ПоискПоШтрихкодуЗавершение(ДанныеШтрихкода, ДополнительныеПараметры) Экспорт
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Если ДанныеШтрихкода = Неопределено Тогда
Возврат;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("СтандартнаяОбработка", Истина);
ДополнительныеПараметры.Вставить("ДанныеШтрихкода", ДанныеШтрихкода);
ДополнительныеПараметры.Вставить("КэшированныеЗначения", КэшированныеЗначения);
ДополнительныеПараметры.Вставить("ТребуетсяСерверныйВызов", Ложь);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ТоварыПоискПоШтрихкоду", ДополнительныеПараметры);
Если ДополнительныеПараметры.ТребуетсяСерверныйВызов Тогда
ПоискПоШтрихкодуЗавершениеНаСервере(ДополнительныеПараметры);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ЗавершитьОбработкуШтрихкода", ДополнительныеПараметры);
КонецЕсли;
Если ДополнительныеПараметры.СтандартнаяОбработка Тогда
ДанныеШтрихкодов = Новый Массив;
ДанныеШтрихкодов.Добавить(ДанныеШтрихкода);
ОбработатьШтрихкоды(ДанныеШтрихкодов);
КонецЕсли;
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ДополнительныеПараметры, "РезультатОбработкиШтрихкода") Тогда
АктивироватьСтрокуСПозицией(ДополнительныеПараметры.РезультатОбработкиШтрихкода);
КонецЕсли;
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
Если Не ДополнительныеПараметры.СтандартнаяОбработка
И ДополнительныеПараметры.РезультатОбработкиШтрихкода.ОткрытьФормуВводаКодаМаркировки = Ложь
И ЗначениеЗаполнено(ДанныеДляОбработки()) Тогда
Подключаемый_ПослеОбработкиШтрихкодов();
Иначе
ПересчитатьДокументНаКлиенте();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура АктивироватьСтрокуСПозицией(Знач РезультатОбработки)
Если РезультатОбработки.ДанныеШтрихкода = Неопределено Тогда
Возврат;
КонецЕсли;
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", РезультатОбработки.ДанныеШтрихкода.Номенклатура);
Отбор.Вставить("Штрихкод", РезультатОбработки.ДанныеШтрихкода.Штрихкод);
МассивСтрок = Объект.Товары.НайтиСтроки(Отбор);
Если МассивСтрок.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = МассивСтрок[0].ПолучитьИдентификатор();
КонецЕсли;
Если МассивСтрок.Количество() = 0 Тогда
Отбор.Удалить("Штрихкод");
МассивСтрок = Объект.Товары.НайтиСтроки(Отбор);
Если МассивСтрок.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = МассивСтрок[0].ПолучитьИдентификатор();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПоискПоШтрихкодуЗавершениеНаСервере(ДополнительныеПараметры)
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработатьДанныеШтрихкода", ДополнительныеПараметры);
ПослеОбработкиШтрихкодов(ДополнительныеПараметры);
ДополнительныеПараметры.РезультатОбработкиШтрихкода.ДобавленныеСтроки = Новый Массив;
ДополнительныеПараметры.РезультатОбработкиШтрихкода.ИзмененныеСтроки = Новый Массив;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаКодаМаркировкиВыполнитьДействие(Результат, ДополнительныеПараметры) Экспорт
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработкаКодаМаркировкиВыполнитьДействие", Результат);
ОбработкаКодаМаркировкиВыполнитьДействиеСервер(Результат);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ЗавершитьОбработкуШтрихкода", Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОткрытьФормуУточненияДанных()
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ДанныеДляОбработки", ДанныеДляОбработки());
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "Подключаемый_ОткрытьФормуУточненияДанных", ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПослеОбработкиШтрихкодов()
ИзменятьКоличество = Не ТолькоПросмотр;
ШтрихкодированиеНоменклатурыКлиент.ОбработатьНеизвестныеШтрихкоды(ДанныеДляОбработки(),КэшированныеЗначения,ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("КэшированныеЗначения", КэшированныеЗначения);
ДополнительныеПараметры.Вставить("ДанныеДляОбработки", ДанныеДляОбработки);
ДополнительныеПараметры.Вставить("СтандартнаяОбработка", Истина);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПослеОбработкиШтрихкодов", ДополнительныеПараметры);
КэшированныеЗначения = ДополнительныеПараметры.КэшированныеЗначения;
Если Не ДополнительныеПараметры.СтандартнаяОбработка Тогда
Возврат;
КонецЕсли;
Если ШтрихкодированиеНоменклатурыКлиент.НужноОткрытьФормуУказанияСерийПослеОбработкиШтрихкодов(ДанныеДляОбработки()) Тогда
ТекущиеДанныеИдентификатор = ДанныеДляОбработки().МассивСтрокССериями[0];
Если ТекущиеДанныеИдентификатор <> Неопределено Тогда
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(ТекущиеДанныеИдентификатор);
Элементы.Товары.ТекущаяСтрока = ТекущиеДанныеИдентификатор;
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.Товары, ЭтотОбъект);
ОткрытьПодборСерий(,ТекущиеДанные);
КонецЕсли;
КонецЕсли;
Если ИзменятьКоличество Тогда
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
КонецЕсли;
Если ДанныеДляОбработки().ТекущаяСтрока <> Неопределено Тогда
Элементы.Товары.ТекущаяСтрока = ДанныеДляОбработки().ТекущаяСтрока;
КонецЕсли;
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаСервере
Процедура ОбработатьСтрокиТЧ(ДобавленныеСтроки, ИзмененныеСтроки, КэшированныеЗначения = Неопределено) Экспорт
ЗаполнитьПризнакХарактеристикиИспользуются = Новый Структура("Номенклатура", "ХарактеристикиИспользуются");
ЗаполнитьПризнакТипНоменклатуры = Новый Структура("Номенклатура", "ТипНоменклатуры");
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажиПоАссортименту",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
ИначеЕсли ИспользуетсяЦенообразование25 Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьУсловияРозничныхПродаж",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийРозничныхПродажВСтрокеТЧ(
Объект, ОбъектХраненияУсловийПродаж));
Иначе
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажи",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
Если ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата) Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются",
ЗаполнитьПризнакХарактеристикиИспользуются);
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакТипНоменклатуры", ЗаполнитьПризнакТипНоменклатуры);
СтруктураДействийСДобавленнымиСтроками.Вставить("НоменклатураПриИзмененииПереопределяемый",
Новый Структура("ИмяФормы, ИмяТабличнойЧасти", ИмяФормы, "Товары"));
ДобавитьВСтруктуруДействияПриИзмененииКоличестваЕдиниц(СтруктураДействийСДобавленнымиСтроками, Объект);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(
ЭтотОбъект, "Номенклатура", СтруктураДействийСДобавленнымиСтроками);
СтруктураДействийОкругление = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийОкругление, Объект);
СтрокиСОкруглением = Новый Массив();
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ДобавленныеСтроки,
СтруктураДействийСДобавленнымиСтроками,
Объект.Товары);
Для Каждого СтрокаТЧ Из ДобавленныеСтроки Цикл
Если СтрокаТЧ.КоличествоУпаковок > СтрокаТЧ.Количество И СтрокаТЧ.КоличествоУпаковок <> Окр(СтрокаТЧ.КоличествоУпаковок) Тогда
КоэффициентУпаковки = (СтрокаТЧ.КоличествоУпаковок / СтрокаТЧ.Количество);
Если Окр(Окр(СтрокаТЧ.КоличествоУпаковок) / КоэффициентУпаковки, 3) = СтрокаТЧ.Количество Тогда
СтрокаТЧ.КоличествоУпаковок = Окр(СтрокаТЧ.КоличествоУпаковок);
СтрокиСОкруглением.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЕсли;
КонецЦикла;
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваЕдиниц(СтруктураДействийСИзмененнымиСтроками, Объект);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ИзмененныеСтроки,
СтруктураДействийСИзмененнымиСтроками,
Объект.Товары);
Для Каждого СтрокаТЧ Из ИзмененныеСтроки Цикл
Если СтрокаТЧ.КоличествоУпаковок > СтрокаТЧ.Количество И СтрокаТЧ.КоличествоУпаковок <> Окр(СтрокаТЧ.КоличествоУпаковок) Тогда
КоэффициентУпаковки = (СтрокаТЧ.КоличествоУпаковок / СтрокаТЧ.Количество);
Если Окр(Окр(СтрокаТЧ.КоличествоУпаковок) / КоэффициентУпаковки, 3) = СтрокаТЧ.Количество Тогда
СтрокаТЧ.КоличествоУпаковок = Окр(СтрокаТЧ.КоличествоУпаковок);
СтрокиСОкруглением.Добавить(СтрокаТЧ);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
СтрокиСОкруглением,
СтруктураДействийОкругление,
Объект.Товары);
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
Если ДобавленныеСтроки.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = ДобавленныеСтроки[ДобавленныеСтроки.Количество() - 1].ПолучитьИдентификатор();
ИначеЕсли ИзмененныеСтроки.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = ИзмененныеСтроки[ИзмененныеСтроки.Количество() - 1].ПолучитьИдентификатор();
КонецЕсли;
Если ДобавленныеСтроки.Количество()>0 Или ИзмененныеСтроки.Количество()>0 Тогда
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПослеОбработкиШтрихкодов(ДополнительныеПараметры)
РезультатОбработкиШтрихкода = ДополнительныеПараметры.РезультатОбработкиШтрихкода;
КэшированныеЗначения = ДополнительныеПараметры.КэшированныеЗначения;
Если КэшированныеЗначения = Неопределено Тогда
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
КонецЕсли;
Если КэшированныеЗначения.ПравоРегистрацииШтрихкодовНоменклатурыДоступно = Неопределено Тогда
ПравоРегистрации = ШтрихкодированиеНоменклатурыСервер.ПравоРегистрацииШтрихкодовНоменклатурыДоступно();
КэшированныеЗначения.ПравоРегистрацииШтрихкодовНоменклатурыДоступно = ПравоРегистрации;
КонецЕсли;
Если РезультатОбработкиШтрихкода.ТребуетсяОбработкаШтрихкода Тогда
ЗагрузкаИзТСД = Ложь;
Если ТипЗнч(РезультатОбработкиШтрихкода.ИсходныеДанные) = Тип("Структура") Тогда
ДанныеШтрихкодов = Новый Массив;
ДанныеШтрихкодов.Добавить(РезультатОбработкиШтрихкода.ИсходныеДанные);
Иначе
ДанныеШтрихкодов = РезультатОбработкиШтрихкода.ИсходныеДанные;
КонецЕсли;
ИзменятьКоличество = Не ТолькоПросмотр;
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
Если КонтролироватьАссортимент Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
ИначеЕсли ИспользуетсяЦенообразование25 Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьУсловияРозничныхПродаж", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийРозничныхПродажВСтрокеТЧ(Объект, ОбъектХраненияУсловийПродаж));
Иначе
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
Если ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата) Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСДобавленнымиСтроками, Объект);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействийСДобавленнымиСтроками);
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСИзмененнымиСтроками,Объект);
ДанныеДляОбработки = ШтрихкодированиеНоменклатурыКлиентСервер.ПараметрыОбработкиШтрихкодов();
ДанныеДляОбработки.Штрихкоды = ДанныеШтрихкодов;
ДанныеДляОбработки.СтруктураДействийСДобавленнымиСтроками = СтруктураДействийСДобавленнымиСтроками;
ДанныеДляОбработки.СтруктураДействийСИзмененнымиСтроками = СтруктураДействийСИзмененнымиСтроками;
ДанныеДляОбработки.ПараметрыУказанияСерий = ПараметрыУказанияСерий;
ДанныеДляОбработки.ИзменятьКоличество = ИзменятьКоличество;
ДанныеДляОбработки.РассчитыватьНаборы = Истина;
ДанныеДляОбработки.МаркируемаяПродукцияВТЧ = Истина;
ДанныеДляОбработки.ШтрихкодыВТЧ = Истина;
ДанныеДляОбработки.ЗагрузкаИзТСД = ЗагрузкаИзТСД;
Если КонтролироватьАссортимент Тогда
СтруктураПроверкиАссортимента = АссортиментКлиентСервер.ПараметрыПроверкиАссортимента();
СтруктураПроверкиАссортимента.Ссылка = Объект.Ссылка;
СтруктураПроверкиАссортимента.Склад = Объект.Склад;
СтруктураПроверкиАссортимента.Дата = Объект.Дата;
СтруктураПроверкиАссортимента.ТекстСообщения = НСтр("ru = 'Товар %1 не включен в ассортимент магазина или запрещен к продаже.'");
СтруктураПроверкиАссортимента.ИмяРесурсаАссортимента = "РазрешеныПродажи";
СтруктураПроверкиАссортимента.ПровереноМожноДобавлять = Истина;
СтруктураПроверкиАссортимента.РазрешатьДобавление = Ложь;
ДанныеДляОбработки.ПараметрыПроверкиАссортимента = СтруктураПроверкиАссортимента;
КонецЕсли;
ОбработатьШтрихкодыСервер(ДанныеДляОбработки, КэшированныеЗначения);
Иначе
ОбработатьДобавлениеСтрокСоВскрытымиПотребительскимиУпаковкамиЛокализация(
РезультатОбработкиШтрихкода.ДобавленныеСтроки,
РезультатОбработкиШтрихкода.ИзмененныеСтроки);
ОбработатьСтрокиТЧ(
РезультатОбработкиШтрихкода.ДобавленныеСтроки,
РезультатОбработкиШтрихкода.ИзмененныеСтроки,
КэшированныеЗначения);
КонецЕсли;
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
Возврат РезультатОбработкиШтрихкода;
КонецФункции
&НаКлиенте
Процедура ЗагрузитьИзТСДЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат.Результат Тогда
ОбработатьШтрихкоды(Результат.ТаблицаТоваров, Истина);
Иначе
МенеджерОборудованияУТКлиент.СообщитьОбОшибке(Результат);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьВесЗавершение(РезультатВыполнения, ТекущаяСтрока) Экспорт
Если РезультатВыполнения.Результат Тогда
ТекущаяСтрока.КоличествоУпаковок = РезультатВыполнения.Вес;
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействий,Объект);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
Иначе
МенеджерОборудованияУТКлиент.СообщитьОбОшибке(РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ДанныеДляОбработки()
Возврат ДанныеДляОбработки;
КонецФункции
&НаСервере
Процедура ОбработкаКодаМаркировкиВыполнитьДействиеСервер(Результат)
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработкаКодаМаркировкиВыполнитьДействиеСервер", Результат);
ПослеОбработкиШтрихкодов(Результат);
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "ОбработкаКодаМаркировкиВыполнитьДействиеЗавершениеСервер", Результат);
КонецПроцедуры
#КонецОбласти
#Область Серии
&НаСервере
Процедура УстановитьВидимостьЭлементовСерий()
Элементы.ТоварыСтатусУказанияСерий.Видимость = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
Элементы.ТоварыСерия.Видимость = ПараметрыУказанияСерий.УчитыватьСебестоимостьПоСериям;
Элементы.ТоварыСерияДополнительно.Видимость = ПараметрыУказанияСерий.УчитыватьСебестоимостьПоСериям;
Элементы.УказатьСерии.Видимость = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСтатусыУказанияСерийПриОкончанииРедактированияСтрокиТЧ(ТекущаяСтрокаИдентификатор, КэшированныеЗначения)
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерийПриОкончанииРедактированияСтрокиТЧ(
Объект,
ПараметрыУказанияСерий,
ТекущаяСтрокаИдентификатор,
КэшированныеЗначения);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПодборСерий(Текст = "", ТекущиеДанные = Неопределено, ОповещениеПриЗавершении = Неопределено)
Если НоменклатураКлиент.ДляУказанияСерийНуженСерверныйВызов(ЭтотОбъект,ПараметрыУказанияСерий,Текст, ТекущиеДанные)Тогда
Если ТекущиеДанные = Неопределено Тогда
ТекущиеДанныеИдентификатор = Элементы.Товары.ТекущиеДанные.ПолучитьИдентификатор();
Иначе
ТекущиеДанныеИдентификатор = ТекущиеДанные.ПолучитьИдентификатор();
КонецЕсли;
ПараметрыФормыУказанияСерий = ПараметрыФормыУказанияСерий(ТекущиеДанныеИдентификатор);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПараметрыФормыУказанияСерий", ПараметрыФормыУказанияСерий);
ДополнительныеПараметры.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
ОткрытьФорму(
ПараметрыФормыУказанияСерий.ИмяФормы,
ПараметрыФормыУказанияСерий,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ОткрытьПодборСерийЗавершение", ЭтотОбъект, ДополнительныеПараметры),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПодборСерийЗавершение(Результат, ДополнительныеПараметры) Экспорт
ПараметрыФормыУказанияСерий = ДополнительныеПараметры.ПараметрыФормыУказанияСерий;
Если Результат <> Неопределено Тогда
ОбработатьУказаниеСерийСервер(ПараметрыФормыУказанияСерий);
КонецЕсли;
Если ДополнительныеПараметры.Свойство("ОповещениеПриЗавершении") Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеПриЗавершении);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПараметрыФормыУказанияСерий(ТекущиеДанныеИдентификатор)
Возврат НоменклатураСервер.ПараметрыФормыУказанияСерий(Объект, ПараметрыУказанияСерий, ТекущиеДанныеИдентификатор, ЭтотОбъект);
КонецФункции
&НаСервере
Процедура ОбработатьУказаниеСерийСервер(ПараметрыФормыУказанияСерий)
НоменклатураСервер.ОбработатьУказаниеСерий(Объект, ПараметрыУказанияСерий, ПараметрыФормыУказанияСерий);
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Серии");
КонецПроцедуры
#КонецОбласти
#Область КомандыРаботыСЧеком
&НаСервере
Функция ЗарезервироватьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, СтатусДокумента, ПередЗакрытием = Ложь)
РезервированиеВыполнено = Истина;
СтароеЗначениеСтатуса = Объект.Статус;
СтароеЗначениеПолученоНаличными = Объект.ПолученоНаличными;
Объект.Статус = Перечисления.СтатусыЧековККМ[СтатусДокумента];
Если ПередЗакрытием Тогда
Объект.ПолученоНаличными = 0;
КонецЕсли;
Если ИспользоватьАвтоматическиеСкидкиВПродажах
И ПараметрыПримененияСкидок.НазначеныСкидки
И Не ПередЗакрытием Тогда
ОтменитьСкидкиНаценкиНаСервере();
КонецЕсли;
РезервированиеВыполнено = ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не РезервированиеВыполнено Тогда
Объект.Статус = СтароеЗначениеСтатуса;
Объект.ПолученоНаличными = СтароеЗначениеПолученоНаличными;
КонецЕсли;
Возврат РезервированиеВыполнено;
КонецФункции
&НаКлиенте
Процедура ЗарезервироватьНаКлиенте(РезультатОтложенДо, ДополнительныеПараметры) Экспорт
Если НЕ ЗначениеЗаполнено(РезультатОтложенДо) Тогда
Возврат;
ИначеЕсли РезультатОтложенДо < Объект.Дата Тогда
ТекстПредупреждения = НСтр("ru = 'Дата резерва должна быть не меньше даты чека %ДатаЧека%'");
ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%ДатаЧека%", Объект.Дата);
ПоказатьПредупреждение(, ТекстПредупреждения);
Возврат;
КонецЕсли;
Объект.ОтложенДо = РезультатОтложенДо;
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
СтатусДокумента = "ОтложенСРезервированием";
Результат = ЗарезервироватьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, СтатусДокумента, Истина);
Если Не Результат Тогда
ДополнительныеПараметрыПовторЗаписи = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыПовторЗаписи.ОписаниеОповещения = ДополнительныеПараметры.ОповещениеПриЗавершении;
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения = НСтр("ru = 'После выполнения операции отмены оплаты не удалось записать документ.'");
ДополнительныеПараметрыПовторЗаписи.ВозвращатьРезультатФункции = Истина;
ДополнительныеПараметрыПовторЗаписи.ИмяПроцедуры = "ЗарезервироватьНаСервере";
ДополнительныеПараметрыПовторЗаписи.РезультатОперации = Результат;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыПовторЗаписи);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыПовторЗаписи),
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеПриЗавершении, Результат);
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ОтложитьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи)
ОтложитьВыполнено = Истина;
СтарыйСтатус = Объект.Статус;
Объект.Статус = Перечисления.СтатусыЧековККМ.ОтложенБезРезервирования;
Если ИспользоватьАвтоматическиеСкидкиВПродажах
И ПараметрыПримененияСкидок.НазначеныСкидки
И СуммаСБПВыполнена = 0
И СуммаСБПОжидание = 0 Тогда
ОтменитьСкидкиНаценкиНаСервере();
КонецЕсли;
Попытка
ОтложитьВыполнено = ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ОтложитьВыполнено Тогда
Объект.Статус = СтарыйСтатус;
КонецЕсли;
Исключение
Объект.Статус = СтарыйСтатус;
ОтложитьВыполнено = Ложь;
КонецПопытки;
Возврат ОтложитьВыполнено;
КонецФункции
&НаКлиенте
Процедура ОтложитьНаКлиенте(ОповещениеПриЗавершении)
Объект.ОтложенДо = Дата(1,1,1);
Модифицированность = Истина;
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
Результат = ОтложитьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не Результат Тогда
ДополнительныеПараметрыПопытка = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыПопытка.ОписаниеОповещения = ОповещениеПриЗавершении;
ДополнительныеПараметрыПопытка.ТекстСообщения = НСтр("ru = 'После выполнения операции отмены оплаты не удалось записать документ.'");
ДополнительныеПараметрыПопытка.ВозвращатьРезультатФункции = Истина;
ДополнительныеПараметрыПопытка.ИмяПроцедуры = "ОтложитьНаСервере";
ДополнительныеПараметрыПопытка.РезультатОперации = Результат;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыПопытка);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыПопытка),
ДополнительныеПараметрыПопытка.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ВыполнитьЧастьРасчетаНаСервере(ВозвращенноеЗначениеУправляемыеСкидки, ТребуетсяПовторнаяПопыткаЗаписи)
Результат = Истина;
СтруктураСообщений = Неопределено;
Если Не КонтрольНаСкладеОтключен Тогда
СтатусДокумента = "КОплате";
ТоварЗарезервирован = ЗарезервироватьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, СтатусДокумента);
Если Не ТоварЗарезервирован Тогда
Результат = Ложь;
КонецЕсли;
КонецЕсли;
Если Результат
И ИспользоватьАвтоматическиеСкидкиВПродажах
И ПараметрыПримененияСкидок.НазначеныСкидки Тогда
Если ПараметрыПримененияСкидок.НазначеныУправляемыеСкидки Тогда
УправляемыеСкидки = ВозвращенноеЗначениеУправляемыеСкидки;
СтруктураПараметры = Новый Структура;
СтруктураПараметры.Вставить("ПрименятьКОбъекту", Истина);
СтруктураПараметры.Вставить("ТолькоПредварительныйРасчет", Ложь);
СтруктураПараметры.Вставить("ВосстанавливатьУправляемыеСкидки", Истина);
СтруктураПараметры.Вставить("УправляемыеСкидки", УправляемыеСкидки);
Иначе
СтруктураПараметры = Новый Структура;
СтруктураПараметры.Вставить("ПрименятьКОбъекту", Истина);
СтруктураПараметры.Вставить("ТолькоПредварительныйРасчет", Ложь);
СтруктураПараметры.Вставить("ВосстанавливатьУправляемыеСкидки", Ложь);
СтруктураПараметры.Вставить("УправляемыеСкидки", Неопределено);
КонецЕсли;
СтруктураСообщений = РассчитатьСкидкиНаценкиНаСервере(СтруктураПараметры);
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если СтрокаТЧ.Сумма = 0 И СтрокаТЧ.Цена * СтрокаТЧ.КоличествоУпаковок > 0 Тогда
ОбщегоНазначения.СообщитьПользователю(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Не корректно настроены скидки (наценки). После расчета скидок (наценок) сумма в строке %1 равна нулю.'"), СтрокаТЧ.НомерСтроки), Объект.Ссылка, "Объект.Товары");
Результат = Ложь;
КонецЕсли;
КонецЦикла;
Если Не Результат Тогда
ОтменитьСкидкиНаценкиНаСервере();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Новый Структура("РасчетВыполненУспешно, СтруктураСообщений", Результат, СтруктураСообщений);
КонецФункции
&НаКлиенте
Процедура ПересчитатьДокументНаКлиенте()
Элементы.ВозвратТовара.Доступность = ПраваДоступа.ВозвратТовара;
Элементы.ВозвратТовараБезЧека.Доступность = ПраваДоступа.ВозвратТовара;
Элементы.ПоискПоШтрихкоду.Доступность = Истина;
Элементы.СчитатьКартуЛояльности.Доступность = Истина;
Элементы.ОткрытьПодбор.Доступность = Истина;
Элементы.ОтменитьОплатыПлатежнымиКартами.Доступность = Истина;
Элементы.ФормаБыстрыеТовары.Доступность = Истина;
Элементы.БыстрыеТовары.Доступность = Истина;
Элементы.РассчитатьСкидки.Доступность = Истина;
Элементы.ГруппаНижняяКоманднаяПанельКонтекстныеКоманды.Доступность = Истина;
Элементы.КонтекстноеМенюОбластьКорзиныТоварыДобавить.Доступность = Истина;
Элементы.КонтекстноеМенюОбластьКорзиныТоварыСкопировать.Доступность = Истина;
Элементы.Товары.ИзменятьСоставСтрок = ПраваДоступа.КорректировкаСтрок;
Элементы.ТоварыКоличествоУпаковок.ТолькоПросмотр = Не ПраваДоступа.КорректировкаСтрок;
Элементы.ТоварыНоменклатура.ТолькоПросмотр = Не ПраваДоступа.КорректировкаСтрок;
Элементы.ТоварыШтрихкод.ТолькоПросмотр = Не ПраваДоступа.КорректировкаСтрок;
Элементы.ТоварыХарактеристика.ТолькоПросмотр = Не ПраваДоступа.КорректировкаСтрок;
Элементы.ТоварыПродавец.ТолькоПросмотр = Не ПраваДоступа.КорректировкаСтрок;
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПраваДоступа");
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
УправлениеДоступностьюКнопокОплаты(ЭтотОбъект, ИнформацияОбОплате);
ПересчитатьДокументНаКлиентеЛокализация(ИнформацияОбОплате);
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
КонецПроцедуры
&НаСервере
Процедура НовыйЧекНаСервере(Ссылка = Неопределено)
Если Ссылка = Неопределено Тогда
НовыйЧек = Документы.ЧекККМ.СоздатьДокумент();
НовыйЧек.Партнер = Справочники.Партнеры.РозничныйПокупатель;
НовыйЧек.ОбработкаЗаполнения(Новый Структура("КассаККМ", Объект.КассаККМ), Истина);
Иначе
НовыйЧек = Ссылка.ПолучитьОбъект();
КонецЕсли;
НовыйЧек.Дата = ТекущаяДатаСеанса();
РазблокироватьДанныеФормыДляРедактирования();
Кассир = ?(ЗначениеЗаполнено(Объект.Кассир), Объект.Кассир, НовыйЧек.Кассир);
ЗначениеВДанныеФормы(НовыйЧек, Объект);
Прочитать();
Если Ссылка = Неопределено Тогда
СобытияФорм.ПриЧтенииНаСервере(ЭтотОбъект, НовыйЧек);
КонецЕсли;
Объект.Кассир = Кассир;
ТолькоПросмотр = Ложь;
Модифицированность = Ложь;
ВывестиКОплатеНаДисплейПокупателя = Ложь;
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМ));
ПриСозданииЧека();
КонецПроцедуры
#КонецОбласти
#Область Оплата
&НаКлиенте
Процедура ОплатитьНаличнымиОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ОбновитьСостояниеКассовойСмены();
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОплатитьНаличнымиЗавершениеРасчета", ЭтотОбъект));
Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.Свойство("ВыбраннаяФормаОплаты") Тогда
ПараметрыРасчета.Вставить("ВыбраннаяФормаОплаты", ДополнительныеПараметры.ВыбраннаяФормаОплаты);
КонецЕсли;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьРасчет", ЭтотОбъект, ПараметрыРасчета);
НачатьВыполнениеДополнительныхДействийПередОплатойЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьНаличнымиЗавершениеРасчета(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Ложь Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОткрытьФормуОплатыНаличными", ЭтотОбъект),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуОплатыНаличными(ИзмененныеДанныеЗаписаны, ДополнительныеПараметры) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("ИнформацияОбОплате", ИнформацияОбОплате(ЭтотОбъект));
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("ДоступнаПередачаДанных", ПараметрыКассыККМ.ДоступнаПередачаДанных);
ДопПараметрыОповещения = Новый Структура("ВызовИзФормыРМК", Истина);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаОплатыНаличными",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ЗавершениеОплаты", ЭтотОбъект, ДопПараметрыОповещения));
КонецПроцедуры
&НаКлиенте
Процедура СмешаннаяОплатаОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ВывестиКОплатеНаДисплейПокупателя = Истина;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("СмешаннаяОплатаЗавершениеРасчета", ЭтотОбъект));
Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.Свойство("ВыбраннаяФормаОплаты") Тогда
ПараметрыРасчета.Вставить("ВыбраннаяФормаОплаты", ДополнительныеПараметры.ВыбраннаяФормаОплаты);
ОбновитьДаннныеОФормеОплаты(ЭтотОбъект, ДополнительныеПараметры.ВыбраннаяФормаОплаты);
КонецЕсли;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьРасчет", ЭтотОбъект, ПараметрыРасчета);
НачатьВыполнениеДополнительныхДействийПередОплатойЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура СмешаннаяОплатаЗавершениеРасчета(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Ложь Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОткрытьФормуСмешаннойОплаты", ЭтотОбъект, Результат),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуСмешаннойОплаты(ИзмененныеДанныеЗаписаны, ДоступныеВидыОплаты) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ВывестиКОплатеНаДисплейПокупателя = Истина;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("ИнформацияОбОплате", ИнформацияОбОплате(ЭтотОбъект));
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("ДоступнаПередачаДанных", ПараметрыКассыККМ.ДоступнаПередачаДанных);
Если ДоступныеВидыОплаты <> Неопределено Тогда
ПараметрыОткрытияФормы.ИнформацияОбОплате.ДоступныеВидыОплаты = ДоступныеВидыОплаты;
КонецЕсли;
ДопПараметрыОповещения = Новый Структура("ВызовИзФормыРМК", Истина);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаСмешаннойОплаты",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ЗавершениеОплаты", ЭтотОбъект, ДопПараметрыОповещения));
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьПлатежнойКартойОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОплатитьПлатежнойКартойЗавершениеРасчета", ЭтотОбъект));
Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.Свойство("ВыбраннаяФормаОплаты") Тогда
ПараметрыРасчета.Вставить("ВыбраннаяФормаОплаты", ДополнительныеПараметры.ВыбраннаяФормаОплаты);
КонецЕсли;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьРасчет", ЭтотОбъект, ПараметрыРасчета);
НачатьВыполнениеДополнительныхДействийПередОплатойЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьПлатежнойКартойЗавершениеРасчета(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Ложь Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ДобавитьОплатуКартой", ЭтотОбъект),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаСервере
Процедура АнализВозможностиОплатыБонуснымиБаллами(НастроитьРМК = Ложь)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КартыЛояльности.Владелец.БонуснаяПрограммаЛояльности КАК БонуснаяПрограммаЛояльности
|ИЗ
| Справочник.КартыЛояльности КАК КартыЛояльности
|ГДЕ
| КартыЛояльности.Ссылка = &КартаЛояльности";
Запрос.УстановитьПараметр("КартаЛояльности", Объект.КартаЛояльности);
БонуснаяПрограммаЗаполнена = Ложь;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
БонуснаяПрограммаЗаполнена = ЗначениеЗаполнено(Выборка.БонуснаяПрограммаЛояльности);
КонецЕсли;
ИспользоватьБонусныеПрограммыЛояльности = ПолучитьФункциональнуюОпцию("ИспользоватьБонусныеПрограммыЛояльности") И БонуснаяПрограммаЗаполнена;
Если НастроитьРМК Тогда
НастроитьРМК();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьБонуснымиБалламиОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ДобавитьОплатуБонуснымиБаллами", ЭтотОбъект),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьОплатуБонуснымиБаллами(ИзмененныеДанныеЗаписаны, ПараметрыЗавершения) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
Если ПараметрыЗавершения <> Неопределено Тогда
Объект.ПолученоНаличными = ПараметрыЗавершения.ПолученоНаличными;
КонецЕсли;
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("КартаЛояльности", Объект.КартаЛояльности);
ПараметрыОткрытияФормы.Вставить("АдресТабличнойЧастиТовары", АдресТабличнойЧастиТовары());
ПараметрыОткрытияФормы.Вставить("Валюта", Объект.Валюта);
ОткрытьФорму(
"Справочник.БонусныеПрограммыЛояльности.Форма.ОплатаБонуснымиБаллами",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ДобавитьОплатуБонуснымиБалламиЗавершение", ЭтотОбъект, ПараметрыЗавершения));
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьОплатуБонуснымиБалламиЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Не ЗначениеЗаполнено(Результат) Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
Возврат;
КонецЕсли;
ПрименитьОплатуБонуснымиБаллами(Результат.АдресВоВременномХранилище);
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьПодарочнымСертификатомОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОплатитьПодарочнымСертификатомЗавершениеРасчета", ЭтотОбъект));
Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.Свойство("ВыбраннаяФормаОплаты") Тогда
ПараметрыРасчета.Вставить("ВыбраннаяФормаОплаты", ДополнительныеПараметры.ВыбраннаяФормаОплаты);
КонецЕсли;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьРасчет", ЭтотОбъект, ПараметрыРасчета);
НачатьВыполнениеДополнительныхДействийПередОплатойЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьПодарочнымСертификатомЗавершениеРасчета(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Ложь Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ДобавитьОплатуПодарочнымСертификатом", ЭтотОбъект),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьОплатуПодарочнымСертификатом(ИзмененныеДанныеЗаписаны, ПараметрыЗавершения) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
Если ПараметрыЗавершения <> Неопределено Тогда
Объект.ПолученоНаличными = ПараметрыЗавершения.ПолученоНаличными;
КонецЕсли;
ВывестиКОплатеНаДисплейПокупателя = Истина;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
АдресТаблицыТоваровДляАнализаВозможностиОплаты = ПодарочныеСертификатыВызовСервера.АдресТабличнойЧастиТоварыДляАнализаВозможностиОплатыПодарочнымиСертификатами(Объект.Ссылка, УникальныйИдентификатор);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("АдресВХранилище", АдресТабличнойЧастьПодарочныеСертификаты());
Если ЗначениеЗаполнено(АдресТаблицыТоваровДляАнализаВозможностиОплаты) Тогда
ПараметрыОткрытияФормы.Вставить("АдресВХранилищеТовары", АдресТаблицыТоваровДляАнализаВозможностиОплаты);
КонецЕсли;
ПараметрыОткрытияФормы.Вставить("Валюта", Объект.Валюта);
ПараметрыОткрытияФормы.Вставить("Организация", Объект.Организация);
ПараметрыОткрытияФормы.Вставить("Доплатить", ИнформацияОбОплате.СуммаКОплате - ИнформацияОбОплате.ИтогоОплачено);
ПараметрыОткрытияФормы.Вставить("ПоказыватьИтогОсталосьДоплатить", Истина);
ПараметрыОткрытияФормы.Вставить("РегистрироватьНовые", Ложь);
ПараметрыОткрытияФормы.Вставить("Отбор", Новый Структура);
МассивОтбора = Новый Массив();
МассивОтбора.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыПодарочныхСертификатов.ЧастичноПогашен"));
МассивОтбора.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыПодарочныхСертификатов.Активирован"));
ПараметрыОткрытияФормы.Отбор.Вставить("Статус", МассивОтбора);
ПараметрыОткрытияФормы.Отбор.Вставить("Организация", Объект.Организация);
ПараметрыОткрытияФормы.Отбор.Вставить("ТипОперации", ПодарочныеСертификатыКлиентСервер.ТипОперацииПоПодарочнымСертификатам(Объект));
ПараметрыОткрытияФормы.Вставить("ОписаниеОповещенияОЗакрытии", Новый ОписаниеОповещения("ДобавитьОплатуПодарочнымСертификатомЗавершение", ЭтотОбъект, ПараметрыЗавершения));
ПодарочныеСертификатыКлиент.ОткрытьФормуПодбораПодарочныхСертификатов(ЭтотОбъект, ПараметрыОткрытияФормы);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьОплатуПодарочнымСертификатомЗавершение(АдресВХранилище, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(АдресВХранилище) Тогда
ЗагрузитьТабличнуюЧастьПодарочныеСертификатыИзХранилища(АдресВХранилище);
КонецЕсли;
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеОплаты(РезультатОплаты, ДополнительныеПараметры) Экспорт
Если РезультатОплаты <> Неопределено И РезультатОплаты <> "Отмена" Тогда
Объект.ПолученоНаличными = РезультатОплаты.ПолученоНаличными;
Объект.Партнер = РезультатОплаты.ДанныеЭлектронногоЧека.Партнер;
ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = РезультатОплаты.ДанныеЭлектронногоЧека.ВариантОтправкиЭлектронногоЧека;
ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = РезультатОплаты.ДанныеЭлектронногоЧека.КонтактныеДанныеЭлектронногоЧека;
ИначеЕсли РезультатОплаты = "Отмена" Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
ИначеЕсли ТипЗнч(ДополнительныеПараметры) = Тип("Структура")
И ДополнительныеПараметры.Свойство("ЗавершениеРаботы")
И ДополнительныеПараметры.ЗавершениеРаботы = Истина Тогда
ПринудительноеЗавершениеРаботы = Истина;
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ОбновитьДаннныеОФормеОплаты(ЭтотОбъект, ИнформацияОбОплате(ЭтотОбъект));
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
КонецПроцедуры
#Область ОплатаСлужебные
&НаКлиентеНаСервереБезКонтекста
Функция ИнформацияОбОплате(Форма)
Форма.СуммаДокумента = ЦенообразованиеКлиентСервер.ПолучитьСуммуДокумента(Форма.Объект.Товары, Форма.Объект.ЦенаВключаетНДС);
СуммаСкидки = Форма.Объект.Товары.Итог("СуммаРучнойСкидки")
+ Форма.Объект.Товары.Итог("СуммаАвтоматическойСкидки");
СуммаСкидкиБонусныеБаллы = Форма.Объект.Товары.Итог("СуммаБонусныхБалловКСписаниюВВалюте");
Если Форма.Объект.ЦенаВключаетНДС Тогда
СуммаБезСкидки = Форма.СуммаДокумента + СуммаСкидки + СуммаСкидкиБонусныеБаллы;
Иначе
СуммаБезСкидки = Форма.СуммаДокумента - Форма.Объект.Товары.Итог("СуммаНДС") + СуммаСкидки + СуммаСкидкиБонусныеБаллы;
КонецЕсли;
СуммаКОплате = СуммаБезСкидки - СуммаСкидки;
ИнформацияОбОплате = Новый Структура;
ИнформацияОбОплате.Вставить("Документ", Форма.Объект.Ссылка);
ИнформацияОбОплате.Вставить("Наличные", Форма.Объект.ПолученоНаличными);
ИнформацияОбОплате.Вставить("ПлатежныеКарты", РозничныеПродажиКлиентСервер.СуммаОплатыПлатежнымиКартами(Форма.Объект.ОплатаПлатежнымиКартами));
ИнформацияОбОплате.Вставить("ПодарочныеСертификаты", Форма.Объект.ПодарочныеСертификаты.Итог("Сумма"));
ИнформацияОбОплате.Вставить("БонусныеБаллы", СуммаСкидкиБонусныеБаллы);
ИнформацияОбОплате.Вставить("СуммаДокумента", Форма.СуммаДокумента);
ИнформацияОбОплате.Вставить("СуммаБезСкидки", СуммаБезСкидки);
ИнформацияОбОплате.Вставить("СуммаКОплате", СуммаКОплате);
ИнформацияОбОплате.Вставить("СуммаСкидки", СуммаСкидки);
ИнформацияОбОплате.Вставить("ДоступныеВидыОплаты", РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(Форма));
Форма.СуммаИтогоОплачено = ИнформацияОбОплате.Наличные
+ ИнформацияОбОплате.ПлатежныеКарты
+ ИнформацияОбОплате.ПодарочныеСертификаты
+ ИнформацияОбОплате.БонусныеБаллы;
ИнформацияОбОплате.Вставить("ИтогоОплачено", Форма.СуммаИтогоОплачено);
ИнформацияОбОплатеЛокализация(Форма, ИнформацияОбОплате);
Возврат ИнформацияОбОплате;
КонецФункции
#Область ОплатаПлатежнымиКартами
&НаКлиенте
Процедура ДобавитьОплатуКартой(ИзмененныеДанныеЗаписаны, ПараметрыЗавершения) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
Если ПараметрыЗавершения <> Неопределено Тогда
Объект.ПолученоНаличными = ПараметрыЗавершения.ПолученоНаличными;
КонецЕсли;
ВывестиКОплатеНаДисплейПокупателя = Истина;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
СуммаДоплаты = ИнформацияОбОплате.СуммаКОплате - ИнформацияОбОплате.ИтогоОплачено;
Если СуммаДоплаты <= 0 Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Чек оплачен'"));
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Возврат;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ДобавитьОплатуКартойЗавершение", ЭтотОбъект, ПараметрыЗавершения));
ДополнительныеПараметры.Вставить("Форма", ЭтотОбъект);
ДополнительныеПараметры.Вставить("ДокументОснование", Объект.Ссылка);
ДополнительныеПараметры.Вставить("ЭквайринговыеТерминалы", ЭквайринговыеТерминалы);
ДополнительныеПараметры.Вставить("ПараметрыКассыККМ", ПараметрыКассыККМ);
ДополнительныеПараметры.Вставить("ФормаАвторизации_Сумма", ИнформацияОбОплате.СуммаКОплате - ИнформацияОбОплате.ИтогоОплачено);
ДополнительныеПараметры.Вставить("ФормаАвторизации_ПределСуммы", ИнформацияОбОплате.СуммаКОплате - ИнформацияОбОплате.ИтогоОплачено);
ДополнительныеПараметры.Вставить("Валюта", Объект.Валюта);
ДополнительныеПараметры.Вставить("СтруктураЭквайринговыйТерминал");
ДополнительныеПараметры.Вставить("ИдентификаторУстройстваЭТ");
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ДобавитьОплатуКартой", РозничныеПродажиКлиент, ДополнительныеПараметры),
НСтр("ru = 'Перед оплатой платежной картой не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьОплатуКартойЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Не ЗначениеЗаполнено(Результат) Тогда
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
Возврат;
КонецЕсли;
СтрокаОплатыКартой = Объект.ОплатаПлатежнымиКартами.Добавить();
СтрокаОплатыКартой.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта");
СтрокаОплатыКартой.ЭквайринговыйТерминал = Результат.ЭквайринговыйТерминал;
СтрокаОплатыКартой.НомерПлатежнойКарты = Результат.НомерКарты;
СтрокаОплатыКартой.Сумма = Результат.СуммаОперации;
СтрокаОплатыКартой.СсылочныйНомер = Результат.СсылочныйНомер;
СтрокаОплатыКартой.НомерЧекаЭТ = Результат.НомерЧека;
СтрокаОплатыКартой.КодАвторизации = Результат.КодАвторизации;
ДанныеДляЖурналаРегистрации = Новый Структура;
ДанныеДляЖурналаРегистрации.Вставить("СуммаОперации", Результат.СуммаОперации);
ДанныеДляЖурналаРегистрации.Вставить("СсылочныйНомер", Результат.СсылочныйНомер);
ДанныеДляЖурналаРегистрации.Вставить("НомерКарты", Результат.НомерКарты);
ДанныеДляЖурналаРегистрации.Вставить("НомерЧекаЭТ", Результат.НомерЧека);
ДанныеДляЖурналаРегистрации.Вставить("КодАвторизации", Результат.КодАвторизации);
Модифицированность = Истина;
ПересчитатьДокументНаКлиенте();
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметрыЗавершение = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыЗавершение.ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьОплатуКартойЗаписьЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ДополнительныеПараметрыЗавершение.ТекстСообщения = НСтр("ru = 'После проведения оплаты платежной картой не удалось сохранить документ.'");
ДополнительныеПараметрыЗавершение.ВозвращатьРезультатФункции = Ложь;
ДополнительныеПараметрыЗавершение.РезультатПриУспешномПроведении = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Истина);
ДополнительныеПараметрыЗавершение.РезультатПриОтмене = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Ложь);
ДополнительныеПараметрыЗавершение.ИмяПроцедуры = "ЗаписатьНаСервере";
ДополнительныеПараметрыЗавершение.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыЗавершение);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыЗавершение),
ДополнительныеПараметрыЗавершение.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьОплатуКартойЗаписьЗавершение(Результат, ДополнительныеПараметры) Экспорт
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
Если Результат.ВыполненаОперацияНаУстройстве И Не Результат.ИзмененныеДанныеЗаписаны Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Данные", Объект.Ссылка);
ПараметрыФормы.Вставить("ДанныеДляЖурналаРегистрации", ДанныеДляЖурналаРегистрации);
ПараметрыФормы.Вставить("ТекстСообщения",
НСтр("ru = 'ВНИМАНИЕ! Произошла исключительная ситуация:
|Оплата произведена, но не зафиксирована в системе.'"));
ОткрытьФорму("Документ.ЧекККМ.Форма.ОшибкаЗаписи", ПараметрыФормы, ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьДобавлениеОплаты(ДополнительныеПараметры)
ВывестиКОплатеНаДисплейПокупателя = Ложь;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
Если ДополнительныеПараметры = Неопределено
ИЛИ ТипЗнч(ДополнительныеПараметры) = Тип("Структура")
И ДополнительныеПараметры.Свойство("ВызовИзФормыРМК")
И ДополнительныеПараметры.ВызовИзФормыРМК = Истина Тогда
Если Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит") Тогда
ВывестиКОплатеНаДисплейПокупателя = Истина;
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина);
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
Иначе
Если ИнформацияОбОплате.ИтогоОплачено >= ИнформацияОбОплате.СуммаКОплате
И ЗначениеЗаполнено(ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека) Тогда
ВывестиКОплатеНаДисплейПокупателя = Истина;
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина);
ПробитьЧек();
ИначеЕсли ИнформацияОбОплате.ИтогоОплачено > 0 Тогда
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОткрытьФормуСмешаннойОплаты", ЭтотОбъект),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
ИначеЕсли ТребуетсяОтложитьЧекПриДобавленииОплатыЛокализация(ИнформацияОбОплате) Тогда
ОтложитьНаКлиенте(Неопределено);
НастроитьРМК();
Иначе
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
КонецЕсли;
КонецЕсли;
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеВФормуОплаты, ИнформацияОбОплате);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОтменаОплатыПлатежнымиКартами
&НаКлиенте
Процедура ОтменитьОплатыПлатежнымиКартами(Результат, ДополнительныеПараметры) Экспорт
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("АдресВХранилище", ПоместитьТабличнуюЧастьОплатыПлатежнымиКартамиВХранилище());
Если ДополнительныеПараметры.Свойство("ПолученоНаличными") Тогда
Объект.ПолученоНаличными = ДополнительныеПараметры.ПолученоНаличными;
КонецЕсли;
ДополнительныеПараметры.Вставить("ПоказатьКнопкуОтменитьОплатыПоследовательно", Ложь);
ДополнительныеПараметры.Вставить("ПоказыватьТолькоОплатыПлатежнымиКартами", Истина);
ДополнительныеПараметры.Вставить("СуммаДокумента", СуммаДокумента);
ДополнительныеПараметры.Вставить("Форма", ЭтотОбъект);
ДополнительныеПараметры.Вставить("Валюта", Объект.Валюта);
ДополнительныеПараметры.Вставить("ПараметрыКассыККМ", ПараметрыКассыККМ);
ДополнительныеПараметры.Вставить("ТипТранзакции", "AuthorizeVoid");
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ТабличнаяЧастьОплатаПлатежнымиКартами",
ПараметрыФормы,,,,,
Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартамиВыборСтрокиОплатыЗавершение", РозничныеПродажиКлиент, ДополнительныеПараметры),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатыПлатежнымиКартамиЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат.ВыполненаОперацияНаУстройстве И Не Результат.ИзмененныеДанныеЗаписаны Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Данные", ДополнительныеПараметры.Форма.Объект.Ссылка);
ПараметрыФормы.Вставить("ДанныеДляЖурналаРегистрации", ДополнительныеПараметры.Форма.ДанныеДляЖурналаРегистрации);
ПараметрыФормы.Вставить("ТекстСообщения",
НСтр("ru = 'ВНИМАНИЕ! Произошла исключительная ситуация:
|Отмена оплаты не зафиксирована в системе.'"));
ОткрытьФорму("Документ.ЧекККМ.Форма.ОшибкаЗаписи", ПараметрыФормы, ДополнительныеПараметры.Форма);
КонецЕсли;
Если ДополнительныеПараметры.Свойство("ОповещениеВФормуОплаты") Тогда
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеВФормуОплаты, ИнформацияОбОплате(ЭтотОбъект));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуПлатежнойКартой(Результат, ДополнительныеПараметры) Экспорт
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОтменитьОплатуКартой", РозничныеПродажиКлиент, ДополнительныеПараметры),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуПлатежнымиКартами(ОповещениеОЗавершении)
СтрокиОплатыПлатежнымиКартами = Новый Массив;
Для каждого СтрокаОплаты Из Объект.ОплатаПлатежнымиКартами Цикл
Если СтрокаОплаты.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта") Тогда
СтрокиОплатыПлатежнымиКартами.Добавить(СтрокаОплаты);
КонецЕсли;
КонецЦикла;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОповещениеПриЗавершении", ОповещениеОЗавершении);
ДополнительныеПараметры.Вставить("СтрокиОплатыПлатежнымиКартами", СтрокиОплатыПлатежнымиКартами);
ДополнительныеПараметры.Вставить("Форма", ЭтотОбъект);
ДополнительныеПараметры.Вставить("Валюта", Объект.Валюта);
ДополнительныеПараметры.Вставить("ПараметрыКассыККМ", ПараметрыКассыККМ);
ДополнительныеПараметры.Вставить("ТипТранзакции", "AuthorizeVoid");
РозничныеПродажиКлиент.ОтменитьОплатуПлатежнымиКартамиПоследовательно(
Неопределено,
ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуПлатежнойКартойЗавершение(Результат, ДополнительныеПараметры) Экспорт
ДанныеДляЖурналаРегистрации = Новый Структура;
ДанныеДляЖурналаРегистрации.Вставить("СуммаОперации", ДополнительныеПараметры.СуммаОперации);
ДанныеДляЖурналаРегистрации.Вставить("СсылочныйНомер", ДополнительныеПараметры.СсылочныйНомер);
ДанныеДляЖурналаРегистрации.Вставить("НомерЧекаЭТ", ДополнительныеПараметры.НомерЧека);
Объект.ОплатаПлатежнымиКартами.Удалить(Объект.ОплатаПлатежнымиКартами.Индекс(ДополнительныеПараметры.СтрокаОплаты));
Модифицированность = Истина;
ПересчитатьДокументНаКлиенте();
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметрыПовторЗаписи = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыПовторЗаписи.ОписаниеОповещения = ДополнительныеПараметры.ОповещениеПриЗавершении;
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения = НСтр("ru = 'После выполнения операции отмены оплаты не удалось записать документ.'");
ДополнительныеПараметрыПовторЗаписи.ВозвращатьРезультатФункции = Ложь;
ДополнительныеПараметрыПовторЗаписи.РезультатПриУспешномПроведении = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Истина);
ДополнительныеПараметрыПовторЗаписи.РезультатПриОтмене = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Ложь);
ДополнительныеПараметрыПовторЗаписи.ИмяПроцедуры = "ЗаписатьНаСервере";
ДополнительныеПараметрыПовторЗаписи.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыПовторЗаписи);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыПовторЗаписи),
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ВыполнитьОбработкуОповещения(
ДополнительныеПараметры.ОповещениеПриЗавершении,
Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны",
Истина, Истина));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплату(ИзмененныеДанныеЗаписаны, ДополнительныеПараметры) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
Возврат;
КонецЕсли;
Объект.ПолученоНаличными = 0;
Объект.ПодарочныеСертификаты.Очистить();
Если Объект.СкидкиРассчитаны И Объект.Товары.Количество() > 0 Тогда
ПрименитьОплатуБонуснымиБаллами(Неопределено);
КонецЕсли;
ОтменитьОплатуЛокализация(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОплатуЗавершение(Результат, ДополнительныеПараметры) Экспорт
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
Если ТребуетсяОтложитьЧекПриЗавершенииОтменыОплатыЛокализация(ИнформацияОбОплате) Тогда
ОтложитьНаКлиенте(Неопределено);
НастроитьРМК();
КонецЕсли;
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеВФормуОплаты, ИнформацияОбОплате);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецОбласти
#Область Прочие
&НаКлиенте
Процедура ОшибкаПриПроведенииЧекаВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Отмена Тогда
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
Если ДополнительныеПараметры.ИмяПроцедуры = "ЗаписатьНаСервере" Тогда
РезультатОперации = ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
ИначеЕсли ДополнительныеПараметры.ИмяПроцедуры = "ЗаписатьФискальнуюОперациюНаСервере" Тогда
РезультатОперации = ЗаписатьФискальнуюОперациюНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, ДополнительныеПараметры.РеквизитыФискальнойОперацииКассовогоУзла);
ИначеЕсли ДополнительныеПараметры.ИмяПроцедуры = "ОтложитьНаСервере" Тогда
РезультатОперации = ОтложитьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
ИначеЕсли ДополнительныеПараметры.ИмяПроцедуры = "ЗарезервироватьНаСервере" Тогда
РезультатОперации = ЗарезервироватьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, "ОтложенСРезервированием");
ИначеЕсли ДополнительныеПараметры.ИмяПроцедуры = "ВыполнитьЧастьРасчетаНаСервере" Тогда
РезультатОперации = ВыполнитьЧастьРасчетаНаСервере(ДополнительныеПараметры.ПараметрыПроцедуры, ТребуетсяПовторнаяПопыткаЗаписи);
КонецЕсли;
Если (ТипЗнч(РезультатОперации) = Тип("Булево") И РезультатОперации)
ИЛИ (ТипЗнч(РезультатОперации) = Тип("Структура") И РезультатОперации.Свойство("РасчетВыполненУспешно") И РезультатОперации.РасчетВыполненУспешно) Тогда
ВыполнитьОбработкуОповещения(
ДополнительныеПараметры.ОписаниеОповещения,
?(ДополнительныеПараметры.ВозвращатьРезультатФункции, РезультатОперации, ДополнительныеПараметры.РезультатПриУспешномПроведении));
Иначе
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметры),
ДополнительныеПараметры.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
КонецЕсли;
Иначе
ВыполнитьОбработкуОповещения(
ДополнительныеПараметры.ОписаниеОповещения,
?(ДополнительныеПараметры.ВозвращатьРезультатФункции, ДополнительныеПараметры.РезультатОперации, ДополнительныеПараметры.РезультатПриОтмене));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьДействиеПослеЗаписи(ОповещениеПриЗавершении, ТекстСообщения)
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметры = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметры.ОписаниеОповещения = ОповещениеПриЗавершении;
ДополнительныеПараметры.ТекстСообщения = ТекстСообщения;
ДополнительныеПараметры.ВозвращатьРезультатФункции = Истина;
ДополнительныеПараметры.ИмяПроцедуры = "ЗаписатьНаСервере";
ДополнительныеПараметры.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметры);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметры),
ДополнительныеПараметры.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи = Неопределено)
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
Значение = РеквизитФормыВЗначение("Объект", Тип("ДокументОбъект.ЧекККМ"));
Значение.УстановитьСсылкуНового(Документы.ЧекККМ.ПолучитьСсылку());
ЗначениеВДанныеФормы(Значение, Объект);
КонецЕсли;
Объект.Дата = ТекущаяДатаСеанса();
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "Документ.ЧекККМ";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Ссылка", Объект.Ссылка);
Блокировка.Заблокировать();
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
ПараметрыЗаписи.Вставить("РежимПроведения", РежимПроведенияДокумента.Оперативный);
ПараметрыЗаписи.Вставить("РежимТранзакции", Истина);
Результат = Записать(ПараметрыЗаписи);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Шаблон = НСтр("ru = 'Не удалось записать чек ККМ по причине: %1'");
КраткоеПредставлениеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстСообщения = СтрШаблон(Шаблон, КраткоеПредставлениеОшибки);
ЗаписьЖурналаРегистрации(
НСтр("ru = 'РМК'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Документы.ЧекККМ,,
ТекстСообщения);
ТребуетсяПовторнаяПопыткаЗаписи = Истина;
Результат = Ложь;
КонецПопытки;
Если Не Результат Тогда
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМ));
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
Иначе
ПараметрыЗаписи.Вставить("РежимТранзакции", Ложь);
ПослеЗаписиНаСервере(РеквизитФормыВЗначение("Объект"), ПараметрыЗаписи);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Функция ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи = Неопределено)
Если Модифицированность Тогда
УИДЗамера = ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЧекККМ.Форма.ФормаДокументаРМК.ЗаписатьНаКлиенте",, Ложь);
Результат = ЗаписатьНаСервере(ТребуетсяПовторнаяПопыткаЗаписи);
ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамера, Не Результат);
Если Результат Тогда
Оповестить("Запись_ЧекККМ", Новый Структура, Неопределено);
КонецЕсли;
Возврат Результат;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ОбработкаОповещенияИзмененоРабочееМестоТекущегоСеансаЗавершение(ДополнительныеПараметры) Экспорт
ПринудительноеЗавершениеРаботы = Истина;
Закрыть();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСлужебныеРеквизитыПоНоменклатуре()
ЗаполнитьПризнакХарактеристикиИспользуются = Новый Структура("Номенклатура", "ХарактеристикиИспользуются");
ЗаполнитьПризнакТипНоменклатуры = Новый Структура("Номенклатура", "ТипНоменклатуры");
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", ЗаполнитьПризнакХарактеристикиИспользуются);
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", ЗаполнитьПризнакТипНоменклатуры);
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "НоменклатураПризнаки", СтруктураДействий);
НоменклатураСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуреВКоллекции(Объект.Товары, СтруктураДействий);
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
НаборыСервер.ЗаполнитьСлужебныеРеквизиты(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ДобавитьПроверкуАссортиментаВСтруктуруДействий(СтруктураДействий)
СтруктураПроверкиАссортимента = АссортиментКлиентСервер.ПараметрыПроверкиАссортимента();
СтруктураПроверкиАссортимента.Ссылка = Объект.Ссылка;
СтруктураПроверкиАссортимента.Склад = Объект.Склад;
СтруктураПроверкиАссортимента.Дата = Объект.Дата;
СтруктураПроверкиАссортимента.ТекстСообщения = НСтр("ru = 'Товар %1 не включен в ассортимент магазина или запрещен к продаже.'");
СтруктураПроверкиАссортимента.ИмяРесурсаАссортимента = "РазрешеныПродажи";
СтруктураПроверкиАссортимента.ПровереноМожноДобавлять = Истина;
СтруктураПроверкиАссортимента.РазрешатьДобавление = Ложь;
СтруктураДействий.Вставить("ПроверитьАссортиментСтроки", СтруктураПроверкиАссортимента);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьДаннныеОФормеОплаты(Форма, ИнформацияОбОплате)
ФормыОплаты = ПредопределенноеЗначение("Перечисление.ФормыОплаты.ПустаяСсылка");
Наличные = ИнформацияОбОплате.Наличные;
ПлатежныеКарты = ИнформацияОбОплате.ПлатежныеКарты;
ПодарочныеСертификаты = ИнформацияОбОплате.ПодарочныеСертификаты;
БонусныеБаллы = ИнформацияОбОплате.БонусныеБаллы;
Если Наличные > 0 И ПлатежныеКарты = 0 И ПодарочныеСертификаты = 0 И БонусныеБаллы = 0 Тогда
ФормыОплаты = ПредопределенноеЗначение("Перечисление.ФормыОплаты.Наличная");
ИначеЕсли Наличные = 0 И ПлатежныеКарты > 0 И ПодарочныеСертификаты = 0 И БонусныеБаллы = 0 Тогда
ФормыОплаты = ПредопределенноеЗначение("Перечисление.ФормыОплаты.ПлатежнаяКарта");
ИначеЕсли Наличные = 0 И ПлатежныеКарты = 0 И ПодарочныеСертификаты > 0 И БонусныеБаллы = 0 Тогда
ФормыОплаты = ПредопределенноеЗначение("Перечисление.ФормыОплаты.ПодарочныйСертификат");
ИначеЕсли Наличные = 0 И ПлатежныеКарты = 0 И ПодарочныеСертификаты = 0 И БонусныеБаллы > 0 Тогда
ФормыОплаты = ПредопределенноеЗначение("Перечисление.ФормыОплаты.БонусныеБаллы");
КонецЕсли;
Форма.Объект.ФормаОплаты = ФормыОплаты;
КонецПроцедуры
&НаСервере
Функция АдресТабличнойЧастиТовары()
Возврат ПоместитьВоВременноеХранилище(Объект.Товары.Выгрузить(), УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ЗагрузитьНовыйЧек(Ссылка = Неопределено)
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Если Объект.Статус <> ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит") Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Ссылка", Ссылка);
Отказ = Ложь;
ПередЗакрытиемЧека(
Отказ,
Новый ОписаниеОповещения("ЗагрузитьНовыйЧекЗавершение", ЭтотОбъект, ДополнительныеПараметры));
Если Отказ Тогда
Возврат;
КонецЕсли;
Иначе
НовыйЧекНаСервере();
ЗагрузитьНовыйЧекФрагмент();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьНовыйЧекФрагмент()
АдресПримененныхСкидокВоВременномХранилище = "";
УправляемыеСкидки = Новый СписокЗначений;
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьНовыйЧекЗавершение(Результат, ДополнительныеПараметры) Экспорт
НовыйЧекНаСервере(ДополнительныеПараметры.Ссылка);
ЗагрузитьНовыйЧекФрагмент();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьДанныеИнформационнойПанели(Форма, ОтобразитьСдачу = Ложь)
ИнформацияОбОплате = ИнформацияОбОплате(Форма);
Форма.ИнформационнаяПанельСуммаКОплате = ИнформацияОбОплате.СуммаКОплате;
Форма.ИнформационнаяПанельСуммаБезСкидки = ИнформацияОбОплате.СуммаБезСкидки;
Форма.ИнформационнаяПанельСуммаСкидки = ИнформацияОбОплате.СуммаСкидки;
КоличествоСтрокВТЧ = Форма.Объект.Товары.Количество();
ТекущаяСтрока = Форма.Элементы.Товары.ТекущаяСтрока;
Если ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ > 0 Тогда
ТекущиеДанные = Форма.Объект.Товары[КоличествоСтрокВТЧ - 1];
Форма.Элементы.Товары.ТекущаяСтрока = ТекущиеДанные.ПолучитьИдентификатор();
ИначеЕсли ТекущаяСтрока = Неопределено И КоличествоСтрокВТЧ = 0 Тогда
ТекущиеДанные = Неопределено;
Иначе
ТекущиеДанные = Форма.Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
КонецЕсли;
НаименованиеТовара = "";
Если ТекущиеДанные <> Неопределено Тогда
НаименованиеТовара = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(
ТекущиеДанные.Номенклатура,
ТекущиеДанные.Характеристика,
,
ТекущиеДанные.Серия);
ДополнительноеОписание = ТекстДополнительногоОписанияДляРазливногоПива(
Форма.ИнформацияПоВскрытымУпаковкам,
Форма.Объект.АкцизныеМарки,
ТекущиеДанные);
Если ДополнительноеОписание.Количество() > 0 Тогда
ДополнительноеОписание.Вставить(0, НаименованиеТовара);
НаименованиеТовара = Новый ФорматированнаяСтрока(ДополнительноеОписание);
КонецЕсли;
КонецЕсли;
ОбязательныеРеквизиты = Новый Массив;
ДанныеСтроки = Новый Структура;
ПродавецТолькоКассир = Форма.КассирМожетБытьПродавцом И Не Форма.МенеджерТорговогоЗалаМожетБытьПродавцом;
Если Не ПродавецТолькоКассир И ТекущиеДанные <> Неопределено Тогда
ИмяРеквизитаИнформационнойПанели = "Продавец";
ОбязательныеРеквизиты.Добавить(ИмяРеквизитаИнформационнойПанели);
ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, ТекущиеДанные.Продавец);
КонецЕсли;
Если Форма.ПараметрыКассыККМ.ИспользоватьСкладскиеПомещения И ТекущиеДанные <> Неопределено Тогда
ИмяРеквизитаИнформационнойПанели = "Помещение";
ОбязательныеРеквизиты.Добавить(ИмяРеквизитаИнформационнойПанели);
ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, ТекущиеДанные.Помещение);
КонецЕсли;
Если Форма.ИспользоватьКартыЛояльности Тогда
ИмяРеквизитаИнформационнойПанели = "Карта";
ДанныеСтроки.Вставить(ИмяРеквизитаИнформационнойПанели, Форма.Объект.КартаЛояльности);
КонецЕсли;
СуммовыеПараметры = Новый Структура;
СуммовыеПараметры.Вставить("Количество", 0);
СуммовыеПараметры.Вставить("Цена", 0);
СуммовыеПараметры.Вставить("СуммаРучнойСкидки", 0);
СуммовыеПараметры.Вставить("ПроцентРучнойСкидки", 0);
СуммовыеПараметры.Вставить("СуммаАвтоматическойСкидки", 0);
СуммовыеПараметры.Вставить("ПроцентАвтоматическойСкидки", 0);
СуммовыеПараметры.Вставить("Сумма", 0);
Если ТекущиеДанные <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(СуммовыеПараметры, ТекущиеДанные);
СуммовыеПараметры.Количество = ТекущиеДанные.КоличествоУпаковок;
КонецЕсли;
Данные = Новый Структура;
Данные.Вставить("НаименованиеТовара", НаименованиеТовара);
Данные.Вставить("ДанныеСтроки", ДанныеСтроки);
Данные.Вставить("СуммовыеПараметры", СуммовыеПараметры);
Данные.Вставить("ОбязательныеРеквизиты", ОбязательныеРеквизиты);
Если ОтобразитьСдачу Тогда
ТекстНачисленныеБонусныеБаллы = СтрШаблон(
НСтр("ru = 'Начислено бонусных баллов: %1 %2'"),
Форма.Объект.Товары.Итог("СуммаНачисленныхБонусныхБалловВВалюте"),
Форма.Объект.Валюта);
ТекстСдача = Новый ФорматированнаяСтрока(
СтрШаблон(НСтр("ru = 'Сдача: %1'"),
Формат(ИнформацияОбОплате.ИтогоОплачено - ИнформацияОбОплате.СуммаКОплате, "ЧДЦ=2; ЧН=0.00")));
Данные.Вставить("ОтобразитьСдачу", Истина);
Данные.Вставить("ТекстСдача", ТекстСдача);
Данные.Вставить("ТекстНачисленныеБонусныеБаллы", ТекстНачисленныеБонусныеБаллы);
Иначе
Данные.Вставить("ОтобразитьСдачу", Ложь);
КонецЕсли;
Данные.Вставить("СтруктураСообщений", Форма.СтруктураСообщений);
РозничныеПродажиКлиентСервер.ОбновитьДанныеИнформационнойПанели(Форма, Данные);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКоличествоВДокументе(Результат, ДополнительныеПараметры) Экспорт
Если ТолькоПросмотр Тогда
Возврат;
КонецЕсли;
ВыгруженаТолькоНеМаркируемаяПродукция = Ложь;
ПараметрыОткрытия = Новый Структура;
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПроверитьКоличествоВДокументе", ПараметрыОткрытия);
ПараметрыОткрытия.Вставить("АдресВоВременномХранилище", ПоместитьТабличнуюЧастьТоварыВоВременноеХранилищеДляПроверкиКоличества(ВыгруженаТолькоНеМаркируемаяПродукция));
ПараметрыОткрытия.Вставить("ПревышениеКоличестваТоваровРазрешено", Истина);
ПараметрыОткрытия.Вставить("ПараметрыУказанияСерий", ПараметрыУказанияСерий);
ПараметрыОткрытия.Вставить("Склад", Объект.Склад);
ПараметрыОткрытия.Вставить("ИмяТабличнойЧасти", "Товары");
ПараметрыОткрытия.Вставить("Ссылка", Объект.Ссылка);
ПараметрыОткрытия.Вставить("ВыгруженаТолькоНеМаркируемаяПродукция", ВыгруженаТолькоНеМаркируемаяПродукция);
ОткрытьФорму(
"ОбщаяФорма.ПроверкаЗаполненияДокументов",
ПараметрыОткрытия,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ПроверитьКоличествоВДокументеЗавершение", ЭтотОбъект),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ОтложитьЗавершение(Результат, ДополнительныеПараметры) Экспорт
Оповестить("Запись_ЧекККМ", Новый Структура, Неопределено);
Если Результат Тогда
ЗагрузитьНовыйЧек();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение)
ТаблицаТоваров = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище);
ИспользоватьСкладскиеПомещения = ИспользоватьСкладскиеПомещения(Объект.Склад, Объект.Дата);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
СтруктураДействий.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус",
Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
Если КонтролироватьАссортимент Тогда
СтруктураПроверкиАссортимента = АссортиментКлиентСервер.ПараметрыПроверкиАссортимента();
СтруктураПроверкиАссортимента.Ссылка = Объект.Ссылка;
СтруктураПроверкиАссортимента.Склад = Объект.Склад;
СтруктураПроверкиАссортимента.Дата = Объект.Дата;
СтруктураПроверкиАссортимента.ТекстСообщения
= НСтр("ru = 'Товар %1 не включен в ассортимент магазина или запрещен к продаже.'");
СтруктураПроверкиАссортимента.ИмяРесурсаАссортимента = "РазрешеныПродажи";
СтруктураПроверкиАссортимента.ПровереноМожноДобавлять = Истина;
СтруктураПроверкиАссортимента.РазрешатьДобавление = Ложь;
СтруктураДействий.Вставить("ПроверитьАссортиментСтроки", СтруктураПроверкиАссортимента);
КонецЕсли;
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый",
Новый Структура("ИмяФормы, ИмяТабличнойЧасти", ИмяФормы, "Товары"));
СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу");
СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу");
Если ИспользоватьСкладскиеПомещения Тогда
СтруктураДействий.Вставить("ЗаполнитьПомещение", Новый Структура("Склад", Объект.Склад));
КонецЕсли;
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(
ЭтотОбъект, "Номенклатура", СтруктураДействий);
СписокСвойств = "НоменклатураНабора, ХарактеристикаНабора, Номенклатура, Характеристика, Упаковка, Серия, Цена,
|КоличествоУпаковок, ПроцентРучнойСкидки";
ОбрабатываемыеСтроки = Новый Массив();
Если НЕ ПодбиратьКодыМаркировкиВскрытыхПотребительскихУпаковокПоFIFOЛокализация() Тогда
ОбработатьВскрытыеПотребительскиеУпаковкиПоТаблицеТоваровЛокализация(ТаблицаТоваров);
КонецЕсли;
Для каждого СтрокаТовара Из ТаблицаТоваров Цикл
ТекущаяСтрока = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, СтрокаТовара, СписокСвойств);
ОбрабатываемыеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
ОбрабатываемыеСтроки,
СтруктураДействий,
Объект.Товары);
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ПриИзмененииНоменклатурыХарактеристикиКоличестваЛокализация();
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект,НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМ));
Если ТекущаяСтрока <> Неопределено Тогда
Элементы.Товары.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();
КонецЕсли;
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
Если ТаблицаТоваров.Количество() Тогда
СобытияФорм.ПриИзмененииЭлемента(ЭтотОбъект, "Товары");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПродавцаЗавершение(Продавец, ДополнительныеПараметры) Экспорт
Если Не ЗначениеЗаполнено(Продавец) Тогда
Возврат;
КонецЕсли;
ТекущийПродавец = Продавец;
ЗаполнитьПродавцаВТабличнойЧасти();
ОбновитьЗаголовокФормы();
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПродавцаГиперссылкаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Продавец = Результат;
Если Не ЗначениеЗаполнено(Продавец) Тогда
Возврат;
КонецЕсли;
Для Каждого ВыделеннаяСтрока Из Элементы.Товары.ВыделенныеСтроки Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ВыделеннаяСтрока);
СтрокаТЧ.Продавец = Продавец;
КонецЦикла;
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПродавцаВТабличнойЧасти()
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если Не ЗначениеЗаполнено(СтрокаТЧ.Продавец) Тогда
СтрокаТЧ.Продавец = ТекущийПродавец;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПомещениеЗавершение(Результат, ДополнительныеПараметры) Экспорт
СтрокаТЧ = ДополнительныеПараметры.СтрокаТЧ;
Помещение = Результат;
Если Не ЗначениеЗаполнено(Помещение) Тогда
Возврат;
КонецЕсли;
СтароеЗначениеПомещения = СтрокаТЧ.Помещение;
СтрокаТЧ.Помещение = Помещение;
РозничныеПродажиКлиент.ОбновитьПомещениеВСтрокахТабличнойЧастиСерии(ЭтотОбъект, СтрокаТЧ, СтароеЗначениеПомещения);
ОбновитьДанныеИнформационнойПанели(ЭтотОбъект, Истина = ТолькоПросмотр);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьКассуККМЗавершение(КассаККМ, ДополнительныеПараметры) Экспорт
Если Не ЗначениеЗаполнено(КассаККМ) Тогда
Возврат;
КонецЕсли;
Если Объект.КассаККМ <> КассаККМ Тогда
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
ИзменитьКассуККМ(КассаККМ);
ПересчитатьДокументНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ВозвратТовараОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытия.Вставить("Кассир", Объект.Кассир);
ПараметрыОткрытия.Вставить("Организация", Объект.Организация);
ОткрытьФорму("Документ.ЧекККМ.Форма.ОформлениеВозвратаДеньВДень", ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКоличествоВДокументеЗавершение(Результат, ДополнительныеПараметры) Экспорт
ВозвращаемыеПараметры = Результат;
Если ВозвращаемыеПараметры <> Неопределено Тогда
ИзменитьТабличнуюЧастьПоРезультатамПроверки(ВозвращаемыеПараметры, ?(КэшированныеЗначения = Неопределено, ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения(), КэшированныеЗначения));
Модифицированность = Истина;
СкидкиНаценкиЗаполнениеКлиент.СброситьФлагСкидкиРассчитаны(ЭтотОбъект);
ПересчитатьДокументНаКлиенте();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначенияПоНастройкам()
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
ОтборПоККМОтложенногоЧека = Оборудование.НайтиСтроки(Новый Структура("Объект", Объект.КассаККМ));
Если Объект.Статус <> Перечисления.СтатусыЧековККМ.Пробит
И ОтборПоККМОтложенногоЧека.Количество() = 0
И Оборудование.Количество() > 0 Тогда
Объект.КассаККМ = Оборудование[0].Объект;
КонецЕсли;
СтруктураСостояниеКассовойСмены = РозничныеПродажи.ПолучитьСостояниеКассовойСмены(Объект.КассаККМ);
ТекущийПользователь = Пользователи.ТекущийПользователь();
Если Объект.Статус <> Перечисления.СтатусыЧековККМ.Пробит Тогда
Если Объект.КассоваяСмена <> СтруктураСостояниеКассовойСмены.КассоваяСмена Тогда
Объект.КассоваяСмена = СтруктураСостояниеКассовойСмены.КассоваяСмена;
КонецЕсли;
Если Объект.Организация <> СтруктураСостояниеКассовойСмены.Организация Тогда
Объект.Организация = СтруктураСостояниеКассовойСмены.Организация;
КонецЕсли;
Если Объект.Кассир <> ТекущийПользователь Тогда
Объект.Кассир = ТекущийПользователь;
КонецЕсли;
КонецЕсли;
Иначе
ЗаполнитьСлужебныеРеквизитыПоНоменклатуре();
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМ));
УстановитьВидимостьЭлементовСерий();
Если Параметры.Свойство("ЗначениеКопирования")
И ЗначениеЗаполнено(Параметры.ЗначениеКопирования)
И ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры Тогда
Объект.Серии.Очистить();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимостьЭлементовФормы()
Элементы.ОплатитьЭСФСС.Видимость = Ложь;
Элементы.ОплатитьСБП.Видимость = Ложь;
КонецПроцедуры
&НаСервере
Процедура ОбновитьСостояниеКассовойСмены()
Если ЗначениеЗаполнено(Объект.КассаККМ)
И Объект.Статус <> Перечисления.СтатусыЧековККМ.Пробит Тогда
СтруктураСостояниеКассовойСмены = РозничныеПродажи.ПолучитьСостояниеКассовойСмены(Объект.КассаККМ);
Если Объект.КассоваяСмена <> СтруктураСостояниеКассовойСмены.КассоваяСмена Тогда
ЗаполнитьЗначенияСвойств(Объект, СтруктураСостояниеКассовойСмены,,"Кассир");
КонецЕсли;
ТекущийПользователь = Пользователи.ТекущийПользователь();
Если Объект.Кассир <> ТекущийПользователь
И НЕ ЗначениеЗаполнено(Объект.Кассир) Тогда
Объект.Кассир = ТекущийПользователь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьЗаголовокФормы()
Заголовок = НСтр("ru = 'Продажа (Кассир: %Кассир%, Продавец: %Продавец%)'");
Заголовок = СтрЗаменить(Заголовок, "%Кассир%", Объект.Кассир);
Заголовок = СтрЗаменить(Заголовок, "%Продавец%", ?(ЗначениеЗаполнено(ТекущийПродавец),ТекущийПродавец, НСтр("ru='<Не выбран>'")));
КонецПроцедуры
&НаСервере
Процедура ПриСозданииЧека()
Если ИспользуетсяЦенообразование25 Тогда
ОбъектХраненияУсловийПродаж = АссортиментСерверПовтИсп.ФорматМагазинаПоСкладу(Объект.Склад, Объект.Дата);
Иначе
ОбъектХраненияУсловийПродаж = Объект.Склад;
КонецЕсли;
СтруктураСообщений = СкидкиНаценкиЗаполнениеСервер.СтруктураСообщений(Объект);
Элементы.ПоказатьСообщения.Видимость = СтруктураСообщений.Сообщения.Количество() > 0;
АнализВозможностиОплатыБонуснымиБаллами();
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ЧекККМ));
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект, ПараметрыУказанияСерий);
УстановитьВидимостьЭлементовСерий();
КонецЕсли;
СтруктураСостояниеКассовойСмены = РозничныеПродажиВызовСервера.СостояниеКассовойСмены(Объект.КассаККМ);
ЗаполнитьЗначенияСвойств(Объект, СтруктураСостояниеКассовойСмены,, "Кассир");
РозничныеПродажи.ОчиститьДанныеФискальнойОперации(ДанныеФискальнойОперации);
Объект.Дата = ТекущаяДатаСеанса();
ОбновитьЗаголовокФормы();
НастроитьРМК();
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЧека(Отказ, ОписаниеОповещения = Неопределено)
Если СуммаСБПВыполнена > 0 ИЛИ СуммаСБПОжидание > 0 Тогда
Если ОписаниеОповещения <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОписаниеОповещения, Неопределено);
КонецЕсли;
Возврат;
КонецЕсли;
Кнопки = Новый СписокЗначений;
РезервироватьДо = КонецДня((Объект.Дата + 24*60*60));
Если Не ТолькоПросмотр И (Модифицированность ИЛИ ЗначениеЗаполнено(Объект.Ссылка)) Тогда
ТекстВопроса = НСтр("ru = 'Данные чека ККМ были изменены.'");
Если КонтрольНаСкладеОтключен Тогда
Если ПраваДоступа.Отложить Тогда
Кнопки.Добавить(1, НСтр("ru = 'Отложить'"));
КонецЕсли;
Иначе
Если ПраваДоступа.Отложить Тогда
Кнопки.Добавить(1, НСтр("ru = 'Отложить без резервирования'"));
КонецЕсли;
Если ПраваДоступа.Зарезервировать Тогда
Кнопки.Добавить(2, НСтр("ru = 'Зарезервировать до...'"));
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Ссылка) И ПраваДоступа.КорректировкаСтрок Тогда
Кнопки.Добавить(4, НСтр("ru = 'Удалить чек'"));
КонецЕсли;
ЗаголовокКнопкиЗакрыть = НСтр("ru = 'Закрыть'");
Если ПраваДоступа.КорректировкаСтрок И Модифицированность Тогда
ЗаголовокКнопкиЗакрыть = НСтр("ru = 'Закрыть без сохранения'");
КонецЕсли;
Кнопки.Добавить(3, ЗаголовокКнопкиЗакрыть);
Кнопки.Добавить(99, НСтр("ru = 'Отмена'"));
КонецЕсли;
ПередЗакрытиемЧекаЛокализация(Отказ, Кнопки);
Если Кнопки.Количество() > 0 Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("РезервироватьДо", РезервироватьДо);
ДополнительныеПараметры.Вставить("ОписаниеОповещения", ОписаниеОповещения);
Отказ = Истина;
ПоказатьВопрос(
Новый ОписаниеОповещения("ВопросПередЗакрытиемЧекаЗавершение", ЭтотОбъект, ДополнительныеПараметры),
ТекстВопроса,
Кнопки);
Иначе
Если ОписаниеОповещения <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОписаниеОповещения, Неопределено);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВопросПередЗакрытиемОперацияЗавершение(Результат, ДополнительныеПараметры) Экспорт
Оповестить("Запись_ЧекККМ", Новый Структура, Неопределено);
Если Результат Тогда
Если ДополнительныеПараметры.ОписаниеОповещения = Неопределено Тогда
ПринудительноеЗавершениеРаботы = Истина;
Закрыть(Неопределено);
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещения, Неопределено);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВопросПередЗакрытиемЧекаЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
Если РезультатВопроса = 1 Тогда
Оповещение = Новый ОписаниеОповещения("ВопросПередЗакрытиемОперацияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОтложитьНаКлиенте(Оповещение);
ИначеЕсли РезультатВопроса = 2 Тогда
РезервироватьДо = КонецДня((Объект.Дата + 24*60*60));
Оповещение = Новый ОписаниеОповещения("ВопросПередЗакрытиемОперацияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ДополнительныеПараметры = Новый Структура("ОповещениеПриЗавершении", Оповещение);
ОписаниеОповещения = Новый ОписаниеОповещения(
"ЗарезервироватьНаКлиенте",
ЭтотОбъект,
ДополнительныеПараметры);
ПоказатьВводДаты(
ОписаниеОповещения,
РезервироватьДо,
НСтр("ru = 'Зарезервировать до:'"),
ЧастиДаты.ДатаВремя);
ИначеЕсли РезультатВопроса = 3 Тогда
Если ДополнительныеПараметры.ОписаниеОповещения = Неопределено Тогда
ПринудительноеЗавершениеРаботы = Истина;
Закрыть(Неопределено);
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещения, Неопределено);
КонецЕсли;
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
ИначеЕсли РезультатВопроса = 4 Тогда
УдалениеВыполнено = РозничныеПродажиВызовСервера.УдалитьДокументПриОтменеФискальнойОперации(Объект.Ссылка);
Если УдалениеВыполнено Тогда
Оповестить("Запись_ЧекККМ", Новый Структура, Неопределено);
Если ДополнительныеПараметры.ОписаниеОповещения = Неопределено Тогда
ПринудительноеЗавершениеРаботы = Истина;
Закрыть(Неопределено);
Иначе
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещения, Неопределено);
КонецЕсли;
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьКомандыФормы(УникальныйИдентификатор)
КомандыФормы = Новый Массив;
Для Каждого КомандаФормы Из Команды Цикл
Если НЕ КомандаФормы.СочетаниеКлавиш.Клавиша = Клавиша.Нет Тогда
КомандыФормы.Добавить(Новый Структура("ИмяКоманды, Заголовок, СочетаниеКлавиш", КомандаФормы.Имя, КомандаФормы.Заголовок, КомандаФормы.СочетаниеКлавиш));
КонецЕсли;
КонецЦикла;
Возврат ПоместитьВоВременноеХранилище(КомандыФормы, УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ИзменитьКассуККМ(КассаККМ)
Объект.КассаККМ = КассаККМ;
ПараметрыКассыККМ = Новый ФиксированнаяСтруктура(Справочники.КассыККМ.ПараметрыКассыККМ(Объект.КассаККМ));
ВерсияФФД = МенеджерОборудованияВызовСервера.ФискальноеУстройствоПоддерживаетВерсиюФФД(ПараметрыКассыККМ.ИдентификаторУстройства);
НовыйЧекНаСервере();
КонецПроцедуры
&НаСервере
Процедура НастроитьПраваДляПользователя(Пользователь)
ПраваДоступа = НастройкиПродажДляПользователейСервер.ПраваДоступаРМК(Пользователь);
Объект.Кассир = Пользователь;
РеквизитыКассира = РозничныеПродажи.РеквизитыКассира(Пользователь, Объект.Организация);
Если КассирМожетБытьПродавцом И Не МенеджерТорговогоЗалаМожетБытьПродавцом Тогда
ТекущийПродавец = Пользователь;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.Продавец = Пользователь;
КонецЦикла;
КонецЕсли;
ОбновитьЗаголовокФормы();
КонецПроцедуры
&НаСервере
Процедура НастроитьРМК()
УстановитьПривилегированныйРежим(Истина);
ПолучитьСсылкиНаОборудование();
КонтрольНаСкладеОтключен = ЗначениеЗаполнено(Объект.Склад)
И Справочники.Склады.КонтрольОстатковНаСкладеОтключен(Объект.Склад)
И Не ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Склад, "КонтролироватьОперативныеОстатки");
Если ИспользоватьАвтоматическиеСкидкиВПродажах Тогда
НастроитьАвтоматическиеСкидкиНаценки();
КонецЕсли;
Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
Элементы.СуммаБезСкидки.Ширина = 22;
Элементы.СуммаСкидки.Ширина = 22;
Элементы.СуммаКОплате.Ширина = 22;
КонецЕсли;
РозничныеПродажи.ПодписатьГорячиеКлавишиНаКнопках(ЭтотОбъект);
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(НастройкиРМК.ГорячиеКлавиши, Неопределено) КАК ГорячиеКлавиши,
| ЕСТЬNULL(НастройкиРМК.ГорячиеКлавиши.БыстрыеТовары, Неопределено) КАК БыстрыеТовары,
| ЕСТЬNULL(НастройкиРМК.ГорячиеКлавиши.КомандыФормы, Неопределено) КАК КомандыФормы,
| НастройкиРМК.КассирМожетБытьПродавцом КАК КассирМожетБытьПродавцом,
| НастройкиРМК.МенеджерТорговогоЗалаМожетБытьПродавцом КАК МенеджерТорговогоЗалаМожетБытьПродавцом,
| НастройкиРМК.ИспользоватьАвторизацию
|ИЗ
| Справочник.НастройкиРМК КАК НастройкиРМК
|ГДЕ
| НастройкиРМК.РабочееМесто = &РабочееМесто
| И НастройкиРМК.Ссылка В (ВЫБРАТЬ Различные Т.Ссылка Из Справочник.НастройкиРМК.КассыККМ КАК Т Где Т.КассаККМ = &КассаККМ)
|");
Запрос.УстановитьПараметр("РабочееМесто", МенеджерОборудованияВызовСервера.РабочееМестоКлиента());
Запрос.УстановитьПараметр("КассаККМ", Объект.КассаККМ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
ГорячиеКлавиши = Выборка.ГорячиеКлавиши;
ПринудительнаяАвторизация = Выборка.ИспользоватьАвторизацию;
МенеджерТорговогоЗалаМожетБытьПродавцом = Выборка.МенеджерТорговогоЗалаМожетБытьПродавцом;
КассирМожетБытьПродавцом = Выборка.КассирМожетБытьПродавцом;
Если ЗначениеЗаполнено(ГорячиеКлавиши) Тогда
РозничныеПродажи.НастроитьБыстрыеТоварыИГорячиеКлавиши(ЭтотОбъект, Выборка);
КонецЕсли;
Иначе
ГорячиеКлавиши = Неопределено;
ПринудительнаяАвторизация = Ложь;
МенеджерТорговогоЗалаМожетБытьПродавцом = Ложь;
КассирМожетБытьПродавцом = Истина;
КонецЕсли;
НастроитьПраваДляПользователя(Объект.Кассир);
ПродавецТолькоКассир = КассирМожетБытьПродавцом И Не МенеджерТорговогоЗалаМожетБытьПродавцом;
Элементы.ТоварыПродавец.Видимость = Не ПродавецТолькоКассир;
Элементы.БыстрыеТовары.Видимость = БыстрыеТовары.Количество() > 0;
Элементы.РассчитатьСкидки.Видимость = ИспользоватьАвтоматическиеСкидкиВПродажах;
Элементы.ИзменитьПродавца.Видимость = Не ПродавецТолькоКассир;
Элементы.ИзменитьПомещение.Видимость = ПараметрыКассыККМ.ИспользоватьСкладскиеПомещения;
Элементы.ТоварыПомещение.Видимость = ПараметрыКассыККМ.ИспользоватьСкладскиеПомещения;
Элементы.СоставНабора.Видимость = ПолучитьФункциональнуюОпцию("ИспользоватьНаборы");
Элементы.УказатьСерии.Видимость = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
Элементы.РучныеСкидки.Видимость = ИспользоватьРучныеСкидкиВПродажах;
ОбщегоНазначенияУТ.НастроитьПодключаемоеОборудование(ЭтотОбъект, "");
ДоступныеВидыОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
Элементы.ОплатитьНаличными.Видимость = ДоступныеВидыОплаты.Наличные;
Элементы.ОплатитьКартой.Видимость = ДоступныеВидыОплаты.ПлатежныеКарты;
Элементы.СмешаннаяОплата.Видимость = ДоступныеВидыОплаты.ПлатежныеКарты ИЛИ ДоступныеВидыОплаты.ПодарочныеСертификаты ИЛИ ДоступныеВидыОплаты.БонусныеБаллы;
Элементы.ОплатитьПодарочнымСертификатом.Видимость = ДоступныеВидыОплаты.ПодарочныеСертификаты;
ЭлементыНаПерегруппировку = Новый Массив;
ЭлементыНаПерегруппировку.Добавить(Элементы.БыстрыеТовары);
ЭлементыНаПерегруппировку.Добавить(Элементы.РассчитатьСкидки);
Для Каждого Подгруппа Из Элементы.ГруппаНижняяКоманднаяПанельКонтекстныеКоманды.ПодчиненныеЭлементы Цикл
Для Каждого Элемент Из Подгруппа.ПодчиненныеЭлементы Цикл
ЭлементыНаПерегруппировку.Добавить(Элемент);
КонецЦикла;
КонецЦикла;
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьНаличными);
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьКартой);
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьПодарочнымСертификатом);
ЭлементыНаПерегруппировку.Добавить(Элементы.СмешаннаяОплата);
НастроитьРМКЛокализация(ДоступныеВидыОплаты, ЭлементыНаПерегруппировку);
УправлениеДоступностьюКнопокОплаты(ЭтотОбъект);
РозничныеПродажи.ПерегруппироватьКнопкиФормы(ЭтотОбъект, ЭлементыНаПерегруппировку);
РозничныеПродажи.НастроитьКомандыПечати(ЭтотОбъект, Элементы.ПеремещаемыеКнопки);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УправлениеДоступностьюКнопокОплаты(Форма, ИнформацияОбОплате = Неопределено)
Если ИнформацияОбОплате = Неопределено Тогда
ИнформацияОбОплате = ИнформацияОбОплате(Форма);
КонецЕсли;
Элементы = Форма.Элементы;
Элементы.СмешаннаяОплата.Доступность = Истина;
ОплатаКартойНачатаЧекНеПробит = ((Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
Или Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате"))
И ИнформацияОбОплате.ПлатежныеКарты <> 0);
Элементы.ОплатитьНаличными.Доступность = Не ОплатаКартойНачатаЧекНеПробит;
Элементы.ОплатитьКартой.Доступность = Не ОплатаКартойНачатаЧекНеПробит;
Элементы.ОплатитьПодарочнымСертификатом.Доступность = Не ОплатаКартойНачатаЧекНеПробит;
УправлениеДоступностьюКнопокОплатыЛокализация(Форма, ИнформацияОбОплате);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОкноАвторизации()
ОткрытьФорму("Документ.ЧекККМ.Форма.Авторизация", Новый Структура("Режим", "СменитьПрава"), ЭтотОбъект);
КонецПроцедуры
&НаСервере
Функция ПолучитьЦенуПоОтбору(Номенклатура, Характеристика, Серия, Упаковка)
СтруктураПараметровОтбора = Новый Структура;
СтруктураПараметровОтбора.Вставить("Валюта", Объект.Валюта);
СтруктураПараметровОтбора.Вставить("Дата", ТекущаяДатаСеанса());
СтруктураПараметровОтбора.Вставить("ВидЦены", Объект.ВидЦены);
СтруктураПараметровОтбора.Вставить("Номенклатура", Номенклатура);
СтруктураПараметровОтбора.Вставить("Характеристика", Характеристика);
СтруктураПараметровОтбора.Вставить("Серия", Серия);
СтруктураПараметровОтбора.Вставить("Упаковка", Упаковка);
Возврат ЦеныПредприятияЗаполнениеСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
КонецФункции
&НаКлиенте
Процедура ОбработатьКомандуПечати(ИмяКоманды, ДополнительныеПараметры) Экспорт
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команды[ИмяКоманды], Объект);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьТекущийЭлементНаКнопкуНовыйЧек()
ТекущийЭлемент = Элементы.НовыйЧек;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьТекущийЭлементНаТабличнуюЧастьТовары()
ТекущийЭлемент = Элементы.Товары;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗавершенияПечатиСлипЧека(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если УИДЗамераПечатьСлипЧека <> Неопределено Тогда
ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамераПечатьСлипЧека, Не РезультатВыполнения.Результат);
УИДЗамераПечатьСлипЧека = Неопределено;
КонецЕсли;
Если Не РезультатВыполнения.Результат Тогда
ТекстСообщения = СтрШаблон(
НСтр("ru = 'При печати слип-чека возникла ошибка:
|""%1"".'"),
РезультатВыполнения.ОписаниеОшибки);
РозничныеПродажиВызовСервера.ЗаписьВЖурналРегистрации(
ТекстСообщения, "ПослеЗавершенияПечатиСлипЧека", Объект.Ссылка);
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВидЦеныВключаетСуммаНДС(ВидЦены)
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидЦены, "ЦенаВключаетНДС");
КонецФункции
&НаКлиенте
Процедура ВозвратТовараБезЧекаОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("КассоваяСмена", Объект.КассоваяСмена);
ОткрытьФорму("Документ.ЧекККМВозврат.Форма.ФормаДокументаРМК", Новый Структура("Основание", ПараметрыОткрытия), ВладелецФормы);
КонецПроцедуры
&НаКлиенте
Функция СтруктураФормыОплаты()
ФормаОплаты = Новый Структура;
ФормаОплаты.Вставить("Наличные", Ложь);
ФормаОплаты.Вставить("БонусныеБаллы", Ложь);
ФормаОплаты.Вставить("ПлатежныеКарты", Ложь);
ФормаОплаты.Вставить("ЭСФСС", Ложь);
ФормаОплаты.Вставить("ПодарочныеСертификаты", Ложь);
Возврат ФормаОплаты;
КонецФункции
&НаСервереБезКонтекста
Функция ИспользоватьСкладскиеПомещения(Склад, Дата)
Возврат СкладыСервер.ИспользоватьСкладскиеПомещения(Склад,
?(ЗначениеЗаполнено(Дата), Дата, ТекущаяДатаСеанса()));
КонецФункции
&НаСервере
Функция СтруктураДействийПриИзмененииНоменклатурыТабличнойЧастиТовары()
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
Если КонтролироватьАссортимент Тогда
ДобавитьПроверкуАссортиментаВСтруктуруДействий(СтруктураДействий);
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажиПоАссортименту", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныПоАссортиментуВСтрокеТЧ(Объект));
ИначеЕсли ИспользуетсяЦенообразование25 Тогда
СтруктураДействий.Вставить("ЗаполнитьУсловияРозничныхПродаж", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийРозничныхПродажВСтрокеТЧ(Объект, ОбъектХраненияУсловийПродаж));
Иначе
СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныРозницаВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
СтруктураДействий.Вставить("ЗаполнитьПродавца", Новый Структура("Продавец", ТекущийПродавец));
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Истина));
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомСкидкиБонуснымиБаллами");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));
СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
ИмяФормы, "Товары"));
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействий);
Возврат СтруктураДействий;
КонецФункции
#КонецОбласти
#Область Локализация
&НаСервере
Процедура НастроитьРМКЛокализация(ДоступныеВидыОплаты, ЭлементыНаПерегруппировку)
Элементы.СмешаннаяОплата.Видимость = Элементы.СмешаннаяОплата.Видимость ИЛИ ДоступныеВидыОплаты.ЭСФСС;
Элементы.ОплатитьЭСФСС.Видимость = ДоступныеВидыОплаты.ЭСФСС;
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьЭСФСС);
Элементы.СмешаннаяОплата.Видимость = Элементы.СмешаннаяОплата.Видимость ИЛИ ДоступныеВидыОплаты.СБП;
Элементы.ОплатитьСБП.Видимость = ДоступныеВидыОплаты.СБП;
ЭлементыНаПерегруппировку.Добавить(Элементы.ОплатитьСБП);
СуммаСБПВыполнена = РозничныеПродажиКлиентСерверЛокализация.СуммаОплатыСБППоДокументу(Объект.ОплатаПлатежнымиКартами, Истина);
СуммаСБПОжидание = РозничныеПродажиКлиентСерверЛокализация.СуммаОплатыСБППоДокументу(Объект.ОплатаПлатежнымиКартами) - СуммаСБПВыполнена;
Элементы.ГруппаСуммаСБПОжидается.Видимость = СуммаСБПВыполнена > 0 ИЛИ СуммаСБПОжидание > 0;
Если СуммаСБПВыполнена > 0 Тогда
Элементы.СуммаСБП.Заголовок = НСтр("ru = 'СБП оплачено'");
ИнформационнаяПанельСуммаСБП = СуммаСБПВыполнена;
ИначеЕсли СуммаСБПОжидание > 0 Тогда
Элементы.СуммаСБП.Заголовок = НСтр("ru = 'СБП ожидается'");
ИнформационнаяПанельСуммаСБП = СуммаСБПОжидание;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УправлениеДоступностьюКнопокОплатыЛокализация(Форма, ИнформацияОбОплате)
ОплатаКартойНачатаЧекНеПробит = ((Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
Или Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате"))
И ИнформацияОбОплате.ПлатежныеКарты <> 0);
ОплатаЭСФССНачатаЧекНеПробит = ((Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
Или Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате"))
И ИнформацияОбОплате.ЭСФСС <> 0);
Элементы = Форма.Элементы;
Элементы.ОплатитьСБП.Доступность = Не (ОплатаКартойНачатаЧекНеПробит Или ОплатаЭСФССНачатаЧекНеПробит);
Элементы.ОплатитьЭСФСС.Доступность = Не ОплатаКартойНачатаЧекНеПробит И Форма.ЕстьТоварыСВозможностьюОплатыЭС;
Если ИнформацияОбОплате.СБПОжидание > 0 Тогда
Элементы.ОплатитьСБП.Доступность = Ложь;
Элементы.СмешаннаяОплата.Доступность = Ложь;
КонецЕсли;
Если ИнформацияОбОплате.СБП > 0 ИЛИ ИнформацияОбОплате.СБПОжидание > 0 ИЛИ ОплатаЭСФССНачатаЧекНеПробит Тогда
Элементы.ОплатитьЭСФСС.Доступность = Ложь;
Элементы.ОплатитьПодарочнымСертификатом.Доступность = Ложь;
Элементы.ОплатитьНаличными.Доступность = Ложь;
Элементы.ОплатитьКартой.Доступность = Ложь;
Если ОплатаЭСФССНачатаЧекНеПробит Тогда
Элементы.ОплатитьЭСФСС.Доступность = Истина;
Элементы.СмешаннаяОплата.Доступность = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПересчитатьДокументНаКлиентеЛокализация(ИнформацияОбОплате)
ОплатаЭСФССНачатаЧекНеПробит = ((Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
Или Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате"))
И ИнформацияОбОплате.ЭСФСС <> 0);
Если ОплатаЭСФССНачатаЧекНеПробит Тогда
Элементы.ПоискПоШтрихкоду.Доступность = Ложь;
Элементы.СчитатьКартуЛояльности.Доступность = Ложь;
Элементы.ОткрытьПодбор.Доступность = Ложь;
Элементы.ОтменитьОплатыПлатежнымиКартами.Доступность = Ложь;
Элементы.ФормаБыстрыеТовары.Доступность = Ложь;
Элементы.БыстрыеТовары.Доступность = Ложь;
Элементы.РассчитатьСкидки.Доступность = Ложь;
Элементы.ГруппаНижняяКоманднаяПанельКонтекстныеКоманды.Доступность = Ложь;
Элементы.Товары.ИзменятьСоставСтрок = Ложь;
Элементы.КонтекстноеМенюОбластьКорзиныТоварыДобавить.Доступность = Ложь;
Элементы.КонтекстноеМенюОбластьКорзиныТоварыСкопировать.Доступность = Ложь;
Элементы.ТоварыУпаковкаЕдиницаИзмерения.ТолькоПросмотр = Истина;
Элементы.ТоварыКоличествоУпаковок.ТолькоПросмотр = Истина;
Элементы.ТоварыНоменклатура.ТолькоПросмотр = Истина;
Элементы.ТоварыШтрихкод.ТолькоПросмотр = Истина;
Элементы.ТоварыХарактеристика.ТолькоПросмотр = Истина;
Элементы.ТоварыПродавец.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыбраннаяФормаОплатыЛокализация(ВыбраннаяФормаОплаты)
ВыбраннаяФормаОплаты.Вставить("ЭСФСС", Ложь);
ВыбраннаяФормаОплаты.Вставить("СБП", Ложь);
РозничныеПродажиКлиентСерверЛокализация.ДополнитьДоступныеВидыОплаты(ЭтотОбъект, ВыбраннаяФормаОплаты);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ИнформацияОбОплатеЛокализация(Форма, ИнформацияОбОплате)
СуммаОплатыЭСФССПоДокументу = СуммаОплатыЭСФССПоДокументу(Форма.Объект.ОплатаПлатежнымиКартами);
Форма.ЭтоОплатаЭСФСС = (СуммаОплатыЭСФССПоДокументу > 0);
ИнформацияОбОплате.Вставить("ЭСФСС", СуммаОплатыЭСФССПоДокументу);
Форма.СуммаИтогоОплачено = ИнформацияОбОплате.ИтогоОплачено
+ ИнформацияОбОплате.ЭСФСС;
ИнформацияОбОплате.Вставить("ИтогоОплачено", Форма.СуммаИтогоОплачено);
СуммаОплатыСБППоДокументу = РозничныеПродажиКлиентСерверЛокализация.СуммаОплатыСБППоДокументу(Форма.Объект.ОплатаПлатежнымиКартами, Истина);
СуммаОжиданиеОплатыСБППоДокументу = РозничныеПродажиКлиентСерверЛокализация.СуммаОплатыСБППоДокументу(Форма.Объект.ОплатаПлатежнымиКартами) - СуммаОплатыСБППоДокументу;
Форма.ЕстьОплатаСБП = (СуммаОплатыСБППоДокументу > 0);
Форма.СуммаСБПВыполнена = СуммаОплатыСБППоДокументу;
Форма.СуммаСБПОжидание = СуммаОжиданиеОплатыСБППоДокументу;
ИнформацияОбОплате.Вставить("СБП", СуммаОплатыСБППоДокументу);
ИнформацияОбОплате.Вставить("СБПОжидание", СуммаОжиданиеОплатыСБППоДокументу);
Форма.СуммаИтогоОплачено = ИнформацияОбОплате.ИтогоОплачено
+ ИнформацияОбОплате.СБП;
ИнформацияОбОплате.Вставить("ИтогоОплачено", Форма.СуммаИтогоОплачено);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьЭСФССЛокализация()
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяФормаОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОплатаЭСФССОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьСБПЛокализация()
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ВыбраннаяФормаОплаты = РозничныеПродажиКлиентСервер.ДоступныеВидыОплаты(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ВыбраннаяФормаОплаты", ВыбраннаяФормаОплаты);
РозничныеПродажиКлиент.ОбработатьСостояниеСмены(
ЭтотОбъект,
Новый ОписаниеОповещения("ОплатаСБПОбработкаОповещения", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Функция ТребуетсяОтложитьЧекПриДобавленииОплатыЛокализация(ИнформацияОбОплате)
Результат = Ложь;
Результат = (ИнформацияОбОплате.СБПОжидание > 0);
Возврат Результат;
КонецФункции
&НаКлиенте
Функция ТребуетсяОтложитьЧекПриЗавершенииОтменыОплатыЛокализация(ИнформацияОбОплате)
Результат = Ложь;
Результат = (ИнформацияОбОплате.СБП > 0);
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ОтменитьОплатуЛокализация(ДополнительныеПараметры)
Если ДополнительныеПараметры.Свойство("ЭтоОплатаЭСФСС")
И ДополнительныеПараметры.ЭтоОплатаЭСФСС Тогда
Объект.ОплатаПлатежнымиКартами.Очистить();
Иначе
ОтменитьОплатуПлатежнымиКартами(
Новый ОписаниеОповещения("ОтменитьОплатуЗавершение", ЭтотОбъект, ДополнительныеПараметры));
КонецЕсли;
Возврат;
ОтменитьОплатуПлатежнымиКартами(
Новый ОписаниеОповещения("ОтменитьОплатуЗавершение", ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧекаПослеЗаписиИзмененийЛокализация(ПараметрыОперацииФискализацииЧека)
ФорматноЛогическийКонтрольКлиентСервер.ПровестиФорматноЛогическийКонтроль(ПараметрыОперацииФискализацииЧека, ПараметрыКассыККМ.ИдентификаторУстройства);
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ПробитьЧекПослеПроведения", ЭтотОбъект, ПараметрыОперацииФискализацииЧека),
НСтр("ru = 'Перед выполнением операции пробития чека не удалось провести документ.'"));
Возврат;
УстановитьФискальныйСтатусПробит();
РозничныеПродажиКлиент.РазблокироватьФорму(Этотобъект);
КонецПроцедуры
&НаСервере
Функция ПараметрыОперацииФискализацииЧекаНаСервереЛокализация()
ПараметрыОперацииФискализацииЧека = Новый Структура;
ПараметрыОперацииФискализацииЧека = ФормированиеПараметровФискальногоЧекаСервер.ПараметрыОперацииФискализацииЧека(Объект.Ссылка, Объект.Организация, Объект.Кассир);
ПараметрыОперацииФискализацииЧека.Вставить("ВерсияФФД", ВерсияФФД);
ПараметрыОперацииФискализацииЧека.Вставить("ИдентификаторУстройства", ПараметрыКассыККМ.ИдентификаторУстройства);
ПараметрыОперацииФискализацииЧека.Вставить("ЭтоОплатаЭСФСС", ЭтоОплатаЭСФСС);
ФормированиеПараметровФискальногоЧекаСервер.ПараметрыФискальногоЧекаЗаполнитьТипРасчета(
ПараметрыОперацииФискализацииЧека,
Перечисления.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств);
ФормированиеПараметровФискальногоЧекаСервер.ПараметрыФискальногоЧекаЗаполнитьСерийныйНомерОборудования(
ПараметрыОперацииФискализацииЧека,
ПараметрыКассыККМ.СерийныйНомер);
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаМестоРасчетов(
ПараметрыОперацииФискализацииЧека,
Объект.Организация,
СтруктураСостояниеКассовойСмены.КассаККМ,
ПараметрыКассыККМ.ИдентификаторУстройства);
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаПозицийЧекаККМ(ПараметрыОперацииФискализацииЧека, Объект.Ссылка);
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаТаблицаОплатЧекаККМ(
ПараметрыОперацииФискализацииЧека,
ИнформацияОбОплате(ЭтотОбъект));
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаСертификатыФСС(
ПараметрыОперацииФискализацииЧека,
Объект.ОплатаПлатежнымиКартами);
ФормированиеПараметровФискальногоЧекаСервер.ОбновитьПараметрыФискальногоЧекаСБП(
ПараметрыОперацииФискализацииЧека,
ОплатыСБП(Объект.ОплатаПлатежнымиКартами));
ФормированиеПараметровФискальногоЧекаСервер.ПараметрыФискальногоЧекаЗаполнитьПараметрыОтправкиЭлектронногоЧека(
ПараметрыОперацииФискализацииЧека,
ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека,
ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека);
ФормированиеПараметровФискальногоЧекаСервер.ДобавитьДанныеПоПодарочнымСертификатам(
ПараметрыОперацииФискализацииЧека,
Объект.ПодарочныеСертификаты.Выгрузить());
Возврат ПараметрыОперацииФискализацииЧека;
КонецФункции
&НаКлиенте
Процедура УстановитьФискальныйСтатусПробит()
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит");
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
ПараметрыЗаписи.Вставить("РежимПроведения", РежимПроведенияДокумента.Оперативный);
Записать(ПараметрыЗаписи);
ТолькоПросмотр = Истина;
ПодключитьОбработчикОжидания("УстановитьТекущийЭлементНаКнопкуНовыйЧек", 0.1, Истина);
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'Функционал печати чека для документа не реализован. Обратитесь к разработчикам.'"));
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииНоменклатурыХарактеристикиКоличестваЛокализация()
ВедетсяУчетЕГАИС = ОбщегоНазначенияЕГАИСКлиентСерверПовтИсп.ИспользуетсяМаркируемаяПродукция();
ВедетсяУчетИСМП = ИнтеграцияИСМПКлиентСерверПовтИсп.ВестиУчетМаркируемойПродукции();
Если (ВедетсяУчетЕГАИС Или ВедетсяУчетИСМП)
И ЭтотОбъект.ПараметрыИнтеграцииГосИС["ВедетсяУчетВидовПродукцииСЧастичнымВыбытиемИС"] = Истина Тогда
СтруктураПоиска = Новый Структура("ЕстьВскрытыеПотребительскиеУпаковкиИС", Истина);
СтрокиТоваров = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Если СтрокиТоваров.Количество() Тогда
ИнтеграцияИСУТ.ЗаполнитьКодыМаркировкиВскрытыхПотребительскихУпаковокИС(ЭтотОбъект, СтрокиТоваров);
КонецЕсли;
КонецЕсли;
Если ИнтеграцияИСМпКлиентСерверПовтИсп.ВестиУчетМаркируемойПродукции(Перечисления.ВидыПродукцииИС.ВетеринарныеПрепараты) Тогда
РозничныеПродажиЛокализация.ОбработатьРазрешенияНаПродажуТоваров(ЭтотОбъект);
КонецЕсли;
Возврат;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПриОкончанииРедактированияЛокализация(
Элемент,
НоваяСтрока,
ОтменаРедактирования,
КэшированныеЗначения,
ДополнительныеПараметры)
Если ОтменаРедактирования
Или Элементы.Товары.ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ВедетсяУчетЕГАИС = ОбщегоНазначенияЕГАИСКлиентСерверПовтИсп.ИспользуетсяМаркируемаяПродукция();
ВедетсяУчетИСМП = ИнтеграцияИСМПКлиентСерверПовтИсп.ВестиУчетМаркируемойПродукции();
Если Не (ВедетсяУчетЕГАИС Или ВедетсяУчетИСМП) Тогда
Возврат;
ИначеЕсли ЭтотОбъект.ПараметрыИнтеграцииГосИС["ВедетсяУчетВидовПродукцииСЧастичнымВыбытиемИС"] <> Истина Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока);
Если ТекущиеДанные.ЕстьВскрытыеПотребительскиеУпаковкиИС Тогда
КэшированныеЗначения.Вставить("ЗаполнитьКодыМаркировкиВскрытыхПотребительскихУпаковокИС");
ДополнительныеПараметры.Вставить("ТребуетсяСерверныйВызов");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ТоварыПриОкончанииРедактированияНаСервереЛокализация(ИдентификаторСтроки, КэшированныеЗначения)
Если КэшированныеЗначения.Свойство("ЗаполнитьКодыМаркировкиВскрытыхПотребительскихУпаковокИС") Тогда
ТекущиеДанные = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока);
Если ЗначениеЗаполнено(ТекущиеДанные.Количество) Тогда
СтрокиТоваров = Новый Массив();
СтрокиТоваров.Добавить(ТекущиеДанные);
ИнтеграцияИСУТ.ЗаполнитьКодыМаркировкиВскрытыхПотребительскихУпаковокИС(ЭтотОбъект, СтрокиТоваров, Истина);
КонецЕсли;
КэшированныеЗначения.Удалить("ЗаполнитьКодыМаркировкиВскрытыхПотребительскихУпаковокИС");
КонецЕсли;
РозничныеПродажиЛокализация.УдалитьРазрешенияНаПродажуБезСвязанныхТоваров(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ОбновитьКэшИнформацияПоВскрытымУпаковкам()
Если Объект.Товары.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ВключенныеВидыПродукции = ИнтеграцияИСКлиентСерверПовтИсп
.ВидыПродукцииИспользующиеВскрытыеПотребительскихУпаковок(Истина, Истина);
Если ВключенныеВидыПродукции.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ДанныеДокументаТовары = ДанныеДокументаТовары();
ПараметрыСканирования = ШтрихкодированиеОбщегоНазначенияИС.ПараметрыСканирования(ЭтотОбъект);
ВскрытыеУпаковки = РегистрыСведений
.ВскрытыеПотребительскиеУпаковкиИС
.ВскрытыеПотребительскиеУпаковкиПоТаблицеТоваров(ДанныеДокументаТовары, ПараметрыСканирования);
ИнформацияПоВскрытымУпаковкам.Очистить();
ДобавитьВКэшИнформацияПоВскрытымУпаковкамЕслиНужноЛокализация(ВскрытыеУпаковки);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЭтоМаркированныйТоварСЧастичнымВыбытиемЛокализация(Номенклатура)
ЭтоМаркированныйТоварСЧастичнымВыбытием = Ложь;
Результат = ОбщегоНазначенияИС.ОписаниеНоменклатуры(Номенклатура);
ДанныеЧастичногоВыбытия = Результат.Получить(Номенклатура);
Если ДанныеЧастичногоВыбытия <> Неопределено
И ЗначениеЗаполнено(ДанныеЧастичногоВыбытия.ВариантЧастичногоВыбытия) Тогда
ЭтоМаркированныйТоварСЧастичнымВыбытием = Истина;
КонецЕсли;
Возврат ЭтоМаркированныйТоварСЧастичнымВыбытием;
КонецФункции
&НаСервере
Функция ПодбиратьКодыМаркировкиВскрытыхПотребительскихУпаковокПоFIFOЛокализация()
Возврат ОбщегоНазначенияИСМПКлиентСерверПовтИсп
.НастройкиСканированияКодовМаркировки()
.ПодбиратьКодыМаркировкиВскрытыхПотребительскихУпаковокПоFIFO;
Возврат Истина;
КонецФункции
&НаСервере
Функция ВскрытыеПотребительскиеУпаковкиПоТоваруЛокализация(ДанныеПоТовару)
ТаблицаТовары = РегистрыСведений.ВскрытыеПотребительскиеУпаковкиИС.НоваяТаблицаПоискаВскрытыхПотребительскихУпаковок();
СтрокаТовары = ТаблицаТовары.Добавить();
СтрокаТовары.Номенклатура = ДанныеПоТовару.Номенклатура;
СтрокаТовары.Характеристика = ДанныеПоТовару.Характеристика;
СтрокаТовары.Серия = ДанныеПоТовару.Серия;
СтрокаТовары.УчитыватьСерии = (НЕ ДанныеПоТовару.Серия = Справочники.СерииНоменклатуры.ПустаяСсылка());
СтрокаТовары.Количество = ДанныеПоТовару.КоличествоУпаковок;
СтрокаТовары.ИндексИсходнойСтроки = 0;
ПараметрыСканирования = ШтрихкодированиеОбщегоНазначенияИС.ПараметрыСканирования(ЭтотОбъект);
Результат = РегистрыСведений.ВскрытыеПотребительскиеУпаковкиИС.ВскрытыеПотребительскиеУпаковкиПоТаблицеТоваров(
ТаблицаТовары,
ПараметрыСканирования);
ДобавитьВТабличнуюЧасть = Ложь;
GTINДляУказанияВскрытойУпаковки = Неопределено;
Если Результат <> Неопределено Тогда
Если Результат.Количество() = 0
ИЛИ Результат.Количество() = 1 Тогда
ДобавитьВТабличнуюЧасть = Истина;
Иначе
GTINДляУказанияВскрытойУпаковки = Результат[0].GTIN;
КонецЕсли;
КонецЕсли;
ДобавитьВКэшИнформацияПоВскрытымУпаковкамЕслиНужноЛокализация(Результат);
Возврат Новый Структура("ДобавитьВТабличнуюЧасть, GTINДляУказанияВскрытойУпаковки",
ДобавитьВТабличнуюЧасть, GTINДляУказанияВскрытойУпаковки);
Возврат Неопределено;
КонецФункции
&НаСервере
Процедура ОбработатьВскрытыеПотребительскиеУпаковкиПоТаблицеТоваровЛокализация(ТаблицаТоваров)
Описание = ОбщегоНазначенияИС.ОписаниеНоменклатуры(ТаблицаТоваров.ВыгрузитьКолонку("Номенклатура"));
Поиск = РегистрыСведений.ВскрытыеПотребительскиеУпаковкиИС.НоваяТаблицаПоискаВскрытыхПотребительскихУпаковок();
Для Каждого СтрокаТЧ Из ТаблицаТоваров Цикл
Если ЗначениеЗаполнено(Описание[СтрокаТЧ.Номенклатура].ВариантЧастичногоВыбытия) Тогда
НоваяСтрока = Поиск.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
НоваяСтрока.УчитыватьСерии = ЗначениеЗаполнено(СтрокаТЧ.Серия);
НоваяСтрока.Количество = СтрокаТЧ.КоличествоУпаковок;
КонецЕсли;
КонецЦикла;
Результат = РегистрыСведений.ВскрытыеПотребительскиеУпаковкиИС.ВскрытыеПотребительскиеУпаковкиПоТаблицеТоваров(
Поиск, ШтрихкодированиеОбщегоНазначенияИС.ПараметрыСканирования(ЭтотОбъект));
ДобавитьВКэшИнформацияПоВскрытымУпаковкамЕслиНужноЛокализация(Результат);
КонецПроцедуры
&НаСервере
Процедура ОбработатьДобавлениеСтрокСоВскрытымиПотребительскимиУпаковкамиЛокализация(ДобавленныеСтроки, ИзмененныеСтроки)
ТаблицаТовары = РегистрыСведений.ВскрытыеПотребительскиеУпаковкиИС
.НоваяТаблицаПоискаВскрытыхПотребительскихУпаковок();
Для Каждого ДобавленнаяСтрока Из ДобавленныеСтроки Цикл
СтрокаТовары = ТаблицаТовары.Добавить();
СтрокаТовары.Номенклатура = ДобавленнаяСтрока.Номенклатура;
СтрокаТовары.Характеристика = ДобавленнаяСтрока.Характеристика;
СтрокаТовары.Серия = ДобавленнаяСтрока.Серия;
СтрокаТовары.УчитыватьСерии = (НЕ ДобавленнаяСтрока.Серия = Справочники.СерииНоменклатуры.ПустаяСсылка());
СтрокаТовары.Количество = ДобавленнаяСтрока.КоличествоУпаковок;
СтрокаТовары.ИндексИсходнойСтроки = 0;
КонецЦикла;
Для Каждого ИзмененнаяСтрока Из ИзмененныеСтроки Цикл
СтрокаТовары = ТаблицаТовары.Добавить();
СтрокаТовары.Номенклатура = ИзмененнаяСтрока.Номенклатура;
СтрокаТовары.Характеристика = ИзмененнаяСтрока.Характеристика;
СтрокаТовары.Серия = ИзмененнаяСтрока.Серия;
СтрокаТовары.УчитыватьСерии = (НЕ ИзмененнаяСтрока.Серия = Справочники.СерииНоменклатуры.ПустаяСсылка());
СтрокаТовары.Количество = ИзмененнаяСтрока.Количество;
СтрокаТовары.ИндексИсходнойСтроки = 0;
КонецЦикла;
Если ТаблицаТовары.Количество() > 0 Тогда
ПараметрыСканирования = ШтрихкодированиеОбщегоНазначенияИС.ПараметрыСканирования(ЭтотОбъект);
Результат = РегистрыСведений.ВскрытыеПотребительскиеУпаковкиИС.ВскрытыеПотребительскиеУпаковкиПоТаблицеТоваров(
ТаблицаТовары,
ПараметрыСканирования);
ДобавитьВКэшИнформацияПоВскрытымУпаковкамЕслиНужноЛокализация(Результат);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемЧекаЛокализация(Отказ, Кнопки)
Если ЭтоОплатаЭСФСС
И Кнопки.Количество()
И (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
Или Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате"))
И ЗначениеЗаполнено(ПолучитьИдентификаторКорзиныОплатыЭСФСС(Объект.ОплатаПлатежнымиКартами)) Тогда
Кнопки.Очистить();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УказатьРазрешениеНаПродажуЛокализация()
Если Элементы.Товары.ВыделенныеСтроки.Количество() > 1 Тогда
УказатьРазрешениеНаПродажуВСценарииНесколькихСтрок();
ИначеЕсли Элементы.Товары.ВыделенныеСтроки.Количество() = 1 Тогда
УказатьРазрешениеНаПродажуВСценарииОднойСтроки();
КонецЕсли;
КонецПроцедуры
#Область ДополнительноеОписаниеКеги
&НаКлиентеНаСервереБезКонтекста
Функция ТекстДополнительногоОписанияДляРазливногоПива(ИнформацияПоВскрытымУпаковкам, АкцизныеМарки, СтрокаТовары)
ЧастиОписания = Новый Массив;
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", СтрокаТовары.Номенклатура);
Отбор.Вставить("Характеристика", СтрокаТовары.Характеристика);
Отбор.Вставить("Серия", СтрокаТовары.Серия);
НайденныеСтрокиТовары = ИнформацияПоВскрытымУпаковкам.НайтиСтроки(Отбор);
Для Каждого ДанныеПоВскрытойУпаковке Из НайденныеСтрокиТовары Цикл
ВскрытаОднаУпаковка = Ложь;
Если НайденныеСтрокиТовары.Количество() = 1 Тогда
ВскрытаОднаУпаковка = Истина;
КонецЕсли;
ОтборШтрихкодаВДокументе = Новый Структура("АкцизнаяМарка", ДанныеПоВскрытойУпаковке.КодМаркировки);
ШтрихкодУпаковкиВДокументе = АкцизныеМарки.НайтиСтроки(ОтборШтрихкодаВДокументе);
КоличествоВДокументеПоШтрихкоду = 0;
Если ШтрихкодУпаковкиВДокументе.Количество() > 0 Тогда
КоличествоВДокументеПоШтрихкоду = ШтрихкодУпаковкиВДокументе[0].ЧастичноеВыбытиеКоличество;
Если КоличествоВДокументеПоШтрихкоду = 0 Тогда
КоличествоВДокументеПоШтрихкоду = ДанныеПоВскрытойУпаковке.Остаток * ДанныеПоВскрытойУпаковке.КоэффициентУпаковки;
КонецЕсли;
Если ДанныеПоВскрытойУпаковке.УпаковкаЧастичногоВыбытия <> ДанныеПоВскрытойУпаковке.БазоваяЕдиницаИзмерения Тогда
КоличествоВДокументеПоШтрихкоду = КоличествоВДокументеПоШтрихкоду / ДанныеПоВскрытойУпаковке.КоэффициентУпаковки;
КонецЕсли;
КонецЕсли;
Остаток = ДанныеПоВскрытойУпаковке.Остаток - КоличествоВДокументеПоШтрихкоду;
Если ДанныеПоВскрытойУпаковке.ВидПродукции = ПредопределенноеЗначение("Перечисление.ВидыПродукцииИС.Пиво") Тогда
ТекстОписанияПоКеге = ДополнительноеОписаниеТовараДляКеги(
ДанныеПоВскрытойУпаковке.Комментарий,
ДанныеПоВскрытойУпаковке.КодМаркировки,
ДанныеПоВскрытойУпаковке.УпаковкаЧастичногоВыбытия,
Остаток);
Иначе
ТекстОписанияПоКеге = ДополнительноеОписаниеТовараДляИныхВидовПродукцииИС(
ДанныеПоВскрытойУпаковке.КодМаркировки,
ДанныеПоВскрытойУпаковке.УпаковкаЧастичногоВыбытия,
ВскрытаОднаУпаковка,
Остаток);
КонецЕсли;
Если ТекстОписанияПоКеге <> "" Тогда
ЧастиОписания.Добавить(ТекстОписанияПоКеге);
ЧастиОписания.Добавить(" ");
КонецЕсли;
КонецЦикла;
Если НайденныеСтрокиТовары.Количество() = 0
И ЭтоМаркированныйТоварСЧастичнымВыбытиемЛокализация(СтрокаТовары.Номенклатура) Тогда
ТекстОписанияПоКеге = ДополнительноеОписаниеТовараПриОтсутствииВскрытыхУпаковокДляИныхВидовПродукцииИС();
ЧастиОписания.Добавить(ТекстОписанияПоКеге);
КонецЕсли;
Если ЧастиОписания.Количество() > 0 Тогда
ЧастиОписания.Вставить(0, Символы.ПС);
КонецЕсли;
Возврат ЧастиОписания;
КонецФункции
&НаКлиенте
Процедура ОбработатьПопыткуИзмененияКоличестваЛокализация()
Если НЕ АктивированаКолонкаКоличество Тогда
Возврат;
КонецЕсли;
РозничныеПродажиКлиент.ОчиститьОкноСообщений(ЭтотОбъект);
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
Отбор.Вставить("Характеристика", ТекущиеДанные.Характеристика);
Отбор.Вставить("Серия", ТекущиеДанные.Серия);
ВскрытиеУпаковкиПоНоменклатуре = ИнформацияПоВскрытымУпаковкам.НайтиСтроки(Отбор);
Если ВскрытиеУпаковкиПоНоменклатуре.Количество() > 1 Тогда
ТекстСообщения = НСтр("ru='Вскрыто несколько кег. Для увеличения количества продажи используйте функционал
|быстрых товаров (кнопка «Быстрые товары») или форму подбора (кнопка «Подобрать»).
|Для уменьшения количества используйте форму подбора и проверки (кнопка «Акцизные марки»).'");
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НастроитьПравоРедактированияКоличестваЛокализация()
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
Отбор.Вставить("Характеристика", ТекущиеДанные.Характеристика);
Отбор.Вставить("Серия", ТекущиеДанные.Серия);
ВскрытиеУпаковкиПоНоменклатуре = ИнформацияПоВскрытымУпаковкам.НайтиСтроки(Отбор);
Если ВскрытиеУпаковкиПоНоменклатуре.Количество() > 1 Тогда
Элементы.ТоварыКоличествоУпаковок.ТолькоПросмотр = Истина;
Иначе
Элементы.ТоварыКоличествоУпаковок.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьИзменениеВПравахРедактированияКоличестваЛокализация()
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", ТекущиеДанные.Номенклатура);
Отбор.Вставить("Характеристика", ТекущиеДанные.Характеристика);
Отбор.Вставить("Серия", ТекущиеДанные.Серия);
ВскрытиеУпаковкиПоНоменклатуре = ИнформацияПоВскрытымУпаковкам.НайтиСтроки(Отбор);
Если ВскрытиеУпаковкиПоНоменклатуре.Количество() > 0 Тогда
Элементы.ТоварыКоличествоУпаковок.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ДанныеДокументаТовары()
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
Запрос.Текст =
"ВЫБРАТЬ
| Товары.ИдентификаторСтроки,
| Товары.НомерСтроки,
| Товары.Номенклатура,
| Товары.Характеристика,
| Товары.Серия,
| Товары.СтатусУказанияСерий,
| Товары.Упаковка,
| Товары.Количество,
| Товары.КоличествоУпаковок,
| Товары.Цена,
| Товары.СуммаАвтоматическойСкидки,
| Товары.СуммаРучнойСкидки,
| Товары.СтавкаНДС,
| Товары.СуммаНДС,
| Товары.Сумма
|ПОМЕСТИТЬ ТаблицаТовары
|ИЗ
| Документ.ЧекККМ.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка;
|
|
|ВЫБРАТЬ
| Серии.НомерСтроки КАК НомерСтроки,
| Серии.Серия КАК СерияТаблицыСерий,
| Серии.Количество КАК КоличествоУпаковок,
| Серии.Номенклатура КАК Номенклатура,
| Серии.Характеристика КАК Характеристика
|ПОМЕСТИТЬ Серии
|ИЗ
| Документ.ЧекККМ.Серии КАК Серии
|ГДЕ
| Серии.Ссылка = &Ссылка
|;
|
|
|ВЫБРАТЬ
| АкцизныеМарки.ИдентификаторСтроки,
| АкцизныеМарки.НомерСтроки,
| АкцизныеМарки.КодАкцизнойМарки,
| АкцизныеМарки.АкцизнаяМарка КАК ШтрихкодУпаковки,
| АкцизныеМарки.ЧастичноеВыбытиеВариантУчета КАК ЧастичноеВыбытиеВариантУчета,
| АкцизныеМарки.ЧастичноеВыбытиеНоменклатура КАК ЧастичноеВыбытиеНоменклатура,
| АкцизныеМарки.ЧастичноеВыбытиеХарактеристика КАК ЧастичноеВыбытиеХарактеристика,
| АкцизныеМарки.ЧастичноеВыбытиеКоличество КАК ЧастичноеВыбытиеКоличество,
| АкцизныеМарки.РазрешительныйРежимИдентификаторЗапросаГИСМТ КАК РазрешительныйРежимИдентификаторЗапросаГИСМТ,
| АкцизныеМарки.РазрешительныйРежимДатаЗапросаГИСМТ КАК РазрешительныйРежимДатаЗапросаГИСМТ,
| АкцизныеМарки.РазрешительныйРежимИдентификаторЭкземпляраПО КАК РазрешительныйРежимИдентификаторЭкземпляраПО,
| АкцизныеМарки.РазрешительныйРежимВерсияБазы КАК РазрешительныйРежимВерсияБазы
|ПОМЕСТИТЬ ТаблицаАкцизныеМарки
|ИЗ
| Документ.ЧекККМ.АкцизныеМарки КАК АкцизныеМарки
|ГДЕ
| АкцизныеМарки.Ссылка = &Ссылка
|ИНДЕКСИРОВАТЬ ПО
| ИдентификаторСтроки,
| НомерСтроки;
|
|
|ВЫБРАТЬ
| Товары.ИдентификаторСтроки,
| Товары.НомерСтроки,
| Товары.Номенклатура,
| Товары.Характеристика,
| Товары.Серия,
| Товары.СтатусУказанияСерий,
| СпрНоменклатура.ОсобенностьУчета КАК ОсобенностьУчета,
| Товары.Упаковка,
| Товары.Количество,
| Товары.КоличествоУпаковок,
| ВЫРАЗИТЬ(ВЫБОР
| КОГДА &ЦенаВключаетНДС
| ТОГДА Товары.Цена
| КОГДА Товары.КоличествоУпаковок = 0 И &ЦенаВключаетНДС
| ТОГДА Товары.Сумма
| КОГДА Товары.КоличествоУпаковок = 0 И НЕ &ЦенаВключаетНДС
| ТОГДА Товары.Сумма + Товары.СуммаНДС
| ИНАЧЕ (Товары.Сумма + Товары.СуммаНДС + Товары.СуммаРучнойСкидки
| + Товары.СуммаАвтоматическойСкидки) / Товары.КоличествоУпаковок
| КОНЕЦ КАК ЧИСЛО(31, 2)) КАК Цена,
| Товары.СуммаАвтоматическойСкидки + Товары.СуммаРучнойСкидки КАК СуммаСкидки,
| Товары.СтавкаНДС,
| Товары.СуммаНДС,
| ВЫРАЗИТЬ(ВЫБОР
| КОГДА &ЦенаВключаетНДС
| ТОГДА Товары.Сумма
| ИНАЧЕ Товары.Сумма + Товары.СуммаНДС
| КОНЕЦ КАК ЧИСЛО(31, 2)) КАК СуммаСНДС
|ПОМЕСТИТЬ Товары
|ИЗ
| ТаблицаТовары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
| ПО СпрНоменклатура.Ссылка = Товары.Номенклатура
|;
|";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.УстановитьПараметр("ЦенаВключаетНДС" , Объект.ЦенаВключаетНДС);
Запрос.Выполнить();
ДанныеДокумента = РозничныеПродажиЛокализация.ПолучитьТоварыИШтрихкодыДляИСМП(
Объект.Ссылка,
Запрос.МенеджерВременныхТаблиц);
Возврат ДанныеДокумента.Товары;
КонецФункции
&НаСервере
Процедура ДобавитьВКэшИнформацияПоВскрытымУпаковкамЕслиНужноЛокализация(ВскрытыеПотребительскиеУпаковки)
Для Каждого ВскрытаяУпаковка Из ВскрытыеПотребительскиеУпаковки Цикл
Отбор = Новый Структура("КодМаркировки", ВскрытаяУпаковка.КодМаркировки);
НайденныеСтроки = ИнформацияПоВскрытымУпаковкам.НайтиСтроки(Отбор);
СтрокаКэша = Неопределено;
Если НайденныеСтроки.Количество() > 0 Тогда
СтрокаКэша = НайденныеСтроки[0];
Иначе
СтрокаКэша = ИнформацияПоВскрытымУпаковкам.Добавить();
ОписаниеНоменклатурыСоответствие = ОбщегоНазначенияИС.ОписаниеНоменклатуры(ВскрытаяУпаковка.Номенклатура);
ОписаниеНоменклатуры = ОписаниеНоменклатурыСоответствие.Получить(ВскрытаяУпаковка.Номенклатура);
СтрокаКэша.УпаковкаЧастичногоВыбытия = ОписаниеНоменклатуры.УпаковкаЧастичногоВыбытия;
БазоваяЕдиницаИзмерения = Справочники
.УпаковкиЕдиницыИзмерения
.ЕдиницаХраненияНоменклатуры(ВскрытаяУпаковка.Номенклатура);
СтрокаКэша.БазоваяЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
СтрокаКэша.КоэффициентУпаковки = Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(
СтрокаКэша.УпаковкаЧастичногоВыбытия,
ВскрытаяУпаковка.Номенклатура);
КонецЕсли;
СтрокаКэша.Номенклатура = ВскрытаяУпаковка.Номенклатура;
СтрокаКэша.Характеристика = ВскрытаяУпаковка.Характеристика;
СтрокаКэша.Серия = ВскрытаяУпаковка.Серия;
СтрокаКэша.ВидПродукции = ВскрытаяУпаковка.ВидПродукции;
СтрокаКэша.GTIN = ВскрытаяУпаковка.GTIN;
СтрокаКэша.КодМаркировки = ВскрытаяУпаковка.КодМаркировки;
СтрокаКэша.КодМаркировкиСтрокой = ВскрытаяУпаковка.КодМаркировкиСтрокой;
СтрокаКэша.Комментарий = ВскрытаяУпаковка.Комментарий;
СтрокаКэша.Остаток = ВскрытаяУпаковка.Остаток / СтрокаКэша.КоэффициентУпаковки;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДополнительноеОписаниеТовараПриОтсутствииВскрытыхУпаковокДляИныхВидовПродукцииИС()
Текст = НСтр("ru = 'Нет вскрытых упаковок;'");
ОписаниеПоКеге = Новый ФорматированнаяСтрока(Текст, , ЦветаТекстаПодсказки().Проблема);
Возврат ОписаниеПоКеге;
КонецФункции
&НаСервереБезКонтекста
Функция ДополнительноеОписаниеТовараДляКеги(НомерКрана, КодМаркировки, УпаковкаЧастичногоВыбытия, Остаток)
ОписаниеПоКеге = "";
ДанныеПоКеге = СокрЛП(НомерКрана);
Если НЕ ЗначениеЗаполнено(ДанныеПоКеге) Тогда
ДанныеПоКеге = КодМаркировки;
КонецЕсли;
Текст = СтрШаблон(НСтр("ru = 'Кег %1: остаток %2 %3;'"), ДанныеПоКеге, Окр(Остаток, 1), УпаковкаЧастичногоВыбытия);
Если Остаток < 0 Тогда
ОписаниеПоКеге = Новый ФорматированнаяСтрока(Текст, , ЦветаТекстаПодсказки().Проблема);
ИначеЕсли Остаток <= МинимальныйОбъемОстаткаВКегеДляПредупреждения() Тогда
ОписаниеПоКеге = Новый ФорматированнаяСтрока(Текст, , ЦветаТекстаПодсказки().Предупреждение);
КонецЕсли;
Возврат ОписаниеПоКеге;
КонецФункции
&НаСервереБезКонтекста
Функция ДополнительноеОписаниеТовараДляИныхВидовПродукцииИС(
КодМаркировки,
УпаковкаЧастичногоВыбытия,
ВскрытаОднаУпаковка,
Остаток)
ОписаниеУпаковки = "";
Текст = СтрШаблон(НСтр("ru = '%1: остаток %2 %3;'"), КодМаркировки, Окр(Остаток, 0), УпаковкаЧастичногоВыбытия);
Если ВскрытаОднаУпаковка Тогда
Текст = СтрШаблон(НСтр("ru = 'остаток %1 %2;'"), Окр(Остаток, 0), УпаковкаЧастичногоВыбытия);
КонецЕсли;
ОписаниеУпаковки = Новый ФорматированнаяСтрока(Текст, , ЦветаТекстаПодсказки().Предупреждение);
Возврат ОписаниеУпаковки;
КонецФункции
&НаСервереБезКонтекста
Функция ЦветаТекстаПодсказки()
ЦветаТекстаПодсказки = Новый Структура;
ЦветаТекстаПодсказки.Вставить("Проблема", ЦветаСтиля["ЦветТекстаПроблема"]);
ЦветаТекстаПодсказки.Вставить("Предупреждение", ЦветаСтиля["ЦветТекстаПредупреждениеEDI"]);
Возврат ЦветаТекстаПодсказки;
КонецФункции
&НаСервереБезКонтекста
Функция МинимальныйОбъемОстаткаВКегеДляПредупреждения()
Возврат 5;
КонецФункции
#КонецОбласти
&НаКлиенте
Процедура УказатьРазрешениеНаПродажуВСценарииНесколькихСтрок()
ПозицииЧекаКЗаполнению.Очистить();
ЕстьЗаполненныеРазрешения = Ложь;
Для Каждого ИдентификаторВыбраннойСтроки Из Элементы.Товары.ВыделенныеСтроки Цикл
ВыбраннаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторВыбраннойСтроки);
Если ВыбраннаяСтрока.ПродаетсяПоРазрешению Тогда
СтрокаЧека = ПозицииЧекаКЗаполнению.Добавить();
СтрокаЧека.ИдентификаторСтроки = ВыбраннаяСтрока.ИдентификаторСтроки;
СтрокаЧека.Номенклатура = ВыбраннаяСтрока.Номенклатура;
КонецЕсли;
СтруктураПоиска = Новый Структура("ИдентификаторСтроки", ВыбраннаяСтрока.ИдентификаторСтроки);
СтрокиРазрешенияНаПродажу = Объект.РазрешенияНаПродажу.НайтиСтроки(СтруктураПоиска);
Если СтрокиРазрешенияНаПродажу.Количество() > 0 Тогда
Если ЗначениеЗаполнено(СтрокиРазрешенияНаПродажу[0].ТипДокумента) Тогда
ЕстьЗаполненныеРазрешения = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЕстьЗаполненныеРазрешения Тогда
ПоказатьВопрос(
Новый ОписаниеОповещения("УказатьРазрешениеНаПродажуДляВыделенныхСтрокВопросЗавершение", ЭтотОбъект),
НСтр("ru = 'В выделенных позициях чека есть номенклатура, для которой указаны разрешения на продажу. Заменить?'"),
РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);
ИначеЕсли ПозицииЧекаКЗаполнению.Количество() > 0 Тогда
ОткрытьФормуУказанияРазрешенияНаПродажу();
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'В выделенных позициях чека нет номенклатуры, для которой требуется указать разрешение на продажу'"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УказатьРазрешениеНаПродажуДляВыделенныхСтрокВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ОткрытьФормуУказанияРазрешенияНаПродажу();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуУказанияРазрешенияНаПродажу()
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПозицииЧекаКЗаполнению", ПозицииЧекаКЗаполнению);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаРазрешениеНаПродажу",
ПараметрыФормы,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ОткрытьФормуУказанияДокументаОтпускаПрепаратаЗавершение", ЭтотОбъект),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура УказатьРазрешениеНаПродажуВСценарииОднойСтроки()
ПозицииЧекаКЗаполнению.Очистить();
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'Не выбрана позиция чека, для которой нужно указать разрешение на продажу'"));
Возврат;
КонецЕсли;
Если Не ОбщегоНазначенияУТКлиентСервер.ЕстьРеквизитОбъекта(ТекущаяСтрока, "ПродаетсяПоРазрешению") Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'В позициях чеках нет номенклатуры, для которой нужно указать разрешение на продажу'"));
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
Если ТекущаяСтрока.ПродаетсяПоРазрешению Тогда
ПараметрыФормы.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
ПараметрыФормы.Вставить("ИдентификаторСтроки", ТекущаяСтрока.ИдентификаторСтроки);
СтруктураПоиска = Новый Структура("ИдентификаторСтроки", ТекущаяСтрока.ИдентификаторСтроки);
СтрокиРазрешенияНаПродажу = Объект.РазрешенияНаПродажу.НайтиСтроки(СтруктураПоиска);
Если СтрокиРазрешенияНаПродажу.Количество() > 0 Тогда
ПараметрыФормы.Вставить("ТипДокумента", СтрокиРазрешенияНаПродажу[0].ТипДокумента);
ПараметрыФормы.Вставить("НомерДокумента", СтрокиРазрешенияНаПродажу[0].НомерДокумента);
ПараметрыФормы.Вставить("ДатаДокумента", СтрокиРазрешенияНаПродажу[0].ДатаДокумента);
КонецЕсли;
КонецЕсли;
Для Каждого СтрокаТовары Из Объект.Товары Цикл
Если СтрокаТовары.ИдентификаторСтроки = ТекущаяСтрока.ИдентификаторСтроки
Или СтрокаТовары.ПродаетсяПоРазрешению = Ложь Тогда
Продолжить;
КонецЕсли;
СтруктураПоиска = Новый Структура("ИдентификаторСтроки", СтрокаТовары.ИдентификаторСтроки);
СтрокиРазрешенияНаПродажу = Объект.РазрешенияНаПродажу.НайтиСтроки(СтруктураПоиска);
Если СтрокиРазрешенияНаПродажу.Количество() = 0
Или Не ЗначениеЗаполнено(СтрокиРазрешенияНаПродажу[0].ТипДокумента) Тогда
СтрокаЧека = ПозицииЧекаКЗаполнению.Добавить();
СтрокаЧека.ИдентификаторСтроки = СтрокаТовары.ИдентификаторСтроки;
СтрокаЧека.Номенклатура = СтрокаТовары.Номенклатура;
КонецЕсли;
КонецЦикла;
ПараметрыФормы.Вставить("ПозицииЧекаКЗаполнению", ПозицииЧекаКЗаполнению);
Если ТекущаяСтрока.ПродаетсяПоРазрешению Или ПозицииЧекаКЗаполнению.Количество() > 0 Тогда
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаРазрешениеНаПродажу",
ПараметрыФормы,
ЭтотОбъект,,,,
Новый ОписаниеОповещения("ОткрытьФормуУказанияДокументаОтпускаПрепаратаЗавершение", ЭтотОбъект),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'В позициях чеках нет номенклатуры, для которой не указано разрешение на продажу'"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуУказанияДокументаОтпускаПрепаратаЗавершение(ДанныеРазрешенияНаПродажу, ДополнительныеПараметры) Экспорт
Если ДанныеРазрешенияНаПродажу <> Неопределено
И ДанныеРазрешенияНаПродажу.Результат <> Ложь Тогда
Если ЗначениеЗаполнено(ДанныеРазрешенияНаПродажу.ИдентификаторСтроки) Тогда
ЗаполнитьРазрешениеНаПродажуВПозицииЧека(
ДанныеРазрешенияНаПродажу.ИдентификаторСтроки,
ДанныеРазрешенияНаПродажу);
КонецЕсли;
Если ДанныеРазрешенияНаПродажу.Свойство("ПозицииЧекаКЗаполнению")
И ДанныеРазрешенияНаПродажу.ПозицииЧекаКЗаполнению.Количество() > 0 Тогда
Для Каждого СтрокаПозицийЧекаКЗаполнению Из ДанныеРазрешенияНаПродажу.ПозицииЧекаКЗаполнению Цикл
ЗаполнитьРазрешениеНаПродажуВПозицииЧека(
СтрокаПозицийЧекаКЗаполнению.ИдентификаторСтроки,
ДанныеРазрешенияНаПродажу);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьРазрешениеНаПродажуВПозицииЧека(ИдентификаторСтроки, РеквизитыРазрешенияНаПродажу)
СтруктураПоиска = Новый Структура("ИдентификаторСтроки", ИдентификаторСтроки);
СтрокиТовары = Объект.Товары.НайтиСтроки(СтруктураПоиска);
Если СтрокиТовары.Количество() = 0 Тогда
СтрокиТовары[0].РеквизитыРазрешенияНаПродажу = "";
Возврат;
КонецЕсли;
СтруктураПоиска = Новый Структура("ИдентификаторСтроки", ИдентификаторСтроки);
СтрокиРазрешениеНаПродажу = Объект.РазрешенияНаПродажу.НайтиСтроки(СтруктураПоиска);
Если СтрокиРазрешениеНаПродажу.Количество() = 0 Тогда
СтрокаРазрешенияНаПродажу = Объект.РазрешенияНаПродажу.Добавить();
Иначе
СтрокаРазрешенияНаПродажу = СтрокиРазрешениеНаПродажу[0];
КонецЕсли;
СтрокаРазрешенияНаПродажу.ИдентификаторСтроки = ИдентификаторСтроки;
СтрокаРазрешенияНаПродажу.ТипДокумента = РеквизитыРазрешенияНаПродажу.ТипДокумента;
СтрокаРазрешенияНаПродажу.НомерДокумента = РеквизитыРазрешенияНаПродажу.НомерДокумента;
СтрокаРазрешенияНаПродажу.ДатаДокумента = РеквизитыРазрешенияНаПродажу.ДатаДокумента;
СтрокиТовары[0].РеквизитыРазрешенияНаПродажу = "" + СтрокаРазрешенияНаПродажу.ТипДокумента
+ " №" + СтрокаРазрешенияНаПродажу.НомерДокумента + " от "
+ Формат(СтрокаРазрешенияНаПродажу.ДатаДокумента, "ДФ=dd.MM.yyyy");
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ОплатыСБП(ОплатаПлатежнымиКартами)
ОтборОплатыСБП = Новый Структура("ВидОплаты", ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.СистемаБыстрыхПлатежей"));
Возврат ОплатаПлатежнымиКартами.НайтиСтроки(ОтборОплатыСБП);
КонецФункции
&НаКлиенте
Процедура ПробитьЧекПослеПроведения(Проведен, ПараметрыОперацииФискализацииЧека) Экспорт
Если НЕ Проведен Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПробитьЧекЗавершение", ЭтотОбъект);
Результат = МенеджерОборудованияУТКлиент.ОборудованиеПодключено(ПараметрыКассыККМ.ИдентификаторУстройства);
Если Результат Или ПараметрыКассыККМ.ИспользоватьБезПодключенияОборудования Тогда
Если Не ПараметрыКассыККМ.ИспользоватьБезПодключенияОборудования Тогда
ПроверитьКодМаркировкиСредствамиККТ(ПараметрыОперацииФискализацииЧека);
Иначе
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОписаниеОповещения", ОписаниеОповещения);
РезультатВыполнения = Новый Структура;
РезультатВыполнения.Вставить("Результат", Истина);
ПечатьЧека_Завершение(
РезультатВыполнения,
ДополнительныеПараметры);
КонецЕсли;
Иначе
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'Фискальное устройство не подключено. Чек не напечатан.'"));
ВыполнитьОбработкуОповещения(
ОписаниеОповещения,
Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны",
Ложь, Ложь));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКодМаркировкиСредствамиККТ(ПараметрыОперацииФискализацииЧека)
УИДЗамераПроверкаКодаМаркировкиСредствамиККТ = ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЧекККМ.Форма.ФормаДокументаРМК.ПроверитьКодМаркировкиСредствамиККТ",, Ложь);
ПозицииЧека = ПараметрыОперацииФискализацииЧека.ПозицииЧека;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПараметрыОперацииФискализацииЧека", ПараметрыОперацииФискализацииЧека);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ПроверитьКодМаркировкиСредствамиККТЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ТекстКнопки = НСтр("ru = 'Пробить чек'");
РозничныеПродажиКлиент.ПроверитьКодМаркировкиСредствамиККТ(ПозицииЧека, ЭтотОбъект, ТекстКнопки, ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКодМаркировкиСредствамиККТЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если УИДЗамераПроверкаКодаМаркировкиСредствамиККТ <> Неопределено Тогда
ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамераПроверкаКодаМаркировкиСредствамиККТ);
УИДЗамераПроверкаКодаМаркировкиСредствамиККТ = Неопределено;
КонецЕсли;
Если ШтрихкодированиеИСМПКлиент.РезультатПроверкиСредствамиККТТребуетФискализации(Результат)
И ТипЗнч(ДополнительныеПараметры) = Тип("Структура")
И ДополнительныеПараметры.Свойство("ПараметрыОперацииФискализацииЧека") Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ПробитьЧекЗавершение", ЭтотОбъект);
ПараметрыОперацииФискализацииЧека = ДополнительныеПараметры.ПараметрыОперацииФискализацииЧека;
РозничныеПродажиКлиентЛокализация.ОбновитьПараметрыФискальногоЧекаЗапросПроверкиКодаПозицийЧека(
ПараметрыОперацииФискализацииЧека,
Результат);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОписаниеОповещения", ОписаниеОповещения);
ДополнительныеПараметры.Вставить("ПараметрыОперацииФискализацииЧека", ПараметрыОперацииФискализацииЧека);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПробитьЧекПослеПроведения", ДополнительныеПараметры);
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ПечатьЧека_Завершение", ЭтотОбъект, ДополнительныеПараметры);
ОповещениеПослеОткрытииЧека = Новый ОписаниеОповещения("ПечатьЧека_ПослеОткрытияЧека", ЭтотОбъект, ДополнительныеПараметры);
ОповещениеПриОшибкеПечатиЧека = Новый ОписаниеОповещения("ПечатьЧека_ПослеОшибкиПечатиЧека", ЭтотОбъект, ДополнительныеПараметры);
УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве = ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЧекККМ.Форма.ФормаДокументаРМК.НачатьФискализациюЧекаНаФискальномУстройстве",, Ложь);
ДополнительныеПараметры = МенеджерОборудованияКлиентСервер.ДополнительныеПараметрыОперации();
ДополнительныеПараметры.ОповещениеПослеОткрытииЧека = ОповещениеПослеОткрытииЧека;
ДополнительныеПараметры.ОповещениеПриОшибкеПечатиЧека = ОповещениеПриОшибкеПечатиЧека;
ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаНаФискальномУстройстве(
ОповещениеПриЗавершении,
УникальныйИдентификатор,
ПараметрыКассыККМ.ИдентификаторУстройства,
ПараметрыОперацииФискализацииЧека,
ДополнительныеПараметры);
Иначе
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧека_ПослеОткрытияЧека(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ПараметрыЛокализации = Новый Структура;
ПараметрыЛокализации.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
ПараметрыЛокализации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
ПараметрыЛокализации.Вставить("СтандартнаяОбработка", Истина);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПечатьЧека_ПослеОткрытияЧека", ПараметрыЛокализации);
Если ПараметрыЛокализации.СтандартнаяОбработка Тогда
ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОповещениеПродолжения, ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧека_ПослеОшибкиПечатиЧека(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
Если УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве <> Неопределено Тогда
ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве, Истина);
УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве = Неопределено;
КонецЕсли;
ПараметрыЛокализации = Новый Структура;
ПараметрыЛокализации.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
ПараметрыЛокализации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
ПараметрыЛокализации.Вставить("СтандартнаяОбработка", Истина);
СобытияФормКлиент.ПриИзмененииЭлемента(ЭтотОбъект, "ПечатьЧека_ПослеОшибкиПечатиЧека", ПараметрыЛокализации);
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЧека_Завершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
ИзмененныеДанныеЗаписаны = Ложь;
ВыполненаОперацияНаУстройстве = Ложь;
Если УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве <> Неопределено Тогда
ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве, Не РезультатВыполнения.Результат);
УИДЗамераНачатьФискализациюЧекаНаФискальномУстройстве = Неопределено;
КонецЕсли;
Если РезультатВыполнения.Результат Тогда
СписаноБонусныхБалловВВалюте = Объект.Товары.Итог("СуммаБонусныхБалловКСписаниюВВалюте");
НачисленоБонусныхБалловВВалюте = Объект.Товары.Итог("СуммаНачисленныхБонусныхБалловВВалюте");
ТекстоваяСтрокаДляПечатиНаККТ = "";
Если ЗначениеЗаполнено(Объект.КартаЛояльности)
И (СписаноБонусныхБалловВВалюте <> 0) Тогда
ТекстоваяСтрокаДляПечатиНаККТ = ТекстоваяСтрокаДляПечатиНаККТ + СтрШаблон(
НСтр("ru = 'Списано бонусных баллов: %1 %2'"),
СписаноБонусныхБалловВВалюте,
Объект.Валюта);
КонецЕсли;
Если ЗначениеЗаполнено(Объект.КартаЛояльности)
И (НачисленоБонусныхБалловВВалюте <> 0) Тогда
ТекстоваяСтрокаДляПечатиНаККТ = ТекстоваяСтрокаДляПечатиНаККТ + Символы.ПС + СтрШаблон(
НСтр("ru = 'Начислено бонусных баллов: %1 %2'"),
НачисленоБонусныхБалловВВалюте,
Объект.Валюта);
КонецЕсли;
Если ЗначениеЗаполнено(ТекстоваяСтрокаДляПечатиНаККТ) Тогда
УИДЗамераПечатьСлипЧека = ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЧекККМ.Форма.ФормаДокументаРМК.ПечатьСлипЧека",, Ложь);
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияПечатиСлипЧека", ЭтотОбъект);
ПараметрыОперации = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПечатиТекста(ТекстоваяСтрокаДляПечатиНаККТ);
ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьПечатьТекста(
ОповещениеПриЗавершении,
УникальныйИдентификатор,
ПараметрыКассыККМ.ИдентификаторУстройства,
ПараметрыОперации);
КонецЕсли;
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит");
Если РезультатВыполнения.Свойство("НомерЧекаККТ") Тогда
Объект.НомерЧекаККМ = Число(РезультатВыполнения.НомерЧекаККТ);
КонецЕсли;
ДанныеДляЖурналаРегистрации = Новый Структура;
ДанныеДляЖурналаРегистрации.Вставить("Дата", Объект.Дата);
ДанныеДляЖурналаРегистрации.Вставить("Статус", Объект.Статус);
ПараметрыФискализации = Неопределено;
Если РезультатВыполнения.Свойство("ВыходныеПараметры")
И РезультатВыполнения.ВыходныеПараметры.Количество() > 1 Тогда
ДанныеДляЖурналаРегистрации.Вставить("НомерЧекаККМ", РезультатВыполнения.ВыходныеПараметры[1]);
Объект.НомерЧекаККМ = Число(ДанныеДляЖурналаРегистрации.НомерЧекаККМ);
Если РезультатВыполнения.ВыходныеПараметры.Количество() > 8 Тогда
ПараметрыФискализации = РезультатВыполнения.ВыходныеПараметры[8];
КонецЕсли;
КонецЕсли;
ВыполненаОперацияНаУстройстве = Истина;
Модифицированность = Истина;
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьФискальнуюОперациюНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи, ПараметрыФискализации);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметрыПовторЗаписи = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыПовторЗаписи.РеквизитыФискальнойОперацииКассовогоУзла = ПараметрыФискализации;
ДополнительныеПараметрыПовторЗаписи.ОписаниеОповещения = ДополнительныеПараметры.ОписаниеОповещения;
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения = НСтр("ru = 'После пробития чека на ФР не удалось сохранить документ.'");
ДополнительныеПараметрыПовторЗаписи.ВозвращатьРезультатФункции = Ложь;
ДополнительныеПараметрыПовторЗаписи.РезультатПриУспешномПроведении = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Истина);
ДополнительныеПараметрыПовторЗаписи.РезультатПриОтмене = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Ложь);
ДополнительныеПараметрыПовторЗаписи.ИмяПроцедуры = "ЗаписатьФискальнуюОперациюНаСервере";
ДополнительныеПараметрыПовторЗаписи.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыПовторЗаписи);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыПовторЗаписи),
ДополнительныеПараметрыПовторЗаписи.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
КонецЕсли;
Иначе
РозничныеПродажиКлиент.СообщитьОбОшибкеПриПечатиЧека(ЭтотОбъект, РезультатВыполнения, Истина);
РозничныеПродажиКлиент.ЗакрытьСессиюПроверкиКМНаККТ(УникальныйИдентификатор, ПараметрыКассыККМ.ИдентификаторУстройства);
КонецЕсли;
ВыполнитьОбработкуОповещения(
ДополнительныеПараметры.ОписаниеОповещения,
Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны",
ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны));
КонецПроцедуры
&НаКлиенте
Процедура ПробитьЧекЗавершение(Результат, ДополнительныеПараметры) Экспорт
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Если Результат.ВыполненаОперацияНаУстройстве
И Результат.ИзмененныеДанныеЗаписаны Тогда
ТолькоПросмотр = Истина;
Если ЭтоОплатаЭСФСС Тогда
ТоварыФССКОплате = ТоварыФССКОплате();
ОтправитьПодтверждениеНСПКНаКлиенте(ТоварыФССКОплате);
КонецЕсли;
ПодключитьОбработчикОжидания("УстановитьТекущийЭлементНаКнопкуНовыйЧек", 0.1, Истина);
Иначе
Если Результат.ВыполненаОперацияНаУстройстве И Не Результат.ИзмененныеДанныеЗаписаны Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Данные", Объект.Ссылка);
ПараметрыФормы.Вставить("ДанныеДляЖурналаРегистрации", ДанныеДляЖурналаРегистрации);
ПараметрыФормы.Вставить("ТекстСообщения",
НСтр("ru = 'ВНИМАНИЕ! Произошла исключительная ситуация:
|Чек ККМ пробит, но не зафиксирован в системе.'"));
ОткрытьФорму("Документ.ЧекККМ.Форма.ОшибкаЗаписи", ПараметрыФормы, ЭтотОбъект);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ЗаписатьФискальнуюОперациюНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи, ПараметрыФискализации)
УИДЗамера = ОценкаПроизводительностиКлиент.ЗамерВремени(
"Документ.ЧекККМ.Форма.ФормаДокументаРМК.ЗаписатьФискальнуюОперациюНаКлиенте",, Ложь);
Результат = ЗаписатьФискальнуюОперациюНаСервере(ТребуетсяПовторнаяПопыткаЗаписи, ПараметрыФискализации);
ОценкаПроизводительностиКлиент.ЗавершитьЗамерВремени(УИДЗамера, Не Результат);
Если Результат Тогда
Оповестить("Запись_ЧекККМ", Новый Структура, Неопределено);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ОплатаЭСФССОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ВывестиКОплатеНаДисплейПокупателя = Истина;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОплатаЭСФССЗавершениеРасчета", ЭтотОбъект));
Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.Свойство("ВыбраннаяФормаОплаты") Тогда
ПараметрыРасчета.Вставить("ВыбраннаяФормаОплаты", ДополнительныеПараметры.ВыбраннаяФормаОплаты);
ОбновитьДаннныеОФормеОплаты(ЭтотОбъект, ДополнительныеПараметры.ВыбраннаяФормаОплаты);
КонецЕсли;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьРасчет", ЭтотОбъект, ПараметрыРасчета);
НачатьВыполнениеДополнительныхДействийПередОплатойЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОплатаЭСФССЗавершениеРасчета(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Ложь Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОткрытьФормуОплатыЭСФСС", ЭтотОбъект, Результат),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуОплатыЭСФСС(ИзмененныеДанныеЗаписаны, ДоступныеВидыОплаты) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ВывестиКОплатеНаДисплейПокупателя = Истина;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("ИнформацияОбОплате", ИнформацияОбОплате);
ПараметрыОткрытияФормы.Вставить("Организация", Объект.Организация);
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытияФормы.Вставить("ДоступнаПередачаДанных", ПараметрыКассыККМ.ДоступнаПередачаДанных);
ПараметрыОткрытияФормы.Вставить("ТоварныеПозиции", ТоварыФССКОплате());
ДанныеОплатыЭСФСС = ПолучитьДанныеОплатыЭСФСС(Объект.ОплатаПлатежнымиКартами);
Если Не ДанныеОплатыЭСФСС = Неопределено Тогда
ПараметрыОткрытияФормы.Вставить("ИдентификаторКорзины", ДанныеОплатыЭСФСС.ИдентификаторКорзины);
ПараметрыОткрытияФормы.Вставить("СсылочныйНомер", ДанныеОплатыЭСФСС.СсылочныйНомер);
КонецЕсли;
Если ДоступныеВидыОплаты <> Неопределено Тогда
ПараметрыОткрытияФормы.ИнформацияОбОплате.ДоступныеВидыОплаты = ДоступныеВидыОплаты;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатОплатыЭСФСС", ЭтотОбъект, ПараметрыОткрытияФормы);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаОплатыЭСФСС",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
ОписаниеОповещения);
КонецПроцедуры
&НаСервере
Функция ЭквайринговыйТерминалПоПодключенномуОборудованию(ИдентификаторУстройства)
РабочееМесто = МенеджерОборудованияВызовСервера.РабочееМестоКлиента();
Возврат Справочники.ЭквайринговыеТерминалы.ЭквайринговыйТерминалПоПодключенномуОборудованию(
РабочееМесто, ИдентификаторУстройства);
КонецФункции
&НаКлиенте
Процедура ОбработатьРезультатОплатыЭСФСС(Знач РезультатВыполнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт
Если РезультатВыполнения = Неопределено
ИЛИ РезультатВыполнения = "Отмена"
ИЛИ НЕ РезультатВыполнения.Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
Объект.Партнер = РезультатВыполнения.ДанныеЭлектронногоЧека.Партнер;
ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = РезультатВыполнения.ДанныеЭлектронногоЧека.ВариантОтправкиЭлектронногоЧека;
ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = РезультатВыполнения.ДанныеЭлектронногоЧека.КонтактныеДанныеЭлектронногоЧека;
Модифицированность = Истина;
Если РезультатВыполнения.Результат
И (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
Или Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате"))
И ЗначениеЗаполнено(ПолучитьИдентификаторКорзиныОплатыЭСФСС(Объект.ОплатаПлатежнымиКартами)) Тогда
ОбработатьДобавлениеОплаты(Неопределено);
Возврат;
КонецЕсли;
Объект.ПолученоНаличными = 0;
Объект.ОплатаПлатежнымиКартами.Очистить();
ЭквайринговыйТерминал = Неопределено;
Если РезультатВыполнения.Свойство("СуммаЭлектронногоСертификата")
И РезультатВыполнения.СуммаЭлектронногоСертификата > 0 Тогда
СтрокаЭСФСС = Объект.ОплатаПлатежнымиКартами.Добавить();
Если ЭквайринговыйТерминал = Неопределено Тогда
ЭквайринговыйТерминал = ЭквайринговыйТерминалПоПодключенномуОборудованию(РезультатВыполнения.ИдентификаторУстройства);
КонецЕсли;
СтрокаЭСФСС.ЭквайринговыйТерминал = ЭквайринговыйТерминал;
СтрокаЭСФСС.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.СертификатНСПК");
СтрокаЭСФСС.НомерПлатежнойКарты = РезультатВыполнения.НомерКарты;
СтрокаЭСФСС.ИдентификаторКорзины = РезультатВыполнения.ИдентификаторКорзины;
СтрокаЭСФСС.СсылочныйНомер = РезультатВыполнения.СсылочныйНомер;
СтрокаЭСФСС.КодАвторизации = РезультатВыполнения.КодАвторизации;
СтрокаЭСФСС.НомерЧекаЭТ = РезультатВыполнения.НомерЧекаЭТ;
СтрокаЭСФСС.Сумма = РезультатВыполнения.СуммаЭлектронногоСертификата;
КонецЕсли;
Если РезультатВыполнения.Свойство("СуммаСобственныхСредств")
И РезультатВыполнения.СуммаСобственныхСредств > 0 Тогда
СтрокаПКНСПК = Объект.ОплатаПлатежнымиКартами.Добавить();
Если ЭквайринговыйТерминал = Неопределено Тогда
ЭквайринговыйТерминал = ЭквайринговыйТерминалПоПодключенномуОборудованию(РезультатВыполнения.ИдентификаторУстройства);
КонецЕсли;
СтрокаПКНСПК.ЭквайринговыйТерминал = ЭквайринговыйТерминал;
СтрокаПКНСПК.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.ПлатежнаяКарта");
СтрокаПКНСПК.НомерПлатежнойКарты = РезультатВыполнения.НомерКарты;
СтрокаПКНСПК.СсылочныйНомер = РезультатВыполнения.СсылочныйНомер;
СтрокаПКНСПК.КодАвторизации = РезультатВыполнения.КодАвторизации;
СтрокаПКНСПК.НомерЧекаЭТ = РезультатВыполнения.НомерЧекаЭТ;
СтрокаПКНСПК.Сумма = РезультатВыполнения.СуммаСобственныхСредств;
КонецЕсли;
Если РезультатВыполнения.Свойство("Наличными") И РезультатВыполнения.Наличными > 0 Тогда
Объект.ПолученоНаличными = РезультатВыполнения.Наличными;
КонецЕсли;
ПересчитатьДокументНаКлиенте();
ТребуетсяПовторнаяПопыткаЗаписи = Ложь;
ИзмененныеДанныеЗаписаны = ЗаписатьНаКлиенте(ТребуетсяПовторнаяПопыткаЗаписи);
Если Не ИзмененныеДанныеЗаписаны Тогда
ДополнительныеПараметрыЗавершение = РозничныеПродажиКлиентСервер.СтруктураПовтораЗаписи();
ДополнительныеПараметрыЗавершение.ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьОплатуКартойЗаписьЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ДополнительныеПараметрыЗавершение.ТекстСообщения = НСтр("ru = 'После проведения оплаты платежной картой не удалось сохранить документ.'");
ДополнительныеПараметрыЗавершение.ВозвращатьРезультатФункции = Ложь;
ДополнительныеПараметрыЗавершение.РезультатПриУспешномПроведении = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Истина);
ДополнительныеПараметрыЗавершение.РезультатПриОтмене = Новый Структура("ВыполненаОперацияНаУстройстве, ИзмененныеДанныеЗаписаны", Истина, Ложь);
ДополнительныеПараметрыЗавершение.ИмяПроцедуры = "ЗаписатьНаСервере";
ДополнительныеПараметрыЗавершение.РезультатОперации = ИзмененныеДанныеЗаписаны;
Если Не ТребуетсяПовторнаяПопыткаЗаписи Тогда
ОшибкаПриПроведенииЧекаВопросЗавершение(КодВозвратаДиалога.Отмена, ДополнительныеПараметрыЗавершение);
Возврат;
КонецЕсли;
ПоказатьВопрос(
Новый ОписаниеОповещения("ОшибкаПриПроведенииЧекаВопросЗавершение", ЭтотОбъект, ДополнительныеПараметрыЗавершение),
ДополнительныеПараметрыЗавершение.ТекстСообщения,
РежимДиалогаВопрос.ПовторитьОтмена, 10, КодВозвратаДиалога.Повторить,,КодВозвратаДиалога.Повторить);
Возврат;
Иначе
ОбработатьДобавлениеОплаты(Неопределено);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПараметрыПередачиДанныхФискальногоЧека(ДокументОснование, СуммаСертификатамиЭСФСС)
Возврат ЭлектронныеСертификатыНСПКУТ.ПараметрыПередачиДанныхФискальногоЧека(ДокументОснование, СуммаСертификатамиЭСФСС);
КонецФункции
&НаКлиенте
Процедура ОтправитьПодтверждениеНСПКНаКлиенте(ТоварыФССКОплате)
СуммаОплатыСертификатамиФСС = СуммаОплатыЭСФССПоДокументу(Объект.ОплатаПлатежнымиКартами);
ПараметрыОперации = ПараметрыПередачиДанныхФискальногоЧека(Объект.Ссылка, СуммаОплатыСертификатамиФСС);
Если ПараметрыОперации = Неопределено Тогда
ТекстСообщения = СтрШаблон(НСтр("ru = 'Отсутствуют данные о фискализации чека: %1'"), СокрЛП(Объект.Ссылка));
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
Иначе
ОповещениеМетода = Новый ОписаниеОповещения("ПередатьДанныеФискальногоЧекаНСПКЗавершение", ЭтотОбъект, ПараметрыОперации);
ЭлектронныеСертификатыНСПККлиент.НачатьПередачуДанныхФискальногоЧека(ОповещениеМетода, ПараметрыОперации);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередатьДанныеФискальногоЧекаНСПКЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
РезультатПередачи = Новый Структура("Результат, КодРезультата, ОписаниеОшибки", Ложь, 999, "");
ЗаполнитьЗначенияСвойств(РезультатПередачи, РезультатВыполнения);
Если Не РезультатПередачи.Результат Тогда
ТекстСообщения = СтрШаблон(
НСтр("ru = 'При отправке подтверждения операции %1 на сервер произошла ошибка (код %2):
|%3'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()),
ДополнительныеПараметры.ИдентификаторКорзины,
Строка(РезультатПередачи.КодРезультата),
РезультатПередачи.ОписаниеОшибки);
ДобавитьЗаписьПоНеотправленномуВНСПКФискальномуЧеку(Объект.Ссылка, ТекстСообщения);
РозничныеПродажиВызовСервера.ЗаписьВЖурналРегистрации(
ТекстСообщения, "ПередатьДанныеФискальногоЧекаНСПКЗавершение", Объект.Ссылка);
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ДобавитьЗаписьПоНеотправленномуВНСПКФискальномуЧеку(ЧекККМ, ТекстСообщения)
ЭлектронныеСертификатыНСПКУТ.ДобавитьЗаписьПоНеотправленномуВНСПКФискальномуЧеку(ЧекККМ, ТекстСообщения);
КонецПроцедуры
&НаСервере
Функция ТоварыФССКОплате()
Возврат ЧекККМЛокализация.ТоварыФССВДокументеКОплате(
Объект.Товары.Выгрузить(),
Объект.ЦенаВключаетНДС);
КонецФункции
&НаСервереБезКонтекста
Функция СуммаОплатыЭСФССПоДокументу(ЗНАЧ ОплатыПлатежнойКартой)
Возврат РозничныеПродажиЛокализация.СуммаОплатыЭСФССПоДокументу(ОплатыПлатежнойКартой.Выгрузить());
КонецФункции
&НаКлиенте
Процедура УстановитьДоступностьКнопкиОплатитьЭСФСС(Значение)
Элементы.ОплатитьЭСФСС.Доступность = Ложь;
Если Значение И СуммаСБПВыполнена = 0 И СуммаСБПОжидание = 0 Тогда
Если (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
Или Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате"))
И ЭтоОплатаЭСФСС Тогда
Элементы.ОплатитьЭСФСС.Доступность = (Не ПолучитьИдентификаторКорзиныОплатыЭСФСС(Объект.ОплатаПлатежнымиКартами) = Неопределено);
ИначеЕсли (Не (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.ОтложенСРезервированием")
Или Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.КОплате"))
Или СуммаИтогоОплачено = 0) Тогда
Элементы.ОплатитьЭСФСС.Доступность = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КонтрольКодовТРУ(Знач ТолькоПриИзмененииКоличестваСтрок = Ложь)
Если ТипЗнч(КэшКодовТРУ) <> Тип("Структура") Тогда
КэшКодовТРУ = НовыйКэшКодовТРУ();
КонецЕсли;
Если ТолькоПриИзмененииКоличестваСтрок
И КэшКодовТРУ.КоличествоСтрокНаМоментОбработки = Объект.Товары.Количество() Тогда
Возврат;
КонецЕсли;
КэшКодовТРУ.КоличествоСтрокНаМоментОбработки = Объект.Товары.Количество();
ЕстьТоварыСВозможностьюОплатыЭС = Ложь;
ОтборСтрок = Новый Структура("ВозможнаОплатаЭС", Истина);
Если Объект.Товары.НайтиСтроки(ОтборСтрок).Количество() > 0 Тогда
ЕстьТоварыСВозможностьюОплатыЭС = Истина;
УстановитьДоступностьКнопкиОплатитьЭСФСС(Истина);
Возврат;
КонецЕсли;
ПолучитьЗапросомТРУ = Новый Массив;
Для каждого СтрокаТовар Из Объект.Товары Цикл
ТекНоменклатура = СтрокаТовар.Номенклатура;
ТекЗначениеТРУ = КэшКодовТРУ.ВсеКодыТРУ.Получить(ТекНоменклатура);
Если ТекЗначениеТРУ = Истина Тогда
СтрокаТовар.ВозможнаОплатаЭС = Истина;
ЕстьТоварыСВозможностьюОплатыЭС = Истина;
УстановитьДоступностьКнопкиОплатитьЭСФСС(Истина);
Возврат;
ИначеЕсли ТекЗначениеТРУ = Ложь Тогда
СтрокаТовар.ВозможнаОплатаЭС = Ложь;
Иначе
СтрокаТовар.ВозможнаОплатаЭС = Ложь;
Если ПолучитьЗапросомТРУ.Найти(ТекНоменклатура) = Неопределено Тогда
ПолучитьЗапросомТРУ.Добавить(ТекНоменклатура);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ПолучитьЗапросомТРУ.Количество() = 0 Тогда
УстановитьДоступностьКнопкиОплатитьЭСФСС(Ложь);
Возврат;
КонецЕсли;
КодыТРУ = ЗаполненныеКодыТРУ(ПолучитьЗапросомТРУ);
Для каждого Элем Из ПолучитьЗапросомТРУ Цикл
ЕстьКодТРУ = КодыТРУ.Найти(Элем)<> Неопределено;
КэшКодовТРУ.ВсеКодыТРУ.Вставить(Элем, ЕстьКодТРУ);
ОтборСтрок = Новый Структура("Номенклатура", Элем);
Для каждого ЭлемСтрокаТовары Из Объект.Товары.НайтиСтроки(ОтборСтрок) Цикл
ЭлемСтрокаТовары.ВозможнаОплатаЭС = ЕстьКодТРУ;
ЕстьТоварыСВозможностьюОплатыЭС = ЕстьТоварыСВозможностьюОплатыЭС ИЛИ ЕстьКодТРУ;
КонецЦикла;
КонецЦикла;
УстановитьДоступностьКнопкиОплатитьЭСФСС(ЕстьТоварыСВозможностьюОплатыЭС);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполненныеКодыТРУ(ТоварыДляЧтения)
Запрос = Новый Запрос;
Запрос.Параметры.Вставить("ТоварыДляЧтения", ТоварыДляЧтения);
Запрос.Текст =
"ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Ссылка,
| СпрНоменклатура.КодТРУ КАК КодТРУ
|ИЗ
| Справочник.Номенклатура КАК СпрНоменклатура
|ГДЕ
| СпрНоменклатура.Ссылка В(&ТоварыДляЧтения)
| И СпрНоменклатура.КодТРУ <> """"";
Результат = Новый Массив;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если НЕ ПустаяСтрока(Выборка.КодТРУ) Тогда
Результат.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция НовыйКэшКодовТРУ()
Результат = Новый Структура;
Результат.Вставить("ВсеКодыТРУ", Новый Соответствие);
Результат.Вставить("КоличествоСтрокНаМоментОбработки", 0);
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ОплатаСБПОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ВывестиКОплатеНаДисплейПокупателя = Истина;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("ОповещениеОЗавершении", Новый ОписаниеОповещения("ОплатаСБПЗавершениеРасчета", ЭтотОбъект));
Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.Свойство("ВыбраннаяФормаОплаты") Тогда
ПараметрыРасчета.Вставить("ВыбраннаяФормаОплаты", ДополнительныеПараметры.ВыбраннаяФормаОплаты);
ОбновитьДаннныеОФормеОплаты(ЭтотОбъект, ДополнительныеПараметры.ВыбраннаяФормаОплаты);
КонецЕсли;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьРасчет", ЭтотОбъект, ПараметрыРасчета);
НачатьВыполнениеДополнительныхДействийПередОплатойЛокализация(ОповещениеОЗавершении);
КонецПроцедуры
&НаКлиенте
Процедура ОплатаСБПЗавершениеРасчета(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Ложь Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ОткрытьФормуОплатыСБП", ЭтотОбъект),
НСтр("ru = 'Перед открытием формы оплаты не удалось записать документ.'"));
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуОплатыСБП(ИзмененныеДанныеЗаписаны, ПараметрыЗавершения) Экспорт
Если Не ИзмененныеДанныеЗаписаны = Истина Тогда
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
Если СуммаСБПВыполнена > 0 ИЛИ СуммаСБПОжидание > 0 Тогда
ОбработатьДобавлениеОплаты(Неопределено);
Возврат;
КонецЕсли;
Если ПараметрыЗавершения <> Неопределено Тогда
Объект.ПолученоНаличными = ПараметрыЗавершения.ПолученоНаличными;
КонецЕсли;
ВывестиКОплатеНаДисплейПокупателя = Истина;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ИнформацияОбОплате = ИнформацияОбОплате(ЭтотОбъект);
ПараметрыОткрытияФормы = Новый Структура;
ПараметрыОткрытияФормы.Вставить("ИнформацияОбОплате", ИнформацияОбОплате);
ПараметрыОткрытияФормы.Вставить("Организация", Объект.Организация);
ПараметрыОткрытияФормы.Вставить("Партнер", Объект.Партнер);
ПараметрыОткрытияФормы.Вставить("КассаККМ", Объект.КассаККМ);
ПараметрыОткрытияФормы.Вставить("ДатаОплаты", Объект.Дата);
ПараметрыОткрытияФормы.Вставить("Валюта", Объект.Валюта);
ПараметрыОткрытияФормы.Вставить("ИдентификаторФискальногоУстройства", ПараметрыКассыККМ.ИдентификаторУстройства);
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатОплатыСБП", ЭтотОбъект, ПараметрыЗавершения);
ОткрытьФорму(
"Документ.ЧекККМ.Форма.ФормаОплатыСБП",
ПараметрыОткрытияФормы,
ЭтотОбъект,,,,
ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьРезультатОплатыСБП(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если РезультатВыполнения = Неопределено
ИЛИ РезультатВыполнения = КодВозвратаДиалога.Отмена
ИЛИ НЕ РезультатВыполнения.Результат Тогда
ВывестиКОплатеНаДисплейПокупателя = Ложь;
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
РозничныеПродажиКлиент.РазблокироватьФорму(ЭтотОбъект);
Возврат;
КонецЕсли;
ОплатыСБП = ОплатыСБП(Объект.ОплатаПлатежнымиКартами);
Для Каждого СтрокаОплатыСБП Из ОплатыСБП Цикл
Объект.ОплатаПлатежнымиКартами.Удалить(СтрокаОплатыСБП);
КонецЦикла;
СтрокаСБП = Объект.ОплатаПлатежнымиКартами.Добавить();
СтрокаСБП.ВидОплаты = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.СистемаБыстрыхПлатежей");
СтрокаСБП.Сумма = РезультатВыполнения.СуммаОплаты;
СтрокаСБП.СсылочныйНомер = ИдентификаторыОперацииОплаты(РезультатВыполнения.НастройкаПодключения, Объект.Ссылка);
СтрокаСБП.ДоговорПодключения = РезультатВыполнения.ДоговорПодключения;
СтрокаСБП.СтатусОплатыСБП = ПредопределенноеЗначение("Перечисление.ТипыСтатусовОплатыСБП.Выполнена");
Если РезультатВыполнения.ЧекОтложен Тогда
СтрокаСБП.СтатусОплатыСБП = ПредопределенноеЗначение("Перечисление.ТипыСтатусовОплатыСБП.ОжидаетПодтверждение");
ОбщегоНазначенияКлиент.СообщитьПользователю(
НСтр("ru = 'Чек отложен. Необходимо дождаться получение статуса оплаты СБП.'"));
ИначеЕсли РезультатВыполнения.РучноеПодтверждениеОплаты Тогда
СтрокаСБП.СсылочныйНомер = "";
СтрокаСБП.СтатусОплатыСБП = ПредопределенноеЗначение("Перечисление.ТипыСтатусовОплатыСБП.ОжидаетПодтверждение");
КонецЕсли;
ПересчитатьДокументНаКлиенте();
ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Функция ИдентификаторыОперацииОплаты(ТорговаяТочка, ДокументОплаты)
ИдентификаторОплаты = "";
Попытка
Если ЗначениеЗаполнено(ДокументОплаты) Тогда
ИдентификаторОплаты = ПереводыСБПc2b.ИдентификаторыОперацииОплаты(ДокументОплаты);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации(
НСтр("ru = 'ИдентификаторыОперацииОплаты'",
ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
Метаданные.РегистрыСведений.НастройкиИнтеграцииСПлатежнымиСистемамиУТ,
,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат ИдентификаторОплаты;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьДанныеОплатыЭСФСС(ТаблицаОплатПлатежнымиКартами)
Результат = Неопределено;
ОплатыЭСФСС = ТаблицаОплатПлатежнымиКартами.НайтиСтроки(Новый Структура("ВидОплаты", ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.СертификатНСПК")));
Если ОплатыЭСФСС.Количество() Тогда
Результат = Новый Структура;
Результат.Вставить("ИдентификаторКорзины", ?(ПустаяСтрока(ОплатыЭСФСС[0].ИдентификаторКорзины), Неопределено, ОплатыЭСФСС[0].ИдентификаторКорзины));
Результат.Вставить("СсылочныйНомер", ?(ПустаяСтрока(ОплатыЭСФСС[0].СсылочныйНомер), Неопределено, ОплатыЭСФСС[0].СсылочныйНомер));
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьИдентификаторКорзиныОплатыЭСФСС(ТаблицаОплатПлатежнымиКартами)
Результат = Неопределено;
ДанныеОплатыЭСФСС = ПолучитьДанныеОплатыЭСФСС(ТаблицаОплатПлатежнымиКартами);
Если Не ДанныеОплатыЭСФСС = Неопределено Тогда
Результат = ДанныеОплатыЭСФСС.ИдентификаторКорзины;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ОпределятьПринадлежностьТовараИСтавкуНДСПередОплатойЛокализация()
КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ЗаполнитьСобственникаТовара",
ПакетнаяОбработкаТабличнойЧастиКлиентСерверЛокализация.ПараметрыЗаполненияСобственникаТовара(Объект));
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС",
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Объект.Товары, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
#КонецОбласти
#КонецОбласти