Для ситуаций, когда клиент оплачивает частично за товар, в типовой торговле неправильно формировалась таблица оплат, не учитывались суммы предыдущих оплат. Для изменения внести правки:
В общем модуле МенеджерОборудованияВызовСервера, заменить процедуру ЗаполнитьПоНовому() на:
Процедура ЗаполнитьПоНовому(ОбщиеПараметры, ДеревоСделок, НаименованиеПредметаРасчета, ВалютаРеглУчета)
Для Каждого СтрокаСделки Из ДеревоСделок.Строки Цикл
Для Каждого СтрокаСтавки Из СтрокаСделки.Строки Цикл
Если СтрокаСтавки.ВалютаСделки = ВалютаРеглУчета Тогда
КурсОплаты = 1;
Иначе
КурсОплаты = Окр(СтрокаСтавки.СуммаПлатежа / СтрокаСтавки.СуммаВзаиморасчетов, 8);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаСтавки.Сделка) Тогда
ЗаполнитьФиктивнуюСтрокуЧека(ОбщиеПараметры, СтрокаСтавки, НаименованиеПредметаРасчета);
Иначе
// детальная печать
Для Каждого СтрокаПозиции Из СтрокаСтавки.Строки Цикл
Если ЗначениеЗаполнено(СтрокаПозиции.Номенклатура) Тогда
ЗаполнитьТоварнуюСтрокуЧека(ОбщиеПараметры, СтрокаПозиции, КурсОплаты);
Иначе
// есть платеж по сделке и ставке, но нет товарных позиций по такой ставке
// излишек денег, нужно добавить авансовую товарную позицию
ЗаполнитьФиктивнуюСтрокуЧека(ОбщиеПараметры, СтрокаПозиции, НаименованиеПредметаРасчета);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(СтрокаСтавки.Сделка) Тогда
СуммаТовара = Окр(СтрокаСделки.СуммаТовара * КурсОплаты,2);
СуммаПрошлыхОплат = ПолучитьСуммуОплатПоСделке(СтрокаСделки.Сделка) - СтрокаСделки.СуммаПлатежа;
СуммаПрошлыхОплат = ?(СуммаПрошлыхОплат < 0, 0, СуммаПрошлыхОплат);
Если (СуммаТовара - СуммаПрошлыхОплат - СтрокаСделки.СуммаПлатежа) > 0 Тогда
// недостаток денег по сделке и ставке, нужно добавить оплату кредитом
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Постоплата"));
СтрокаОплаты.Вставить("Наименование", "Постоплата (кредит)");
СтрокаОплаты.Вставить("Сумма", СуммаТовара - СуммаПрошлыхОплат - СтрокаСделки.СуммаПлатежа);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
Если СуммаПрошлыхОплат > 0 Тогда
//учитываем прошлые оплаты как зачет аванса
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Предоплата"));
СтрокаОплаты.Вставить("Наименование", "Зачет аванса");
СтрокаОплаты.Вставить("Сумма", СуммаПрошлыхОплат);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Добавить функцию ПолучитьСуммуОплатПоСделке():
Функция ПолучитьСуммуОплатПоСделке(ДокументРасчетовСКонтрагентом) Экспорт
ПогашеннаяСумма = 0;
Если ТипЗнч(ДокументРасчетовСКонтрагентом) = Тип("ДокументСсылка.РеализацияТоваровУслуг")
ИЛИ ТипЗнч(ДокументРасчетовСКонтрагентом) = Тип("ДокументСсылка.ВозвратТоваровОтПокупателя") Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДокументРасчетовСКонтрагентом", ДокументРасчетовСКонтрагентом);
Запрос.УстановитьПараметр("Организация", ДокументРасчетовСКонтрагентом.Организация);
Запрос.УстановитьПараметр("Контрагент", ДокументРасчетовСКонтрагентом.Контрагент);
Запрос.УстановитьПараметр("ДоговорКонтрагента", ДокументРасчетовСКонтрагентом.ДоговорКонтрагента);
Запрос.Текст = "ВЫБРАТЬ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.ДокументРасчетовСКонтрагентом,
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки.СуммаВзаиморасчетовРасход КАК ПогашеннаяСумма
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(
| ,
| ,
| ,
| Организация = &Организация
| И Контрагент = &Контрагент
| И ДоговорКонтрагента = &ДоговорКонтрагента
| И ДокументРасчетовСКонтрагентом = &ДокументРасчетовСКонтрагентом) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстатки";
ДанныеЗапроса = Запрос.Выполнить().Выбрать();
Если ДанныеЗапроса.Следующий() Тогда
ПогашеннаяСумма = ДанныеЗапроса.ПогашеннаяСумма;
КонецЕсли;
КонецЕсли;
Возврат ПогашеннаяСумма;
КонецФункции
Также исправлено следующее.
При пробитии чека документом Приходный кассовый ордер, если указан документ расчетов реализация товаров и услуг (или другой) в котором в табличной части указаны товарные позиции по разным ставкам НДС (10% и 20%), а в ПКО указана ставка, например 20%, то товарные позиции с ставкой 10% отсекались.
В общем модуле МенеджерОборудованияВызовСервера, заменить функцию ЗапросДанныеЧека на:
Функция ЗапросДанныеЧека(Ссылка, ВалютаРеглУчета)
Запрос = Новый Запрос;
ИмяДокумента = Ссылка.Метаданные().Имя;
ДопустимыеТипыДР = МенеджерОборудованияКлиентСервер.ДопустимыеТипыДокументаРасчетов();
ДопустимыеТипыСД = МенеджерОборудованияКлиентСервер.ДопустимыеТипыСделки();
ДопустимыеТипыДО = Новый Массив;
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ДопустимыеТипыДО, ДопустимыеТипыДР);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ДопустимыеТипыДО, ДопустимыеТипыСД);
ТекстЗапроса = "ВЫБРАТЬ
| ПДРП.Ссылка КАК Ссылка,
| ВЫБОР
| КОГДА ПДРП.ДокументРасчетовСКонтрагентом <> НЕОПРЕДЕЛЕНО
| И ТИПЗНАЧЕНИЯ(ПДРП.ДокументРасчетовСКонтрагентом) В (&ДопустимыеТипыДР)
| И НЕ ПДРП.ДокументРасчетовСКонтрагентом В (&ПустыеСсылки)
| ТОГДА ПДРП.ДокументРасчетовСКонтрагентом
| КОГДА ПДРП.Сделка <> НЕОПРЕДЕЛЕНО
| И ТИПЗНАЧЕНИЯ(ПДРП.Сделка) В (&ДопустимыеТипыСД)
| И НЕ ПДРП.Сделка В (&ПустыеСсылки)
| ТОГДА ПДРП.Сделка
| КОГДА ПДРП.Ссылка.ДокументОснование <> НЕОПРЕДЕЛЕНО
| И ТИПЗНАЧЕНИЯ(ПДРП.Ссылка.ДокументОснование) В (&ДопустимыеТипыДО)
| И НЕ ПДРП.Ссылка.ДокументОснование В (&ПустыеСсылки)
| ТОГДА ПДРП.Ссылка.ДокументОснование
| ИНАЧЕ НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК Сделка,
| ПДРП.СтавкаНДС КАК СтавкаНДС,
| СУММА(ПДРП.СуммаПлатежа) КАК СуммаПлатежа,
| СУММА(ПДРП.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов,
| СУММА(ПДРП.СуммаНДС) КАК СуммаНДС,
| МАКСИМУМ(ВЫБОР
| КОГДА ПДРП.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
| ТОГДА 18
| КОГДА ПДРП.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
| ТОГДА 10
| КОГДА ПДРП.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
| ТОГДА 20
| ИНАЧЕ 0
| КОНЕЦ) КАК ПроцентНДС,
| ПДРП.ПризнакСпособаРасчета
|ПОМЕСТИТЬ ТаблицаПлатежей
|ИЗ
| Документ."+ИмяДокумента+".РасшифровкаПлатежа КАК ПДРП
|ГДЕ
| ПДРП.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПДРП.Ссылка,
| ПДРП.СтавкаНДС,
| ПДРП.ПризнакСпособаРасчета,
| ВЫБОР
| КОГДА ПДРП.ДокументРасчетовСКонтрагентом <> НЕОПРЕДЕЛЕНО
| И ТИПЗНАЧЕНИЯ(ПДРП.ДокументРасчетовСКонтрагентом) В (&ДопустимыеТипыДР)
| И НЕ ПДРП.ДокументРасчетовСКонтрагентом В (&ПустыеСсылки)
| ТОГДА ПДРП.ДокументРасчетовСКонтрагентом
| КОГДА ПДРП.Сделка <> НЕОПРЕДЕЛЕНО
| И ТИПЗНАЧЕНИЯ(ПДРП.Сделка) В (&ДопустимыеТипыСД)
| И НЕ ПДРП.Сделка В (&ПустыеСсылки)
| ТОГДА ПДРП.Сделка
| КОГДА ПДРП.Ссылка.ДокументОснование <> НЕОПРЕДЕЛЕНО
| И ТИПЗНАЧЕНИЯ(ПДРП.Ссылка.ДокументОснование) В (&ДопустимыеТипыДО)
| И НЕ ПДРП.Ссылка.ДокументОснование В (&ПустыеСсылки)
| ТОГДА ПДРП.Ссылка.ДокументОснование
| ИНАЧЕ НЕОПРЕДЕЛЕНО
| КОНЕЦ
|;
|";
ИмяВТ = "НоменклатураСделок";
Для Каждого ОписаниеТипа Из ДопустимыеТипыДО Цикл
ОбъектМетаданных = Метаданные.НайтиПоТипу(ОписаниеТипа);
Если ОбъектМетаданных = Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого ТЧ Из МенеджерОборудованияКлиентСервер.ДопустимыеТабличныеЧасти() Цикл
Если ОбъектМетаданных.ТабличныеЧасти.Найти(ТЧ) <> Неопределено Тогда
ТекстЗапроса = ТекстЗапроса + ТекстаЗапросаТЧпоВидуДокументов(ОбъектМетаданных.Имя, ТЧ, ИмяВТ);
ИмяВТ = "";
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса +
"
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаПлатежей.Сделка КАК Сделка,
| НоменклатураСделок.СтавкаНДС КАК СтавкаНДС,
| ЕСТЬNULL(НоменклатураСделок.ВалютаСделки, &ВалютаРеглУчета) КАК ВалютаСделки,
| НоменклатураСделок.Номенклатура КАК Номенклатура,
| НоменклатураСделок.Услуга КАК Услуга,
| НоменклатураСделок.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| НоменклатураСделок.Характеристика КАК Характеристика,
| НоменклатураСделок.Серия КАК Серия,
| ВЫБОР
| КОГДА НоменклатураСделок.Количество = 0
| И ЕСТЬNULL(НоменклатураСделок.Номенклатура.Услуга, ИСТИНА)
| ТОГДА 1
| ИНАЧЕ ЕСТЬNULL(НоменклатураСделок.Количество, 0)
| КОНЕЦ КАК Количество,
| ВЫРАЗИТЬ(ВЫБОР
| КОГДА НоменклатураСделок.СуммаВключаетНДС
| ТОГДА НоменклатураСделок.Цена
| ИНАЧЕ НоменклатураСделок.Цена + НоменклатураСделок.Цена * НоменклатураСделок.ПроцентНДС / 100
| КОНЕЦ КАК ЧИСЛО(15, 2)) КАК Цена,
| ВЫБОР
| КОГДА НоменклатураСделок.СуммаВключаетНДС
| ТОГДА ЕСТЬNULL(НоменклатураСделок.Сумма, 0)
| ИНАЧЕ ЕСТЬNULL(НоменклатураСделок.Сумма, 0) + ЕСТЬNULL(НоменклатураСделок.СуммаНДС, 0)
| КОНЕЦ КАК СуммаТовара,
| ЕСТЬNULL(НоменклатураСделок.СуммаНДС, 0) КАК СуммаНДСТовара,
| ТаблицаПлатежей.СуммаПлатежа КАК СуммаПлатежа,
| ТаблицаПлатежей.СуммаНДС КАК СуммаНДС,
| ТаблицаПлатежей.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов,
| &СтрокаВыборкиПоляСодержания КАК Наименование,
| НоменклатураСделок.НомерСекции КАК НомерСекции,
| ТаблицаПлатежей.ПризнакСпособаРасчета КАК ПризнакСпособаРасчета
|ИЗ
| ТаблицаПлатежей КАК ТаблицаПлатежей
| ЛЕВОЕ СОЕДИНЕНИЕ НоменклатураСделок КАК НоменклатураСделок
| ПО ТаблицаПлатежей.Сделка = НоменклатураСделок.Сделка
//| И ТаблицаПлатежей.СтавкаНДС = НоменклатураСделок.СтавкаНДС
| УПОРЯДОЧИТЬ ПО
| Сделка,
| СтавкаНДС
|ИТОГИ
| СУММА(СуммаТовара),
| СУММА(СуммаНДСТовара),
| МАКСИМУМ(СуммаПлатежа),
| МАКСИМУМ(СуммаНДС),
| МАКСИМУМ(СуммаВзаиморасчетов),
| МАКСИМУМ(ВалютаСделки),
| МАКСИМУМ(ПризнакСпособаРасчета)
|ПО
| Сделка,
| СтавкаНДС";
СтрокаВыборкиПоляСодержания = ОбработкаТабличныхЧастей.ПолучитьЧастьЗапросаДляВыбораСодержания("НоменклатураСделок");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&СтрокаВыборкиПоляСодержания", СтрокаВыборкиПоляСодержания);
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("ВалютаРеглУчета", ВалютаРеглУчета);
Запрос.УстановитьПараметр("ДопустимыеТипыДР", ДопустимыеТипыДР);
Запрос.УстановитьПараметр("ДопустимыеТипыСД", ДопустимыеТипыСД);
Запрос.УстановитьПараметр("ДопустимыеТипыДО", ДопустимыеТипыДО);
Запрос.УстановитьПараметр("ПустыеСсылки", ПустыеСсылки(ДопустимыеТипыДО));
Возврат Запрос;
Функцию ТекстаЗапросаТЧпоВидуДокументов на:
Функция ТекстаЗапросаТЧпоВидуДокументов(ИмяДокумента, ИмяТЧ, ИмяВТ = "")
ПолеНомерСекции = "
| ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(ТаблицаНоменклатуры.Ссылка.СкладГруппа) = ТИП(Справочник.Склады)
| И ТаблицаНоменклатуры.Ссылка.СкладГруппа <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| ТОГДА ТаблицаНоменклатуры.Ссылка.СкладГруппа.НомерСекции
| ИНАЧЕ 0
| КОНЕЦ";
// Рассматриваем только два варианта: "Товары" и "Услуги"
Если ИмяТЧ = "Товары" Тогда
ПолеЕдиницаИзмерения = "ТаблицаНоменклатуры.ЕдиницаИзмерения";
ПолеХарактеристика = "ТаблицаНоменклатуры.ХарактеристикаНоменклатуры";
Если Метаданные.Документы[ИмяДокумента].ТабличныеЧасти[ИмяТЧ].Реквизиты.Найти("СерияНоменклатуры") <> Неопределено Тогда
ПолеСерия = "ТаблицаНоменклатуры.СерияНоменклатуры";
Иначе
ПолеСерия = "ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)";
КонецЕсли;
ПолеСодержание = """""";
Если ИмяДокумента = "СчетНаОплатуПокупателю" Тогда
ПолеНомерСекции = СтрЗаменить(ПолеНомерСекции, "СкладГруппа", "Склад");
ИначеЕсли ИмяДокумента <> "ЗаказПокупателя" Тогда
ПолеНомерСекции = "
| ВЫБОР
| КОГДА ТаблицаНоменклатуры.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| ТОГДА ТаблицаНоменклатуры.Склад.НомерСекции
| КОГДА ТИПЗНАЧЕНИЯ(ТаблицаНоменклатуры.Ссылка.СкладОрдер) = ТИП(Справочник.Склады)
| И ТаблицаНоменклатуры.Ссылка.СкладОрдер <> ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
| ТОГДА ТаблицаНоменклатуры.Ссылка.СкладОрдер.НомерСекции
| ИНАЧЕ 0
| КОНЕЦ";
Если ИмяДокумента = "РеализацияТоваровУслуг" Тогда
ПолеНомерСекции = СтрЗаменить(ПолеНомерСекции, "СкладОрдер", "Склад");
КонецЕсли;
КонецЕсли;
Иначе
ПолеЕдиницаИзмерения = "ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)";
ПолеХарактеристика = "ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)";
ПолеСерия = "ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)";
ПолеСодержание = "ТаблицаНоменклатуры.Содержание";
Если ИмяДокумента <> "ЗаказПокупателя" Тогда
ПолеНомерСекции = СтрЗаменить(ПолеНомерСекции, "СкладГруппа", "Склад");
КонецЕсли;
КонецЕсли;
Если Не ПустаяСтрока(ИмяВТ) Тогда
ТекстВТ = Символы.ПС + " ПОМЕСТИТЬ " + ИмяВТ;
ТекстОбъединения = "";
Иначе
ТекстВТ = "";
ТекстОбъединения = "
|
|ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
ТекстЗапроса = ТекстОбъединения + "
|ВЫБРАТЬ
| ТаблицаПлатежей.Сделка,
| ТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
| ТаблицаНоменклатуры.Номенклатура.Услуга КАК Услуга,
| ТаблицаНоменклатуры.Количество КАК Количество,
| ТаблицаНоменклатуры.Цена КАК Цена,
| ТаблицаНоменклатуры.Сумма КАК Сумма,
| ТаблицаНоменклатуры.СтавкаНДС КАК СтавкаНДС,
| ТаблицаНоменклатуры.Ссылка.ВалютаДокумента КАК ВалютаСделки,
| ТаблицаНоменклатуры.СуммаНДС КАК СуммаНДС,
| "+ПолеЕдиницаИзмерения+" КАК ЕдиницаИзмерения,
| ТаблицаНоменклатуры.Ссылка.СуммаВключаетНДС КАК СуммаВключаетНДС,
| ТаблицаПлатежей.СуммаПлатежа КАК СуммаПлатежа,
| ТаблицаПлатежей.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов,
| "+ПолеХарактеристика+" КАК Характеристика,
| "+ПолеСерия+" КАК Серия,
| "+ПолеСодержание+" КАК Содержание,
| "+ПолеНомерСекции+" КАК НомерСекции,
| ТаблицаПлатежей.ПроцентНДС КАК ПроцентНДС"+
ТекстВТ+"
|ИЗ
| ТаблицаПлатежей КАК ТаблицаПлатежей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ."+ИмяДокумента+"."+ИмяТЧ+" КАК ТаблицаНоменклатуры
| ПО ТаблицаПлатежей.Сделка = ТаблицаНоменклатуры.Ссылка
//| И ТаблицаПлатежей.СтавкаНДС = ТаблицаНоменклатуры.СтавкаНДС
|";
Возврат ТекстЗапроса;
КонецФункции