При выгрузке данных в процессе синхронизации между конфигурациями 1С (например, между «Управление торговлей» и «Бухгалтерия предприятия») разработчики и администраторы нередко сталкиваются с ошибкой вида: «Ошибка при выгрузке данных для узла плана обмена... ТипОбъекта = Документ объект: Возврат товаров поставщику Объект = Корректировка поступления... ОписаниеОшибки = Поле объекта не обнаружено (Склад)».
В тексте сообщения видно явное противоречие: система пытается обработать объект типа Корректировка поступления по правилу, предназначенному для документа Возврат товаров поставщику. В результате алгоритм пытается обратиться к реквизиту Склад, который присутствует в шапке возврата, но отсутствует в структуре корректировки. Разберем детально, почему возникает эта коллизия и как ее устранить.
Проанализируем основные факторы, вызывающие подобную ошибку в механизмах конвертации данных (КД 2.x):
Счет-фактура полученный или Корректировка поступления) присутствует составной реквизит основания (например, ДокументОснование или Сделка). Если в правилах обмена для этого реквизита принудительно задано конкретное правило конвертации объекта (ПКО) ВозвратТоваровПоставщику, система будет пытаться прогнать любой документ-основание через это правило, даже если фактически по ссылке передан другой документ.ПередВыгрузкой или ПриВыгрузке может вызываться функция ВыгрузитьПоПравилу(...), куда жестко передано строковое имя неподходящего ПКО без проверки реального типа объекта источника.Возврат товаров поставщику реквизит Склад находится в шапке, а у Корректировки поступления данные о складах могут храниться в табличных частях либо вовсе отсутствовать, что и приводит к падению при обращении к реквизиту напрямую.Рассмотрим порядок действий в конфигурации «Конвертация данных»:
КорректировочныйСчетФактура, СчетФактураПолученный и КорректировкаПоступления).ДокументОснование (или аналогичные составные поля: Сделка, Документ).ВозвратТоваровПоставщику, очищаем это значение, оставляя поле пустым.Если для составного реквизита требуется специфическая логика выгрузки в зависимости от типа переданного документа, разберем программное переопределение правила в обработчике «Перед выгрузкой» соответствующего ПКС:
Если ЗначениеЗаполнено(Источник.ДокументОснование) Тогда
ТипОснования = ТипЗнч(Источник.ДокументОснование);
Если ТипОснования = Тип("ДокументСсылка.КорректировкаПоступления") Тогда
ИмяПКО = "КорректировкаПоступления";
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ВозвратТоваровПоставщику") Тогда
ИмяПКО = "ВозвратТоваровПоставщику";
ИначеЕсли ТипОснования = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
ИмяПКО = "ПоступлениеТоваровУслуг";
КонецЕсли;
КонецЕсли;
Такой подход гарантирует, что каждый объект-основание попадет строго в предназначенное для него правило конвертации.
Если обращение к реквизиту Склад происходит в алгоритмах общего модуля конфигурации, защитим код проверкой наличия реквизита в метаданных выгружаемого объекта:
Если ОбщегоНазначения.ЕстьРеквизитШапкиИлиТабличнойЧасти("Склад", Источник.Метаданные()) Тогда
ЗначениеСклада = Источник.Склад;
Иначе
ЗначениеСклада = Справочники.Склады.ПустаяСсылка();
КонецЕсли;
Также, если для документа-основания не требуется переносить все движения и табличные части, в ПКС можно включить режим «Выгружать только ссылку» (ВыгрузитьТолькоСсылку = Истина), что предотвратит глубокую конвертацию объекта и обращение к его несуществующим реквизитам.