При настройке регулярного или повторного обмена данными между конфигурациями 1С часто возникает классическая дилемма. Представим ситуацию: мы перенесли справочник Контрагенты из базы-источника (например, УНФ) в базу-приемник (УТ). В базе-приемнике мы провели дополнительную работу — например, создали связанные объекты Партнеры и заполнили соответствующий реквизит у контрагентов. Теперь нам необходимо повторно запустить перенос из источника, чтобы обновить контактную информацию или ИНН контрагентов. Как сделать так, чтобы уже заполненный реквизит Партнер в базе-приемнике гарантированно не затерся пустой ссылкой?
В рамках этой статьи мы подробно разберем, как работает механизм обновления объектов в «1С:Конвертация данных 2.1» (КД 2.1), и рассмотрим три практических способа решения этой задачи: от самого простого (на уровне структуры правил) до более сложных программных методов.
Выясним причины и особенности поведения КД 2.1 при различных настройках правил обмена.
Самый простой и очевидный вариант, который часто применяется разработчиками по умолчанию. Проанализируем, как ведет себя обработка загрузки УниверсальныйОбменДаннымиXML, если в Правилах конвертации объектов (ПКО) для нашего справочника вообще отсутствует строка настройки ПКС для реквизита Партнер.
В этом случае поведение системы будет следующим:
Партнер не сопоставлен и не выгружался, тег с этим свойством в файле будет отсутствовать. Обработка загрузки просто обойдет этот реквизит стороной. Заполненное ранее значение в вашей базе УТ останется нетронутым.Партнер останется незаполненным (примет значение СправочникСсылка.Партнеры.ПустаяСсылка). Если в конфигурации-приемнике не настроено автоматическое заполнение этого реквизита при записи, вам придется заполнять его вручную или внешней обработкой.Таким образом, если перед нами стоит задача просто обновить данные уже сопоставленных контрагентов, достаточно убрать ПКС для реквизита из правил. Но если предполагается появление новых элементов, этот способ может потребовать от нас ручной работы в дальнейшем.
В «1С:Конвертация данных 2.1» предусмотрен очень гибкий штатный механизм, позволяющий управлять процессом обновления конкретных реквизитов. Нам не нужно удалять правило конвертации свойства (ПКС) из обмена — достаточно правильно его настроить.
Разберем по шагам, как задействовать эту настройку:
Контрагенты) и перейдем на вкладку «Конвертация свойств».Партнер и откроем форму его настройки.Посмотрим, как изменится логика работы загрузчика:
Партнер останется без изменений. При этом неважно, было оно заполнено в приемнике или оставалось пустым — значение перезаписываться не будет.Иногда стандартного поведения флага «Не замещать» бывает недостаточно. Например, мы хотим реализовать более сложную логику: «Заменять значение партнера в приемнике только в том случае, если оно там не заполнено (пустая ссылка), но если пользователь уже вручную выбрал партнера — не трогать его». Или же нам нужно подставлять определенного партнера-заглушку по умолчанию.
В таких случаях на помощь приходят обработчики событий КД 2.1. Рассмотрим два варианта программного решения.
Вариант А. Написание кода в обработчике «При загрузке» для ПКС свойства «Партнер»
В этом обработчике нам доступна переменная Ссылка, которая указывает на уже существующий объект в базе-приемнике (если он был найден по полям поиска или GUID), а также параметр Отказ. Если мы установим Отказ = Истина, то загрузка конкретно этого свойства для данного объекта будет отменена.
Проанализируем пример кода:
// Проверяем, существует ли уже объект в базе-приемнике
Если ЗначениеЗаполнено(Ссылка) Тогда
// Если объект найден и у него в базе уже заполнен партнер - отменяем загрузку этого реквизита
Если ЗначениеЗаполнено(Ссылка.Партнер) Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Этот код изящно решает задачу: новые объекты получат своего партнера из файла переноса, у существующих объектов с пустым партнером значение обновится, а заполненные партнеры останутся защищенными от изменений.
Вариант Б. Восстановление значения в обработчике «После загрузки» для ПКО «Контрагенты»
Еще один надежный способ — принудительно вернуть старое значение реквизита непосредственно перед записью объекта. В обработчике «После загрузки» нам доступны переменные Объект (модифицируемый объект, подготовленный к записи) и Ссылка (оригинальный объект из базы данных до перезаписи).
Посмотрим на пример реализации:
// Если объект существовал в базе до начала загрузки
Если ЗначениеЗаполнено(Ссылка) Тогда
// Если у существующего объекта партнер уже был заполнен, принудительно возвращаем его значение
Если ЗначениеЗаполнено(Ссылка.Partner) Тогда
Объект.Партнер = Ссылка.Партнер;
КонецЕсли;
КонецЕсли;
Этот метод гарантирует, что никакие изменения в XML-файле не смогут перезаписать критически важный реквизит в базе-приемнике.
Завершая настройку правил, обязательно проанализируем специфику конфигурации-приемника. В «Управлении торговлей» (УТ 11) справочники Контрагенты и Партнеры тесно связаны между собой. Попытка записать контрагента с пустым партнером может привести к ошибкам транзакции или непредсказуемому поведению системы.
Перед переносом обязательно обратим внимание на следующие настройки в УТ:
Мы подробно разобрали все возможные варианты защиты реквизитов от затирания. Выбирайте наиболее подходящий для вашей задачи метод — от простой корректировки состава ПКС до гибкого написания условий в обработчиках событий КД 2.1.