Как при обмене данными из одного справочника 1С создать записи в двух разных справочниках?

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

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

Решение 1: Использование обработчиков событий и метода ВыгрузитьПоПравилу

Это основной и самый гибкий способ решения нашей задачи. Суть подхода заключается в том, что мы создаем одно главное правило для выгрузки, а в процессе его выполнения принудительно инициируем выгрузку данных по второму, связанному правилу. Разберем по шагам, как это реализовать.

  1. Создание правил конвертации.

    Нам понадобится одно Правило Выгрузки Данных (ПВД) для нашего исходного справочника (например, Справочник_Контрагенты) и два Правила Конвертации Объектов (ПКО):

    • ПКО №1: Контрагенты_в_Партнеры. Это правило будет отвечать за создание элемента в справочнике "Партнеры" в базе-приемнике.
    • ПКО №2: Контрагенты_в_Контрагенты. Это правило создаст элемент в справочнике "Контрагенты" приемника.

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

  2. Написание кода в обработчике событий.

    Теперь самое интересное. Нам нужно в одном из обработчиков событий "главного" ПКО (Контрагенты_в_Контрагенты) вызвать выгрузку по второму ПКО (Контрагенты_в_Партнеры). Для этого используется специальная процедура ВыгрузитьПоПравилу. Рассмотрим, где это можно сделать.

Вариант А: Использование обработчика ПередВыгрузкой

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

В ПКО Контрагенты_в_Контрагенты, в обработчике события ПередВыгрузкой, напишем следующий код:


// Источник - это текущий выгружаемый элемент справочника "Контрагенты"
// "Партнеры" - это имя второго ПКО, по которому нужно выполнить выгрузку
ВыгрузитьПоПравилу(Источник, , , , "Партнеры");

Важный момент: Иногда, при такой выгрузке, для второго объекта выгружаются только поля поиска, а остальные реквизиты остаются пустыми. Чтобы этого избежать, в ПКО "Партнеры" в обработчике ПередВыгрузкой нужно добавить строку:


ТолькоПолучитьУзелСсылки = Ложь;

Эта настройка говорит системе, что нам нужен полностью сформированный объект, а не просто ссылка на него.

Вариант Б: Использование обработчика ПослеВыгрузки

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

В ПКО Контрагенты_в_Контрагенты, в обработчике события ПослеВыгрузки, пишем аналогичный код:


// В этом обработчике мы также имеем доступ к исходному объекту
ВыгрузитьПоПравилу(Источник, , , , "Контрагенты_Партнеры"); // Имя ПКО для Партнеров

Решение 2: Установка связи между объектами после загрузки

Итак, мы успешно выгрузили и загрузили два объекта из одного. Но теперь в базе-приемнике у нас есть "Контрагент" и "Партнер", которые никак не связаны друг с другом. Эту связь необходимо установить на стороне приемника. Рассмотрим, как это сделать.

В "Конвертации данных" для этого предназначен обработчик события ПослеЗагрузки. Он выполняется уже после того, как объект записан в базу-приемник.

  1. Перенос общего идентификатора.

    Убедимся, что при выгрузке и в "Партнера", и в "Контрагента" переносится какое-то общее, уникальное поле. Чаще всего для этого используют Наименование, Код или ИНН.

  2. Написание кода в ПослеЗагрузки.

    В ПКО для "Контрагента" (Контрагенты_в_Контрагенты) перейдем в обработчик ПослеЗагрузки и напишем код, который найдет созданного "Партнера" и пропишет ссылку на него в реквизит "Контрагента".

Посмотрим на пример. Предположим, у объекта-приемника "Контрагент" есть реквизит ГоловнойПартнер, и мы ищем партнера по наименованию.


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

// Если партнер успешно найден, прописываем ссылку
Если НЕ НайденныйПартнер.Пустая() Тогда
    Объект.ГоловнойПартнер = НайденныйПартнер;
    
    // Так как мы изменили объект уже после записи, его нужно перезаписать
    Объект.Записать();
КонецЕсли;

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

Таким образом, комбинируя вызов ВыгрузитьПоПравилу на этапе выгрузки и код в обработчике ПослеЗагрузки, мы можем полноценно решить задачу конвертации одного исходного объекта в два связанных объекта в базе-приемнике.

← К списку