Почему возникает ошибка обмена данными 'Проверка свойства РасчетнаяСтавка' и как ее исправить?

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

При обмене данными между различными конфигурациями 1С, такими как Управление торговлей (УТ), Розница, ERP и Бухгалтерия Предприятия (БП), пользователи часто сталкиваются с ошибкой валидации XDTO-пакета: "Ошибка проверки свойства 'РасчетнаяСтавка': форма: Элемент имя: { тип: { Отсутствует обязательное свойство Показать" или "РасчетнаяСтавка: не заполнено обязательное поле.". Эта проблема чаще всего проявляется при выгрузке документов, содержащих информацию о налоге на добавленную стоимость (НДС), таких как "Счет-фактура полученный", "Реализация товаров и услуг", "Заказ клиента" или "Поступление товаров от хранителя". Рассмотрим подробнее, почему возникает эта ошибка и как мы можем ее устранить.

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

Для решения этой проблемы нам необходимо скорректировать процедуры выгрузки данных таким образом, чтобы они преобразовывали значение "СтавкаНДС" из исходного типа (Перечисление) в тот тип, который ожидается XDTO-схемой.

Решение 1: Для услуг в документах "Заказ покупателя" и "Реализация товаров и услуг" (обмен Розница/УТ -> БП)

В некоторых случаях, особенно при обмене между Розницей/УТ и БП, ошибка "РасчетнаяСтавка" возникает для табличной части "Услуги" в документах "Заказ покупателя" и "Реализация товаров и услуг". Это связано с тем, что для товаров процедура преобразования ставки НДС может быть предусмотрена, а для услуг – нет.

  1. Откроем общий модуль: МенеджерОбменаЧерезУниверсальныйФормат.
  2. Найдем процедуры:
    • ПОД_Документ_ЗаказПокупателя_Отправка_ПриОбработке
    • ПОД_Документ_РеализацияТоваровУслуг_Отправка_ПриОбработке
  3. После строки выгрузки услуг: Услуги = РезультатыЗапроса[1].Выгрузить; (или аналогичной, где происходит выгрузка табличной части услуг), нам нужно добавить вызов процедуры ЗаполнитьСтавкиНДСОтправка. Эта процедура отвечает за корректное формирование структуры Ставки НДС для обмена.

Пример кода для добавления:


// ... (существующий код процедуры)
Услуги = РезультатыЗапроса[1].Выгрузить;
ЗаполнитьСтавкиНДСОтправка(КомпонентыОбмена, Услуги); // Добавляем эту строку
// ... (дальнейший код процедуры)

Мы видим, что это изменение позволит системе обмена правильно обработать ставки НДС для услуг, преобразуя их в ожидаемый формат.

Решение 2: Для документа "Счет-фактура полученный (налоговый агент)" (обмен УТ -> БП)

Если проблема возникает именно для документа "Счет-фактура полученный (налоговый агент)", нам потребуется более детальная настройка правил конвертации объектов (ПКО), так как исходная конфигурация может выгружать ставку НДС как простое перечисление, тогда как XDTO ожидает структуру.

  1. Откроем общий модуль: МенеджерОбменаЧерезУниверсальныйФормат.
  2. Найдем процедуру: ДобавитьПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп.
  3. Добавим свойство "СтавкаНДС" в свойства шапки ПКО:

Пример изменений в ДобавитьПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп:


Процедура ДобавитьПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп (ПравилаКонвертации)
    // ... (существующий код)
    СвойстваШапки = ПравилоКонвертации.Свойства;
    // ... (другие ДобавитьПКС)
    ДобавитьПКС(СвойстваШапки, "", "СуммаНДС", 1);
    // ++ Добавляем свойство СтавкаНДС
    ДобавитьПКС(СвойстваШапки, "", "СтавкаНДС", 1); 
    // --
    ДобавитьПКС(СвойстваШапки, "СчетФактураОснование", "ИсправляемыйСчетФактура", , "Документ_СчетФактураПолученный_Отправка");
    // ... (дальнейший код)
КонецПроцедуры
  1. Далее найдем процедуру: ПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп_ПриОтправкеДанных.
  2. Переопределим присвоение этой СтавкиНДС в ДанныеXDTO: Нам нужно убедиться, что СтавкаНДС будет сформирована как структура с необходимыми полями. Мы сделаем это, свернув табличную часть по ставке НДС и, если она одна, сформировав структуру для XDTO.

Пример изменений в ПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп_ПриОтправкеДанных:


Процедура ПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
    // ... (существующий код)
    ДанныеXDTO.Вставить("Сумма", ДанныеИБ.ДокументыОснования.Итог("Сумма"));
    ДанныеXDTO.Вставить("СуммаНДС", ДанныеИБ.ДокументыОснования.Итог("СуммаНДС"));

    ТабДокументыОснования = ДанныеИБ.ДокументыОснования.Выгрузить();
    ТабДокументыОснования.Свернуть("СтавкаНДС");

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

Эти изменения гарантируют, что "СтавкаНДС" будет передана в XDTO-пакете в виде структуры, которая содержит Значение (саму ставку) и ИмяПКО (указание на правило конвертации для ссылки на справочник Ставки НДС), что соответствует требованиям схемы.

Решение 3: Для товаров в "Реализация товаров и услуг" (обмен ERP -> БП) - Общий подход для преобразования Перечисления в СправочникСсылка

Иногда, при обмене из ERP в БП, для табличной части "Товары" документа "Реализация товаров и услуг" возникает похожая проблема: в ERP "СтавкаНДС" является Перечисление, а XDTO-пакет ожидает СправочникСсылка.СтавкиНДС. В этом случае мы можем выполнить преобразование типов прямо в процедуре отправки данных.

  1. Откроем общий модуль: МенеджерОбменаЧерезУниверсальныйФормат.
  2. Найдем процедуру: ПКО_Документ_РеализацияТоваровУслуг_Отправка_ПриОтправкеДанных.
  3. Добавим код для преобразования: Мы создадим временную колонку, перенесем туда значения перечисления, удалим старую колонку "СтавкаНДС", затем добавим новую колонку с тем же именем, но с типом СправочникСсылка.СтавкиНДС, и заполним ее, сопоставляя перечисления с элементами справочника.

Пример кода для преобразования ставки НДС в табличной части "Товары":


// ... (существующий код процедуры)
ТабТовары = РезультатыЗапроса[7].Выгрузить(); // Получаем табличную часть товаров

// Добавляем временную колонку для хранения исходных значений перечисления
ТабТовары.Колонки.Добавить("СтавкаНДС_Переопределить", Новый ОписаниеТипов("ПеречислениеСсылка.СтавкиНДС"));

// Переносим значения из исходной колонки в новую временную
Для Каждого СтрокаТЗ ИЗ ТабТовары Цикл
    СтрокаТЗ.СтавкаНДС_Переопределить = СтрокаТЗ.СтавкаНДС;
КонецЦикла;

// Находим и удаляем исходную колонку "СтавкаНДС" (которая была перечислением)
Колонка = ТабТовары.Колонки.Найти("СтавкаНДС");
Если НЕ Колонка = Неопределено Тогда
    ТабТовары.Колонки.Удалить(Колонка);
КонецЕсли;

// Добавляем новую колонку "СтавкаНДС" с правильным типом (ссылка на справочник)
ТабТовары.Колонки.Добавить("СтавкаНДС", Новый ОписаниеТипов("Справочникссылка.СтавкиНДС"));

// Заполняем новую колонку, сопоставляя перечисления с элементами справочника "СтавкиНДС"
Для Каждого СтрокаТЗ ИЗ ТабТовары Цикл
    Если СтрокаТЗ.СтавкаНДС_Переопределить = Перечисления.СтавкиНДС.НДС22 Тогда
        СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("22%"); // Или другой способ получения ссылки на элемент справочника
    ИначеЕсли СтрокаТЗ.СтавкаНДС_Переопределить = Перечисления.СтавкиНДС.НДС20 Тогда
        СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%");
    ИначеЕсли СтрокаТЗ.СтавкаНДС_Переопределить = Перечисления.СтавкиНДС.НДС0 Тогда
        СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("0%");
    ИначеЕсли СтрокаТЗ.СтавкаНДС_Переопределить = Перечисления.СтавкиНДС.БезНДС Тогда
        СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("Без НДС");
    Иначе
        // Обработка других случаев или установка значения по умолчанию
        СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("Не облагается"); 
    КонецЕсли;
КонецЦикла;
// ... (дальнейший код процедуры)

Этот подход позволяет нам гибко управлять преобразованием типов данных, обеспечивая соответствие требованиям XDTO-схемы.

Решение 4: Для "Поступление товаров от хранителя" (конвертация в "Возврат товаров от покупателя")

В некоторых специфических случаях, например, при конвертации документа "Поступление товаров от хранителя" в "Возврат товаров от покупателя", ошибка "РасчетнаяСтавка" может возникать из-за того, что XDTO-схема ожидает наличие свойства "СтавкаНДС" в табличной части, хотя в исходном документе или в логике его преобразования для данной табличной части такой реквизит отсутствует или не должен быть передан. В такой ситуации, если реквизит действительно не нужен в приемнике, мы можем удалить его из правил конвертации.

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

Пример кода для удаления свойства:


// ... (существующий код процедуры ДобавитьПКО_Документ_ВозвратОтКомиссионера_Отправка)
СвойстваТЧ = ДобавитьПКТЧ(ПравилоКонвертации, "", "Товары"); // Допустим, это табличная часть "Товары"
ДобавитьПКС(СвойстваТЧ, "", "Номенклатура", 1, "Справочник_Номенклатура");
// #Удаление: Убираем строку, которая добавляет ненужное свойство "СтавкаНДС"
// ДобавитьПКС(СвойстваТЧ, "", "СтавкаНДС", 1); 
// #КонецУдаления
ДобавитьПКС(СвойстваТЧ, "", "Количество", 1);
// ... (другие ДобавитьПКС для этой табличной части)

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

Важные общие рекомендации

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

  1. Используем расширения: Все описанные изменения настоятельно рекомендуем вносить с помощью расширений конфигурации. Это позволит нам сохранять типовую конфигурацию без изменений, облегчая процесс обновления и сопровождения.
  2. Проверяем актуальность релизов: Многие из подобных ошибок являются "косяками" или недоработками, которые 1С исправляет в последующих релизах. Прежде чем приступать к доработкам, всегда проверяем, не выпущено ли уже официальное исправление в более новых версиях конфигураций.
  3. Детальная проверка данных: Если, помимо "РасчетнаяСтавка", появляются другие ошибки валидации XDTO (например, "Проверка свойства 'Валюта': форма: Элемент имя: { тип: { Не установлено значение одного из следующих свойств: ВидОперации"), это может указывать на проблемы с данными в исходных документах. Мы внимательно проверяем заполнение всех обязательных реквизитов (таких как "Валюта", "Контрагент", "Договор", "ВидОперации") в документе и связанных с ним справочниках. Пустые, некорректно заполненные или помеченные на удаление элементы справочников могут вызывать подобные ошибки.

Мы видим, что ошибка "Проверка свойства 'РасчетнаяСтавка'" является распространенной проблемой при обмене данными между конфигурациями 1С, но с помощью целенаправленных доработок в общих модулях и правилах конвертации, мы можем эффективно ее устранить. Главное – правильно определить источник проблемы и выбрать подходящий метод ее решения, всегда стараясь сохранить типовую конфигурацию с помощью расширений.

← На главную