Как в 1С:Бухгалтерия 3.0 через расширение автоматически устанавливать ставку Без НДС для конкретной организации

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

В связи с изменениями в налоговом законодательстве с 2025 года, многие организации на упрощенной системе налогообложения (УСН) становятся плательщиками НДС. В конфигурации 1С:Бухгалтерия предприятия 3.0 это привело к тому, что при редактировании документов, таких как Поступление на расчетный счет, программа по умолчанию может подставлять ставку 5% или 7%. Однако возникают ситуации, когда для конкретной организации, даже при наличии настроек плательщика НДС, необходимо по умолчанию устанавливать значение Без НДС. Рассмотрим, как реализовать эту логику с помощью расширения конфигурации, избежав типичных ошибок начинающих разработчиков.

Анализ проблемы и ограничений тонкого клиента

Первоначальная попытка реализовать задачу напрямую в коде формы часто натыкается на ошибки компиляции. Разберем типичный ошибочный код, который часто пытаются использовать в процедурах с аннотацией &НаКлиенте:


&НаКлиенте
Процедура Расш1_СтавкаНДСПриИзмененииПосле(Элемент)
    Если Объект.Организация = "РОГА И КОПЫТА" Тогда
        РасшифровкаПлатежаСтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
    КонецЕсли;
КонецПроцедуры

При выполнении этого кода система выдаст ошибку: Переменная не определена (Перечисления). Проанализируем причину: в управляемом приложении на Тонком клиенте менеджеры метаданных, такие как Перечисления, Справочники или Документы, недоступны. Они существуют только на стороне сервера.

Второй важный момент — сравнение ссылочного типа (Организация) со строкой ("РОГА И КОПЫТА"). Такое условие никогда не будет выполнено, так как Объект.Организация содержит ссылку на элемент справочника, а не текстовое название.

Решение 1: Правильное обращение к значениям перечислений

Для того чтобы получить значение перечисления на клиенте без обращения к серверу, в платформе 1С предусмотрена специальная функция ПредопределенноеЗначение(). Она позволяет получить ссылку на предопределенный элемент справочника или значение перечисления по его строковому имени.

Рассмотрим, как правильно изменить ставку НДС, используя этот метод:


&НаКлиенте
Процедура Расш1_ДоговорКонтрагентаПриИзмененииПосле(Элемент)
    // Устанавливаем ставку "Без НДС" программно
    РасшифровкаПлатежаСтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
КонецЕсли;

Важное замечание: В современных версиях БП 3.0 объект СтавкиНДС может быть преобразован из перечисления в справочник. В этом случае синтаксис изменится на ПредопределенноеЗначение("Справочник.СтавкиНДС.БезНДС"). Всегда проверяйте тип метаданных в вашей версии конфигурации.

Решение 2: Идентификация организации через ИНН

Поскольку мы не можем сравнивать ссылку с названием организации на клиенте, а обращение к метаданным Справочники.Организации запрещено, наиболее надежным способом будет проверка организации по её ИНН. ИНН — это уникальная строка, которую легко проверить.

Для реализации этого метода нам потребуется создать вспомогательную функцию на стороне сервера, которая будет проверять, является ли выбранная в документе организация той самой, для которой мы меняем логику. Разберем по шагам создание такой функции:


&НаСервере
Функция ЭтоОрганизацияБезНДС()
    
    // Определим целевой ИНН
    НужныйИНН = "1001350063"; 
    
    Если Не ЗначениеЗаполнено(Объект.Организация) Тогда
        Возврат Ложь;
    КонецЕсли;

    // Используем типовой механизм для быстрого получения реквизита без загрузки всего объекта
    ИНН_Организации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Организация, "ИНН");
    
    Возврат (ИНН_Организации = НужныйИНН);
    
КонецФункции

В данном примере мы используем функцию ОбщегоНазначения.ЗначениеРеквизитаОбъекта. Это значительно эффективнее, чем метод ПолучитьОбъект(), так как система выполняет легкий запрос к базе данных только за одним полем, не перегружая память сервера данными всей организации.

Итоговый код в расширении

Теперь объединим полученные знания и напишем финальный обработчик события. Мы будем использовать аннотацию &После (или &After), чтобы наше действие выполнялось после того, как отработают типовые алгоритмы 1С по заполнению ставок.


&НаКлиенте
Процедура Расш1_ДоговорКонтрагентаПриИзмененииПосле(Элемент)
    
    // Проверяем, наша ли это организация (через серверную функцию)
    Если ЭтоОрганизацияБезНДС() Тогда
        
        // Устанавливаем ставку НДС
        Объект.РасшифровкаПлатежа[0].СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
        
        // При необходимости обнуляем сумму НДС
        Объект.РасшифровкаПлатежа[0].СуммаНДС = 0;
        
        // Если форма однострочная, обновляем связанные реквизиты
        РасшифровкаПлатежаСтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
        РасшифровкаПлатежаСуммаНДС = 0;
        
    КонецЕсли;
    
КонецПроцедуры

Рекомендации по оптимизации и расширению логики

При работе с формой документа Поступление на расчетный счет важно учитывать несколько нюансов, которые сделают ваше решение более профессиональным:

  1. Обработка всех событий: Одной процедуры на изменение договора недостаточно. Если пользователь сначала выберет договор, а затем поменяет организацию в шапке, ваша логика не сработает. Рекомендуется добавить аналогичный вызов процедуры в обработчик ОрганизацияПриИзменении.
  2. Режим отображения: Документ может отображаться в режиме "одной строки" или "списка" (табличной части). В режиме списка данные хранятся в коллекции Объект.РасшифровкаПлатежа. Проанализируем структуру документа: если платеж разбит на несколько строк, код должен обходить их в цикле.
  3. Избегайте жесткого кодирования (Hardcode): Указывать ИНН прямо в коде — не лучшая практика. Если организация сменит ИНН или база будет использоваться для другой компании, код придется переписывать. Рассмотрим вариант создания Дополнительного реквизита (типа Булево) для справочника Организации, например "Всегда заполнять Без НДС". Тогда в серверной функции мы будем проверять значение этого реквизита.
  4. Законодательный контекст: Перед тем как писать код, убедитесь, что проблема не решается типовыми средствами. Проверьте настройки в разделе Главное — Налоги и отчеты — НДС. Если там установлена галочка об освобождении от НДС или применении общих ставок, 1С может начать подставлять нужные значения автоматически без вмешательства программиста.

Использование расширений позволяет сохранить типовую конфигурацию на поддержке, при этом гибко адаптируя поведение форм под нужды конкретного бизнеса. Разбирая по шагам взаимодействие клиента и сервера, мы создали надежный механизм автоматизации заполнения реквизитов.

← На главную