Как программно установить «НДС сверху» при создании документа «Реализация товаров и услуг» в 1С:Бухгалтерии 3.0?

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

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

Понимание логики расчета: реквизит СуммаВключаетНДС

За выбор режима начисления налога в документе отвечает единственный булев реквизит шапки — СуммаВключаетНДС. Рассмотрим подробнее, как платформа интерпретирует его значения при заполнении табличных частей:

  1. СуммаВключаетНДС = Ложь (режим «НДС сверху»). В этом случае в колонку Цена записывается чистая стоимость товара или услуги без учета налога. Колонка Сумма рассчитывается как произведение количества на цену. Сумма НДС вычисляется по формуле: Сумма * СтавкаНДС / 100 и прибавляется к стоимости, формируя итоговую колонку Всего (Сумма + СуммаНДС).
  2. СуммаВключаетНДС = Истина (режим «НДС в сумме»). Здесь цена номенклатуры уже включает в себя налог. Колонка Сумма отражает общую стоимость с НДС. Сумма налога рассчитывается «внутри» по ставке обратным счетом: Сумма * СтавкаНДС / (100 + СтавкаНДС). Значение в колонке Всего совпадает со значением в колонке Сумма.

Таким образом, для программной установки режима «НДС сверху» нам необходимо присвоить реквизиту СуммаВключаетНДС значение Ложь. Однако на практике простое присвоение одной строкой кода часто не дает нужного результата. Выясним причину этого поведения.

Критический нюанс: порядок инициализации реквизитов шапки

Разберем типичную ошибку начинающих разработчиков. Если мы сначала установим СуммаВключаетНДС = Ложь, а затем заполним реквизиты контрагента и договора, вызывая стандартные процедуры заполнения, наш флаг сбросится обратно в Истина (или наоборот, в зависимости от настроек договора).

В типовой конфигурации 1С:Бухгалтерия 3.0 при изменении договора или при вызове метода заполнения по умолчанию система автоматически обращается к параметрам договора контрагента. Если в договоре указан тип цен, в котором задано включение НДС в стоимость, то подсистема перезапишет программно установленный флаг. Чтобы избежать этой проблемы, проанализируем правильную последовательность инициализации объекта:


// Создаем новый объект документа
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

// 1. Сначала заполняем базовые реквизиты шапки
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = СсылкаНаОрганизацию;
НовыйДок.Контрагент = СсылкаНаКонтрагента;
НовыйДок.ДоговорКонтрагента = СсылкаНаДоговор;

// 2. Вызываем стандартный обработчик заполнения (если требуется инициализировать счета учета и т.д.)
НовыйДок.Заполнить(Неопределено);

// 3. И только ПОСЛЕ этого принудительно устанавливаем способ расчета НДС
НовыйДок.СуммаВключаетНДС = Ложь;

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

Автоматический пересчет сумм в табличной части на сервере

Представим ситуацию: вы создали документ, установили режим «НДС сверху» и перенесли в табличную часть Товары или Услуги готовые суммы из внешнего файла (например, загрузили из Excel-прайса). На первый взгляд, документ выглядит корректно. Но стоит пользователю интерактивно изменить количество или цену любой позиции в форме, вся строка мгновенно пересчитается, и итоговые копейки могут «поехать» из-за разницы алгоритмов округления в сторонней программе и в 1С.

Чтобы избежать подобных расхождений и гарантировать математическую точность, мы должны использовать стандартные процедуры пересчета БСП (Библиотеки стандартных подсистем), заложенные в конфигурации. Посмотрим на практический пример заполнения табличной части:


// Перебираем строки загружаемых данных
Для Каждого СтрокаДанных Из ВнешнийИсточник Цикл
    
    НоваяСтрока = НовыйДок.Товары.Добавить();
    НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
    НоваяСтрока.Количество = СтрокаДанных.Количество;
    НоваяСтрока.Цена = СтрокаДанных.ЦенаБезНДС; // Передаем цену без налога
    НоваяСтрока.СтавкаНДС = СтрокаДанных.СтавкаНДС;
    
    // Рассчитываем чистую сумму (Количество * Цена)
    ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуТабЧасти(НоваяСтрока);
    
    // Вычисляем сумму НДС по правилам "НДС сверху" (передаем наш флаг)
    ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуНДСТабЧасти(НоваяСтрока, НовыйДок.СуммаВключаетНДС);
    
    // Рассчитываем итоговую сумму строки (Сумма + НДС)
    ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуВсегоТабЧасти(НоваяСтрока, НовыйДок.СуммаВключаетНДС);
    
    // Заполняем счета учета по умолчанию для Бухгалтерии 3.0
    ЗаполнитьСчетаУчетаВСтрокеTabЧасти(НовыйДок, НоваяСтрока);
    
КонецЦикла;

// Записываем готовый документ
НовыйДок.Записать(РежимЗаписиДокумента.Запись);

Использование общих модулей ОбработкаТабличныхЧастейКлиентСервер гарантирует, что расчеты внутри документа полностью соответствуют ожиданиям учетной системы и защищены от внезапного искажения данных пользователями при последующем редактировании документа вручную.

Альтернативный вариант решения: настройка без изменения кода

Если перед вами стоит задача сделать так, чтобы все новые документы реализации по определенному контрагенту или договору по умолчанию создавались с признаком «НДС сверху», писать кастомный программный код необязательно. Мы можем настроить это стандартными средствами системы через справочники данных. Разберем этот процесс по шагам:

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

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

← На главную