Приветствуем вас! Наверняка каждый специалист по 1С хотя бы раз сталкивался с ситуацией, когда при обмене данными между базами конфигурация выдает непредвиденные ошибки, прерывающие весь процесс интеграции. Сегодня мы подробно разберем одну из таких классических, но крайне неприятных проблем: ошибку получения значения свойства объекта при переносе документов через универсальный обмен.
Представим сценарий: вы пытаетесь выгрузить данные из одной базы в другую (абсолютно идентичную по конфигурации). При переносе справочников Контрагенты или Физические лица по отдельности всё проходит гладко и без ошибок. Однако стоит запустить выгрузку документов, как система выдает критический сбой в модуле обработки УниверсальныйОбменДаннымиXML.
Проанализируем ситуацию, выясним технические причины возникновения этой ошибки и разберем по шагам наиболее эффективные методы ее решения.
Для начала внимательно изучим лог ошибки, с которой сталкивается пользователь:
Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1619)}: Ошибка получения значения свойства объекта (по имени свойства источника)
ПКО = ФизическиеЛица (Справочник: Физические лица)
ПКС = 1 (ГруппаДоступаФизическогоЛица --> ГруппаДоступаФизическогоЛица)
Объект = Л В С (Контрагенты)
СвойствоПриемника = ГруппаДоступаФизическогоЛица (СправочникСсылка.ГруппыДоступаФизическихЛиц)
ОписаниеОшибки = Поле объекта не обнаружено (ГруппаДоступаФизическогоЛица)
ПозицияМодуля = Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8219)
КодСообщения = 13
Давайте расшифруем то, что сообщает нам платформа:
ФизическиеЛица.ГруппаДоступаФизическогоЛица.Контрагенты с наименованием «Л В С».Здесь и кроется ключевой конфликт логики КД 2.0 (Конвертации данных). Программа пытается обработать контрагента «Л В С» по правилам, предназначенным исключительно для физических лиц. Естественно, у справочника Контрагенты физически отсутствует реквизит ГруппаДоступаФизическогоЛица, из-за чего платформа 1С закономерно выбрасывает исключение: «Поле объекта не обнаружено».
При изолированной выгрузке справочников ПКО для контрагентов и ПКО для физлиц отрабатывают независимо, обрабатывая только предназначенные для них типы данных.
Однако при выгрузке документов запускается цепочка выгрузки связанных объектов по ссылкам. Ошибка возникает по одной из следующих причин:
Контрагент или Получатель) жестко прописано ПКО-получатель — ФизическиеЛица. При этом в самом документе в базе данных в этом поле выбрана ссылка на обычного контрагента («Л В С»).ФизическиеЛица, система пытается применить его ко всем выгружаемым по ссылке объектам без разбора.Перед выгрузкой свойства документа) разработчик мог написать код, который принудительно устанавливает параметр ИмяПКО = "ФизическиеЛица", забыв сделать проверку на тип выгружаемого значения.Если ваши информационные базы действительно абсолютно идентичны (совпадают версии конфигураций, релизы и структура метаданных), использовать универсальный обмен по правилам (через КД 2.0) нет никакой необходимости.
Рассмотрим, как выполнить перенос данных гораздо проще и надежнее:
ВыгрузкаЗагрузкаДанныхXML.epf).Если вам все же необходимо использовать именно универсальный обмен по правилам, нужно локализовать конкретный документ, в котором записан контрагент «Л В С» в нетипичном для него поле. Проанализируем, как это сделать:
ПодотчетноеЛицо, Экспедитор, Ответственный, ФизическоеЛицо).Если вы самостоятельно поддерживаете или редактируете правила обмена, оптимальным решением будет исправление логики сопоставления типов в самом файле правил.
Посмотрим на пример кода, который решает эту проблему. Откройте правила в конфигурации «Конвертация данных 2.1», найдите ПКО документа, на котором происходит сбой, и перейдите к ПКС (правилу конвертации свойства) нужного реквизита.
В обработчике события «Перед выгрузкой» этого ПКС пропишите явное программное определение нужного правила в зависимости от типа значения источника:
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Контрагенты") Тогда
ИмяПКО = "Контрагенты";
ИначеЕсли ТипЗнч(Значение) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
ИмяПКО = "ФизическиеЛица";
КонецЕсли;
Такой гибкий код заставит обработку динамически определять, по какому именно правилу нужно выгружать объект. Если значение является ссылкой на контрагента, применится ПКО Контрагенты. Если это физлицо — применится ПКО ФизическиеЛица. Ошибка будет полностью устранена.
Часто разработчики при настройке правил в графическом интерфейсе КД вручную связывают ПКС с конкретным ПКО. Если реквизит источника имеет тип Контрагенты, а в поле «Правило конвертации» для этого свойства ошибочно выбрано ПКО ФизическиеЛица, система всегда будет выдавать ошибку.
Разберем, как исправить это визуально в «Конвертации данных»:
Применяя данные методы, мы можем быстро локализовать источник проблемы, очистить данные или скорректировать правила обмена, обеспечив стабильный и корректный перенос информации между базами 1С.