Как исправить незаполненную ставку НДС в поступлениях БП 3.0 после синхронизации из УТ 11?

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

При настройке регулярного обмена данными между конфигурациями 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 технические специалисты часто сталкиваются со следующей проблемой: после проведения синхронизации документы Поступление товаров и услуг приходят в принимающую базу (БП) с незаполненными ставками НДС в табличной части. При этом в базе-источнике (УТ) все ставки заполнены корректно. Подобное поведение системы делает невозможным автоматическое проведение документов и требует ручного вмешательства бухгалтеров для перезаполнения данных.

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

Выясняем причину возникновения ошибки

Для того чтобы понять природу проблемы, рассмотрим архитектуру взаимодействия программных продуктов через универсальный формат. Синхронизация данных между современными конфигурациями 1С строится на базе XDTO-пакетов стандарта EnterpriseData. Когда документ выгружается из УТ, специальный программный класс — менеджер обмена — преобразует объектные данные 1С в структурированный XML-документ.

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

Официальные исправления от разработчиков 1С выпускаются в плановых обновлениях конфигураций, однако бизнес-процессы не могут простаивать в ожиданиях новых релизов. Поэтому разберем, как локализовать и устранить эту неисправность самостоятельно.

Шаг 1. Создание расширения конфигурации и переопределение процедуры

Наиболее технологичным и безопасным способом исправления данной ошибки является использование механизма расширений конфигурации. Это позволяет избежать снятия основной конфигурации с поддержки и упростит дальнейшие обновления системы.

Для реализации исправления нам потребуется переопределить поведение процедуры ОпределитьСтавкуНДС_Отправка в общем модуле МенеджерОбменаЧерезУниверсальныйФормат на стороне конфигурации 1С:Управление торговлей 11.

Выполним следующие действия по шагам:

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

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

Посмотрим на пример программного кода, который решает проблему сопоставления ставок НДС (включая исторические переходы на 20%):


&Вместо("ОпределитьСтавкуНДС_Отправка")
Процедура ОпределитьСтавкуНДС_Отправка(ТабличнаяЧасть, НДСПоСтавкам2и4)
    
    // Добавляем временную колонку строкового типа для хранения текстового представления ставки
    ТабличнаяЧасть.Колонки.Добавить("СтавкаНДССтрокой");
    
    Для Каждого Строка Из ТабличнаяЧасть Цикл
        Если Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС0 Тогда
            Строка.СтавкаНДССтрокой = "НДС0";
        ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
            Строка.СтавкаНДССтрокой = "БезНДС";
        Иначе
            Если НДСПоСтавкам2и4 Тогда
                Если Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС18 Тогда
                    Строка.СтавкаНДССтрокой = "НДС4";
                ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
                    Строка.СтавкаНДССтрокой = "НДС4_104";
                ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС10 Тогда
                    Строка.СтавкаНДССтрокой = "НДС2";
                ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда
                    Строка.СтавкаНДССтрокой = "НДС2_102";
                КонецЕсли;
            Иначе
                Если Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС18 Тогда
                    Строка.СтавкаНДССтрокой = "НДС18";
                ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
                    Строка.СтавкаНДССтрокой = "НДС18_118";
                ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС10 Тогда
                    Строка.СтавкаНДССтрокой = "НДС10";
                ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда
                    Строка.СтавкаНДССтрокой = "НДС10_110";
                
                // Обработка ставок 20% для корректной выгрузки
                ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
                    Строка.СтавкаНДССтрокой = "НДС20";
                ИначеЕсли Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
                    Строка.СтавкаНДССтрокой = "НДС20_120";
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    // Производим подмену оригинальной колонки типизированного перечисления строковой колонкой
    ТабличнаяЧасть.Колонки.Удалить("СтавкаНДС");
    ТабличнаяЧасть.Колонки.СтавкаНДССтрокой.Имя = "СтавкаНДС";
    
КонецПроцедуры

Разберем подробнее логику работы этого кода. Входящая табличная часть содержит типизированную колонку с типом ПеречислениеСсылка.СтавкиНДС. Напрямую записать туда произвольное строковое значение, соответствующее формату XML-пакета, невозможно из-за строгой типизации. Чтобы обойти это ограничение, мы создаем новую временную колонку СтавкаНДССтрокой с произвольным типом, обходим в цикле все строки, конвертируем ссылочные значения в строковые эквиваленты (например, ссылка НДС20 превращается в строковый литерал "НДС20"), удаляем исходную колонку и переименовываем строковую обратно в СтавкаНДС.

Шаг 2. Проверка версии формата EnterpriseData

Даже если программный код в общем модуле будет полностью исправен, выгрузка может завершиться ошибкой или игнорированием полей, если между базами согласована слишком старая версия формата обмена. Например, в формате EnterpriseData версии 1.2 физически отсутствуют типы данных для описания ставки НДС 20%.

Проанализируем настройки синхронизации и выполним следующие действия:

  1. В обеих базах (УТ 11 и БП 3.0) перейдем в раздел НСИ и администрирование (или Администрирование) — Синхронизация данных.
  2. Откроем параметры нашего узла обмена.
  3. Проверим используемую версию формата. Для корректной передачи новых ставок НДС версия формата обмена должна быть не ниже 1.3 (рекомендуется использовать наиболее актуальные версии — 1.5 и выше).
  4. При необходимости перенастроим правила обмена или вручную обновим XDTO-пакеты в конфигурациях до актуальных релизов.

Шаг 3. Корректировка правил конвертации предопределенных данных

Иногда одной лишь модификации процедуры отправки оказывается недостаточно, поскольку при обратном обмене или сопоставлении объектов система использует правила конвертации предопределенных данных. За это отвечает процедура ЗаполнитьПравилаКонвертацииПредопределенныхДанных() в том же общем модуле.

Если после применения расширения из Шага 1 данные все еще не заполняются, добавьте в это же расширение переопределение правил сопоставления перечислений. Убедитесь, что для каждого значения перечисления СтавкиНДС на стороне УТ задано адекватное соответствие значению перечисления в БП.

Шаг 4. Очистка кэша и повторная отправка документов

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

Чтобы изменения гарантированно вступили в силу, выполните следующие действия:

  1. Перезапустите службу сервера «1С:Предприятие» или очистите кэш конфигурации на рабочих местах пользователей. Это связано с тем, что правила обмена через универсальный формат кэшируются платформой в оперативной памяти для ускорения производительности.
  2. Поскольку документы, которые уже были выгружены ранее с ошибками, не будут отправлены повторно автоматически (так как система считает их успешно синхронизированными), нам нужно вручную зарегистрировать их к отправке.
  3. Для этого воспользуемся стандартной обработкой Регистрация изменений для обмена данными (доступна через настройки синхронизации). Выделим нужные документы Поступление товаров и услуг за проблемный период и зарегистрируем их заново.
  4. Запустите процесс синхронизации повторно.

Альтернативный способ для базовых версий (без изменения конфигурации)

Что делать, если одна из баз является базовой и использование расширений в ней ограничено программно, либо политика безопасности компании запрещает вносить изменения в структуру метаданных?

Для таких сценариев предусмотрена возможность использования внешних правил обмена:

  1. Из типовой конфигурации выгружается актуальный макет общего модуля менеджера обмена.
  2. Файл сохраняется локально как внешняя обработка обслуживания с сохранением структуры процедур.
  3. В программный код этой обработки вносятся аналогичные правки в процедуру ОпределитьСтавкуНДС_Отправка.
  4. В режиме "1С:Предприятие" в настройках синхронизации данных устанавливается флаг Использовать внешние правила обмена, после чего модифицированная обработка загружается в информационную базу. Обмен начинает работать по новым правилам без изменения кода конфигурации.

Цикличность проблемы и взгляд в будущее

Рассмотренный паттерн проектирования правил обмена имеет системный характер. Аналогичные сбои со ставками НДС происходят регулярно при глобальных изменениях в налоговом законодательстве. Например, точно такая же ситуация с пустыми ставками возникла в начале 2025 года при введении новых ставок НДС 5% и 7% для налогоплательщиков, применяющих упрощенную систему налогообложения (УСН).

Используя предложенный в данной статье метод доработки общего модуля МенеджерОбменаЧерезУниверсальныйФормат и контролируя версию XDTO-пакетов, вы сможете оперативно устранять подобные ошибки синхронизации, не дожидаясь официальных обновлений конфигураций от компании 1С.

← На главную