Отбитие чеков по заказ-нарядам при различных СНО

Внимание! Данный форум является модерируемым.
Для получения к нему доступа необходимо зарегистрироваться или авторизоваться на сайте.

Страницы: 1
RSS
Отбитие чеков по заказ-нарядам при различных СНО, Отбитие чеков по заказ-нарядам при различных СНО для товаров и работ
 
Цитата
Михаил Волков https://rarus.ru/forum/forum7/topic11493/?PAGEN_1=83#message80834 написал:
Делал доработку, чтобы при оплате заказ-наряда его табличные части: Товары и Работы оплачивались как различные документы, если СНО у них различные. Могу поделиться.
Цитата
Данил Василига https://rarus.ru/forum/forum7/topic11493/?PAGEN_1=85#message81758 написал:
Можете поделиться Вашей доработкой по пробитию двух чеков из одного заказ-наряда?
Сразу предупреждаю, доработка сделана в Альфа-Авто 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
   ФормаФронта.ВыйтиИзРежима(РежимВыбора);
   
   // Произведем установку нового режима
   Если ФормаФронта.ХозОперация=Справочники.ХозОперации.ЧекНаОплатуВозврат Тогда
      ФормаФронта.УстановитьРежим("ЧекНаОплатуВозврат");
   ИначеЕсли ФормаФронта.ХозОперация=Справочники.ХозОперации.ПриходныйКассовыйОрдер Тогда
      ФормаФронта.УстановитьРежим("ПриходныйКассовыйОрдер");
   ИначеЕсли ФормаФронта.ХозОперация=Справочники.ХозОперации.РасходныйКассовыйОрдер Тогда
      ФормаФронта.УстановитьРежим("РасходныйКассовыйОрдер");
   Иначе
      ФормаФронта.УстановитьРежим("ЧекНаОплату");   
   КонецЕсли;
   
   // Произведем корректировку суммы оплаты
   ФормаФронта.СуммаДокумента = СуммаДляОплаты;
   ФормаФронта.ОбработкаРеквизита("СуммаДокумента",, ФормаФронта);
   ФормаФронта.СуммаНДСЧекаНаОплату = СуммаНДСЧекаНаОплату;
   ФормаФронта.СтавкаНДСЧекаНаОплату = СтавкаНДСЧекаНаОплату;
   ФормаФронта.ПолнаяОплатаПоСделке = ПолнаяОплатаПоСделке;
   
   // Обновим индикаторы формы
   ФормаФронта.УправлениеИнтерфейсом();
КонецПроцедуры
 
Продолжение описания моей доработки:
Аналогичные флажки: ОплатаТовары и ОплатаРаботы внесены в форму документа ЧекНаОплату:
Код
// Обновление отображения при смене "Документ основание"
//+МВ 30.09.2017
Процедура ОбновлениеОтображенияДополнительно(УстановитьПолнаяОплатаПоСделке = Истина)
   ПолнаяОплатаПоСделке(УстановитьПолнаяОплатаПоСделке);
   Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.ЗаказНаряд") Тогда
      ИтогТовары = ДокументОснование.Товары.Итог("СуммаВсего");
      ИтогРаботы = ДокументОснование.Работы.Итог("СуммаВсего");
      Если ПолнаяОплатаПоСделке Тогда
         ОплатаТовары = СуммаДокумента >= ИтогТовары;
         ОплатаРаботы = СуммаДокумента >= ИтогРаботы;
         Если СуммаДокумента < ИтогТовары + ИтогРаботы Тогда
            ОплатаТовары = ОплатаТовары И (ИтогТовары > ИтогРаботы Или Не ОплатаРаботы);
            ОплатаРаботы = ОплатаРаботы И (ИтогРаботы > ИтогТовары Или Не ОплатаТовары);
         КонецЕсли;
         Если Модифицированность Тогда
            орОбработкаЗаполнения_ЗаказНаряд_ЧекНаОплату(ЭтотОбъект, ДокументОснование, Ложь, Ложь, ОплатаТовары, ОплатаРаботы);
            дкВывестиЗаголовокСуммаДокумента(ЭтаФорма);
         КонецЕсли;
      Иначе
         ОплатаТовары = Ложь;
         ОплатаРаботы = Ложь;
      КонецЕсли;
      ОплатаТоварыРаботы();
      ЭлементыФормы.ОплатаТовары.Доступность = ПолнаяОплатаПоСделке И ИтогТовары > 0;
      ЭлементыФормы.ОплатаРаботы.Доступность = ПолнаяОплатаПоСделке И ИтогРаботы > 0;
      ЭлементыФормы.ОплатаТовары.Видимость   = Истина;
      ЭлементыФормы.ОплатаРаботы.Видимость   = Истина;
      ЭлементыФормы.ПолнаяОплатаПоСделке.Заголовок = "Полная оплата по сделке:";
   Иначе
      ЭлементыФормы.ОплатаТовары.Видимость   = Ложь;
      ЭлементыФормы.ОплатаРаботы.Видимость   = Ложь;
      ЭлементыФормы.ПолнаяОплатаПоСделке.Заголовок = "Полная оплата по сделке";
   КонецЕсли;
   Если Модифицированность Тогда
      ОбработкаРеквизита("СуммаДокумента",,ЭтаФорма);
   КонецЕсли;
КонецПроцедуры // ОбновлениеОтображенияДополнительно()

// Изменение оплаты Товары
//+МВ 30.09.2017
Процедура ОплатаТоварыПриИзменении(Элемент)
   СуммаДокумента = ?(ОплатаТовары, ДокументОснование.Товары.Итог("СуммаВсего"), 0)
               + ?(ОплатаРаботы, ДокументОснование.Работы.Итог("СуммаВсего"), 0);
   ОбновлениеОтображенияДополнительно();
КонецПроцедуры

// Изменение оплаты Работы
//+МВ 30.09.2017
Процедура ОплатаРаботыПриИзменении(Элемент)
   СуммаДокумента = ?(ОплатаТовары, ДокументОснование.Товары.Итог("СуммаВсего"), 0)
               + ?(ОплатаРаботы, ДокументОснование.Работы.Итог("СуммаВсего"), 0);
   ОбновлениеОтображенияДополнительно();
КонецПроцедуры
А чтобы в чеке правильно отбивалась СНО, внес изменения в функцию ПолучитьКодНалогообложения() обработки Фронт кассира, которую https://rarus.ru/forum/forum7/topic11493/?PAGEN_1=49#message73497 приводил ранее.
Страницы: 1
Читают тему
Поддержка отраслевых решений «1С-Рарус»
Услуги 1С