При конвертации данных в 1С, особенно когда мы работаем с комплексными правилами обмена и механизмами синхронизации, мы можем столкнуться с трудностями. Одной из наиболее распространенных и вызывающих замешательство является ошибка "<Объект не найден>". Давайте вместе разберем эту проблему на примере, когда при конвертации двух справочников в один, а также при условной подмене Правила Конвертации Объектов (ПКО) для реквизита документа, система выдает такую ошибку, хотя, казалось бы, все настроено корректно.
Мы выясним, почему эта ошибка возникает, в чем разница между "простыми правилами" и "рабочими правилами" обмена, а также предложим эффективные решения для ее устранения.
Ошибка "<Объект не найден>" в 1С, которую также называют "битой ссылкой", появляется, когда система ожидает найти ссылку на какой-либо объект (например, элемент справочника или документ), но не может его обнаружить. Это критическая проблема, которая может привести к некорректной работе баз данных.
SHIFT + DELETE, система не отслеживает, на что он ссылался, и все существующие ссылки на него становятся "битыми".
ИмяПКО = "ДругойСправочникВСправочник"), могут быть причиной некорректной обработки объектов, если условия не срабатывают так, как мы ожидаем, или если в результате подмены система теряет контекст для поиска или создания нужного объекта.
Прежде чем перейти к решению, нам важно понять, почему проблема "<Объект не найден>" может проявляться по-разному в зависимости от используемого механизма обмена.
Этот механизм чаще всего используется для разовой или регулярной синхронизации данных между произвольными конфигурациями (или разными версиями одной и той же конфигурации). Мы используем внешнюю обработку "Универсальный обмен данными в формате XML", загружаем в нее набор правил и запускаем выгрузку/загрузку. Как правило, в "простых правилах" мы можем явно указать, какие объекты выгружать, без привязки к регистрации изменений в планах обмена. Это дает нам большую гибкость, но также требует более тщательной ручной настройки выгрузки всех связанных объектов. Для постоянной синхронизации по расписанию с использованием готовых правил Конвертации данных 2 можно автоматизировать регулярный обмен данными между базами 1С.
Этот механизм предназначен для создания территориально распределенных систем, обычно на основе идентичных конфигураций. Он основан на использовании общих объектов конфигурации – Планов обмена. Ключевое отличие заключается в том, что система сама отслеживает изменения данных в узлах плана обмена. Если включена авторегистрация, 1С автоматически регистрирует изменения объектов, входящих в состав плана обмена, и формирует пакет данных для обмена. Если авторегистрация запрещена, мы должны программно регистрировать изменения, используя методы Зарегистрировать() или ЗарегистрироватьИзменения().
В нашем случае, когда "простые правила" работали, а "рабочие" (синхронизация) нет, это прямо указывает на то, что проблема кроется именно в особенностях механизма планов обмена – а именно, в правилах регистрации изменений или в том, как система определяет, какие связанные объекты должны быть включены в пакет обмена.
В нашем сценарии автор использует условную подмену Правила Конвертации Объектов (ПКО) в обработчике "Перед выгрузкой" Правила Конвертации Свойства (ПКС):
Если Условие Тогда
ИмяПКО = "ДругойСправочникВСправочник";
КонецЕсли;
Этот механизм позволяет нам динамически выбирать, как будет конвертироваться реквизит в зависимости от определенных условий. Например, если реквизит документа может ссылаться на разные типы справочников или если его значение должно быть конвертировано в другой тип объекта только при выполнении определенного условия.
Важные моменты при использовании условной подмены ПКО:
Условие доступны в момент выполнения обработчика "Перед выгрузкой" в ПКС.
"ДругойСправочникВСправочник" действительно существует и корректно настроено для конвертации.
"ДругойСправочникВСправочник" должно содержать правильную логику поиска элемента справочника в базе-приемнике (по ИД, по полям поиска) и, при необходимости, логику создания нового элемента. Если поиск не находит объект, а создание запрещено или не предусмотрено, мы можем получить "<Объект не найден>".
ИмяПКО мы ссылаемся на новый тип объекта (например, на другой справочник), необходимо убедиться, что этот справочник или его элементы также корректно регистрируются для обмена, если они еще не существуют в базе-приемнике. Именно здесь кроется основная проблема при работе с планами обмена.
Автор в сообщении 8 выразил распространенное заблуждение, что "к выгрузке регистрируются документы, все остальные объекты подтягиваются следом". К сожалению, это не всегда так, как нам бы хотелось. В сообщении 9 нам прямо указывают: "не подтягиваются".
На самом деле, автоматическое "подтягивание" объектов происходит только при определенных условиях, как поясняет сообщение 10: "Это если в свойстве ПКО у документа указано". Даже при этом, механизм планов обмена требует четкой настройки. Если объект (например, элемент справочника, на который ссылается реквизит документа) не зарегистрирован в плане обмена, он не будет автоматически включен в пакет обмена, даже если на него ссылается выгружаемый документ.
Если мы не настроим правила регистрации или выгрузки для связанных объектов, система не узнает, что их тоже нужно передать. Это приводит к тому, что в базе-приемнике документ загружается, но его реквизит, ссылающийся на незагруженный справочник, становится "<Объект не найден>". Для проверки структуры и содержимого выгруженного файла до его загрузки в приемник можно использовать обработку для анализа состава выгруженных данных.
Ключевое решение нашей проблемы лежит в правильной настройке правил регистрации подчиненных объектов в плане обмена. Сообщение 13 указывает нам верный путь.
Мы должны перейти в состав плана обмена (обычно это делается в конфигураторе, в объекте "Планы обмена", вкладка "Состав") и для всех подчиненных объектов, которые могут быть реквизитами выгружаемых документов (например, для справочников), установить "Переключатель режима" в значение РежимВыгрузкиПриНеобходимости. Этот режим означает, что объект будет зарегистрирован к выгрузке, если на него есть ссылка из какого-либо другого объекта, который уже зарегистрирован к выгрузке (например, из документа).
Как это работает:
РежимВыгрузкиПриНеобходимости, и этого объекта еще нет в базе-приемнике или он изменился, то система автоматически регистрирует и этот связанный объект к выгрузке.Без этой настройки подчиненные объекты могут быть просто проигнорированы механизмом регистрации, что приводит к появлению "<Объект не найден>" в базе-приемнике.
Сообщение 14 дополняет решение: "Еще желательно ПВД создать для всех подчиненных справочников." Правила Выгрузки Данных (ПВД) — это отправная точка процесса выгрузки. Они определяют, какие объекты и в каком порядке мы выгружаем. Создание отдельных ПВД для каждого подчиненного справочника обеспечивает следующие преимущества:
Даже если основной объект (документ) регистрирует изменения, наличие ПВД для его подчиненных справочников гарантирует, что правила конвертации для этих справочников будут корректно применены, и они будут участвовать в обмене согласно нашим настройкам.
Для корректной работы обмена крайне важно правильно настроить логику поиска объектов в Правилах Конвертации Объектов (ПКО). Мы должны обратить внимание на следующие флаги:
Если этот флаг установлен, система в первую очередь пытается найти соответствующий объект в базе-приемнике по его уникальному внутреннему идентификатору (GUID). Это наиболее надежный способ поиска, особенно при обмене между идентичными конфигурациями.
Этот флаг критически важен. Если объект не был найден по GUID, система, в случае установленного флага, продолжит поиск по другим полям, которые мы указали в ПКО как "поля поиска" (например, по коду, наименованию, ИНН и т.д.).
Наши действия:
Если эти настройки некорректны, при отсутствии объекта по ID система не сможет его найти по другим признакам, что приведет к созданию дублирующего объекта или появлению "<Объект не найден>".
Сообщение 15 напоминает нам о флаге "Не выгружать объект по ссылке" в Правилах Конвертации Свойства (ПКС). Этот флаг влияет на то, как будут обрабатываться ссылки на связанные объекты:
В нашем случае, когда возникала ошибка "<Объект не найден>", скорее всего, этот флаг не был установлен или его установка была неверной, что приводило к попытке выгрузить несуществующий или незарегистрированный объект.
В сообщении 11 автор упоминает, что добавил "принудительную выгрузку реквизитов перед выгрузкой документа". Однако в сообщении 12 это решение справедливо названо "хреновым", потому что оно ведет к неэффективному обмену: "при каждой выгрузке тащить все связанные объекты, а не ссылки на них".
Минусы принудительной выгрузки:
Мы всегда должны стремиться к тому, чтобы передавались только необходимые изменения и ссылки, а полные данные объектов – только по мере необходимости, как это достигается с помощью РежимВыгрузкиПриНеобходимости и корректно настроенных ПВД.
Работая с обменом данными в 1С, мы всегда должны помнить о нескольких общих рекомендациях, которые помогут избежать множества проблем:
ИсходящиеДанные, ВходящиеДанные и ПараметрыОбъекта для передачи дополнительной информации между обработчиками ПВД, ПКО и ПКС.
Таким образом, проблема "<Объект не найден>" при конвертации данных через планы обмена чаще всего связана не с ошибками в самих данных, а с некорректной настройкой механизмов регистрации и выгрузки связанных объектов. Следуя рекомендациям по настройке РежимВыгрузкиПриНеобходимости и созданию ПВД, мы можем обеспечить стабильный и эффективный обмен данными в 1С.