В процессе настройки и эксплуатации типовой синхронизации между конфигурациями «Бухгалтерия предприятия» (БП 3.0) и «Управление нашей фирмой» (УНФ 3.0) специалисты часто сталкиваются с техническими сложностями. Одной из наиболее неочевидных проблем является остановка обмена при выгрузке данных о контрагентах, имеющих статус индивидуального предпринимателя (ИП). Ошибка сопровождается сообщением о несоответствии структуры XDTO-пакета из-за отсутствующего КПП. Чтобы не запускать процесс вручную, регулярный автоматический обмен данными между базами 1С обеспечит выполнение синхронизации по заданному расписанию.
Рассмотрим детально, почему возникает эта ситуация, как проанализировать структуру данных и какие шаги необходимо предпринять для восстановления корректной работы обмена.
Проанализируем текст ошибки, который выдает система при попытке выгрузки: Ошибка проверки данных XDTO: Структура объекта '/ИсторияКПП/Строка[2]' не соответствует типу... Отсутствует обязательное свойство КПП. На первый взгляд ситуация кажется парадоксальной, так как у индивидуальных предпринимателей КПП отсутствует по закону, и в экранных формах 1С это поле для них скрыто или недоступно для редактирования.
Выясним причину на уровне форматов обмена. Начиная с версии пакета EnterpriseData 1.15 и выше (в частности, в версии 1.20.2), требования к валидации XML-файлов стали значительно строже. В схеме XDTO для объекта Контрагент коллекция ИсторияКПП описана таким образом, что если в выгружаемом файле появляется узел строки истории, то вложенный в него элемент КПП становится обязательным (параметр minOccurs="1").
Проблема заключается в том, что механизм выгрузки в БП 3.0 при наличии хотя бы одной записи в скрытой табличной части История КПП (даже если само значение КПП там пустое, но указана, например, только дата) принудительно создает узел в XML. Валидатор XDTO видит этот узел, обнаруживает отсутствие значения в поле КПП и блокирует отправку всего пакета данных.
Разберем, откуда в базе данных 1С у индивидуального предпринимателя могут появиться записи в табличной части ИсторияКПП, если штатно они не предусмотрены:
Посмотрим на самый быстрый и эффективный способ исправления ситуации без внесения изменений в конфигурацию («без костылей»). Если ошибка локализована в конкретном контрагенте, нам необходимо очистить его историю КПП.
Рассмотрим последовательность действий:
Контрагенты и установим фильтр по конкретному проблемному контрагенту (или по признаку Вид контрагента РАВНО Физическое лицо).История КПП. Нам необходимо добиться её полной очистки.Если групповая обработка не позволяет напрямую очистить коллекцию, воспользуемся коротким фрагментом кода в консоли кода (для администраторов):
// Пример очистки истории КПП для конкретного ИП
ОбъектКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "770102030405").ПолучитьОбъект();
Если ОбъектКонтрагент <> Неопределено Тогда
ОбъектКонтрагент.ИсторияКПП.Очистить();
ОбъектКонтрагент.Записать();
Сообщить("История КПП успешно очищена для: " + ОбъектКонтрагент.Наименование);
КонецЕсли;
Для системных администраторов и программистов, желающих решить проблему на уровне кода обмена, проанализируем возможность корректировки модуля менеджера обмена. Это позволит избежать подобных ошибок в будущем, даже если данные в базе будут заполнены некорректно.
В расширении конфигурации можно перехватить процедуру выгрузки контрагента. Логика должна заключаться в принудительном игнорировании коллекции ИсторияКПП, если признак ЮридическоеФизическоеЛицо соответствует значению ФизическоеЛицо (к которым относятся ИП).
Пример логики в обработчике ПКО_Справочник_Контрагенты_Отправка_ПриОбработке:
// Проверяем тип контрагента перед выгрузкой в XDTO
Если ДанныеИБ.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
// Если это ИП или физлицо, принудительно очищаем структуру для XDTO
Если ДанныеXDTO.Свойство("ИсторияКПП") Тогда
ДанныеXDTO.ИсторияКПП.Очистить();
КонецЕсли;
КонецЕсли;
Рассмотрим еще несколько важных моментов, которые помогут стабилизировать обмен:
Подводя итог, отметим, что ошибка Структура объекта '/ИсторияКПП/' не соответствует типу — это классический пример конфликта между устаревшими или некорректно введенными данными в базе и строгими правилами современных форматов EnterpriseData. Своевременная очистка служебных табличных частей у ИП гарантирует стабильную работу синхронизации между БП 3.0 и УНФ 3.0.