При автоматизации бизнес-процессов в конфигурации «Управление торговлей 10.3» разработчики часто сталкиваются с ситуацией, когда документ ЗаказПоставщику создается программно, строки в табличную часть добавляются, цены и суммы рассчитываются, но поле СуммаНДС упорно остается равным нулю или очищается после записи документа. Рассмотрим подробнее, почему это происходит и как правильно организовать программное заполнение документа, чтобы соблюсти логику типового решения.
Типичная ошибка при написании кода заключается в попытке «ручного» управления суммами без учета внутренних механизмов конфигурации. Проанализируем ситуацию: разработчик заполняет номенклатуру, количество и цену, а затем вызывает стандартные процедуры модуля ОбработкаТабличныхЧастей. Однако, несмотря на наличие кода для расчета НДС, итоговая сумма в строке может не появляться. Это происходит потому, что в старых конфигурациях на обычных формах (таких как УТ 10.3, КА 1.1 или УПП 1.3) расчет налогов жестко привязан к настройкам шапки документа.
Выясним основную причину «нулевого» НДС. В документе ЗаказПоставщику (как и во многих других товарных документах) существуют два критически важных булевых реквизита: УчитыватьНДС и СуммаВключаетНДС. Если реквизит УчитыватьНДС имеет значение Ложь, система при любых расчетах и даже при ручном присвоении значения в поле СуммаНДС будет обнулять его, так как документ считается не облагаемым налогом.
Для исправления ситуации необходимо в коде инициализации документа явно указать следующие параметры:
ДокЗаказПоставщику.УчитыватьНДС = Истина;
ДокЗаказПоставщику.СуммаВключаетНДС = Истина; // Или Ложь, в зависимости от условий закупки
Важный момент: установка этих флагов должна происходить ДО того, как начнут вызываться процедуры расчета сумм в табличной части. Рассмотрим, как это влияет на работу типовых процедур.
Вместо того чтобы изобретать велосипед и прописывать формулы вида Сумма / 120 * 20, крайне рекомендуется использовать возможности общего модуля ОбработкаТабличныхЧастей. Рассмотрим правильную последовательность действий при программном заполнении строки документа:
Товары.Номенклатура.Проанализируем пример корректного кода:
// Создаем объект документа
НовыйДок = Документы.ЗаказПоставщику.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = Справочники.Организации.НайтиПоКоду("...");
НовыйДок.Контрагент = Поставщик;
НовыйДок.ДоговорКонтрагента = Договор;
// Ключевые настройки для НДС
НовыйДок.УчитыватьНДС = Истина;
НовыйДок.СуммаВключаетНДС = Истина;
// Добавляем строку
НоваяСтрока = НовыйДок.Товары.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 100;
// Заполняем ставку НДС из справочника Номенклатура
ОбработкаТабличныхЧастей.ЗаполнитьСтавкуНДСТабЧасти(НоваяСтрока, НовыйДок, "Приобретение");
// Рассчитываем сумму и НДС типовым методом
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(НоваяСтрока, НовыйДок);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(НоваяСтрока, НовыйДок);
Рассмотрим ситуацию, когда программист решает сам рассчитать НДС: новСтрДок.СуммаНДС = новСтрДок.Сумма / 120 * 20;. На первый взгляд это работает, но на практике приводит к ряду проблем:
Проанализируем еще один нюанс. В УТ 10.3 настройки налогообложения часто подтягиваются из договора с контрагентом. Если в договоре указано, что поставщик работает без НДС, то при программном заполнении ДоговораКонтрагента могут сработать стандартные обработчики, которые сбросят ваши флаги УчитыватьНДС в Ложь.
Поэтому при написании обработки рекомендуется придерживаться следующего порядка заполнения реквизитов:
ЗаполнитьТипЦен(НовыйДок) или аналогичные методы инициализации.Товары.Для работы процедур в модуле ОбработкаТабличныхЧастей часто требуется передать параметры шапки. Посмотрим, как это сделать максимально эффективно. В типовых решениях существует структура, которая собирает все настройки (валюту, флаги НДС, тип цен). Использование функции ОбщегоНазначения.СформироватьСтруктуруПараметровШапки (если она доступна в вашей версии) позволяет избежать ручного создания структур и минимизировать ошибки при расчетах в табличной части.
Если же вы создаете структуру вручную, убедитесь, что в нее включены все необходимые поля:
СтруктураШапки = Новый Структура();
СтруктураШапки.Вставить("УчитыватьНДС", НовыйДок.УчитыватьНДС);
СтруктураШапки.Вставить("СуммаВключаетНДС", НовыйДок.СуммаВключаетНДС);
СтруктураШапки.Вставить("ВалютаДокумента", НовыйДок.ВалютаДокумента);
// ... другие необходимые реквизиты
Подведем итог. Чтобы сумма НДС в программно созданном заказе поставщику в УТ 10.3 не обнулялась, необходимо:
УчитыватьНДС = Истина и СуммаВключаетНДС в объекте документа.СтавкиНДС в строке табличной части (путем вызова ЗаполнитьСтавкуНДСТабЧасти).РассчитатьСуммуНДСТабЧасти для вычисления налога вместо написания формул вручную.Соблюдение этих простых правил сделает ваш код более надежным, читаемым и устойчивым к изменениям законодательства или настроек системы.