Как принудительно заменить объект, найденный по УИН, при загрузке в 1С:Конвертации данных?

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

При настройке обмена данными в Конвертации данных 2.0 часто возникает задача, когда стандартный механизм поиска объектов по УИД (уникальному идентификатору) перестает соответствовать бизнес-логике. Например, в системе приемнике один и тот же контрагент должен быть определен по-разному в зависимости от дополнительных условий, переданных из источника. Рассмотрим подробно, почему возникает эта проблема и как ее эффективно решить.

Почему не срабатывает подмена в обработчике «ПослеЗагрузки»?

Разберем природу проблемы. Когда система КД 2.0 начинает процесс загрузки объекта, она в первую очередь проверяет регистр СоответствиеОбъектовДляОбмена. Если объект уже был найден по УИД, система считает процесс поиска завершенным. Обработчик ПослеЗагрузки в ПКО самого справочника выполняется уже после того, как ссылка на объект была получена и записана в контекст текущего элемента документа.

Если вы пытаетесь переопределить переменную Объект внутри ПослеЗагрузки справочника, вы меняете локальное состояние объекта в памяти, но не меняете ту ссылку, которая уже была присвоена документу на предыдущем этапе. Это типичная ошибка, которая приводит к тому, что документ «загружается» с исходным, неверным контрагентом.

Способ 1: Использование отдельного ПКО для специфического поиска

Если вы хотите изменить логику поиска для конкретной ситуации, самым правильным методом будет создание отдельного ПКО для контрагентов. В нем вы можете отключить поиск по УИД и настроить поиск по другим полям, например, по Коду или Наименованию.

Для реализации этого подхода выполните следующие действия:

  1. Создайте новое ПКО (например, КонтрагентыПоКоду).
  2. В настройках этого ПКО укажите поля поиска (например, реквизит Код).
  3. В обработчике ПередВыгрузкой или ПослеЗагрузки документа, где используется контрагент, принудительно переключите имя используемого ПКО:
    
    Если ЗначениеЗаполнено(Источник.КодПриемника) Тогда
        ИмяПКО = "КонтрагентыПоКоду";
    КонецЕсли;
    

Способ 2: Переопределение ссылки в родительском объекте (рекомендуемый)

Если нет возможности или желания плодить множество ПКО, наиболее эффективным и «чистым» способом является подмена ссылки в обработчике ПослеЗагрузки самого документа. Здесь у вас есть прямой доступ к объекту документа, и вы можете принудительно перезаписать реквизит Контрагент.

Разберем по шагам, как это сделать:

  1. Откройте ПКО вашего документа (например, РеализацияТоваровУслуг).
  2. Перейдите в обработчик ПослеЗагрузки.
  3. Напишите код, который будет искать нужного контрагента и присваивать его реквизиту документа:
    
    // Проверяем, есть ли у нас переопределяющий признак (например, КодПриемника)
    Если ЗначениеЗаполнено(Источник.КодПриемника) Тогда
        // Выполняем поиск нужного объекта по коду
        НайденнаяСсылка = Справочники.Контрагенты.НайтиПоКоду(Источник.КодПриемника);
            
        // Проверяем, удалось ли найти контрагента
        Если ЗначениеЗаполнено(НайденнаяСсылка) Тогда
            Объект.Контрагент = НайденнаяСсылка;
        КонецЕсли;
    КонецЕсли;
    

Этот метод работает безотказно, так как на момент выполнения ПослеЗагрузки документа объект Объект уже полностью сформирован, и прямое обращение к его свойствам гарантированно перепишет любые предыдущие значения, установленные механизмом конвертации.

Что делать с регистром «Соответствие объектов для обмена»?

Часто возникает искушение очистить регистр соответствий, чтобы «обнулить» поиск. Однако помните: если правила конвертации настроены на поиск по УИД, при следующей загрузке регистр снова заполнится теми же парами соответствий. Очистка регистра — это временная мера. Использование подмены в ПослеЗагрузки документа или кастомного ПКО — это системное решение, которое позволит вам управлять обменом гибко и надежно, независимо от того, что записано в регистре соответствий.

Итоги и рекомендации

Мы выяснили, что попытка подмены объекта «изнутри» самого справочника часто не приносит результата из-за архитектуры КД 2.0. Для решения задачи всегда стремитесь работать на уровне выше (в обработчиках документов) или использовать отдельные правила конвертации с настроенным поиском по полям. Это обеспечит предсказуемость обмена и упростит последующую поддержку правил.

← На главную