Как передать реквизит из 1С 7.7 для поиска в 1С 8, если в приемнике нет такого реквизита?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Проанализируем причину затруднения. В типовом механизме КД для баз на платформе 1С 8.х в правиле конвертации свойств (ПКС) доступен переключатель «Передавать данные в параметр». При установке этого флага значение не записывается в реквизит объекта-приемника, а помещается в коллекцию параметров объекта. Однако обработка выгрузки для платформы 1С 7.7 (V77Exp.ert) этот интерфейсный и программный механизм не поддерживает: соответствующий признак в правилах для источника 7.7 недоступен.

Рассмотрим подробнее проверенные способы обхода данного ограничения.

Способ 1. Программное формирование узла параметра с признаком поиска в 1С 7.7

Самый надежный и архитектурно правильный подход заключается в ручном создании XML-узла параметра непосредственно при выгрузке объекта из 1С 7.7. Важно учитывать ключевую особенность платформы 1С 8: в обработчике ПКО «Поля поиска» коллекция ПараметрыОбъекта содержит только те параметры, для которых явно указан признак поиска. Если атрибут поиска отсутствует, на этапе сопоставления коллекция будет пустой.

Разберем по шагам реализацию этого механизма:

  1. В правиле конвертации объекта (ПКО) перейдем в обработчик «ПриВыгрузке». На стороне платформы 1С 7.7 переменная Приемник представляет собой DOM-узел текущего выгружаемого объекта XML.
  2. Сформируем подчиненный узел с именем ЗначениеПараметра, установим тип данных, значение и обязательный атрибут Поиск="true".

Посмотрим на пример кода в обработчике «ПриВыгрузке» (ПКО, 1С 7.7):


УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "НашПараметрПоиска");
УстановитьАтрибут(УзелПараметра, "Тип", "Строка");
// Обязательно указываем признак поиска для доступности в ПоляхПоиска
УстановитьАтрибут(УзелПараметра, "Поиск", "true");
ЗаписатьЭлемент(УзелПараметра, "Значение", Источник.НужныйРеквизит);
ДобавитьПодчиненный(Приемник, УзелПараметра);

Теперь перейдем к обработке полученных данных в базе-приемнике на платформе 1С 8. В обработчике ПКО «Поля поиска» прочитаем переданный параметр и выполним сопоставление:


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

Способ 2. Создание «виртуального» реквизита в метаданных правил обмена

Если нет желания вручную модифицировать XML-структуру через обработчики 1С 7.7, применим обходной путь через структуру метаданных самой базы правил КД 2.1. Конфигурацию 1С 8 в конфигураторе менять не требуется.

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

  1. В базе КД откроем описание метаданных конфигурации-приемника для нужного объекта и вручную добавим новое фиктивное свойство (например, ВиртуальныйКодДляПоиска) соответствующего типа.
  2. В ПКО создадим ПКС, где источником укажем реальный реквизит из 7.7 (или вычислим его в обработчике «Перед выгрузкой» через Значение = ...), а приемником — наш созданный виртуальный реквизит.
  3. В настройках этого ПКС установим флажок «Поиск объекта при загрузке по свойству».
  4. В обработчике ПКО «Поля поиска» значение будет доступно в коллекции СвойстваПоиска["ВиртуальныйКодДляПоиска"].

Важное ограничение: если объект не будет найден в базе-приемнике, типовой алгоритм загрузки попытается записать значение из СвойстваПоиска в реальный объект, что приведет к ошибке отсутствия реквизита в базе 1С 8. Чтобы исключить сбой, в обработчике ПКС «Перед загрузкой» для виртуального свойства обязательно укажем:

Отказ = Истина;

В этом случае свойство корректно отработает на этапе поиска, но не будет участвовать в заполнении реквизитов создаваемого объекта.

Способ 3. Использование существующего реквизита с отключением замещения

Еще один практичный вариант — сопоставить реквизит источника с любым существующим реквизитом приемника того же типа данных (например, строковое поле Комментарий или дубликат любого строкового реквизита):

  1. Создаем ПКС, привязав исходные данные к реквизиту приемника.
  2. Устанавливаем флажок «Поиск объекта при загрузке по свойству».
  3. Чтобы переданное поисковое значение случайно не перезаписало реальные пользовательские данные в базе-приемнике, в настройках ПКС активируем флажок «Не замещать значение свойства у существующих объектов» либо устанавливаем Отказ = Истина; в обработчике «Перед загрузкой».

В обработчике «Поля поиска» используем переданное значение стандартным образом через соответствие СвойстваПоиска, выполняя поиск по собственному сложному алгоритму и возвращая результат в переменную СсылкаНаОбъект.

← На главную