Отголоски автоматического округления. УТ 11.5
После ввода округления до копеек клиент обратился с проблемой, что сумма НДС в документе и печатной форме счета не совпадает. Проверил — в счете стояла некорректная сумма НДС, если перещелкнуть количество, то сумма НДС исправлялась.
Добавил код, чтобы перед типовой «Перед записью» пересчитывалась сумма НДС документа:
&НаКлиенте Процедура дор_ПередЗаписьюПеред(Отказ, ПараметрыЗаписи) дор_К.ПересчитатьСуммыНДСПередЗаписью(ЭтаФорма); ЭтаФорма.ОбновитьОтображениеДанных(); КонецПроцедуры
Функция в общем клиентском модуле дор_К:
Функция ПересчитатьСуммыНДСПередЗаписью(Форма) Экспорт СтруктураДействий = Новый Структура; СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Форма.Объект); СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы); СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы); //Чтобы пересчитывался итог Попытка ЗависимыеРеквизиты = Форма.дор_ЗависимыеРеквизиты(); СтруктураДействий.Вставить("ЗаполнитьДубликатыЗависимыхРеквизитов", ЗависимыеРеквизиты); Исключение КонецПопытки; КэшированныеЗначения = Неопределено; Для Каждого Строка ИЗ Форма.Объект.Товары Цикл ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(Строка, СтруктураДействий, КэшированныеЗначения); КонецЦикла; КонецФункции
UPD: в структуру действий не нужно вставлять пересчет суммы, иначе сумма пересчитывается, но без скидок. Нужно пересчитывать только сумму НДС и сумму с НДС.
UPD 2: в структуру действий нужно добавить пересчет зависимых реквизитов (тары), иначе итоги не пересчитываются. После открытия формы заново можно получить итоги, но так не показываются. При этом в форму документов нужно добавить экспортную функцию:
&НаСервере Функция дор_ЗависимыеРеквизиты() Экспорт Возврат ЗависимыеРеквизиты(); КонецФункции
Пересчет вставляю в событие формы, непременно перед типовым вызовом «Перед записью», чтобы пересчитались итоги документа. Правда, они не обновляются в самой форме заказа, пока не откроешь заново, но искать, где дернуть форму, не стал.
Потому что сумму НДС можно поменять вручную и поставить там любую сумму. Обработка корректирует этот недостаток.
Добавил корректировку в форму заказа покупателя и реализации. И дополнительно в КП.
UPD 2: Также добавил перед записью проверку цен и сумм, на всякий случай:
Процедура ПроверитьЦеныСуммыПередЗаписью(Форма, Отказ) Экспорт //Возврат; Сч = 0; Для Каждого Строка ИЗ Форма.Объект.Товары Цикл Сч = Сч + 1; ТекСумма = Строка.Сумма; ТекСуммаСкидок = Строка.СуммаРучнойСкидки; РасчСумма1 = Окр(Строка.Цена * Строка.Количество - ТекСуммаСкидок, 2); РасчСумма2 = Окр(Строка.Цена * Строка.Количество, 2) - ТекСуммаСкидок; Если ТекСумма <> РасчСумма1 И ТекСумма <> РасчСумма2 Тогда Сообщить("В строке " + Сч + " по товару: " + Строка.Номенклатура + " сумма: " + ТекСумма + " а должна быть: " + РасчСумма1 + " или: " + РасчСумма2 + ". Исправьте, изменения не записаны!"); Отказ = истина; КонецЕсли; КонецЦикла; КонецПроцедуры
UPD 3: увы, округление до копеек не защищает нас от «гуляния» суммы НДС. На больших накладных все же копейки гуляют. Можно было изначально отказаться от доработок и сделать удобную возможность подгонять накладную под нужную сумму оплаты через скидку на нужное количество коппеек.
Среда: УТ 11.5.12.53. Объем 1 час.
Решение огонь. Открыли документ. Распечатали. Отдали клиенту. Нажали провести и закрыть. Суммы поменялись
в 1С можно распечатать только сохраненный документ. Корректировка срабатывает перед записью. Вы не уловили этот момент?
Ещё раз. Документ уже в базе. Сохраненный. Открыли, ничего не меняли. Распечатали. Нажали сохранить — и оппа включилась обработка изменений. Где гарантия, что данные не изменятся?
нет гарантии. если НДС был кривой, он подправится. А зачем нажимали сохранить?
Потому что в 1С работают пользователи, а не программисты, они нажимают на кнопки не задумываясь. А хорошие программисты не допускают возможности сделать ошибку. Ваша реализация и правда ужасная
бывает.