При работе с обменом данными в 1С: Конвертация данных 2.1 (КД2) мы часто сталкиваемся с необходимостью преобразования информации из одного формата в другой. Одной из распространенных задач является конвертация строкового значения, часто представляющего собой дополнительный реквизит, в ссылочный тип данных (например, в элемент справочника) в базе-приемнике. Эта задача имеет свои нюансы, и мы вместе разберем, как ее эффективно решить.
Давайте посмотрим на ситуацию, когда в источнике у нас есть строковый дополнительный реквизит, который содержит наименование или код элемента справочника (например, наименование производителя), и нам нужно найти или создать соответствующий элемент справочника в приемнике и присвоить его ссылке. Рассмотрим различные подходы и механизмы, которые помогут нам в этом.
Начнем с самого простого и часто используемого подхода. Если строковое значение дополнительного реквизита в точности соответствует наименованию элемента справочника в базе-приемнике, мы можем настроить прямое преобразование.
Производители).Производитель типа СправочникСсылка.Производители).Производитель).Значение. Предположим, наш дополнительный реквизит называется ТвойСтроковыйРеквизит.Посмотрим на пример кода для обработчика "Перед выгрузкой":
Значение = Источник.ТвойСтроковыйРеквизит;
Таким образом, система будет искать элемент справочника Производители по значению, которое мы передали в Значение. Если элемент найден, будет использована ссылка на него; если нет – будет создан новый элемент.
Иногда просто передать строку недостаточно, потому что ПКО не всегда понимает, по какому полю приемника нужно искать (по наименованию, коду, полному наименованию и т.д.). В таких случаях нам поможет использование структур и механизма ВходящиеДанные.
Разберем этот подход по шагам:
Производители).СокрЛП() для обрезки лишних пробелов по краям строки.Посмотрим на пример формирования структуры:
// Предполагаем, что Источник.ТвойСтроковыйРеквизит содержит наименование
Значение = Новый Структура("Наименование", СокрЛП(Источник.ТвойСтроковыйРеквизит));
Здесь мы явно указываем, что ищем по полю Наименование. Если нам нужен поиск по другому полю, например, по коду, мы бы написали Новый Структура("Код", СокрЛП(Источник.ТвойСтроковыйРеквизит)).
Наименование (или другого поля, по которому ищем) в ПКО, которое вызывается для конвертации ссылки (в нашем примере это ПКО для Производители), устанавливаем флажок "Получать из входящих данных".Производители) мы можем использовать обработчик "Поля поиска" для более тонкой настройки логики поиска. Здесь мы можем получить нашу структуру через переменную ВходящиеДанные.Посмотрим на пример использования ВходящиеДанные в обработчике "Поля поиска" ПКО:
Если ТипЗнч(ВходящиеДанные) = Тип("Структура") Тогда
Если ВходящиеДанные.Свойство("Наименование") Тогда
СвойстваПоиска.Вставить("Наименование", ВходящиеДанные.Наименование);
КонецЕсли;
Иначе
// Если передана просто строка, а не структура
СвойстваПоиска.Вставить("Наименование", СокрЛП(ВходящиеДанные));
КонецЕсли;
В этом примере мы анализируем тип ВходящихДанных. Если это структура, мы извлекаем из нее значение для поля Наименование и добавляем его в СвойстваПоиска, которые используются для поиска объекта. Если же ВходящиеДанные оказались просто строкой, мы также можем использовать ее для поиска по наименованию.
Обратите внимание, что переменная СвойстваПоиска – это структура, которую мы заполняем для передачи параметров поиска в механизм КД2.
Теперь давайте проанализируем ситуацию более подробно, используя дополнительную информацию о механизмах КД2.
Мы уже упоминали, что ПКО и ПКС – это основа КД2. ПКО описывает, как конвертировать один объект из источника в другой объект в приемнике, а ПКС – как конвертировать отдельные свойства (реквизиты) этих объектов. Для нашей задачи вся работа сосредоточена именно в этих правилах.
Механизм поиска в КД2 очень мощный. Если в ПКС для реквизита-приемника установлен флажок "Поиск", система будет пытаться найти объект в базе-приемнике по значению реквизита, указанного в правиле. Это может быть Наименование, Код или другие уникальные реквизиты. Мы можем также настроить этот поиск через обработчик "Поля поиска" в ПКО, как мы рассмотрели выше.
Это один из ключевых механизмов для передачи информации между различными правилами конвертации. Значение, присвоенное переменной ИсходящиеДанные в обработчике ПКС, становится доступным как ВходящиеДанные в соответствующем ПКО или его ПКС. Это позволяет нам передать строковое значение из дополнительного реквизита источника в ПКО, которое будет отвечать за поиск или создание ссылочного объекта.
Если в ПКО для поля-приемника установлен этот флажок, его значение будет получено из переменной ВходящиеДанные. Важно помнить, что если этот флажок установлен, значение для поля должно быть обязательно заполнено, иначе возникнет ошибка конвертации.
Переменная ПараметрыОбъекта также может быть использована для передачи параметров из источника в приемник. Если мы передаем параметр ссылочного типа, необходимо выбрать соответствующее ПКО в поле "Правило". Этот параметр можно затем прочитать в обработчике ПКО "После загрузки". Если параметр используется для поиска объекта в обработчике ПКО "Поля поиска", следует установить флаг "Передавать данные в параметр".
Этот обработчик предоставляет нам широкие возможности для реализации собственной логики поиска объектов в базе-приемнике. Здесь мы можем программно реализовать более сложные алгоритмы поиска, используя переданные строковые значения. Также в этом обработчике можно использовать переменную ПрекратитьПоиск = Истина;, чтобы остановить стандартный процесс поиска при определенных условиях и реализовать полностью свой алгоритм.
Поскольку наша изначальная проблема касается именно дополнительных реквизитов, давайте рассмотрим их специфику:
ЗначенияСвойствОбъектов или подобных). При конвертации это нужно учитывать.СправочникСсылка.Контрагенты.ДополнительныеРеквизиты.ТаблицуЗначений с колонками Свойство и Значение, которая будет содержать данные дополнительных реквизитов из источника.Значение дополнительного реквизита в обработчике "Перед выгрузкой" может потребоваться программно определить имя ПКО в зависимости от типа значения реквизита. Это особенно актуально, если дополнительный реквизит может хранить значения разных ссылочных типов.Посмотрим на пример кода для динамического определения ПКО:
Если ТипЗнч(ОбъектКоллекции.Значение) = Тип("СправочникСсылка.Контрагенты") Тогда
ИмяПКО = "Контрагенты";
ИначеЕсли ТипЗнч(ОбъектКоллекции.Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
ИмяПКО = "Номенклатура";
Иначе
// Обработка других типов или пустых значений
КонецЕсли;
В нашем случае, когда дополнительный реквизит строковый, нам нужно будет передать эту строку в ПКО, которое умеет искать или создавать ссылку. Мы уже рассмотрели, как это сделать с помощью структур и ВходящихДанных.
Мы рассмотрели различные подходы к конвертации строкового значения дополнительного реквизита в ссылочный тип в 1С: Конвертация данных 2.1. Используя эти методы и механизмы, вы сможете гибко настроить правила обмена данными для самых сложных сценариев.
← К списку