Почему при выгрузке в табличную часть через Конвертацию Данных 2.1 появляются пустые ссылки?

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

При настройке обмена данными между конфигурациями, например, из "Управление торговлей 10.3" в "Бухгалтерию предприятия 3.0" с помощью "Конвертации данных 2.1", часто возникает задача выгружать данные в табличные части документов. Сложность появляется, когда один из реквизитов табличной части является ссылкой на справочник, элементы которого должны создаваться в процессе обмена "на лету".

Рассмотрим типичную ситуацию: необходимо выгрузить коды маркировки в табличную часть "ШтрихкодыУпаковок" документа. Коды маркировки хранятся в самописном регистре, а в базе-приемнике для них предназначен справочник "ШтрихкодыУпаковокТоваров". После выгрузки мы открываем XML-файл обмена и видим, что элементы справочника создаются, но в самой табличной части документа ссылки на них пустые:


 <ТабличнаяЧасть Имя="ШтрихкодыУпаковок">
    <Запись>
        <Свойство Имя="ШтрихкодУпаковки" Тип="СправочникСсылка.ШтрихкодыУпаковокТоваров">
            <Ссылка/>
        </Свойство>
    </Запись>
    <Запись>
        <Свойство Имя="ШтрихкодУпаковки" Тип="СправочникСсылка.ШтрихкодыУпаковокТоваров">
            <Ссылка/>
        </Свойство>
    </Запись>
</ТабличнаяЧасть>

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

Анализ причины: разрыв связи между табличной частью и создаваемым объектом

Основная причина этой проблемы кроется в том, что система конвертации не может сопоставить выгружаемый объект (элемент справочника ШтрихкодыУпаковокТоваров) со строкой в табличной части документа, для которой он предназначен.

Проанализируем по шагам, что происходит внутри механизма конвертации:

  1. При обработке строки табличной части система доходит до правила конвертации свойства (ПКС) для колонки "ШтрихкодУпаковки".
  2. В обработчике этого ПКС мы, как правило, формируем не ссылку, а простое значение (например, строку с кодом маркировки) или структуру с данными для будущего элемента справочника.
  3. "Конвертация данных" видит, что тип приемника — это ссылка на справочник, а мы передаем ей строку или структуру. Она автоматически ищет подходящее правило конвертации объекта (ПКО) для справочника ШтрихкодыУпаковокТоваров, которое может принять на вход наши данные.
  4. ПКО отрабатывает, данные для нового элемента справочника формируются, и он выгружается в XML-файл.
  5. А вот здесь и возникает проблема: после создания объекта система не знает, как найти этот же самый объект, чтобы подставить ссылку на него обратно в табличную часть. Без четких инструкций по поиску она не может установить эту связь и в результате оставляет ссылку пустой.

Именно отсутствие механизма поиска и сопоставления является корнем проблемы.

Ключевое решение: настройка полей поиска в ПКО

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

Разберем по шагам, как настроить правила:

  1. Откройте ваши правила обмена в конфигурации "Конвертация данных 2.1".
  2. Найдите Правило конвертации объекта (ПКО) для справочника, элементы которого вы создаете "на лету". В нашем примере это ШтрихкодыУпаковокТоваров.
  3. Перейдите на вкладку "Правила конвертации свойств". Здесь перечислены все реквизиты этого справочника.
  4. Определите, какие реквизиты уникально идентифицируют элемент справочника. В случае с кодами маркировки это, скорее всего, само значение штрихкода (ЗначениеШтрихкода) и, возможно, связанная номенклатура (Номенклатура).
  5. Для каждого такого реквизита-идентификатора в списке ПКС установите флажок в колонке "Поиск".

Что это меняет? Теперь логика работы системы будет следующей. Получив данные для создания ссылки, она сначала попытается найти в базе-приемнике (а также среди уже выгруженных в текущем сеансе объектов) элемент справочника, у которого значения в полях, отмеченных для поиска, совпадают с переданными.

Проблема с пустыми ссылками будет решена.

Практический пример: разбор кода и настроек из темы

В обсуждаемой на форуме ситуации автор использовал правильный подход для передачи данных, но упустил настройку поиска. Посмотрим на его код в ПКС для колонки "ШтрихкодУпаковки" в табличной части документа.

Сначала в Правиле конвертации группы свойств (ПКГС) для всей табличной части с помощью запроса подготавливается коллекция данных. Затем для каждой строки этой коллекции в ПКС колонки "ШтрихкодУпаковки" выполняется следующий код:


// ... здесь идет сложная логика по формированию наименования номенклатуры (НоменклатураНов) 
// и получению кода маркировки (ДМК) из объекта коллекции ...

ДМК = лев(ОбъектКоллекции.ДМК,31);

// Важно! В Значение передается сам код, а не ссылка.
// Это инициирует поиск ПКО для справочника.
Значение = ДМК; 

// Формируем структуру для передачи нескольких параметров в ПКО
ДанныеДляПередачи = Новый Структура();
ДанныеДляПередачи.Вставить("ЗначениеШтрихкода", ДМК);
ДанныеДляПередачи.Вставить("Номенклатура", Наименование);

// Передаем структуру в следующее правило через ИсходящиеДанные
ИсходящиеДанные = ДанныеДляПередачи;

Этот код абсолютно корректен. Он использует механизм ИсходящиеДанные для передачи в ПКО справочника ШтрихкодыУпаковокТоваров структуры с двумя значениями: самим кодом и номенклатурой. В ПКО для этого справочника должны быть настроены два ПКС (для реквизитов ЗначениеШтрихкода и Номенклатура), которые получают эти данные из ВходящиеДанные.

Единственное, чего не хватало в этой схеме, — это установки флагов "Поиск" в ПКО ШтрихкодыУпаковокТоваров для ПКС реквизитов "ЗначениеШтрихкода" и "Номенклатура". Как только автор это сделал, обмен заработал как надо.

Дополнительные аспекты, на которые стоит обратить внимание

В процессе настройки подобных обменов можно столкнуться и с другими нюансами. Рассмотрим некоторые из них.

Подведем итог: столкнувшись с проблемой пустых ссылок в табличных частях при выгрузке, в первую очередь проверяйте настройки ПКО для связанного справочника. Установка флагов "Поиск" для уникальных реквизитов — это ключевой шаг, который позволяет системе правильно связывать создаваемые на лету объекты с их местом в документе-приемнике.

← На главную