Как перенести цену с НДС из Коммерческого предложения в Заказ клиента и избежать ошибок округления?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе автоматизации бизнес-процессов в 1С часто возникает необходимость доработки механизма ввода на основании. Одна из распространенных задач — корректная передача цен из документа КоммерческоеПредложениеКлиенту в ЗаказКлиента, особенно когда требуется учитывать НДС. Рассмотрим детально, как реализовать этот процесс и почему возникают «лишние» копейки в расчетах.

Шаг 1: Настройка получения цены в запросе

Для того чтобы цена с НДС корректно попадала в табличную часть Товары нового документа, необходимо скорректировать запрос в расширении конфигурации. В процедуре Расш7_ЗаполнитьДокументНаОснованииКоммерческогоПредложенияКлиенту обратите внимание на пакет запроса, отвечающий за заполнение табличной части. Вместо стандартного получения поля Цена нам необходимо явно указать получение цены с НДС.

Измените строку в запросе на следующую:

| КоммерческоеПредложениеКлиентуТовары.ЦенаСНДС КАК Цена,

Таким образом, мы подменяем значение, передаваемое в колонку Цена объекта ЗаказКлиента, на значение из ЦенаСНДС исходного документа.

Шаг 2: Установка флага включения НДС в цену

После внесения изменений в запрос многие сталкиваются с тем, что система начинает «накручивать» НДС сверху на перенесенную цену. Это происходит из-за того, что в 1С логика расчета суммы напрямую зависит от реквизита шапки ЦенаВключаетНДС. Если этот флаг не установлен, система считает, что цена указана без НДС, и прибавляет налог автоматически.

Чтобы этого избежать, необходимо программно установить этот флаг в значение Истина при заполнении документа. Это позволит системе корректно интерпретировать перенесенную цену как уже содержащую налог.

Пример кода, который следует добавить в процедуру заполнения после загрузки данных из выборки шапки:


// Устанавливаем флаг в значение Истина, так как мы передаем уже рассчитанную цену с НДС
ЭтотОбъект.ЦенаВключаетНДС = Истина;

Шаг 3: Борьба с погрешностями округления

Даже при правильной настройке передачи данных, иногда возникают расхождения в копейках. Это связано с тем, что операции умножения цены (которая может иметь дробную часть) на количество приводят к накоплению погрешностей вычислений с плавающей точкой.

Рассмотрим, как минимизировать эти ошибки:

  1. Проверка исходных данных: Если после умножения 409 на 10 получается 4090.02, значит, в переменной Цена скрыто число с микроскопической дробной частью (например, 409.002). Всегда используйте отладчик, чтобы увидеть реальное значение переменной.
  2. Использование функции Окр(): При выполнении промежуточных расчетов всегда округляйте результат. Рекомендуется использовать режим округления РежимОкругления.Окр15как20 (банковское округление), который является стандартом для финансовых расчетов в 1С.
  3. Минимизация ручных расчетов: Старайтесь избегать самостоятельного вычисления суммы НДС через формулы вида ЦенаСНДС - Цена. Лучше всего использовать встроенные серверные методы конфигурации, такие как СкидкиНаценкиСервер.РассчитатьПоЗаказуКлиента, которые учитывают все нюансы налогообложения и правила округления, заложенные разработчиками типового решения.

Рекомендации по отладке

Если вы столкнулись с ситуацией, когда данные «не сходятся», выполните следующие действия:

Помните, что грамотное использование типовых механизмов 1С — это залог отсутствия проблем с бухгалтерской и управленческой отчетностью. Если цена передается из документа КП, который уже был рассчитан системой, старайтесь не пересчитывать её заново, а принимать как константу.

← На главную