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