При настройке обмена данными между конфигурациями, например, из "Управление торговлей 10.3" в "Бухгалтерию предприятия 3.0" с помощью "Конвертации данных 2.1", часто возникает задача выгружать данные в табличные части документов. Сложность появляется, когда один из реквизитов табличной части является ссылкой на справочник, элементы которого должны создаваться в процессе обмена "на лету".
Рассмотрим типичную ситуацию: необходимо выгрузить коды маркировки в табличную часть "ШтрихкодыУпаковок" документа. Коды маркировки хранятся в самописном регистре, а в базе-приемнике для них предназначен справочник "ШтрихкодыУпаковокТоваров". После выгрузки мы открываем XML-файл обмена и видим, что элементы справочника создаются, но в самой табличной части документа ссылки на них пустые:
<ТабличнаяЧасть Имя="ШтрихкодыУпаковок">
<Запись>
<Свойство Имя="ШтрихкодУпаковки" Тип="СправочникСсылка.ШтрихкодыУпаковокТоваров">
<Ссылка/>
</Свойство>
</Запись>
<Запись>
<Свойство Имя="ШтрихкодУпаковки" Тип="СправочникСсылка.ШтрихкодыУпаковокТоваров">
<Ссылка/>
</Свойство>
</Запись>
</ТабличнаяЧасть>
При этом где-то дальше в файле сами объекты создаются корректно. Выясним, почему так происходит и как это исправить.
Основная причина этой проблемы кроется в том, что система конвертации не может сопоставить выгружаемый объект (элемент справочника ШтрихкодыУпаковокТоваров) со строкой в табличной части документа, для которой он предназначен.
Проанализируем по шагам, что происходит внутри механизма конвертации:
ШтрихкодыУпаковокТоваров, которое может принять на вход наши данные.Именно отсутствие механизма поиска и сопоставления является корнем проблемы.
Чтобы решить эту проблему, необходимо явно указать "Конвертации данных", по каким полям следует искать уже существующий или только что созданный элемент справочника. Это делается с помощью флага "Поиск" в правилах конвертации свойств (ПКС) внутри ПКО справочника.
Разберем по шагам, как настроить правила:
ШтрихкодыУпаковокТоваров.ЗначениеШтрихкода) и, возможно, связанная номенклатура (Номенклатура).Что это меняет? Теперь логика работы системы будет следующей. Получив данные для создания ссылки, она сначала попытается найти в базе-приемнике (а также среди уже выгруженных в текущем сеансе объектов) элемент справочника, у которого значения в полях, отмеченных для поиска, совпадают с переданными.
Проблема с пустыми ссылками будет решена.
В обсуждаемой на форуме ситуации автор использовал правильный подход для передачи данных, но упустил настройку поиска. Посмотрим на его код в ПКС для колонки "ШтрихкодУпаковки" в табличной части документа.
Сначала в Правиле конвертации группы свойств (ПКГС) для всей табличной части с помощью запроса подготавливается коллекция данных. Затем для каждой строки этой коллекции в ПКС колонки "ШтрихкодУпаковки" выполняется следующий код:
// ... здесь идет сложная логика по формированию наименования номенклатуры (НоменклатураНов)
// и получению кода маркировки (ДМК) из объекта коллекции ...
ДМК = лев(ОбъектКоллекции.ДМК,31);
// Важно! В Значение передается сам код, а не ссылка.
// Это инициирует поиск ПКО для справочника.
Значение = ДМК;
// Формируем структуру для передачи нескольких параметров в ПКО
ДанныеДляПередачи = Новый Структура();
ДанныеДляПередачи.Вставить("ЗначениеШтрихкода", ДМК);
ДанныеДляПередачи.Вставить("Номенклатура", Наименование);
// Передаем структуру в следующее правило через ИсходящиеДанные
ИсходящиеДанные = ДанныеДляПередачи;
Этот код абсолютно корректен. Он использует механизм ИсходящиеДанные для передачи в ПКО справочника ШтрихкодыУпаковокТоваров структуры с двумя значениями: самим кодом и номенклатурой. В ПКО для этого справочника должны быть настроены два ПКС (для реквизитов ЗначениеШтрихкода и Номенклатура), которые получают эти данные из ВходящиеДанные.
Единственное, чего не хватало в этой схеме, — это установки флагов "Поиск" в ПКО ШтрихкодыУпаковокТоваров для ПКС реквизитов "ЗначениеШтрихкода" и "Номенклатура". Как только автор это сделал, обмен заработал как надо.
В процессе настройки подобных обменов можно столкнуться и с другими нюансами. Рассмотрим некоторые из них.
Значение не структуру, а просто строку (как в примере Значение = ДМК;), то для корректной работы у ПКО справочника поле "Источник" должно быть пустым. Тогда система поймет, что это ПКО можно использовать для конвертации из простых типов данных.Подведем итог: столкнувшись с проблемой пустых ссылок в табличных частях при выгрузке, в первую очередь проверяйте настройки ПКО для связанного справочника. Установка флагов "Поиск" для уникальных реквизитов — это ключевой шаг, который позволяет системе правильно связывать создаваемые на лету объекты с их местом в документе-приемнике.