При автоматизации бизнес-процессов в 1С программисты часто сталкиваются с ситуацией, когда программно созданный документ вроде бы заполнен верно, но при попытке проведения система выдает ошибку: «Поле "Ставка НДС" не заполнено». Особенно часто это происходит с документом ОтчетОРозничныхПродажах. В этой статье мы подробно разберем, почему стандартный подход к заполнению через Перечисления.СтавкиНДС может не работать, как правильно управлять видимостью и доступностью реквизитов для разных пользователей и как правильно инициализировать данные в современных конфигурациях на базе 1С:Предприятие 8.3.
Первым делом проанализируем архитектурные изменения в современных типовых решениях (УТ 11.5+, ERP 2.5+, КА 2.5+). В старых версиях платформ и конфигураций ставка НДС действительно была значением системного перечисления. Однако в актуальных релизах разработчики фирмы «1С» перешли на использование справочника СтавкиНДС. Это было сделано для гибкости настройки налоговых ставок без изменения программного кода.
Если в вашем коде используется конструкция:
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
А в метаданных вашей конфигурации реквизит СтавкаНДС имеет тип СправочникСсылка.СтавкиНДС, то 1С не выдаст ошибку во время выполнения этой строки, но фактически запишет в базу пустое значение. Это происходит из-за несовпадения типов: вы пытаетесь присвоить ссылку перечисления в поле, ожидающее ссылку справочника.
Рассмотрим, как правильно получить ссылку на ставку НДС в современных версиях:
// Для конфигураций, где СтавкаНДС — это справочник
НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("Без НДС");
// Или более надежный вариант через предопределенные значения (если они есть)
НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.БезНДС;
Даже если ставка в табличной части заполнена идеально, документ может не проводиться из-за настроек в шапке. Разберем ситуацию: в документе ОтчетОРозничныхПродажах есть реквизит НалогообложениеНДС (в некоторых конфигурациях может называться иначе, например, ВариантНалогообложения). Этот реквизит определяет общую логику работы документа с налогами.
Если в шапке документа не указано, как именно облагается продажа, механизмы проведения могут игнорировать значения в строках или обнулять их. Выясним причину: при записи документа часто срабатывают подписки на события или встроенные процедуры модуля объекта, которые проверяют соответствие ставок в ТЧ выбранному режиму налогообложения в шапке.
Проанализируем пример правильного заполнения шапки:
ДокументОбъект.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаНеОблагаетсяНДС;
// Или, если организация работает с НДС:
ДокументОбъект.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
Без заполнения этого поля система не понимает, должен ли вообще рассчитываться налог в табличной части Товары.
В платформе 1С очень важен порядок, в котором вы присваиваете значения полям. Рассмотрим стандартную ошибку: сначала устанавливается СтавкаНДС, а затем Номенклатура. Во многих конфигурациях при изменении номенклатуры срабатывает автоматический пересчет, который «подтягивает» ставку НДС из карточки товара, перезаписывая ваше программное значение.
Посмотрим на правильный алгоритм заполнения строки:
Количество, Цена).Пример корректного кода заполнения строки табличной части:
НоваяСтрока = Документ.Товары.Добавить();
// Сначала основные данные
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 100;
// Расчет суммы
НоваяСтрока.Сумма = НоваяСтрока.Цена * НоваяСтрока.Количество;
// В последнюю очередь — налоги, чтобы избежать перезаписи
НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("Без НДС");
НоваяСтрока.СуммаНДС = 0;
Если вы пишете универсальную обработку и не знаете заранее, какой тип данных используется в текущей конфигурации, мы рекомендуем программно проверять тип реквизита. Это поможет избежать ошибок при миграции кода между разными версиями 1С.
Разберем способ проверки программно:
МетаданныеПоля = Метаданные.Документы.ОтчетОРозничныхПродажах.ТабличныеЧасти.Товары.Реквизиты.СтавкаНДС;
ТипПоля = МетаданныеПоля.Тип;
Если ТипПоля.СодержитТип(Тип("СправочникСсылка.СтавкиНДС")) Тогда
// Работаем как со справочником
НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.БезНДС;
ИначеЕсли ТипПоля.СодержитТип(Тип("ПеречислениеСсылка.СтавкиНДС")) Тогда
// Работаем как с перечислением
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
КонецЕсли;
Иногда ошибка «Ставка НДС не заполнена» является следствием того, что для данной Организации или Склада на дату документа не определена учетная политика. Если программа не может определить, является ли организация плательщиком НДС, она может блокировать проведение документа даже при наличии заполненных полей в табличной части.
Убедитесь, что при программном создании документа вы заполнили следующие реквизиты шапки:
Организация — должна иметь актуальную учетную политику.Склад — тип склада должен соответствовать операции розничной продажи.Подразделение — в современных конфигурациях часто требуется сделать подразделение обязательным для заполнения во избежание пустых аналитик.Дата — на эту дату проверяются все настройки налогообложения. Для корректной подстановки можно управлять "Рабочей датой" для автоматического заполнения реквизита "Дата".Резюме: для успешного программного создания Отчета о розничных продажах необходимо проверить тип реквизита СтавкаНДС (справочник или перечисление), обязательно заполнить НалогообложениеНДС в шапке и соблюдать последовательность заполнения полей. Если же вы столкнулись с ситуацией, когда сумма оплат превышает сумму документа, это потребует отдельного анализа алгоритмов распределения платежей.