При настройке регулярного обмена данными между конфигурациями 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 технические специалисты часто сталкиваются со следующей проблемой: после проведения синхронизации документы Поступление товаров и услуг приходят в принимающую базу (БП) с незаполненными ставками НДС в табличной части. При этом в базе-источнике (УТ) все ставки заполнены корректно. Подобное поведение системы делает невозможным автоматическое проведение документов и требует ручного вмешательства бухгалтеров для перезаполнения данных.
В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем механизмы синхронизации через универсальный формат EnterpriseData и предоставим пошаговые инструкции по исправлению этой проблемы с помощью расширения конфигурации и изменения правил обмена.
Для того чтобы понять природу проблемы, рассмотрим архитектуру взаимодействия программных продуктов через универсальный формат. Синхронизация данных между современными конфигурациями 1С строится на базе XDTO-пакетов стандарта EnterpriseData. Когда документ выгружается из УТ, специальный программный класс — менеджер обмена — преобразует объектные данные 1С в структурированный XML-документ.
При передаче ставок НДС менеджер обмена сопоставляет перечисление СтавкиНДС с фиксированными строковыми значениями формата XML-схемы. Если в используемом релизе конфигурации правила сопоставления устарели или не содержат необходимых типов данных (как это произошло при введении ставки НДС 20% или новых ставок 5% и 7% для УСН в 2025 году), выгружаемое значение не проходит проверку или просто игнорируется. В результате в файл выгрузки ставка НДС не попадает вовсе, а в информационной базе БП 3.0 реквизит в строках табличной части остается пустым.
Официальные исправления от разработчиков 1С выпускаются в плановых обновлениях конфигураций, однако бизнес-процессы не могут простаивать в ожиданиях новых релизов. Поэтому разберем, как локализовать и устранить эту неисправность самостоятельно.
Наиболее технологичным и безопасным способом исправления данной ошибки является использование механизма расширений конфигурации. Это позволяет избежать снятия основной конфигурации с поддержки и упростит дальнейшие обновления системы.
Для реализации исправления нам потребуется переопределить поведение процедуры ОпределитьСтавкуНДС_Отправка в общем модуле МенеджерОбменаЧерезУниверсальныйФормат на стороне конфигурации 1С:Управление торговлей 11.
Выполним следующие действия по шагам:
ИсправлениеПереносаНДС. Снимем флажки "Безопасный режим" и "Защита от опасных действий".МенеджерОбменаЧерезУниверсальныйФормат. Кликнем по нему правой кнопкой мыши и выберем пункт Добавить в расширение.&Вместо.Важное примечание: При написании кода директивы обязательно следите за тем, чтобы после амперсанда не было лишних пробелов. Конструкция должна выглядеть строго как &Вместо, иначе платформа выдаст синтаксическую ошибку при компиляции и расширение не применится.
Посмотрим на пример программного кода, который решает проблему сопоставления ставок НДС (включая исторические переходы на 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"), удаляем исходную колонку и переименовываем строковую обратно в СтавкаНДС.
Даже если программный код в общем модуле будет полностью исправен, выгрузка может завершиться ошибкой или игнорированием полей, если между базами согласована слишком старая версия формата обмена. Например, в формате EnterpriseData версии 1.2 физически отсутствуют типы данных для описания ставки НДС 20%.
Проанализируем настройки синхронизации и выполним следующие действия:
Иногда одной лишь модификации процедуры отправки оказывается недостаточно, поскольку при обратном обмене или сопоставлении объектов система использует правила конвертации предопределенных данных. За это отвечает процедура ЗаполнитьПравилаКонвертацииПредопределенныхДанных() в том же общем модуле.
Если после применения расширения из Шага 1 данные все еще не заполняются, добавьте в это же расширение переопределение правил сопоставления перечислений. Убедитесь, что для каждого значения перечисления СтавкиНДС на стороне УТ задано адекватное соответствие значению перечисления в БП.
Частой ошибкой разработчиков является проверка результатов работы сразу после внесения изменений в конфигурацию без учета кэширования метаданных и зарегистрированных изменений.
Чтобы изменения гарантированно вступили в силу, выполните следующие действия:
Поступление товаров и услуг за проблемный период и зарегистрируем их заново.Что делать, если одна из баз является базовой и использование расширений в ней ограничено программно, либо политика безопасности компании запрещает вносить изменения в структуру метаданных?
Для таких сценариев предусмотрена возможность использования внешних правил обмена:
ОпределитьСтавкуНДС_Отправка.Рассмотренный паттерн проектирования правил обмена имеет системный характер. Аналогичные сбои со ставками НДС происходят регулярно при глобальных изменениях в налоговом законодательстве. Например, точно такая же ситуация с пустыми ставками возникла в начале 2025 года при введении новых ставок НДС 5% и 7% для налогоплательщиков, применяющих упрощенную систему налогообложения (УСН).
Используя предложенный в данной статье метод доработки общего модуля МенеджерОбменаЧерезУниверсальныйФормат и контролируя версию XDTO-пакетов, вы сможете оперативно устранять подобные ошибки синхронизации, не дожидаясь официальных обновлений конфигураций от компании 1С.