В связи с изменениями в налоговом законодательстве с 2025 года, многие организации на упрощенной системе налогообложения (УСН) становятся плательщиками НДС. В конфигурации 1С:Бухгалтерия предприятия 3.0 это привело к тому, что при редактировании документов, таких как Поступление на расчетный счет, программа по умолчанию может подставлять ставку 5% или 7%. Однако возникают ситуации, когда для конкретной организации, даже при наличии настроек плательщика НДС, необходимо по умолчанию устанавливать значение Без НДС. Рассмотрим, как реализовать эту логику с помощью расширения конфигурации, избежав типичных ошибок начинающих разработчиков.
Первоначальная попытка реализовать задачу напрямую в коде формы часто натыкается на ошибки компиляции. Разберем типичный ошибочный код, который часто пытаются использовать в процедурах с аннотацией &НаКлиенте:
&НаКлиенте
Процедура Расш1_СтавкаНДСПриИзмененииПосле(Элемент)
Если Объект.Организация = "РОГА И КОПЫТА" Тогда
РасшифровкаПлатежаСтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
КонецЕсли;
КонецПроцедуры
При выполнении этого кода система выдаст ошибку: Переменная не определена (Перечисления). Проанализируем причину: в управляемом приложении на Тонком клиенте менеджеры метаданных, такие как Перечисления, Справочники или Документы, недоступны. Они существуют только на стороне сервера.
Второй важный момент — сравнение ссылочного типа (Организация) со строкой ("РОГА И КОПЫТА"). Такое условие никогда не будет выполнено, так как Объект.Организация содержит ссылку на элемент справочника, а не текстовое название.
Для того чтобы получить значение перечисления на клиенте без обращения к серверу, в платформе 1С предусмотрена специальная функция ПредопределенноеЗначение(). Она позволяет получить ссылку на предопределенный элемент справочника или значение перечисления по его строковому имени.
Рассмотрим, как правильно изменить ставку НДС, используя этот метод:
&НаКлиенте
Процедура Расш1_ДоговорКонтрагентаПриИзмененииПосле(Элемент)
// Устанавливаем ставку "Без НДС" программно
РасшифровкаПлатежаСтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
КонецЕсли;
Важное замечание: В современных версиях БП 3.0 объект СтавкиНДС может быть преобразован из перечисления в справочник. В этом случае синтаксис изменится на ПредопределенноеЗначение("Справочник.СтавкиНДС.БезНДС"). Всегда проверяйте тип метаданных в вашей версии конфигурации.
Поскольку мы не можем сравнивать ссылку с названием организации на клиенте, а обращение к метаданным Справочники.Организации запрещено, наиболее надежным способом будет проверка организации по её ИНН. ИНН — это уникальная строка, которую легко проверить.
Для реализации этого метода нам потребуется создать вспомогательную функцию на стороне сервера, которая будет проверять, является ли выбранная в документе организация той самой, для которой мы меняем логику. Разберем по шагам создание такой функции:
&НаСервере
Функция ЭтоОрганизацияБезНДС()
// Определим целевой ИНН
НужныйИНН = "1001350063";
Если Не ЗначениеЗаполнено(Объект.Организация) Тогда
Возврат Ложь;
КонецЕсли;
// Используем типовой механизм для быстрого получения реквизита без загрузки всего объекта
ИНН_Организации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Организация, "ИНН");
Возврат (ИНН_Организации = НужныйИНН);
КонецФункции
В данном примере мы используем функцию ОбщегоНазначения.ЗначениеРеквизитаОбъекта. Это значительно эффективнее, чем метод ПолучитьОбъект(), так как система выполняет легкий запрос к базе данных только за одним полем, не перегружая память сервера данными всей организации.
Теперь объединим полученные знания и напишем финальный обработчик события. Мы будем использовать аннотацию &После (или &After), чтобы наше действие выполнялось после того, как отработают типовые алгоритмы 1С по заполнению ставок.
&НаКлиенте
Процедура Расш1_ДоговорКонтрагентаПриИзмененииПосле(Элемент)
// Проверяем, наша ли это организация (через серверную функцию)
Если ЭтоОрганизацияБезНДС() Тогда
// Устанавливаем ставку НДС
Объект.РасшифровкаПлатежа[0].СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
// При необходимости обнуляем сумму НДС
Объект.РасшифровкаПлатежа[0].СуммаНДС = 0;
// Если форма однострочная, обновляем связанные реквизиты
РасшифровкаПлатежаСтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
РасшифровкаПлатежаСуммаНДС = 0;
КонецЕсли;
КонецПроцедуры
При работе с формой документа Поступление на расчетный счет важно учитывать несколько нюансов, которые сделают ваше решение более профессиональным:
ОрганизацияПриИзменении.Объект.РасшифровкаПлатежа. Проанализируем структуру документа: если платеж разбит на несколько строк, код должен обходить их в цикле.Использование расширений позволяет сохранить типовую конфигурацию на поддержке, при этом гибко адаптируя поведение форм под нужды конкретного бизнеса. Разбирая по шагам взаимодействие клиента и сервера, мы создали надежный механизм автоматизации заполнения реквизитов.