Сразу предупреждаю, доработка сделана в Альфа-Авто 4.1 (принципиальных отличий в Альфа-Авто 5 нет, если появляется в ней что-то интересное для нашего автосервиса, то переношу в 4.1). Внесены изменения в функциу орОбработкаЗаполнения_ЗаказНаряд_ЧекНаОплату(), добавлены параметры ЗаполнятьТовары, ЗаполнятьРаботы и КонтрольЧастичнойОплаты:
Код
// Функция выполняет заполнение ЧекНаОплату на основании ЗН
// Параметры:
// ЭтотОбъект - Документ для заполнения
// Основание - Документ основание
// Копирование - Признак копирования
//
Функция орОбработкаЗаполнения_ЗаказНаряд_ЧекНаОплату(ЭтотОбъект,Основание,Копирование, ЗаполнятьТабличныеЧасти = Истина, ЗаполнятьТовары = Истина, ЗаполнятьРаботы = Истина, КонтрольЧастичнойОплаты = Истина) Экспорт //+МВ 30.09.2017
Если Не мвДоработки.ЧекНаОплатуПоЗаказНаряд(ЭтотОбъект, Основание, ЗаполнятьТовары, ЗаполнятьРаботы, КонтрольЧастичнойОплаты) Тогда //+МВ 15.11.2017
Возврат Ложь;
КонецЕсли; //-МВ
дкОбработкаЗаполненияПоУмолчанию(ЭтотОбъект, Основание, Копирование, ЗаполнятьТабличныеЧасти);
Если (НЕ обЗначениеНеЗаполнено(Основание)) И (обЗначениеНеЗаполнено(ЭтотОбъект.ДокументОснование)) Тогда
ЭтотОбъект.ДокументОснование=Основание;
КонецЕсли;
ВалютаОснования = Основание.ВалютаДокумента;
КурсОснования = Основание.КурсДокумента;
Пересчет = (ВалютаОснования <> ЭтотОбъект.ВалютаДокумента)ИЛИ(КурсОснования <> ЭтотОбъект.КурсДокумента);
ЭтотОбъект.Товары.Очистить();
Для Каждого СтрокаТоваров Из Основание.Товары Цикл
Если ЗаполнятьТовары //+МВ 30.09.2017
И (СтрокаТоваров.Источник=Перечисления.ЗаказНарядНоменклатураИсточник.ДетальСоСклада ИЛИ
СтрокаТоваров.Источник=Перечисления.ЗаказНарядНоменклатураИсточник.ДетальЗаказывается) Тогда
НоваяСтрокаСчета=ЭтотОбъект.Товары.Добавить();
НоваяСтрокаСчета.Номенклатура=СтрокаТоваров.Номенклатура;
НоваяСтрокаСчета.Количество=СтрокаТоваров.Количество;
НоваяСтрокаСчета.ЕдиницаИзмерения=СтрокаТоваров.ЕдиницаИзмерения;
НоваяСтрокаСчета.Коэффициент=СтрокаТоваров.Коэффициент;
НоваяСтрокаСчета.Цена=СтрокаТоваров.Цена;
НоваяСтрокаСчета.Сумма=СтрокаТоваров.Сумма;
НоваяСтрокаСчета.СтавкаНДС=СтрокаТоваров.СтавкаНДС;
НоваяСтрокаСчета.СуммаНДС=СтрокаТоваров.СуммаНДС;
НоваяСтрокаСчета.ПроцентСкидки=СтрокаТоваров.ПроцентСкидки;
НоваяСтрокаСчета.СуммаСкидки=СтрокаТоваров.СуммаСкидки;
НоваяСтрокаСчета.СкидкаНаТовар=СтрокаТоваров.СкидкаНаТовар;
НоваяСтрокаСчета.ПроцентСкидкиСтроки=СтрокаТоваров.ПроцентСкидкиСтроки;
НоваяСтрокаСчета.СуммаСкидкиСтроки=СтрокаТоваров.СуммаСкидкиСтроки;
НоваяСтрокаСчета.СуммаВсего=СтрокаТоваров.СуммаВсего;
НоваяСтрокаСчета.ХарактеристикаНоменклатуры=СтрокаТоваров.ХарактеристикаНоменклатуры;
КонецЕсли;
КонецЦикла;
Если ЗаполнятьРаботы Тогда //+МВ 30.09.2017
Для Каждого СтрокаТоваров Из Основание.Работы Цикл
НоваяСтрокаСчета=ЭтотОбъект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаСчета, СтрокаТоваров);
НоваяСтрокаСчета.Номенклатура=СтрокаТоваров.Работа.Номенклатура;
НоваяСтрокаСчета.ЕдиницаИзмерения=СтрокаТоваров.Работа.Номенклатура.ОсновнаяЕдиницаИзмерения;
//Создадим характеристику для автоработы
АвтоработаТипНоменклатуры = Справочники.Номенклатура.Авторабота.ТипНоменклатуры;
ХарактеристикаНоменклатуры=Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(Строка(СтрокаТоваров.Работа), Истина,, АвтоработаТипНоменклатуры);
Если ХарактеристикаНоменклатуры.Пустая() Тогда
ХарактеристикаНоменклатуры=Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
ХарактеристикаНоменклатуры.УстановитьНовыйКод();
ХарактеристикаНоменклатуры.Владелец=АвтоработаТипНоменклатуры;
ХарактеристикаНоменклатуры.Наименование=Строка(СтрокаТоваров.Работа);
ХарактеристикаНоменклатуры.ОбменДанными.Загрузка=Истина;
Попытка
ХарактеристикаНоменклатуры.Записать();
Исключение
Сообщить("Ошибка создания новой характеристики автоработы: "+ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецЕсли;
НоваяСтрокаСчета.ХарактеристикаНоменклатуры=ХарактеристикаНоменклатуры.Ссылка;
КонецЦикла;
КонецЕсли;
Если (обЗначениеНеЗаполнено(ЭтотОбъект.СкидкаНаценка)) И (НЕ обЗначениеНеЗаполнено(Основание.СкидкаНаценкаРаботы)) Тогда
ЭтотОбъект.СкидкаНаценка=Основание.СкидкаНаценкаРаботы;
КонецЕсли;
ЭтотОбъект.ЗначениеСкидкиНаценки=ЭтотОбъект.ЗначениеСкидкиНаценки+Основание.ЗначениеСкидкиНаценкиРабот;
//Подсчет новой суммы документа назначения
ЭтотОбъект.СуммаДокумента=ЭтотОбъект.Товары.Итог("СуммаВсего");
Возврат Истина;
КонецФункции // орОбработкаЗаполнения_ЗаказНаряд_ЧекНаОплату()
Места где внесены мною изменения отмечены: //+МВ Дата - начало изменений, и //-МВ - конец, если изменено/добавлено более одной строки. Обычно более 3 строк не добавляю, если требует больше, то изменения выношу в функцию в свой общий модуль мвДоработки, а в коде - обращение к этой функции. Функция ЧекНаОплатуПоЗаказНаряд(Документ, Основание, ЗаполнятьТовары, ЗаполнятьРаботы, Спрашивать) и другие:
Код
// Возвращает Истина для разных СНО товаров и работ заказ-наряда
//
Функция РазныеСНОЗаказНаряда(Документ, Товары = Ложь, Работы = Ложь) Экспорт
Товары = Документ.Товары.Итог("СуммаВсего") > 0;
Работы = Документ.Работы.Итог("СуммаВсего") > 0;
ТоварыНДС = Документ.Товары.Итог("СуммаНДС") > 0;
РаботыНДС = Документ.Работы.Итог("СуммаНДС") > 0;
Если Не(Товары И Работы) Или (ТоварыНДС = РаботыНДС) Тогда
Возврат Ложь;
КонецЕсли;
Если ТоварыНДС И ЕстьРаботаСНДСЗаказНаряда(Документ, Истина) Тогда
Возврат Ложь; // А если не все товары с НДС?
КонецЕсли;
Возврат Истина;
КонецФункции // РазныеСНОЗаказНаряда()
// Возвращает Истина, если заказ-наряд оплачен не полностью
// с уточнением какая часть не оплачена: товары и/или работы
Функция ЧекНаОплатуПоЗаказНаряд(Документ, Основание, ЗаполнятьТовары = Истина, ЗаполнятьРаботы = Истина, Спрашивать = Истина) Экспорт
Если Не Спрашивать Тогда Возврат Истина; КонецЕсли;
Если ТипЗнч(Документ.Ссылка) <> Тип("ДокументСсылка.ЧекНаОплату")
Или ТипЗнч(Основание) <> Тип("ДокументСсылка.ЗаказНаряд") Тогда
Возврат Ложь;
КонецЕсли;
Подчиненный = Неопределено;
Если Документ.ЭтоНовый() Тогда
// Проверим наличие других оплат заказ-наряда
ПолностьюОплачен = Ложь;
Если ПодчиненныйДокумент(Основание, "ОплатаНаличными", Подчиненный) Тогда
Если ЧастичноОплачен(Подчиненный, Основание, Спрашивать) Тогда
Возврат Ложь;
КонецЕсли;
СуммаОплаты = ?(Подчиненный.ПолнаяОплатаПоСделке, Подчиненный.СуммаДокумента, 0);
Если СуммаОплаты >= Основание.СуммаДокумента Тогда
ПолностьюОплачен = Истина;
ИначеЕсли ПодчиненныйДокумент(Основание, "ОплатаНаличными", Подчиненный)
И СуммаОплаты + ?(Подчиненный.ПолнаяОплатаПоСделке, Подчиненный.СуммаДокумента, 0) >= Основание.СуммаДокумента Тогда
ПолностьюОплачен = Истина;
ИначеЕсли Спрашивать И ЧастичноОплачен(Подчиненный, Основание) Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Если ПолностьюОплачен Тогда
Если Подчиненный.Проведен Тогда
ТекстСообщения = "'" + СокрЛП(Основание) + "' полностью оплачен, ввод оплаты отменен.";
#Если Клиент Тогда
Предупреждение(ТекстСообщения, 30, "Ошибка!");
#Иначе
Сообщить(ТекстСообщения, СтатусСообщения.Внимание);
#КонецЕсли
ИначеЕсли Спрашивать Тогда
Ответ = Вопрос("По основанию '" + СокрЛП(Основание) + "' уже имеется
|не проведенный подчиненный документ '" + СокрЛП(Подчиненный) + "'.
|Открыть документ?", РежимДиалогаВопрос.ДаНет, 60);
Если Ответ = КодВозвратаДиалога.Да Тогда
Подчиненный.ПолучитьФорму().Открыть();
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецЕсли;
ИначеЕсли Документ.Товары.Количество() > 0 Тогда
ЕстьТовары = Ложь; ЕстьРаботы = Ложь;
Для каждого Строка Из Документ.Товары Цикл
ЕстьТовары = ?(Строка.Номенклатура = Справочники.Номенклатура.Авторабота, ЕстьТовары, Истина);
ЕстьРаботы = ?(Строка.Номенклатура = Справочники.Номенклатура.Авторабота, Истина, ЕстьРаботы);
Если ЕстьТовары И ЕстьРаботы Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьТовары <> ЕстьРаботы Тогда
ЗаполнятьТовары = ЕстьТовары;
ЗаполнятьРаботы = ЕстьРаботы;
Возврат Истина;
КонецЕсли;
КонецЕсли;
Если Подчиненный <> Неопределено Тогда
Если Подчиненный.СуммаДокумента = Основание.Товары.Итог("СуммаВсего") Тогда
ЗаполнятьТовары = Ложь;
Возврат Истина;
ИначеЕсли Подчиненный.СуммаДокумента = Основание.Работы.Итог("СуммаВсего") Тогда
ЗаполнятьРаботы = Ложь;
Возврат Истина;
КонецЕсли;
Если ПодчиненныйДокумент(Основание, "ОплатаНаличными", Подчиненный) Тогда
Если Подчиненный.СуммаДокумента = Основание.Товары.Итог("СуммаВсего") Тогда
ЗаполнятьТовары = Ложь;
Возврат Истина;
ИначеЕсли Подчиненный.СуммаДокумента = Основание.Работы.Итог("СуммаВсего") Тогда
ЗаполнятьРаботы = Ложь;
Возврат Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЗаполнятьТовары И ЗаполнятьРаботы И РазныеСНОЗаказНаряда(Основание, ЗаполнятьТовары, ЗаполнятьРаботы) Тогда
// Если Спрашивать Тогда
Ответ = Вопрос("В '" + СокрЛП(Основание) + "' различные СНО" + Символы.ПС + "Сперва оплатить работы: "
+ Основание.Работы.Итог("СуммаВсего") + " " + СокрЛП(Основание.ВалютаДокумента) + "? (Нет - товары: "
+ Основание.Товары.Итог("СуммаВсего") + " " + СокрЛП(Основание.ВалютаДокумента) + ")", РежимДиалогаВопрос.ДаНетОтмена, 30);
Если Ответ = КодВозвратаДиалога.Отмена Тогда
Возврат Ложь;
ИначеЕсли Ответ <> КодВозвратаДиалога.Нет Тогда
ЗаполнятьТовары = Ложь;
Иначе
ЗаполнятьРаботы = Ложь;
КонецЕсли;
// Иначе
// ЗаполнятьТовары = Ложь; // Предпочтем 1-ми оплатить работы (товары обычно безналично оплачивают)
// КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции // ЧекНаОплатуПоЗаказНаряд()
// Возвращает Истина, если Сумма совпадает с суммой документа
//
Функция ПолнаяОплатаПоСделке(Документ, Сумма) Экспорт
Если ТипЗнч(Документ) <> Тип("ДокументСсылка.ЗаказНаряд") Тогда
Возврат Документ.СуммаДокумента = Сумма;
КонецЕсли;
Возврат Документ.СуммаДокумента = Сумма
Или Документ.Товары.Итог("СуммаВсего") = Сумма
Или Документ.Работы.Итог("СуммаВсего") = Сумма;
КонецФункции // ПолнаяОплатаПоСделке()
// Возвращает Истина, если документ оплаты не "Полная оплата по сделке"
//
Функция ЧастичноОплачен(Документ, Основание, Спрашивать = Истина) Экспорт
Подчиненный = Неопределено;
Если Документ.ПолнаяОплатаПоСделке Тогда
Возврат Ложь;
ИначеЕсли ПодчиненныйДокумент(Документ, ?(ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекНаОплату"), "ЧекНаОплату", "РасходныйКассовыйОрдер"), Подчиненный)
И Подчиненный.ХозОперация = ?(ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекНаОплату"), Справочники.ХозОперации.ЧекНаОплатуВозврат, Справочники.ХозОперации.РасходныйКассовыйОрдер)
И Подчиненный.СуммаДокумента >= Документ.СуммаДокумента Тогда
Возврат Ложь;
КонецЕсли;
Если Спрашивать Тогда
Ответ = Вопрос("По основанию '" + СокрЛП(Основание) + "' " + ДопНаименованиеДокумента(Документ) + "имеется
|частичная оплата '" + СокрЛП(Документ) + "' на сумму: " + Документ.СуммаДокумента + " " + Документ.ВалютаДокумента + ".
|Открыть документ для оформления чека возврата (Да),
|или продолжить создание документа оплаты? (Нет)", РежимДиалогаВопрос.ДаНетОтмена, 30);
Если Ответ = КодВозвратаДиалога.Да Тогда
Документ.ПолучитьФорму().Открыть();
ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
Спрашивать = Ложь;
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции // ЧастичноОплачен()
// Возвращает Истина, если заказ-наряд полность оплачен
//
Функция ПолностьюОплачен(Документ) Экспорт
Если ТипЗнч(Документ) <> Тип("ДокументСсылка.ЗаказНаряд") Тогда
Возврат Ложь;
КонецЕсли;
Подчиненный = Неопределено;
Если ПодчиненныйДокумент(Документ, "ОплатаНаличными", Подчиненный) Тогда
Если ЧастичноОплачен(Подчиненный, Документ) Тогда
Возврат Ложь;
КонецЕсли;
СуммаОплаты = Подчиненный.СуммаДокумента;
Если СуммаОплаты >= Документ.СуммаДокумента Тогда
ИначеЕсли ПодчиненныйДокумент(Документ, "ОплатаНаличными", Подчиненный)
И СуммаОплаты + Подчиненный.СуммаДокумента >= Документ.СуммаДокумента Тогда
Если ЧастичноОплачен(Подчиненный, Документ) Тогда
Возврат Ложь;
КонецЕсли;
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции // ПолностьюОплачен()
При нажатии кнопки "Оплата" в заказ-наряде происходит анализ его оплаты, если он не оплачен или частично оплачен, то задается вопрос:
Изменено: Михаил Волков - 20.02.2019 17:23:41(Добавление текста)
Продолжение описания моей доработки: Далее открывается форма обработки Фронт кассира "Корректировка суммы оплаты". В ней к флажку "Полная оплата по сделке" добавлены еще два: ОплатаТовары и ОплатаРаботы, которые видны только при оплате заказ-наряда:
Код
Процедура ПриОткрытии()
Если ПолнаяОплатаПоСделке Тогда
ЭлементыФормы.СуммаДляОплаты.Доступность=Ложь;
ЭлементыФормы.СтавкаНДС.Доступность=Ложь;
ЭлементыФормы.СуммаНДС.Доступность=Ложь;
ТекущийЭлемент=ЭлементыФормы.ПолнаяОплатаПоСделке;
Иначе
ТекущийЭлемент=ЭлементыФормы.СуммаДляОплаты;
КонецЕсли;
ВидимостьОплат = ТипЗнч(Сделка) = Тип("ДокументСсылка.ЗаказНаряд"); //+МВ 15.11.2017
ЭлементыФормы.ОплатаТовары.Видимость = ВидимостьОплат;
ЭлементыФормы.ОплатаРаботы.Видимость = ВидимостьОплат;
ОплатаТовары = Ложь; ОплатаРаботы = Ложь;
Если ВидимостьОплат Тогда
ОплатаТовары = (ПолнаяСуммаПоСделке = Сделка.СуммаДокумента) Или (ПолнаяСуммаПоСделке = Сделка.Товары.Итог("СуммаВсего"));
ОплатаРаботы = (ПолнаяСуммаПоСделке = Сделка.СуммаДокумента) Или (ПолнаяСуммаПоСделке = Сделка.Работы.Итог("СуммаВсего"));
КонецЕсли;
ЭлементыФормы.СуммаПоСделке.Доступность = ОплатаТовары И ОплатаРаботы; //-МВ
КонецПроцедуры
Процедура ПолнаяОплатаПоСделкеПриИзменении(Элемент)
Если ПолнаяОплатаПоСделке Тогда
СуммаДляОплаты=ПолнаяСуммаПоСделке;
//ЭтаФорма.ОбработкаРеквизита("СуммаДокумента",, ЭтаФорма);
ПересчитатьСумуНДС();
ЭлементыФормы.СуммаДляОплаты.Доступность=Ложь;
ЭлементыФормы.СтавкаНДС.Доступность=Ложь;
ЭлементыФормы.СуммаНДС.Доступность=Ложь;
Иначе
ЭлементыФормы.СуммаДляОплаты.Доступность=Истина;
ЭлементыФормы.СтавкаНДС.Доступность=Истина;
ЭлементыФормы.СуммаНДС.Доступность=Истина;
КонецЕсли;
ВидимостьОплат = ТипЗнч(Сделка) = Тип("ДокументСсылка.ЗаказНаряд"); //+МВ 15.11.2017
ЭлементыФормы.ОплатаТовары.Видимость = ВидимостьОплат;
ЭлементыФормы.ОплатаРаботы.Видимость = ВидимостьОплат; //-МВ
КонецПроцедуры
Внесены изменения в модуль обработки Фронт кассира в процедуру ОплатитьДокумент(Документ):
Код
// Процедура оплатить документ
//
//Параметры:
// Документ -
//
Процедура ОплатитьДокумент(Документ) Экспорт
// Проверим тип переданного объекта
Если НЕ (Метаданные.Документы.ЧекНаОплату.ВводитсяНаОсновании.Содержит(Документ.Метаданные()) ИЛИ ТипЗнч(Документ)=Тип("ДокументСсылка.ПриходныйКассовыйОрдер") ИЛИ ТипЗнч(Документ)=Тип("ДокументСсылка.РасходныйКассовыйОрдер")) Тогда
Возврат;
КонецЕсли;
// Если ТипЗнч(Документ) <> Тип("ДокументСсылка.ПриходныйКассовыйОрдер") //+МВ 27.09.2017 пока отказались от использования "Чек на оплату"
// И ТипЗнч(Документ) <> Тип("ДокументСсылка.РасходныйКассовыйОрдер") Тогда
// #Если Клиент Тогда
// Предупреждение("Пробитие чека пока возможна только из кассовых документов!", 10);
// #КонецЕсли
// Возврат;
// КонецЕсли; //-МВ 15.11.2017
// Вызываем обработчик выбора чека на оплату
Если ТипЗнч(Документ)=Тип("ДокументСсылка.ЧекНаОплату") Тогда
Если Документ.ХозОперация=Справочники.ХозОперации.ЧекНаОплату Тогда
Если Документ.Проведен Тогда
РежимВыбора = "ВыборДокументаНаОплатуВозврат";
ЗначениеВыбора = Документ;
ПолнаяСуммаПоСделке = Документ.СуммаДокумента;
ИначеЕсли Документ.НомерЧека <= 0 Тогда //+МВ 30.09.2017
Если НЕ Документ.ДляПробитияНаФР Тогда
Предупреждение("Данный документ не предназначен для пробития на фискальном регистраторе. Установите признак документа ""Для пробития на фискальном регистраторе"" для возможности продолжения операции."+Символы.ПС+"Выполнение операции прервано.");
Возврат;
КонецЕсли; //-МВ
РежимВыбора = "ВыборДокументаНаОплату";
ЗначениеВыбора = Документ;
ПолнаяСуммаПоСделке = Документ.СуммаДокумента;
Иначе //+МВ 30.09.2017
Предупреждение("Данный документ уже был пробит на фискальном регистраторе. Повторное выполнение операции запрещено."+Символы.ПС+"Выполнение операции прервано.");
Возврат; //-МВ
КонецЕсли;
ИначеЕсли Документ.ХозОперация=Справочники.ХозОперации.ЧекНаОплатуВозврат Тогда
Если Документ.Проведен Тогда //+МВ 30.09.2017
Предупреждение("На основании возврата по документу <Чек на оплату> нельзя вводить чеки на оплату."+Символы.ПС+"Выполнение операции прервано.");
Возврат;
ИначеЕсли Документ.НомерЧека <= 0 Тогда //+МВ 30.09.2017
Если НЕ Документ.ДляПробитияНаФР Тогда
Предупреждение("Данный документ не предназначен для пробития на фискальном регистраторе. Установите признак документа ""Для пробития на фискальном регистраторе"" для возможности продолжения операции."+Символы.ПС+"Выполнение операции прервано.");
Возврат;
КонецЕсли;
РежимВыбора = "ВыборДокументаНаОплатуВозврат";
ЗначениеВыбора = Документ;
ПолнаяСуммаПоСделке = Документ.СуммаДокумента;
Иначе
Предупреждение("Данный документ уже был пробит на фискальном регистраторе. Повторное выполнение операции запрещено."+Символы.ПС+"Выполнение операции прервано.");
Возврат; //-МВ
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗнч(Документ)=Тип("ДокументСсылка.ПриходныйКассовыйОрдер") ИЛИ ТипЗнч(Документ)=Тип("ДокументСсылка.РасходныйКассовыйОрдер") Тогда
Если НЕ Документ.ДляПробитияНаФР Тогда
Предупреждение("Данный документ не предназначен для пробития на фискальном регистраторе. Установите признак документа ""Для пробития на фискальном регистраторе"" для возможности продолжения операции."+Символы.ПС+"Выполнение операции прервано.");
Возврат;
ИначеЕсли Документ.НомерЧека <= 0 Тогда //+МВ 27.09.2017 вместо обЗначениеНеЗаполнено(Документ.ДатаФР)
РежимВыбора = "ВыборДокументаНаОплату";
ЗначениеВыбора = Документ;
ПолнаяСуммаПоСделке = Документ.СуммаДокумента;
Иначе
Предупреждение("Данный документ уже был пробит на фискальном регистраторе. Повторное выполнение операции запрещено."+Символы.ПС+"Выполнение операции прервано.");
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Документ.ДокументОснование) И дкДокументЕстьРеквизитШапки("ТипЦен", Документ.ДокументОснование.Метаданные().Имя)
И НЕ Документ.ДокументОснование.ТипЦен.ЦенаВключаетНДС Тогда
Сообщить("Тип цен документа основания не включает НДС!");
КонецЕсли;
Иначе
// Произведем формирование чека на оплату по указанному документу
ЧекНаОплату = Документы.ЧекНаОплату.СоздатьДокумент();
//Проверка на право ввода на основании заказ-наряда
Если НЕ обПраво("ВводОплатыПоЗаказНаряду",ЧекНаОплату.Права,,ЧекНаОплату) Тогда
Если НЕ обЗначениеНеЗаполнено(Документ) Тогда
ОтказНаВводДокумента=Ложь;
Если ТипЗнч(Документ)=Тип("ДокументСсылка.ЗаказНаряд") Тогда
ОтказНаВводДокумента=Истина;
Иначе
Попытка
Если ТипЗнч(Документ.ДокументОснование)=Тип("ДокументСсылка.ЗаказНаряд") Тогда
ОтказНаВводДокумента=Истина;
КонецЕсли;
Исключение КонецПопытки;
КонецЕсли;
Если ОтказНаВводДокумента Тогда
Сообщить("Ввод чека на оплату на основании заказ-наряда запрещено!",СтатусСообщения.Важное);
Отказ=Истина; Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если дкДокументЕстьРеквизитШапки("ТипЦен", Документ.Метаданные().Имя)
И НЕ Документ.ТипЦен.ЦенаВключаетНДС Тогда
Сообщить("Тип цен документа не включает НДС!");
КонецЕсли;
ЧекНаОплату.Заполнить(Документ);
РежимВыбора = "ВыборДокументаНаОплату";
ЗначениеВыбора = ЧекНаОплату;
Если ЧекНаОплату.СуммаДокумента = 0 Тогда //+МВ 20.12.2017
Возврат;
КонецЕсли;
ПолнаяСуммаПоСделке = обПересчет(Документ.СуммаДокумента, Документ.ВалютаДокумента, Документ.КурсДокумента, ЧекНаОплату.ВалютаДокумента, ЧекНаОплату.Дата, РежимОкругления.Окр15как20);
ПолнаяСуммаПоСделке = ?(ТипЗнч(Документ) = Тип("ДокументСсылка.ЗаказНаряд"), ЧекНаОплату.СуммаДокумента, ПолнаяСуммаПоСделке); //+МВ 15.11.2017
КонецЕсли;
// Произведем инициализацию формы фронта
ФормаФронта = Обработки.ФронтКассира.ПолучитьФорму("ФормаМенеджера");
НовыйЧекНаОплату=Неопределено;
// Попросим пользователя подтвердить сумму оплаты
СуммаДляОплаты = МАКС(ЗначениеВыбора.СуммаДокумента, 0);
СтавкаНДСЧекаНаОплату = ЗначениеВыбора.СтавкаНДС;
СуммаНДСЧекаНаОплату = МАКС(ЗначениеВыбора.СуммаНДС, 0);
Если ТипЗнч(Документ) = Тип("ДокументСсылка.ПриходныйКассовыйОрдер") //+МВ 15.11.2017
Или (ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекНаОплату")
И Документ.ХозОперация = Справочники.ХозОперации.ЧекНаОплату) Тогда
// Проверим сумму к оплате
Если СуммаДляОплаты=0 Тогда
Предупреждение("Сумма к оплате по данной сделке нулевая. Выполнение операции прервано.");
Возврат;
КонецЕсли;
ПолнаяОплатаПоСделке=Документ.ПолнаяОплатаПоСделке;
ИначеЕсли ТипЗнч(Документ)=Тип("ДокументСсылка.РасходныйКассовыйОрдер") //+МВ 15.11.2017
Или (ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекНаОплату")
И Документ.ХозОперация = Справочники.ХозОперации.ЧекНаОплатуВозврат) Тогда
// Проверим сумму к возврату
Если СуммаДляОплаты=0 Тогда
Предупреждение("Сумма к возврату по данной сделке нулевая. Выполнение операции прервано.");
Возврат;
КонецЕсли;
ПолнаяОплатаПоСделке=Документ.ПолнаяОплатаПоСделке;
Иначе
// Создаем и заполняем форму корректировки оплаты
ФормаКорректировки = ПолучитьФорму("КорректировкаСуммыОплаты", ФормаФронта);
ФормаКорректировки.СуммаПоСделке = ?(СуммаДляОплаты=0, Документ.СуммаДокумента, СуммаДляОплаты);
ФормаКорректировки.СуммаДляОплаты = СуммаДляОплаты;
ФормаКорректировки.ПолнаяСуммаПоСделке = ПолнаяСуммаПоСделке;
ФормаКорректировки.СтавкаНДС = СтавкаНДСЧекаНаОплату;
ФормаКорректировки.СуммаНДС = СуммаНДСЧекаНаОплату;
Если СуммаДляОплаты=Документ.СуммаДокумента Тогда
ПолнаяОплатаПоСделке=Истина;
Иначе
ПолнаяОплатаПоСделке=Ложь;
КонецЕсли;
ФормаКорректировки.Сделка = Документ;
//+МВ 15.11.2017 В заказ-наряде возможны различные СНО, требующие отдельные чеки для товаров и работ
Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЗаказНаряд") Тогда
// Проверим сумму к оплате
Если СуммаДляОплаты = 0 Тогда
Предупреждение("Сумма к оплате по данному заказ-наряду нулевая. Выполнение операции прервано.");
Возврат;
КонецЕсли;
ПолнаяОплатаПоСделке = ПолнаяОплатаПоСделке Или (СуммаДляОплаты = Документ.Товары.Итог("СуммаВсего")) Или (СуммаДляОплаты = Документ.Работы.Итог("СуммаВсего"));
КонецЕсли; //-МВ
// Открываем форму и обрабатываем результат
Если обЗначениеНеЗаполнено(ФормаКорректировки.ОткрытьМодально()) Тогда
Возврат;
Иначе
НовыйЧекНаОплату=Документы.ЧекНаОплату.СоздатьДокумент();
Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЗаказНаряд") Тогда //+МВ 28.12.2017
ЗаполнятьТовары = Документ.Товары.Итог("СуммаВсего") = ФормаКорректировки.ПолнаяСуммаПоСделке Или Документ.СуммаДокумента = ФормаКорректировки.ПолнаяСуммаПоСделке;
ЗаполнятьРаботы = Документ.Работы.Итог("СуммаВсего") = ФормаКорректировки.ПолнаяСуммаПоСделке Или Документ.СуммаДокумента = ФормаКорректировки.ПолнаяСуммаПоСделке;
орОбработкаЗаполнения_ЗаказНаряд_ЧекНаОплату(НовыйЧекНаОплату, Документ, Ложь,, ЗаполнятьТовары, ЗаполнятьРаботы, Ложь);
Иначе
НовыйЧекНаОплату.Заполнить(Документ);
КонецЕсли; //-МВ
НовыйЧекНаОплату.ПолнаяОплатаПоСделке=ФормаКорректировки.ПолнаяОплатаПоСделке;
ЗаполнитьЗначенияСвойств(ЭтотОбъект,НовыйЧекНаОплату);
СуммаДляОплаты = ФормаКорректировки.СуммаДляОплаты;
СтавкаНДСЧекаНаОплату = ФормаКорректировки.СтавкаНДС;
СуммаНДСЧекаНаОплату = ФормаКорректировки.СуммаНДС;
КонецЕсли;
КонецЕсли;
// Производим открытие формы фронта
Если ФормаФронта.Открыта() Тогда
ФормаФронта.Активизировать();
// Необходимо отменить текущий чек
Если ФормаФронта.УстановленРежим("Блокировка") Тогда
ОткрытьДиалог("Система заблокирована! Для продолжения работы необходимо разблокировать систему.", СтатусСообщения.Важное);
Возврат;
ИначеЕсли НЕ ФормаФронта.ОтменитьЧек(ФормаФронта) Тогда
Возврат;
КонецЕсли;
Иначе
ФормаФронта.Открыть();
КонецЕсли;
Если НовыйЧекНаОплату<>Неопределено Тогда
ЗаполнитьЗначенияСвойств(ФормаФронта.ОбработкаОбъект,НовыйЧекНаОплату);
КонецЕсли;
// Проверим произошло ли открытие формы
Если НЕ ФормаФронта.Открыта() Тогда
Возврат;
КонецЕсли;
// Переводим фронт в режим "Оплаты"
ФормаФронта.ИзменитьРежим("ЧекНаОплату");
ФормаФронта.УправлениеИнтерфейсом();
// Производим установку переданного документа
ФормаФронта.ПерейтиВРежим(РежимВыбора);
ФормаФронта.ОбработкаВыбораФронта(?(НовыйЧекНаОплату = Неопределено, ЗначениеВыбора, НовыйЧекНаОплату), Неопределено, ФормаФронта); //+МВ 28.12.2017
ФормаФронта.ВыйтиИзРежима(РежимВыбора);
// Произведем установку нового режима
Если ФормаФронта.ХозОперация=Справочники.ХозОперации.ЧекНаОплатуВозврат Тогда
ФормаФронта.УстановитьРежим("ЧекНаОплатуВозврат");
ИначеЕсли ФормаФронта.ХозОперация=Справочники.ХозОперации.ПриходныйКассовыйОрдер Тогда
ФормаФронта.УстановитьРежим("ПриходныйКассовыйОрдер");
ИначеЕсли ФормаФронта.ХозОперация=Справочники.ХозОперации.РасходныйКассовыйОрдер Тогда
ФормаФронта.УстановитьРежим("РасходныйКассовыйОрдер");
Иначе
ФормаФронта.УстановитьРежим("ЧекНаОплату");
КонецЕсли;
// Произведем корректировку суммы оплаты
ФормаФронта.СуммаДокумента = СуммаДляОплаты;
ФормаФронта.ОбработкаРеквизита("СуммаДокумента",, ФормаФронта);
ФормаФронта.СуммаНДСЧекаНаОплату = СуммаНДСЧекаНаОплату;
ФормаФронта.СтавкаНДСЧекаНаОплату = СтавкаНДСЧекаНаОплату;
ФормаФронта.ПолнаяОплатаПоСделке = ПолнаяОплатаПоСделке;
// Обновим индикаторы формы
ФормаФронта.УправлениеИнтерфейсом();
КонецПроцедуры