Почему не заполняется сумма НДС при программном создании Заказа поставщику в УТ 10.3

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

При автоматизации бизнес-процессов в конфигурации «Управление торговлей 10.3» разработчики часто сталкиваются с ситуацией, когда документ ЗаказПоставщику создается программно, строки в табличную часть добавляются, цены и суммы рассчитываются, но поле СуммаНДС упорно остается равным нулю или очищается после записи документа. Рассмотрим подробнее, почему это происходит и как правильно организовать программное заполнение документа, чтобы соблюсти логику типового решения.

Анализ исходной проблемы

Типичная ошибка при написании кода заключается в попытке «ручного» управления суммами без учета внутренних механизмов конфигурации. Проанализируем ситуацию: разработчик заполняет номенклатуру, количество и цену, а затем вызывает стандартные процедуры модуля ОбработкаТабличныхЧастей. Однако, несмотря на наличие кода для расчета НДС, итоговая сумма в строке может не появляться. Это происходит потому, что в старых конфигурациях на обычных формах (таких как УТ 10.3, КА 1.1 или УПП 1.3) расчет налогов жестко привязан к настройкам шапки документа.

Решение проблемы: ключевые флаги документа

Выясним основную причину «нулевого» НДС. В документе ЗаказПоставщику (как и во многих других товарных документах) существуют два критически важных булевых реквизита: УчитыватьНДС и СуммаВключаетНДС. Если реквизит УчитыватьНДС имеет значение Ложь, система при любых расчетах и даже при ручном присвоении значения в поле СуммаНДС будет обнулять его, так как документ считается не облагаемым налогом.

Для исправления ситуации необходимо в коде инициализации документа явно указать следующие параметры:


ДокЗаказПоставщику.УчитыватьНДС = Истина;
ДокЗаказПоставщику.СуммаВключаетНДС = Истина; // Или Ложь, в зависимости от условий закупки

Важный момент: установка этих флагов должна происходить ДО того, как начнут вызываться процедуры расчета сумм в табличной части. Рассмотрим, как это влияет на работу типовых процедур.

Использование типовых механизмов расчета

Вместо того чтобы изобретать велосипед и прописывать формулы вида Сумма / 120 * 20, крайне рекомендуется использовать возможности общего модуля ОбработкаТабличныхЧастей. Рассмотрим правильную последовательность действий при программном заполнении строки документа:

  1. Добавление строки: Создаем новую строку в табличной части Товары.
  2. Заполнение базовых реквизитов: Указываем номенклатуру, единицу измерения и коэффициент.
  3. Вызов обработчика изменения номенклатуры: Это позволит системе автоматически подтянуть ставку НДС из справочника Номенклатура.
  4. Расчет сумм: Используем типовые методы, которые учитывают флаги шапки.

Проанализируем пример корректного кода:


// Создаем объект документа
НовыйДок = Документы.ЗаказПоставщику.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = Справочники.Организации.НайтиПоКоду("...");
НовыйДок.Контрагент = Поставщик;
НовыйДок.ДоговорКонтрагента = Договор;

// Ключевые настройки для НДС
НовыйДок.УчитыватьНДС = Истина;
НовыйДок.СуммаВключаетНДС = Истина;

// Добавляем строку
НоваяСтрока = НовыйДок.Товары.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 100;

// Заполняем ставку НДС из справочника Номенклатура
ОбработкаТабличныхЧастей.ЗаполнитьСтавкуНДСТабЧасти(НоваяСтрока, НовыйДок, "Приобретение");

// Рассчитываем сумму и НДС типовым методом
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(НоваяСтрока, НовыйДок);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(НоваяСтрока, НовыйДок);

Почему ручной расчет — это плохая практика?

Рассмотрим ситуацию, когда программист решает сам рассчитать НДС: новСтрДок.СуммаНДС = новСтрДок.Сумма / 120 * 20;. На первый взгляд это работает, но на практике приводит к ряду проблем:

Влияние договора контрагента

Проанализируем еще один нюанс. В УТ 10.3 настройки налогообложения часто подтягиваются из договора с контрагентом. Если в договоре указано, что поставщик работает без НДС, то при программном заполнении ДоговораКонтрагента могут сработать стандартные обработчики, которые сбросят ваши флаги УчитыватьНДС в Ложь.

Поэтому при написании обработки рекомендуется придерживаться следующего порядка заполнения реквизитов:

  1. Сначала заполняем «Шапку» (Организация, Контрагент, Договор).
  2. Вызываем ЗаполнитьТипЦен(НовыйДок) или аналогичные методы инициализации.
  3. Принудительно переопределяем флаги НДС, если логика вашей загрузки это подразумевает.
  4. Только после этого переходим к заполнению табличной части Товары.

Использование структуры шапки документа

Для работы процедур в модуле ОбработкаТабличныхЧастей часто требуется передать параметры шапки. Посмотрим, как это сделать максимально эффективно. В типовых решениях существует структура, которая собирает все настройки (валюту, флаги НДС, тип цен). Использование функции ОбщегоНазначения.СформироватьСтруктуруПараметровШапки (если она доступна в вашей версии) позволяет избежать ручного создания структур и минимизировать ошибки при расчетах в табличной части.

Если же вы создаете структуру вручную, убедитесь, что в нее включены все необходимые поля:


СтруктураШапки = Новый Структура();
СтруктураШапки.Вставить("УчитыватьНДС", НовыйДок.УчитыватьНДС);
СтруктураШапки.Вставить("СуммаВключаетНДС", НовыйДок.СуммаВключаетНДС);
СтруктураШапки.Вставить("ВалютаДокумента", НовыйДок.ВалютаДокумента);
// ... другие необходимые реквизиты

Заключение

Подведем итог. Чтобы сумма НДС в программно созданном заказе поставщику в УТ 10.3 не обнулялась, необходимо:

  1. Установить реквизиты УчитыватьНДС = Истина и СуммаВключаетНДС в объекте документа.
  2. Обеспечить наличие корректной СтавкиНДС в строке табличной части (путем вызова ЗаполнитьСтавкуНДСТабЧасти).
  3. Использовать типовую процедуру РассчитатьСуммуНДСТабЧасти для вычисления налога вместо написания формул вручную.

Соблюдение этих простых правил сделает ваш код более надежным, читаемым и устойчивым к изменениям законодательства или настроек системы.

← На главную