Как в 1С:Конвертация данных 2.0 передать или восстановить исходные значения реквизитов (дату и номер) при изменении объекта

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

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

В данной статье мы подробно рассмотрим несколько способов решения этой задачи: от простого восстановления данных в приемнике до использования мощных механизмов передачи произвольных данных через ВходящиеДанные и ИсходящиеДанные, а также разберем работу с историей версий.

Вариант 1. Восстановление данных в обработчике «При загрузке»

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

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

Проанализируем пример кода для этого обработчика:


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

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

Вариант 2. Использование структур «ИсходящиеДанные» и «ВходящиеДанные»

Более гибким и профессиональным подходом является передача дополнительных значений напрямую из источника, не полагаясь на наличие данных в приемнике. В КД 2.0 для этого предусмотрены специальные структуры.

Шаг 1: Подготовка данных в источнике

В ПКО в обработчике «Перед выгрузкой» мы можем создать структуру ИсходящиеДанные. Это позволит нам передать любые параметры, даже если они не являются реквизитами самого объекта или если нам нужно взять значения из версии объекта до его изменения.


// Пример получения старых значений (например, из какой-то логики или версии)
СтараяДата = Источник.Дата; // Предположим, тут нужная нам дата
СтарыйНомер = Источник.Номер;

ИсходящиеДанные = Новый Структура();
ИсходящиеДанные.Вставить("СтараяДата", СтараяДата);
ИсходящиеДанные.Вставить("СтарыйНомер", СтарыйНомер);

Шаг 2: Получение данных в приемнике

На стороне приемника эти значения автоматически попадут в структуру ВходящиеДанные. Мы можем использовать их в любом обработчике ПКО или даже в ПКС, если укажем, что данные должны браться из входящих данных.

Рассмотрим использование в обработчике «После загрузки» в приемнике:


Если ВходящиеДанные <> Неопределено Тогда
    Объект.Дата = ВходящиеДанные.СтараяДата;
    Объект.Номер = ВходящиеДанные.СтарыйНомер;
КонецЕсли;

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

Вариант 3. Получение данных из истории версий (БСП)

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

Проанализируем шаги для реализации этой логики в обработчике «Перед выгрузкой»:

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

Такой подход избавляет от необходимости вводить дополнительные «технические» реквизиты в документы только ради целей обмена.

Важные нюансы работы с флагом «ОбменДанными.Загрузка»

Выясним, почему при обмене часто возникают проблемы с изменением номеров и дат, и как на это влияет стандартный механизм платформы. При загрузке объектов через КД 2.0 программно устанавливается свойство Объект.ОбменДанными.Загрузка = Истина.

Что это дает:

Однако, если в конфигурации-приемнике написаны кастомные обработчики, которые не проверяют флаг Загрузка, они могут принудительно вызывать УстановитьНовыйНомер(), что приведет к игнорированию данных из источника. Всегда проверяйте код модулей объектов в приемнике на наличие конструкции:


Если ОбменДанными.Загрузка Тогда
    Возврат;
КонецЕсли;

Рекомендации по настройке ПКС для Номера и Даты

Чтобы обеспечить корректную передачу номера и даты «как есть», обратите внимание на настройки Правил Конвертации Свойств (ПКС) для этих реквизитов:

  1. Флаг «Заполнять из источника»: должен быть установлен.
  2. Флаг «Отключить»: убедитесь, что свойство не отключено случайно.
  3. Порядок выполнения: Номер и дата должны передаваться в числе первых реквизитов, чтобы при поиске объекта (если поиск настроен по номеру и дате) платформа могла сопоставить данные корректно.

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

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

← На главную