При работе с инструментом 1С:Конвертация данных 2.1 (КД 2.1) программисты часто сталкиваются с ситуацией, когда в конфигурацию-источник или конфигурацию-приемник были добавлены новые реквизиты, а обновлять всю структуру метаданных в базе КД нет возможности или желания. Это может быть связано с большим объемом конфигурации, риском затереть существующие настройки или просто со стремлением сэкономить время. Рассмотрим подробно, как выйти из этой ситуации и успешно передать данные реквизита АналитикаХозяйственнойОперации или любого другого, «невидимого» для текущих правил.
Разберем типичную ошибку, которую совершают начинающие разработчики. Попытка передать значение через ЗначениеВСтрокуВнутр в обработчике «Перед выгрузкой» и ожидание того, что в базе-приемнике в обработчике «После загрузки» эта переменная появится сама собой — это тупиковый путь. Проанализируем причину: данные между базами передаются через XML-файл строго определенной структуры. Если вы просто присвоили значение какой-то переменной в коде, она не попадет в файл обмена, если для нее не создано соответствующее Правило Конвертации Свойства (ПКС) или параметр. Кроме того, использование внутренних идентификаторов типов через ЗначениеВСтрокуВнутр крайне ненадежно, так как GUID типов в разных базах могут отличаться.
Мало кто помнит, что метаданные в конфигурации «Конвертация данных» — это не жесткая системная таблица, а обычные элементы справочников. Мы можем отредактировать их вручную, не прибегая к обработке «Выгрузка описания конфигурации». Рассмотрим этот процесс по шагам:
АналитикаХозяйственнойОперации.Теперь, когда мы вернемся в настройку правил обмена (ПКО), этот реквизит появится в списке доступных для выбора в ПКС. Это самый «чистый» способ, так как он позволяет использовать стандартные механизмы сопоставления ссылок.
Если мы не хотим трогать справочники метаданных, мы можем пойти на хитрость. Выясним, как передать данные, если реквизит есть в базе, но его нет в списке выбора ПКС. Для этого проанализируем настройку Правила Конвертации Свойств:
Создадим новое ПКС в рамках существующего ПКО документа. В поле Источник оставим пустое значение, а в поле Приемник выберем (или впишем вручную) нужный нам реквизит. Далее воспользуемся обработчиком Перед выгрузкой для этого ПКС:
// В обработчике ПКС "Перед выгрузкой"
// Источник - это ссылка на объект в базе 1С
Значение = Источник.АналитикаХозяйственнойОперации;
В этом случае платформа при выгрузке обратится к реальному объекту Источник. Даже если КД «не знает» о существовании реквизита, встроенный язык 1С позволит получить его значение, если оно физически есть в базе данных. Это значение будет упаковано в XML и передано в приемник согласно правилам для данного типа данных.
Иногда возникают ситуации, когда реквизита нет в самой структуре приемника, но данные нужны нам для алгоритмов обработки (например, для заполнения ДополнительныеСвойства или принятия решения о проведении). В этом случае мы воспользуемся механизмом Параметров. Рассмотрим алгоритм действий:
П_АналитикаХозяйственнойОперации.
Значение = Источник.АналитикаХозяйственнойОперации;
На стороне приемника эти данные не запишутся в реквизит документа автоматически. Нам нужно будет «поймать» их. Для этого проанализируем обработчик После загрузки в ПКО:
// В обработчике ПКО "После загрузки" в приемнике
Если ПараметрыОбъекта <> Неопределено Тогда
Аналитика = ПараметрыОбъекта.Получить("П_АналитикаХозяйственнойОперации");
Если ЗначениеЗаполнено(Аналитика) Тогда
// Выполняем необходимые действия, например:
Объект.ДополнительныеСвойства.Вставить("АналитикаДляПроведения", Аналитика);
КонецЕсли;
КонецЕсли;
Важный момент: коллекция ПараметрыОбъекта доступна именно в процессе загрузки и представляет собой Соответствие, в котором ключами являются имена параметров, заданные нами в правилах.
Для опытных разработчиков существует еще один путь — прямое вмешательство в XML-код правил обмена. Это бывает быстрее, чем открывать тяжелую базу КД. Посмотрим, как это сделать:
Выгрузим правила в файл. Откроем его в текстовом редакторе (лучше использовать Notepad++ или аналоги с подсветкой синтаксиса). Найдем узел нужного ПКО по имени или коду. Внутри тега Свойства добавим блок:
<ПравилоКонвертацииСвойства>
<Источник>АналитикаХозяйственнойОперации</Источник>
<Приемник>АналитикаХозяйственнойОперации</Приемник>
<Код>1</Код>
</ПравилоКонвертацииСвойства>
Если тип реквизита ссылочный, необходимо убедиться, что для этого типа (например, справочник АналитикаХозяйственнойОперации) уже создано свое Правило Конвертации Объекта. В противном случае система не поймет, как сопоставить ссылку. После внесения изменений сохраним файл и загрузим его обратно в КД или сразу в обработку обмена.
Мы проанализировали четыре способа решения задачи. Выясним, какой из них лучше выбрать. Если вы планируете долго поддерживать эти правила, первый способ (ручное добавление в метаданные КД) является наиболее предпочтительным, так как он сохраняет прозрачность структуры. Если же задача разовая — использование ПКС с пустым источником или передача через параметры позволит решить вопрос максимально быстро.
Помните, что при работе с 1С:Конвертация данных 2.1 безопасность данных превыше всего. Всегда делайте резервную копию базы КД и XML-файла правил перед внесением ручных изменений, так как некорректная структура XML может привести к неработоспособности всего файла обмена.