Как передать данные регистра в базу-приемник для заполнения реквизитов документа в Конвертации данных?

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

При настройке правил обмена между конфигурациями (например, при переносе документов из «Управление торговлей» в «Бухгалтерию предприятия») часто возникает задача: заполнить реквизиты или табличные части документа-приемника значениями, которых нет в самом документе-источнике, но они присутствуют в связанных регистрах накопления или сведений. Рассмотрим, как правильно организовать передачу таких данных в конфигурации «1С:Конвертация данных 2.1» (КД 2), разберем типичные ошибки и оптимальные способы решения.

Анализ проблемы и риски использования нестандартных методов

Нередко разработчики пытаются собрать данные запросом по регистрам, упаковать их в ХранилищеЗначения, сериализовать через ЗначениеВСтрокуВнутр() и передать через глобальный параметр конвертации. Разберем, почему такой подход несет в себе скрытые риски:

  1. Зависимость от метаданных: Метод ЗначениеВСтрокуВнутр() сохраняет внутренние идентификаторы типов и объектов конкретной информационной базы. Если в список значений попадет ссылка, при распаковке через ЗначениеИзСтрокиВнутр() в базе-приемнике мы получим «битую» ссылку или объект типа УникальныйИдентификатор.
  2. Несовместимость между версиями: Внутренний строковый формат платформы может измениться при обновлении релизов платформы 1С:Предприятие.
  3. Ненадежность сопоставления по номерам: Привязка строк регистра к документам только по номеру документа в глобальном списке может дать сбой, если номера дублируются в разных организациях или периодах.
  4. Нагрузка на память: Упаковка больших массивов данных в один глобальный параметр перегружает память при чтении XML-файла обмена.

Способ 1. Использование структуры «ПараметрыОбъекта» (Рекомендуемый)

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

Рассмотрим реализацию по шагам:

1. На стороне источника: В ПКО документа (например, «ПоступлениеТоваровУслуг») открываем обработчик событий «При выгрузке» (или «Перед выгрузкой»). Выполняем запрос к регистру по текущему документу и помещаем результат в структуру дополнительных свойств:


// Получаем статус партии из регистра по текущему документу Источника
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	Партии.СтатусПартии КАК СтатусПартии
    |ИЗ
    |	РегистрНакопления.ПартииТоваровНаСкладах КАК Партии
    |ГДЕ
    |	Партии.Регистратор = &Документ";

Запрос.УстановитьПараметр("Документ", Источник);
Результат = Запрос.Выполнить();

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

2. На стороне приемника: Механизм КД автоматически передаст структуру в XML внутри узла документа. В обработчике ПКО «После загрузки» мы извлекаем значение и выполняем заполнение реквизитов объекта:


Если ПараметрыОбъекта <> Неопределено Тогда
    СтатусПартии = Неопределено;
    Если ПараметрыОбъекта.Свойство("СтатусПартии", СтатусПартии) Тогда
        Если СтатусПартии = "Купленный" Тогда
            Объект.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
        ИначеЕсли СтатусПартии = "На комиссию" Тогда
            Объект.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСКомитентами;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Способ 2. Вычисление значения в ПКС через «ВходящиеДанные»

Если признак из регистра определяет конкретный реквизит документа-приемника, мы можем настроить Правило конвертации свойства (ПКС):

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

Способ 3. Передача глобальной таблицы через штатные параметры обмена

Если требуется выгрузить срез регистра целиком один раз в начале обмена, правильнее использовать штатный механизм параметров:

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

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

← На главную