Как программно установить признак Цена включает НДС в документе Приобретение товаров и услуг в 1С:ERP 2

Программист 1С:ERP Управление предприятием Налоговый учет
← На главную

При разработке интеграций или автоматическом создании документов в 1С:ERP Управление предприятием 2 (или 1С:Комплексная автоматизация 2) программисты часто сталкиваются с ситуацией, когда прямое присвоение значения реквизиту ЦенаВключаетНДС = Истина не приносит желаемого результата. В интерфейсе программы налоги продолжают рассчитываться "сверху", хотя в отладчике значение реквизита кажется верным. Разберем подробно, почему так происходит, и как правильно управлять этим механизмом.

Анализ механизмов управления НДС в ERP

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

  1. Приоритет Соглашения с поставщиком: В архитектуре ERP настройки налогообложения в первую очередь берутся из СоглашениеСПоставщиком. Если в документе указано соглашение, то при открытии формы или при выполнении типовых процедур заполнения система будет принудительно устанавливать флаг включения НДС в соответствии с тем, что прописано в соглашении.
  2. Влияние Видов цен: Если закупка оформляется по определенному виду цен, настройка "Цена включает НДС" в самом справочнике ВидыЦен может перекрывать ручные настройки документа.
  3. Отсутствие пересчета сумм: При программном заполнении установка флага ЦенаВключаетНДС — это лишь половина дела. Если не вызвать процедуры пересчета табличной части Товары, колонки Сумма, СуммаНДС и Всего останутся со старыми значениями, рассчитанными по схеме "НДС сверху".
  4. Логика управляемой формы: В модуле формы документа часто прописаны обработчики ПриЧтенииНаСервере или ПриСозданииНаСервере, которые "подтягивают" настройки из связанных объектов, затирая ваши программные изменения.

Способ 1: Корректная программная установка реквизита и пересчет

Проанализируем пример кода, который позволит не только установить флаг, но и привести табличную часть документа в соответствие с этим флагом. Простого присвоения Объект.ЦенаВключаетНДС = Истина недостаточно. Необходимо использовать механизмы общего модуля.

Рассмотрим последовательность действий:


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

// Для того чтобы изменения отразились на суммах, необходимо вызвать процедуры пересчета.
// В ERP за это часто отвечают методы в общих модулях ПродажиЗакупкиСервер или обработчики внутри объекта.
ПараметрыПересчета = ПродажиЗакупкиСервер.ПараметрыПересчетаНДС();
ПараметрыПересчета.ОчиститьНДС = Ложь; // Сохраняем НДС, но пересчитываем его "внутри" или "сверху"

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

Этот подход решает проблему "визуального несоответствия", так как данные в табличной части будут физически пересчитаны до записи документа в базу данных.

Способ 2: Настройка через Соглашение с поставщиком

Выясним причину, почему флаг может сбрасываться при открытии. Если в вашем коде заполняется реквизит Соглашение, то именно оно является "источником истины" для документа. Если в соглашении стоит "НДС сверху", документ будет стремиться к этому состоянию.

Посмотрим на алгоритм решения через соглашение:

  1. Проверьте, какое соглашение используется в коде.
  2. В справочнике СоглашенияСПоставщиками на вкладке "Условия закупок" найдите признак "Цена включает НДС".
  3. Если вы создаете соглашение программно, обязательно установите этот признак там:

СоглашениеОбъект = Справочники.СоглашенияСПоставщиками.СоздатьЭлемент();
// ... заполнение других реквизитов ...
СоглашениеОбъект.ЦенаВключаетНДС = Истина;
СоглашениеОбъект.Записать();

В этом случае при создании документа ПриобретениеТоваровУслуг и выборе этого соглашения, система автоматически и корректно установит нужный режим налогообложения.

Способ 3: Использование типовых процедур заполнения

В конфигурации 1С:ERP 2 крайне не рекомендуется заполнять реквизиты "в лоб". Для этого существуют экспортные методы в модулях менеджеров или объектов. Разберем, как использовать встроенный механизм ЗаполнитьПоОснованию или ЗаполнитьУсловияЗакупок.

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


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

// Вызываем типовой метод заполнения условий. 
// Это заполнит и ЦенаВключаетНДС, и Налогообложение, и Валюту.
НовыйДокумент.ЗаполнитьУсловияЗакупок(); 

// Если после этого вам ВСЕ ЖЕ нужно принудительно поменять НДС:
НовыйДокумент.ЦенаВключаетНДС = Истина;
// Но тогда не забудьте про пересчет ТЧ, описанный в Способе 1.

Почему в Конфигураторе стоит "Значение заполнения: Ложь"?

Многих смущает, что в свойствах реквизита ЦенаВключаетНДС в метаданных установлено Значение заполнения = Ложь. Важно понимать, что это свойство платформы влияет только на создание документа вручную через кнопку "Создать". Как только в игру вступает программный код или типовые механизмы ERP (заполнение по соглашению), это значение из метаданных перестает играть какую-либо роль. Не пытайтесь изменить его в расширении — это не решит проблему динамического пересчета в формах.

Важность реквизита Налогообложение

Выясним еще одну важную деталь. Флаг ЦенаВключаетНДС тесно связан с реквизитом Налогообложение. Если в документе программно установлено Налогообложение = Перечисление.ТипыНалогообложенияНДС.ПродажаНеОблагаетсяНДС, то флаг включения НДС в цену может игнорироваться формой или блокироваться. Всегда проверяйте, что тип налогообложения предполагает начисление НДС (например, ЗакупкаОблагаетсяНДС).

Подведение итогов

Для надежного программного изменения признака Цена включает НДС в 1С:ERP необходимо:

Таким образом, мы видим, что проблема заключается не в "недоступности" реквизита, а в многослойной логике конфигурации, которая защищает целостность данных и соответствие документа условиям договора.

← На главную