При разработке интеграций или автоматическом создании документов в 1С:ERP Управление предприятием 2 (или 1С:Комплексная автоматизация 2) программисты часто сталкиваются с ситуацией, когда прямое присвоение значения реквизиту ЦенаВключаетНДС = Истина не приносит желаемого результата. В интерфейсе программы налоги продолжают рассчитываться "сверху", хотя в отладчике значение реквизита кажется верным. Разберем подробно, почему так происходит, и как правильно управлять этим механизмом.
Для начала проанализируем ситуацию: почему значение, установленное программно, может игнорироваться системой? В типовых конфигурациях на платформе 1С:Предприятие 8.3 логика работы с налогами вынесена за рамки простого хранения данных в реквизитах. Рассмотрим основные причины:
СоглашениеСПоставщиком. Если в документе указано соглашение, то при открытии формы или при выполнении типовых процедур заполнения система будет принудительно устанавливать флаг включения НДС в соответствии с тем, что прописано в соглашении.ВидыЦен может перекрывать ручные настройки документа.ЦенаВключаетНДС — это лишь половина дела. Если не вызвать процедуры пересчета табличной части Товары, колонки Сумма, СуммаНДС и Всего останутся со старыми значениями, рассчитанными по схеме "НДС сверху".ПриЧтенииНаСервере или ПриСозданииНаСервере, которые "подтягивают" настройки из связанных объектов, затирая ваши программные изменения.Проанализируем пример кода, который позволит не только установить флаг, но и привести табличную часть документа в соответствие с этим флагом. Простого присвоения Объект.ЦенаВключаетНДС = Истина недостаточно. Необходимо использовать механизмы общего модуля.
Рассмотрим последовательность действий:
// Предположим, ДокОбъект — это создаваемый или редактируемый документ ПриобретениеТоваровУслуг
ДокОбъект.ЦенаВключаетНДС = Истина;
// Для того чтобы изменения отразились на суммах, необходимо вызвать процедуры пересчета.
// В ERP за это часто отвечают методы в общих модулях ПродажиЗакупкиСервер или обработчики внутри объекта.
ПараметрыПересчета = ПродажиЗакупкиСервер.ПараметрыПересчетаНДС();
ПараметрыПересчета.ОчиститьНДС = Ложь; // Сохраняем НДС, но пересчитываем его "внутри" или "сверху"
Для Каждого СтрокаТовара Из ДокОбъект.Товары Цикл
// Вызываем типовой механизм пересчета строки
Суммы = ОбработкаТабличнойЧастиКлиентСервер.РассчитатьСуммыВСтрокеТЧ(
СтрокаТовара.Количество,
СтрокаТовара.Цена,
ДокОбъект.ЦенаВключаетНДС,
СтрокаТовара.СтавкаНДС,
Ложь // флаг "АкцизВключаетсяВСтоимость"
);
ЗаполнитьЗначенияСвойств(СтрокаТовара, Суммы);
КонецЦикла;
Этот подход решает проблему "визуального несоответствия", так как данные в табличной части будут физически пересчитаны до записи документа в базу данных.
Выясним причину, почему флаг может сбрасываться при открытии. Если в вашем коде заполняется реквизит Соглашение, то именно оно является "источником истины" для документа. Если в соглашении стоит "НДС сверху", документ будет стремиться к этому состоянию.
Посмотрим на алгоритм решения через соглашение:
СоглашенияСПоставщиками на вкладке "Условия закупок" найдите признак "Цена включает НДС".
СоглашениеОбъект = Справочники.СоглашенияСПоставщиками.СоздатьЭлемент();
// ... заполнение других реквизитов ...
СоглашениеОбъект.ЦенаВключаетНДС = Истина;
СоглашениеОбъект.Записать();
В этом случае при создании документа ПриобретениеТоваровУслуг и выборе этого соглашения, система автоматически и корректно установит нужный режим налогообложения.
В конфигурации 1С:ERP 2 крайне не рекомендуется заполнять реквизиты "в лоб". Для этого существуют экспортные методы в модулях менеджеров или объектов. Разберем, как использовать встроенный механизм ЗаполнитьПоОснованию или ЗаполнитьУсловияЗакупок.
Проанализируем ситуацию, когда мы хотим, чтобы система сама заполнила все параметры из настроек партнера и соглашения:
НовыйДокумент = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Партнер = СсылкаНаПартнера;
НовыйДокумент.Контрагент = СсылкаНаКонтрагента;
НовыйДокумент.Организация = СсылкаНаОрганизацию;
НовыйДокумент.Соглашение = СсылкаНаСоглашение;
// Вызываем типовой метод заполнения условий.
// Это заполнит и ЦенаВключаетНДС, и Налогообложение, и Валюту.
НовыйДокумент.ЗаполнитьУсловияЗакупок();
// Если после этого вам ВСЕ ЖЕ нужно принудительно поменять НДС:
НовыйДокумент.ЦенаВключаетНДС = Истина;
// Но тогда не забудьте про пересчет ТЧ, описанный в Способе 1.
Многих смущает, что в свойствах реквизита ЦенаВключаетНДС в метаданных установлено Значение заполнения = Ложь. Важно понимать, что это свойство платформы влияет только на создание документа вручную через кнопку "Создать". Как только в игру вступает программный код или типовые механизмы ERP (заполнение по соглашению), это значение из метаданных перестает играть какую-либо роль. Не пытайтесь изменить его в расширении — это не решит проблему динамического пересчета в формах.
Выясним еще одну важную деталь. Флаг ЦенаВключаетНДС тесно связан с реквизитом Налогообложение. Если в документе программно установлено Налогообложение = Перечисление.ТипыНалогообложенияНДС.ПродажаНеОблагаетсяНДС, то флаг включения НДС в цену может игнорироваться формой или блокироваться. Всегда проверяйте, что тип налогообложения предполагает начисление НДС (например, ЗакупкаОблагаетсяНДС).
Для надежного программного изменения признака Цена включает НДС в 1С:ERP необходимо:
РассчитатьСуммыВСтрокеТЧ).ЗаполнитьУсловияЗакупок() для автоматизации процесса.Таким образом, мы видим, что проблема заключается не в "недоступности" реквизита, а в многослойной логике конфигурации, которая защищает целостность данных и соответствие документа условиям договора.