Как правильно конвертировать строковое значение дополнительного реквизита в ссылочный тип в 1С: Конвертация данных 2.1?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← К списку

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

Давайте посмотрим на ситуацию, когда в источнике у нас есть строковый дополнительный реквизит, который содержит наименование или код элемента справочника (например, наименование производителя), и нам нужно найти или создать соответствующий элемент справочника в приемнике и присвоить его ссылке. Рассмотрим различные подходы и механизмы, которые помогут нам в этом.

Решение 1: Простейший путь – прямой поиск по наименованию

Начнем с самого простого и часто используемого подхода. Если строковое значение дополнительного реквизита в точности соответствует наименованию элемента справочника в базе-приемнике, мы можем настроить прямое преобразование.

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

Посмотрим на пример кода для обработчика "Перед выгрузкой":


Значение = Источник.ТвойСтроковыйРеквизит;

Таким образом, система будет искать элемент справочника Производители по значению, которое мы передали в Значение. Если элемент найден, будет использована ссылка на него; если нет – будет создан новый элемент.

Решение 2: Использование структур и входящих данных для точного поиска

Иногда просто передать строку недостаточно, потому что ПКО не всегда понимает, по какому полю приемника нужно искать (по наименованию, коду, полному наименованию и т.д.). В таких случаях нам поможет использование структур и механизма ВходящиеДанные.

Разберем этот подход по шагам:

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

Посмотрим на пример формирования структуры:


// Предполагаем, что Источник.ТвойСтроковыйРеквизит содержит наименование
Значение = Новый Структура("Наименование", СокрЛП(Источник.ТвойСтроковыйРеквизит));

Здесь мы явно указываем, что ищем по полю Наименование. Если нам нужен поиск по другому полю, например, по коду, мы бы написали Новый Структура("Код", СокрЛП(Источник.ТвойСтроковыйРеквизит)).

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

Посмотрим на пример использования ВходящиеДанные в обработчике "Поля поиска" ПКО:


Если ТипЗнч(ВходящиеДанные) = Тип("Структура") Тогда
    Если ВходящиеДанные.Свойство("Наименование") Тогда
        СвойстваПоиска.Вставить("Наименование", ВходящиеДанные.Наименование);
    КонецЕсли;
Иначе
    // Если передана просто строка, а не структура
    СвойстваПоиска.Вставить("Наименование", СокрЛП(ВходящиеДанные));
КонецЕсли;

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

Обратите внимание, что переменная СвойстваПоиска – это структура, которую мы заполняем для передачи параметров поиска в механизм КД2.

Глубже в механизмы: КД2 и дополнительные реквизиты

Теперь давайте проанализируем ситуацию более подробно, используя дополнительную информацию о механизмах КД2.

Правила конвертации объектов (ПКО) и свойств (ПКС)

Мы уже упоминали, что ПКО и ПКС – это основа КД2. ПКО описывает, как конвертировать один объект из источника в другой объект в приемнике, а ПКС – как конвертировать отдельные свойства (реквизиты) этих объектов. Для нашей задачи вся работа сосредоточена именно в этих правилах.

Поиск по наименованию или коду

Механизм поиска в КД2 очень мощный. Если в ПКС для реквизита-приемника установлен флажок "Поиск", система будет пытаться найти объект в базе-приемнике по значению реквизита, указанного в правиле. Это может быть Наименование, Код или другие уникальные реквизиты. Мы можем также настроить этот поиск через обработчик "Поля поиска" в ПКО, как мы рассмотрели выше.

Передача данных через ИсходящиеДанные и ВходящиеДанные

Это один из ключевых механизмов для передачи информации между различными правилами конвертации. Значение, присвоенное переменной ИсходящиеДанные в обработчике ПКС, становится доступным как ВходящиеДанные в соответствующем ПКО или его ПКС. Это позволяет нам передать строковое значение из дополнительного реквизита источника в ПКО, которое будет отвечать за поиск или создание ссылочного объекта.

Флажок "Получать из входящих данных"

Если в ПКО для поля-приемника установлен этот флажок, его значение будет получено из переменной ВходящиеДанные. Важно помнить, что если этот флажок установлен, значение для поля должно быть обязательно заполнено, иначе возникнет ошибка конвертации.

Использование ПараметрыОбъекта

Переменная ПараметрыОбъекта также может быть использована для передачи параметров из источника в приемник. Если мы передаем параметр ссылочного типа, необходимо выбрать соответствующее ПКО в поле "Правило". Этот параметр можно затем прочитать в обработчике ПКО "После загрузки". Если параметр используется для поиска объекта в обработчике ПКО "Поля поиска", следует установить флаг "Передавать данные в параметр".

Обработчик "Поля поиска" в ПКО

Этот обработчик предоставляет нам широкие возможности для реализации собственной логики поиска объектов в базе-приемнике. Здесь мы можем программно реализовать более сложные алгоритмы поиска, используя переданные строковые значения. Также в этом обработчике можно использовать переменную ПрекратитьПоиск = Истина;, чтобы остановить стандартный процесс поиска при определенных условиях и реализовать полностью свой алгоритм.

Особенности работы с дополнительными реквизитами

Поскольку наша изначальная проблема касается именно дополнительных реквизитов, давайте рассмотрим их специфику:

  1. Хранение дополнительных реквизитов: Дополнительные реквизиты часто имеют составной тип значений и хранятся не напрямую в таблице объекта, а в отдельных регистрах сведений (например, ЗначенияСвойствОбъектов или подобных). При конвертации это нужно учитывать.
  2. Явное указание типов: При конвертации дополнительных реквизитов может потребоваться явное указание типов значений, например, СправочникСсылка.Контрагенты.
  3. Правило конвертации группы свойств (ПКГС) для "ДополнительныеРеквизиты": Для переноса дополнительных реквизитов часто используется специальное ПКГС, которое создается для объекта ДополнительныеРеквизиты.
  4. Формирование ТаблицыЗначений: В обработчике "ПередОбработкой" этого ПКГС мы можем сформировать ТаблицуЗначений с колонками Свойство и Значение, которая будет содержать данные дополнительных реквизитов из источника.
  5. Динамическое определение ПКО для значения: В ПКС для поля Значение дополнительного реквизита в обработчике "Перед выгрузкой" может потребоваться программно определить имя ПКО в зависимости от типа значения реквизита. Это особенно актуально, если дополнительный реквизит может хранить значения разных ссылочных типов.

Посмотрим на пример кода для динамического определения ПКО:


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

В нашем случае, когда дополнительный реквизит строковый, нам нужно будет передать эту строку в ПКО, которое умеет искать или создавать ссылку. Мы уже рассмотрели, как это сделать с помощью структур и ВходящихДанных.

Мы рассмотрели различные подходы к конвертации строкового значения дополнительного реквизита в ссылочный тип в 1С: Конвертация данных 2.1. Используя эти методы и механизмы, вы сможете гибко настроить правила обмена данными для самых сложных сценариев.

← К списку