Как не затереть реквизит при повторном переносе данных в 1С:Конвертация данных 2.1?

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

При настройке регулярного или повторного обмена данными между конфигурациями 1С часто возникает классическая дилемма. Представим ситуацию: мы перенесли справочник Контрагенты из базы-источника (например, УНФ) в базу-приемник (УТ). В базе-приемнике мы провели дополнительную работу — например, создали связанные объекты Партнеры и заполнили соответствующий реквизит у контрагентов. Теперь нам необходимо повторно запустить перенос из источника, чтобы обновить контактную информацию или ИНН контрагентов. Как сделать так, чтобы уже заполненный реквизит Партнер в базе-приемнике гарантированно не затерся пустой ссылкой?

В рамках этой статьи мы подробно разберем, как работает механизм обновления объектов в «1С:Конвертация данных 2.1» (КД 2.1), и рассмотрим три практических способа решения этой задачи: от самого простого (на уровне структуры правил) до более сложных программных методов.

Выясним причины и особенности поведения КД 2.1 при различных настройках правил обмена.

Способ 1. Полное исключение реквизита из правил конвертации свойств (ПКС)

Самый простой и очевидный вариант, который часто применяется разработчиками по умолчанию. Проанализируем, как ведет себя обработка загрузки УниверсальныйОбменДаннымиXML, если в Правилах конвертации объектов (ПКО) для нашего справочника вообще отсутствует строка настройки ПКС для реквизита Партнер.

В этом случае поведение системы будет следующим:

  1. Для уже существующих в базе-приемнике объектов: При чтении файла обмена загрузчик КД 2.1 обновляет только те свойства объекта, которые явно переданы в XML-файле. Поскольку реквизит Партнер не сопоставлен и не выгружался, тег с этим свойством в файле будет отсутствовать. Обработка загрузки просто обойдет этот реквизит стороной. Заполненное ранее значение в вашей базе УТ останется нетронутым.
  2. Для новых объектов: Здесь кроется важный нюанс. Если в базу загружается новый контрагент, которого ранее не было в приемнике, то при создании нового элемента справочника реквизит Партнер останется незаполненным (примет значение СправочникСсылка.Партнеры.ПустаяСсылка). Если в конфигурации-приемнике не настроено автоматическое заполнение этого реквизита при записи, вам придется заполнять его вручную или внешней обработкой.

Таким образом, если перед нами стоит задача просто обновить данные уже сопоставленных контрагентов, достаточно убрать ПКС для реквизита из правил. Но если предполагается появление новых элементов, этот способ может потребовать от нас ручной работы в дальнейшем.

Способ 2. Использование флага «Не замещать значение...» в настройках ПКС

В «1С:Конвертация данных 2.1» предусмотрен очень гибкий штатный механизм, позволяющий управлять процессом обновления конкретных реквизитов. Нам не нужно удалять правило конвертации свойства (ПКС) из обмена — достаточно правильно его настроить.

Разберем по шагам, как задействовать эту настройку:

  1. Откроем правила обмена в конфигурации КД 2.1.
  2. Найдем ПКО для нашего справочника (например, Контрагенты) и перейдем на вкладку «Конвертация свойств».
  3. Найдем строку ПКС для реквизита Партнер и откроем форму его настройки.
  4. На вкладке «Основные параметры» установим флаг «Не замещать значение данного свойства у существующих объектов ИБ» (в некоторых версиях формулировка может звучать как «Не замещать предопределенные или уже заполненные данные»).

Посмотрим, как изменится логика работы загрузчика:

Способ 3. Тонкая настройка через обработчики событий (программный метод)

Иногда стандартного поведения флага «Не замещать» бывает недостаточно. Например, мы хотим реализовать более сложную логику: «Заменять значение партнера в приемнике только в том случае, если оно там не заполнено (пустая ссылка), но если пользователь уже вручную выбрал партнера — не трогать его». Или же нам нужно подставлять определенного партнера-заглушку по умолчанию.

В таких случаях на помощь приходят обработчики событий КД 2.1. Рассмотрим два варианта программного решения.

Вариант А. Написание кода в обработчике «При загрузке» для ПКС свойства «Партнер»

В этом обработчике нам доступна переменная Ссылка, которая указывает на уже существующий объект в базе-приемнике (если он был найден по полям поиска или GUID), а также параметр Отказ. Если мы установим Отказ = Истина, то загрузка конкретно этого свойства для данного объекта будет отменена.

Проанализируем пример кода:


// Проверяем, существует ли уже объект в базе-приемнике
Если ЗначениеЗаполнено(Ссылка) Тогда
    // Если объект найден и у него в базе уже заполнен партнер - отменяем загрузку этого реквизита
    Если ЗначениеЗаполнено(Ссылка.Партнер) Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

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

Вариант Б. Восстановление значения в обработчике «После загрузки» для ПКО «Контрагенты»

Еще один надежный способ — принудительно вернуть старое значение реквизита непосредственно перед записью объекта. В обработчике «После загрузки» нам доступны переменные Объект (модифицируемый объект, подготовленный к записи) и Ссылка (оригинальный объект из базы данных до перезаписи).

Посмотрим на пример реализации:


// Если объект существовал в базе до начала загрузки
Если ЗначениеЗаполнено(Ссылка) Тогда
    // Если у существующего объекта партнер уже был заполнен, принудительно возвращаем его значение
    Если ЗначениеЗаполнено(Ссылка.Partner) Тогда
        Объект.Партнер = Ссылка.Партнер;
    КонецЕсли;
КонецЕсли;

Этот метод гарантирует, что никакие изменения в XML-файле не смогут перезаписать критически важный реквизит в базе-приемнике.

Особое внимание: бизнес-логика «Управления торговлей»

Завершая настройку правил, обязательно проанализируем специфику конфигурации-приемника. В «Управлении торговлей» (УТ 11) справочники Контрагенты и Партнеры тесно связаны между собой. Попытка записать контрагента с пустым партнером может привести к ошибкам транзакции или непредсказуемому поведению системы.

Перед переносом обязательно обратим внимание на следующие настройки в УТ:

Мы подробно разобрали все возможные варианты защиты реквизитов от затирания. Выбирайте наиболее подходящий для вашей задачи метод — от простой корректировки состава ПКС до гибкого написания условий в обработчиках событий КД 2.1.

← На главную