Как исправить ошибку несоответствия типа объекта и правила конвертации при обмене данными в 1С?

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

При выгрузке данных в процессе синхронизации между конфигурациями 1С (например, между «Управление торговлей» и «Бухгалтерия предприятия») разработчики и администраторы нередко сталкиваются с ошибкой вида: «Ошибка при выгрузке данных для узла плана обмена... ТипОбъекта = Документ объект: Возврат товаров поставщику Объект = Корректировка поступления... ОписаниеОшибки = Поле объекта не обнаружено (Склад)».

В тексте сообщения видно явное противоречие: система пытается обработать объект типа Корректировка поступления по правилу, предназначенному для документа Возврат товаров поставщику. В результате алгоритм пытается обратиться к реквизиту Склад, который присутствует в шапке возврата, но отсутствует в структуре корректировки. Разберем детально, почему возникает эта коллизия и как ее устранить.

Причины возникновения несоответствия

Проанализируем основные факторы, вызывающие подобную ошибку в механизмах конвертации данных (КД 2.x):

  1. Жесткая привязка ПКО в правиле конвертации свойств (ПКС). В выгружаемом документе (например, Счет-фактура полученный или Корректировка поступления) присутствует составной реквизит основания (например, ДокументОснование или Сделка). Если в правилах обмена для этого реквизита принудительно задано конкретное правило конвертации объекта (ПКО) ВозвратТоваровПоставщику, система будет пытаться прогнать любой документ-основание через это правило, даже если фактически по ссылке передан другой документ.
  2. Явное указание ПКО в коде обработчиков. В обработчиках ПередВыгрузкой или ПриВыгрузке может вызываться функция ВыгрузитьПоПравилу(...), куда жестко передано строковое имя неподходящего ПКО без проверки реального типа объекта источника.
  3. Различия в структуре метаданных. У документа Возврат товаров поставщику реквизит Склад находится в шапке, а у Корректировки поступления данные о складах могут храниться в табличных частях либо вовсе отсутствовать, что и приводит к падению при обращении к реквизиту напрямую.

Способ 1. Очистка жесткой фиксации ПКО в реквизитах-основаниях

Рассмотрим порядок действий в конфигурации «Конвертация данных»:

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

Способ 2. Динамический выбор ПКО в обработчике ПКС

Если для составного реквизита требуется специфическая логика выгрузки в зависимости от типа переданного документа, разберем программное переопределение правила в обработчике «Перед выгрузкой» соответствующего ПКС:


Если ЗначениеЗаполнено(Источник.ДокументОснование) Тогда
    ТипОснования = ТипЗнч(Источник.ДокументОснование);
    
    Если ТипОснования = Тип("ДокументСсылка.КорректировкаПоступления") Тогда
        ИмяПКО = "КорректировкаПоступления";
    ИначеЕсли ТипОснования = Тип("ДокументСсылка.ВозвратТоваровПоставщику") Тогда
        ИмяПКО = "ВозвратТоваровПоставщику";
    ИначеЕсли ТипОснования = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
        ИмяПКО = "ПоступлениеТоваровУслуг";
    КонецЕсли;
КонецЕсли;

Такой подход гарантирует, что каждый объект-основание попадет строго в предназначенное для него правило конвертации.

Способ 3. Безопасное обращение к реквизитам в модулях обмена

Если обращение к реквизиту Склад происходит в алгоритмах общего модуля конфигурации, защитим код проверкой наличия реквизита в метаданных выгружаемого объекта:


Если ОбщегоНазначения.ЕстьРеквизитШапкиИлиТабличнойЧасти("Склад", Источник.Метаданные()) Тогда
    ЗначениеСклада = Источник.Склад;
Иначе
    ЗначениеСклада = Справочники.Склады.ПустаяСсылка();
КонецЕсли;

Также, если для документа-основания не требуется переносить все движения и табличные части, в ПКС можно включить режим «Выгружать только ссылку» (ВыгрузитьТолькоСсылку = Истина), что предотвратит глубокую конвертацию объекта и обращение к его несуществующим реквизитам.

← На главную