При обмене данными между различными конфигурациями 1С, такими как Управление торговлей (УТ), Розница, ERP и Бухгалтерия Предприятия (БП), пользователи часто сталкиваются с ошибкой валидации XDTO-пакета: "Ошибка проверки свойства 'РасчетнаяСтавка': форма: Элемент имя: { тип: { Отсутствует обязательное свойство Показать" или "РасчетнаяСтавка: не заполнено обязательное поле.". Эта проблема чаще всего проявляется при выгрузке документов, содержащих информацию о налоге на добавленную стоимость (НДС), таких как "Счет-фактура полученный", "Реализация товаров и услуг", "Заказ клиента" или "Поступление товаров от хранителя". Рассмотрим подробнее, почему возникает эта ошибка и как мы можем ее устранить.
Основная причина этой ошибки кроется в несоответствии типов данных реквизита "СтавкаНДС" между конфигурацией-источником и схемой обмена XDTO, которую ожидает конфигурация-приемник. В большинстве случаев, в конфигурациях-источниках (например, в Рознице или УТ) реквизит "СтавкаНДС" реализован как Перечисление, в то время как XDTO-пакет, соответствующий требованиям БП, ожидает получить более сложный тип данных – либо Структура, либо СправочникСсылка на элемент справочника "Ставки НДС". При попытке выгрузить Перечисление в поле, которое по схеме должно быть структурой с определенными свойствами (например, РасчетнаяСтавка) или ссылкой, система обмена не может провести валидацию и выдает указанную ошибку.
Для решения этой проблемы нам необходимо скорректировать процедуры выгрузки данных таким образом, чтобы они преобразовывали значение "СтавкаНДС" из исходного типа (Перечисление) в тот тип, который ожидается XDTO-схемой.
В некоторых случаях, особенно при обмене между Розницей/УТ и БП, ошибка "РасчетнаяСтавка" возникает для табличной части "Услуги" в документах "Заказ покупателя" и "Реализация товаров и услуг". Это связано с тем, что для товаров процедура преобразования ставки НДС может быть предусмотрена, а для услуг – нет.
МенеджерОбменаЧерезУниверсальныйФормат.ПОД_Документ_ЗаказПокупателя_Отправка_ПриОбработкеПОД_Документ_РеализацияТоваровУслуг_Отправка_ПриОбработкеУслуги = РезультатыЗапроса[1].Выгрузить; (или аналогичной, где происходит выгрузка табличной части услуг), нам нужно добавить вызов процедуры ЗаполнитьСтавкиНДСОтправка. Эта процедура отвечает за корректное формирование структуры Ставки НДС для обмена.Пример кода для добавления:
// ... (существующий код процедуры)
Услуги = РезультатыЗапроса[1].Выгрузить;
ЗаполнитьСтавкиНДСОтправка(КомпонентыОбмена, Услуги); // Добавляем эту строку
// ... (дальнейший код процедуры)
Мы видим, что это изменение позволит системе обмена правильно обработать ставки НДС для услуг, преобразуя их в ожидаемый формат.
Если проблема возникает именно для документа "Счет-фактура полученный (налоговый агент)", нам потребуется более детальная настройка правил конвертации объектов (ПКО), так как исходная конфигурация может выгружать ставку НДС как простое перечисление, тогда как XDTO ожидает структуру.
МенеджерОбменаЧерезУниверсальныйФормат.ДобавитьПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп.Пример изменений в ДобавитьПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп:
Процедура ДобавитьПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп (ПравилаКонвертации)
// ... (существующий код)
СвойстваШапки = ПравилоКонвертации.Свойства;
// ... (другие ДобавитьПКС)
ДобавитьПКС(СвойстваШапки, "", "СуммаНДС", 1);
// ++ Добавляем свойство СтавкаНДС
ДобавитьПКС(СвойстваШапки, "", "СтавкаНДС", 1);
// --
ДобавитьПКС(СвойстваШапки, "СчетФактураОснование", "ИсправляемыйСчетФактура", , "Документ_СчетФактураПолученный_Отправка");
// ... (дальнейший код)
КонецПроцедуры
ПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп_ПриОтправкеДанных.ДанныеXDTO: Нам нужно убедиться, что СтавкаНДС будет сформирована как структура с необходимыми полями. Мы сделаем это, свернув табличную часть по ставке НДС и, если она одна, сформировав структуру для XDTO.Пример изменений в ПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп_ПриОтправкеДанных:
Процедура ПКО_Документ_СчетФактураПолученныйНалоговыйАгент_Отп_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
// ... (существующий код)
ДанныеXDTO.Вставить("Сумма", ДанныеИБ.ДокументыОснования.Итог("Сумма"));
ДанныеXDTO.Вставить("СуммаНДС", ДанныеИБ.ДокументыОснования.Итог("СуммаНДС"));
ТабДокументыОснования = ДанныеИБ.ДокументыОснования.Выгрузить();
ТабДокументыОснования.Свернуть("СтавкаНДС");
Если ТабДокументыОснования.Количество = 1 Тогда
СтавкаНДС = ТабДокументыОснования[0].СтавкаНДС;
// ++ Преобразуем перечисление в структуру, ожидаемую XDTO-схемой
СтавкаНДССтруктура = Новый Структура;
СтавкаНДССтруктура.Вставить("Значение", СтавкаНДС);
СтавкаНДССтруктура.Вставить("ИмяПКО", "СправочникСсылка_СтавкиНДС_Отправка"); // Указываем ПКО для ссылки на справочник СтавкиНДС
ДанныеXDTO.Вставить("СтавкаНДС", СтавкаНДССтруктура);
Иначе
// Если ставок НДС несколько или другая логика, используем стандартную функцию
ДанныеXDTO.Вставить("СтавкаНДС", СтавкаНДСПоСправочнику(СтавкаНДС));
КонецЕсли; // --
ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, ДанныеИБ, ДанныеXDTO);
КонецПроцедуры
Эти изменения гарантируют, что "СтавкаНДС" будет передана в XDTO-пакете в виде структуры, которая содержит Значение (саму ставку) и ИмяПКО (указание на правило конвертации для ссылки на справочник Ставки НДС), что соответствует требованиям схемы.
Иногда, при обмене из ERP в БП, для табличной части "Товары" документа "Реализация товаров и услуг" возникает похожая проблема: в ERP "СтавкаНДС" является Перечисление, а XDTO-пакет ожидает СправочникСсылка.СтавкиНДС. В этом случае мы можем выполнить преобразование типов прямо в процедуре отправки данных.
МенеджерОбменаЧерезУниверсальныйФормат.ПКО_Документ_РеализацияТоваровУслуг_Отправка_ПриОтправкеДанных.СправочникСсылка.СтавкиНДС, и заполним ее, сопоставляя перечисления с элементами справочника.Пример кода для преобразования ставки НДС в табличной части "Товары":
// ... (существующий код процедуры)
ТабТовары = РезультатыЗапроса[7].Выгрузить(); // Получаем табличную часть товаров
// Добавляем временную колонку для хранения исходных значений перечисления
ТабТовары.Колонки.Добавить("СтавкаНДС_Переопределить", Новый ОписаниеТипов("ПеречислениеСсылка.СтавкиНДС"));
// Переносим значения из исходной колонки в новую временную
Для Каждого СтрокаТЗ ИЗ ТабТовары Цикл
СтрокаТЗ.СтавкаНДС_Переопределить = СтрокаТЗ.СтавкаНДС;
КонецЦикла;
// Находим и удаляем исходную колонку "СтавкаНДС" (которая была перечислением)
Колонка = ТабТовары.Колонки.Найти("СтавкаНДС");
Если НЕ Колонка = Неопределено Тогда
ТабТовары.Колонки.Удалить(Колонка);
КонецЕсли;
// Добавляем новую колонку "СтавкаНДС" с правильным типом (ссылка на справочник)
ТабТовары.Колонки.Добавить("СтавкаНДС", Новый ОписаниеТипов("Справочникссылка.СтавкиНДС"));
// Заполняем новую колонку, сопоставляя перечисления с элементами справочника "СтавкиНДС"
Для Каждого СтрокаТЗ ИЗ ТабТовары Цикл
Если СтрокаТЗ.СтавкаНДС_Переопределить = Перечисления.СтавкиНДС.НДС22 Тогда
СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("22%"); // Или другой способ получения ссылки на элемент справочника
ИначеЕсли СтрокаТЗ.СтавкаНДС_Переопределить = Перечисления.СтавкиНДС.НДС20 Тогда
СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%");
ИначеЕсли СтрокаТЗ.СтавкаНДС_Переопределить = Перечисления.СтавкиНДС.НДС0 Тогда
СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("0%");
ИначеЕсли СтрокаТЗ.СтавкаНДС_Переопределить = Перечисления.СтавкиНДС.БезНДС Тогда
СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("Без НДС");
Иначе
// Обработка других случаев или установка значения по умолчанию
СтрокаТЗ.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("Не облагается");
КонецЕсли;
КонецЦикла;
// ... (дальнейший код процедуры)
Этот подход позволяет нам гибко управлять преобразованием типов данных, обеспечивая соответствие требованиям XDTO-схемы.
В некоторых специфических случаях, например, при конвертации документа "Поступление товаров от хранителя" в "Возврат товаров от покупателя", ошибка "РасчетнаяСтавка" может возникать из-за того, что XDTO-схема ожидает наличие свойства "СтавкаНДС" в табличной части, хотя в исходном документе или в логике его преобразования для данной табличной части такой реквизит отсутствует или не должен быть передан. В такой ситуации, если реквизит действительно не нужен в приемнике, мы можем удалить его из правил конвертации.
МенеджерОбменаЧерезУниверсальныйФормат или похожий модуль, где определяются ПКО.ДобавитьПКО_Документ_ВозвратОтКомиссионера_Отправка (или аналогичную, соответствующую конвертируемому документу и табличной части).Пример кода для удаления свойства:
// ... (существующий код процедуры ДобавитьПКО_Документ_ВозвратОтКомиссионера_Отправка)
СвойстваТЧ = ДобавитьПКТЧ(ПравилоКонвертации, "", "Товары"); // Допустим, это табличная часть "Товары"
ДобавитьПКС(СвойстваТЧ, "", "Номенклатура", 1, "Справочник_Номенклатура");
// #Удаление: Убираем строку, которая добавляет ненужное свойство "СтавкаНДС"
// ДобавитьПКС(СвойстваТЧ, "", "СтавкаНДС", 1);
// #КонецУдаления
ДобавитьПКС(СвойстваТЧ, "", "Количество", 1);
// ... (другие ДобавитьПКС для этой табличной части)
Мы должны быть очень внимательны при использовании этого метода, поскольку удаление свойства должно быть оправдано тем, что оно действительно не должно передаваться в принимающую систему или является избыточным для данной операции конвертации.
При работе с обменам данными и внесении изменений в типовые конфигурации, мы всегда следуем лучшим практикам:
Мы видим, что ошибка "Проверка свойства 'РасчетнаяСтавка'" является распространенной проблемой при обмене данными между конфигурациями 1С, но с помощью целенаправленных доработок в общих модулях и правилах конвертации, мы можем эффективно ее устранить. Главное – правильно определить источник проблемы и выбрать подходящий метод ее решения, всегда стараясь сохранить типовую конфигурацию с помощью расширений.