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