При настройке обмена данными между конфигурациями 1С с помощью инструмента «Конвертация данных 2.1» (КД 2) разработчики часто сталкиваются с ситуацией, когда в базе-источнике появился новый реквизит табличной части (например, колонка ФизЛицо в табличной части Товары документа РеализацияТоваровУслуг), но в правилах обмена этого реквизита еще нет. Ситуация усложняется, если в базе-приемнике этот реквизит называется иначе и имеет другой тип данных, а сам разработчик опасается обновлять структуру метаданных в КД, боясь затереть ранее написанный вручную код в обработчиках правил.
В этой статье мы подробно разберем несколько профессиональных сценариев решения этой задачи: от развенчания мифа о потере доработок при обновлении метаданных до продвинутых способов обхода ограничений без изменения структуры КД.
Прежде чем переходить к сложным обходным путям, давайте разберем главное заблуждение многих начинающих специалистов. Страх потерять написанные обработчики (дописки) при повторной загрузке структуры конфигурации абсолютно необоснован.
В архитектуре «Конвертации данных 2» описание метаданных конфигураций и сами правила обмена (ПКО, ПКС, ПГКС) хранятся в разных, хотя и связанных между собой справочниках:
Когда мы выгружаем актуальные метаданные из рабочей базы 1С с помощью внешней обработки (например, MD82Exp.epf или MD83Exp.epf) и загружаем их в КД через обработку «Загрузка структуры конфигурации», происходит лишь обновление описания структуры. Существующие правила обмена при этом остаются абсолютно нетронутыми. Новый реквизит просто появится в дереве метаданных, и мы сможем выбрать его при настройке ПКС.
Рассмотрим пошагово этот стандартный и наиболее правильный алгоритм решения проблемы:
MD82Exp.epf для обычных форм или актуальную версию для управляемых форм).РеализацияТоваровУслуг и справочник ФизическиеЛица, чтобы ускорить процесс).ФизЛицо.ФизЛицо, а в качестве приемника — соответствующее ему свойство в базе-приемнике. Если типы различаются, мы указываем для этого ПКС собственное ПКО (Правило конвертации объектов), которое преобразует один тип в другой.Если же по политическим или техническим причинам обновить метаданные в КД действительно невозможно (например, у вас нет доступа к конфигуратору источника для выгрузки метаданных или база КД заблокирована), рассмотрим альтернативные варианты обхода этой проблемы.
Этот способ позволяет передать значение отсутствующей в метаданных колонки прямо внутри структуры табличной части, используя механизм параметров.
Выясним, как это настроить на практике. В КД 2.1 для каждого правила конвертации группы свойств (ПКГС), которым является наша табличная часть, можно объявлять произвольные параметры. Платформа 1С в режиме выполнения кода имеет доступ ко всем реальным реквизитам объекта базы данных, даже если КД о них "не знает".
Выполним следующие настройки:
Товары.ФизЛицоПараметр.
// ОбъектКоллекции — это строка табличной части источника в момент выгрузки.
// Платформа видит реквизит ФизЛицо непосредственно из базы данных.
Значение = ОбъектКоллекции.ФизЛицо;
// Получаем таблицу параметров для нашей табличной части.
// Имя "Товары" должно соответствовать имени ТЧ в КД.
ПараметрыТовары = ПараметрыОбъекта["ТоварыТабличнаяЧасть"];
Если ПараметрыТовары <> Неопределено Тогда
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
ИндексСтроки = Объект.Товары.Индекс(СтрокаТЧ);
// Проверяем наличие параметров для текущей строки по индексу
Если ИндексСтроки < ПараметрыТовары.Количество() Тогда
СтрокаПараметров = ПараметрыТовары[ИндексСтроки];
// Заполняем реквизит приемника, который называется по-другому
// и при необходимости приводим типы
СтрокаТЧ.НовоеИмяРеквизитаФизЛицо = СтрокаПараметров.ФизЛицоПараметр;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если структура табличной части претерпела значительные изменения, бывает проще полностью сформировать таблицу значений (ТЗ) в коде выгрузки, добавить туда любые необходимые колонки и передать ее целиком.
Проанализируем алгоритм реализации этого подхода:
Товары. Поскольку код выполняется в контексте базы-источника, мы без проблем получим доступ к реквизиту ФизЛицо:
// Выгружаем ТЧ в Таблицу Значений. Колонка ФизЛицо гарантированно будет в ТЗ.
ТаблицаТоваров = Источник.Товары.Выгрузить();
// Помещаем ТЗ в структуру ИсходящиеДанные
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("ТаблицаТоваровДляВыгрузки", ТаблицаТоваров);
ТаблицаТоваровДляВыгрузки.ФизЛицо), а в поле «Приемник» выбираем нужное имя реквизита в базе-приемнике.Поскольку сама информационная база «Конвертация данных» спроектирована на платформе 1С, все описания метаданных внутри нее представляют собой обычные элементы справочников. Мы можем обхитрить систему и добавить недостающий реквизит вручную прямо в интерфейсе КД.
Выполним следующие простые действия:
РеализацияТоваровУслуг, перейдем в его табличную часть Товары.ФизЛицоПоскольку автор вопроса упомянул, что в базе-приемнике реквизит имеет иное наименование и другой тип данных, разберем, как правильно настроить конвертацию в этом случае:
ФизЛицо), а в колонке «Приемник» выбираем новое имя свойства из базы-приемника. КД автоматически сопоставит их при выгрузке.В этом случае в ПКС для свойства-приемника нам не нужно указывать стандартное ПКО. Достаточно в обработчике ПКС «Перед выгрузкой» преобразовать ссылку в строку:
// Получаем текстовое представление физлица для записи в строковый реквизит приемника
Если ЗначениеЗаполнено(ОбъектКоллекции.ФизЛицо) Тогда
Значение = Строка(ОбъектКоллекции.ФизЛицо.Наименование);
Иначе
Значение = "";
КонецЕсли;
В такой ситуации необходимо создать полноценное ПКО для конвертации строки в объект справочника (например, поиск по наименованию). Укажем это созданное ПКО в настройках нашего ПКС.
Таким образом, мы детально рассмотрели все возможные варианты решения проблемы. Наиболее системным и надежным решением остается обновление метаданных с помощью MD83Exp.epf, так как оно полностью безопасно для ваших кастомных доработок. Однако, владея инструментами работы с параметрами, исходящими данными и ручным редактированием свойств в КД, вы сможете решить задачу быстро и эффективно в любых нестандартных условиях.