Как программно заполнить реквизиты, отсутствующие в XML-файле, при загрузке данных в 1С

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

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

Метод 1. Использование обработчика «После загрузки» в ПКО

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

Рассмотрим алгоритм действий:

  1. Откроем правила обмена в конфигурации «Конвертация данных».
  2. Перейдем к нужному ПКО (например, для документа РеализацияТоваровУслуг).
  3. Откроем закладку «Обработчики событий» и найдем пункт «После загрузки».
  4. Пропишем код заполнения. В этом контексте нам доступна переменная Объект, которая представляет собой готовую ссылку на объект в памяти (он еще не записан в базу).

Пример кода для заполнения реквизита:


// Пример: Установка склада и ответственного, если они не пришли из источника
Объект.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;

// Если нужно, чтобы объект точно записался с новыми данными
ОбъектМодифицирован = Истина;

Метод 2. Использование ПКС без источника

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

Посмотрим, как это настроить:

  1. В списке ПКС для конкретного объекта нажмем «Добавить».
  2. В поле «Приемник» выберем нужный реквизит.
  3. Поле «Источник» оставим пустым.
  4. В обработчике «Перед выгрузкой» (на стороне источника) или «Перед загрузкой» (на стороне приемника) пропишем логику.

Если мы пишем код в обработчике «Перед загрузкой» для ПКС, мы можем использовать переменную Значение:


// Устанавливаем значение напрямую в обработчике свойства
Значение = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");

Преимущество этого метода в том, что система сама присвоит это Значение реквизиту объекта в процессе загрузки, и нам не нужно обращаться к Объект.ИмяРеквизита напрямую.

Метод 3. Использование параметров обмена

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

  1. В «Конвертации данных» перейдем на закладку «Параметры» и создадим новый параметр (например, ПодразделениеЗагрузки).
  2. При использовании обработки «Универсальный обмен данными XML» на стороне приемника, пользователь на вкладке «Параметры» сможет указать конкретное значение.
  3. В обработчике «После загрузки» объекта ПКО мы обратимся к этому параметру:

Если ЗначениеЗаполнено(Параметры.ПодразделениеЗагрузки) Тогда
    Объект.Подразделение = Параметры.ПодразделениеЗагрузки;
КонецЕсли;

Метод 4. Работа с «Алгоритмами» для предотвращения дублирования кода

Представим ситуацию, когда один и тот же реквизит (например, Проект) нужно заполнять одинаковым способом для десяти разных видов документов. Чтобы не копировать код в каждое ПКО, мы можем создать «Алгоритм» в правилах обмена.

  1. Создадим новый алгоритм с именем ЗаполнитьПроектПоУмолчанию.
  2. Напишем там код.
  3. В каждом ПКО в обработчике «После загрузки» вызовем этот алгоритм:

Выполнить(Алгоритмы.ЗаполнитьПроектПоУмолчанию);

Важные технические нюансы загрузки

Проанализируем несколько критически важных моментов, которые помогут избежать ошибок при загрузке:

1. Флаг модификации: При программном изменении реквизитов в обработчике «После загрузки», рекомендуется устанавливать ОбъектМодифицирован = Истина;. Это гарантирует, что объект будет записан в базу данных, даже если данные, пришедшие из XML, полностью совпадают с теми, что уже были в базе.

2. Переменная Отказ: В любом обработчике загрузки мы можем использовать переменную Отказ = Истина;. Если в процессе программного заполнения выяснится, что данные некорректны или объект не должен создаваться при определенных условиях, установка этого флага прервет загрузку текущего объекта.

3. Поиск объекта: Если заполняемый реквизит участвует в поиске (например, вы ищете контрагента по ИНН, которого нет в XML, но вы его вычислили программно), используйте обработчик «Поля поиска». Там можно переопределить стандартную логику поиска через переменную СвойстваПоиска.

Что делать, если нет доступа к конфигуратору источника?

Рассмотрим ситуацию, когда вы не можете изменить макет правил в самой конфигурации-источнике. Правила обмена — это обычный XML-файл. Вы можете:

  1. Выгрузить текущие правила в файл.
  2. Загрузить их в свою базу «Конвертация данных 2.0».
  3. Внести все необходимые правки в обработчики (как описано выше).
  4. Сохранить (выгрузить) новые правила в XML-файл.
  5. В обработке «Универсальный обмен данными XML» на стороне приемника выбрать этот файл правил вручную в поле «Имя файла правил».

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

← На главную