Как выгрузить значение одной колонки табличной части документа в Конвертации данных 2, если реквизита нет в метаданных?

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

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

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

Развенчиваем главный миф: Почему обновление метаданных НЕ затирает ваши правила обмена

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

В архитектуре «Конвертации данных 2» описание метаданных конфигураций и сами правила обмена (ПКО, ПКС, ПГКС) хранятся в разных, хотя и связанных между собой справочниках:

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

Рассмотрим пошагово этот стандартный и наиболее правильный алгоритм решения проблемы:

  1. Откроем базу-источник в режиме «1С:Предприятие» и запустим внешнюю обработку выгрузки метаданных (MD82Exp.epf для обычных форм или актуальную версию для управляемых форм).
  2. Выгрузим структуру метаданных в файл XML (можно выбрать только нужные объекты, например, наш документ РеализацияТоваровУслуг и справочник ФизическиеЛица, чтобы ускорить процесс).
  3. В базе «Конвертация данных» перейдем в меню «Загрузка структуры конфигурации», выберем наш XML-файл и обновим описание структуры источника.
  4. Перейдем в настройки правил обмена. Теперь в ПКС (Правила конвертации свойств) для табличной части документа нам доступно реальное поле источника ФизЛицо.
  5. Для сопоставления с реквизитом приемника (у которого другое имя и тип) мы просто создаем новое ПКС, где в качестве источника выбираем наше новое свойство ФизЛицо, а в качестве приемника — соответствующее ему свойство в базе-приемнике. Если типы различаются, мы указываем для этого ПКС собственное ПКО (Правило конвертации объектов), которое преобразует один тип в другой.

Если же по политическим или техническим причинам обновить метаданные в КД действительно невозможно (например, у вас нет доступа к конфигуратору источника для выгрузки метаданных или база КД заблокирована), рассмотрим альтернативные варианты обхода этой проблемы.

Способ 1. Использование параметров табличной части (ПКГС)

Этот способ позволяет передать значение отсутствующей в метаданных колонки прямо внутри структуры табличной части, используя механизм параметров.

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

Выполним следующие настройки:

  1. Откроем ПКО нашего документа и перейдем на вкладку «Правила конвертации групп свойств» (ПКГС) для табличной части Товары.
  2. В табличной части параметров этого ПКГС добавим новый параметр вручную. Назовем его, например, ФизЛицоПараметр.
  3. В обработчике «Перед выгрузкой» для этого созданного параметра напишем следующий код:

// ОбъектКоллекции — это строка табличной части источника в момент выгрузки.
// Платформа видит реквизит ФизЛицо непосредственно из базы данных.
Значение = ОбъектКоллекции.ФизЛицо;
  1. Теперь эти данные будут выгружены во временный XML-контейнер параметров строки табличной части. При загрузке на стороне приемника нам нужно перенести эти данные в физическую колонку табличной части документа.
  2. Для этого перейдем в ПКО документа-приемника и найдем обработчик «После загрузки». Напишем код, который сопоставит строки оригинальной табличной части и переданные параметры:

// Получаем таблицу параметров для нашей табличной части.
// Имя "Товары" должно соответствовать имени ТЧ в КД.
ПараметрыТовары = ПараметрыОбъекта["ТоварыТабличнаяЧасть"]; 

Если ПараметрыТовары <> Неопределено Тогда
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        ИндексСтроки = Объект.Товары.Индекс(СтрокаТЧ);
        
        // Проверяем наличие параметров для текущей строки по индексу
        Если ИндексСтроки < ПараметрыТовары.Количество() Тогда
            СтрокаПараметров = ПараметрыТовары[ИндексСтроки];
            
            // Заполняем реквизит приемника, который называется по-другому
            // и при необходимости приводим типы
            СтрокаТЧ.НовоеИмяРеквизитаФизЛицо = СтрокаПараметров.ФизЛицоПараметр;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Способ 2. Передача произвольной Таблицы Значений через «Исходящие данные»

Если структура табличной части претерпела значительные изменения, бывает проще полностью сформировать таблицу значений (ТЗ) в коде выгрузки, добавить туда любые необходимые колонки и передать ее целиком.

Проанализируем алгоритм реализации этого подхода:

  1. В ПКО исходного документа в обработчике «Перед выгрузкой» программно выгрузим табличную часть Товары. Поскольку код выполняется в контексте базы-источника, мы без проблем получим доступ к реквизиту ФизЛицо:

// Выгружаем ТЧ в Таблицу Значений. Колонка ФизЛицо гарантированно будет в ТЗ.
ТаблицаТоваров = Источник.Товары.Выгрузить();

// Помещаем ТЗ в структуру ИсходящиеДанные
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("ТаблицаТоваровДляВыгрузки", ТаблицаТоваров);
  1. В ПКО документа для группы свойств (ПКГС) нашей табличной части установим флаг «Получать из входящих данных». В качестве источника данных укажем имя нашей ТЗ из структуры: ТаблицаТоваровДляВыгрузки.
  2. В подчиненных ПКС для этой табличной части мы теперь можем напрямую обращаться к колонкам нашей программно созданной ТЗ. В поле «Источник» мы пишем имя колонки из ТЗ (ФизЛицо), а в поле «Приемник» выбираем нужное имя реквизита в базе-приемнике.

Способ 3. Лайфхак для ленивых: Ручное добавление свойства в базу КД 2

Поскольку сама информационная база «Конвертация данных» спроектирована на платформе 1С, все описания метаданных внутри нее представляют собой обычные элементы справочников. Мы можем обхитрить систему и добавить недостающий реквизит вручную прямо в интерфейсе КД.

Выполним следующие простые действия:

  1. В базе «Конвертация данных» перейдем в справочник «Конвертируемые объекты метаданных».
  2. Найдем наш документ РеализацияТоваровУслуг, перейдем в его табличную часть Товары.
  3. В списке свойств этой табличной части добавим новый элемент вручную (если кнопка добавления заблокирована стандартной формой, можно воспользоваться внешней обработкой «Групповая обработка справочников и документов» или написать две строки кода в консоли для создания нового элемента справочника «Конвертируемые свойства объектов»).
  4. Зададим параметры нового свойства:
    • Имя: ФизЛицо
    • Тип значения: СправочникСсылка.ФизическиеЛица (или соответствующий тип вашей конфигурации-источника).
  5. После ручной записи этого элемента свойство сразу станет доступно в дереве настройки ПКС. Теперь мы сможем сопоставить его стандартным образом, без необходимости делать полную выгрузку/загрузку метаданных всей конфигурации.

Решение проблемы с разным типом и именем реквизита в приемнике

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

Таким образом, мы детально рассмотрели все возможные варианты решения проблемы. Наиболее системным и надежным решением остается обновление метаданных с помощью MD83Exp.epf, так как оно полностью безопасно для ваших кастомных доработок. Однако, владея инструментами работы с параметрами, исходящими данными и ручным редактированием свойств в КД, вы сможете решить задачу быстро и эффективно в любых нестандартных условиях.

← На главную