Как в Конвертации данных 2.0 преобразовать строковый реквизит в ссылку на справочник?

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

При настройке обменов между базами 1С с помощью «Конвертации данных 2.0» (КД 2.0) часто возникает потребность преобразовать данные одного типа в другой. Рассмотрим классическую задачу: выгрузку справочника «Банковские счета контрагентов» (например, из 1С:УТ 11 в 1С:Документооборот). У счета есть реквизит Банк (ссылка на классификатор банков) и БИКБанка (строка). Проблема в том, что реквизит Банк может быть не заполнен, и тогда нам нужно найти соответствующий банк в базе-приемнике по строковому значению БИКБанка.

Проанализируем ситуацию и разберем по шагам, как правильно реализовать такой перенос, избежав типичных ошибок.

Ошибочный подход: создание дублей Правил конвертации объектов (ПКО)

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

  1. Создать ПКО «БанковскиеСчетаБезБанка», где в Правилах конвертации свойств (ПКС) источником выступает БИКБанка.
  2. Создать отдельное ПКО «СтрокаВКлассификаторБанка».
  3. Подменять имя правила через условие: ИмяПКО = "БанковскиеСчетаБезБанка".

Выясним причину, почему это является «излишеством». КД 2.0 обладает встроенным, каноничным механизмом для решения подобных задач, который не требует создания дублей правил. Все решается на уровне одного ПКС с использованием объекта Структура.

Правильное решение: использование Структуры в ПКС

Рассмотрим подробнее стандартный механизм. Если нам нужно передать данные для поиска ссылочного объекта (в нашем случае — банка) из строкового реквизита, достаточно сформировать структуру, где ключами будут являться имена свойств поиска в базе-приемнике, а значениями — наши строковые данные.

В ПКО «БанковскиеСчета» находим ПКС, которое отвечает за конвертацию свойства Банк (источник: Банк, приемник: Банк). Откроем обработчик «Перед выгрузкой» для этого ПКС и напишем следующий код:


Если НЕ ЗначениеЗаполнено(Источник.Банк) Тогда
    Значение = Новый Структура("Код", Источник.БИКБанка);
КонецЕсли;

Как это работает:

  1. Система проверяет, заполнен ли ссылочный реквизит Банк.
  2. Если он пуст, мы переопределяем стандартную переменную Значение (которая по умолчанию содержит выгружаемую ссылку).
  3. Вместо ссылки мы передаем структуру с одним ключом Код, в который помещаем строку БИКБанка.
  4. КД 2.0 автоматически поймет, что передана структура, и попытается найти в базе-приемнике элемент справочника «Классификатор банков», у которого реквизит «Код» совпадает с переданным БИКом.

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

Подводные камни при загрузке: почему ссылка может не сохраниться?

После применения вышеописанного решения выгрузка пройдет успешно. Файл обмена будет содержать нужный узел со ссылкой на БИК. Однако на этапе загрузки в базу-приемник может оказаться, что реквизит Банк в банковском счете остался пустым. Выясним причину такого поведения.

Существует три основные причины, по которым объект в базе-приемнике может не записаться:

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

Доработка структуры для корректного создания объектов

Чтобы избежать ошибок валидации, если банка еще нет в базе-приемнике, расширим передаваемую структуру минимально необходимыми данными-заглушками. Посмотрим на пример, как это сделать в том же обработчике «Перед выгрузкой» ПКС Банк:


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

В этом случае, даже если банка в приемнике нет, система создаст новый банк с заполненным кодом и техническим наименованием, успешно запишет его и подставит ссылку в реквизит Банк выгружаемого счета. При этом в ПКО «Классификатор банков» должны быть настроены ПКС как для поля Код, так и для поля Наименование.

Таким образом, использование переменной Значение с типом Структура — это надежный и гибкий инструмент разработчика в КД 2.0, позволяющий без лишних настроек конвертировать примитивные типы (строки, числа) в полноценные ссылочные объекты.

← На главную