При настройке обменов между базами 1С с помощью «Конвертации данных 2.0» (КД 2.0) часто возникает потребность преобразовать данные одного типа в другой. Рассмотрим классическую задачу: выгрузку справочника «Банковские счета контрагентов» (например, из 1С:УТ 11 в 1С:Документооборот). У счета есть реквизит Банк (ссылка на классификатор банков) и БИКБанка (строка). Проблема в том, что реквизит Банк может быть не заполнен, и тогда нам нужно найти соответствующий банк в базе-приемнике по строковому значению БИКБанка.
Проанализируем ситуацию и разберем по шагам, как правильно реализовать такой перенос, избежав типичных ошибок.
На первый взгляд может показаться, что для решения задачи необходимо создавать несколько разных ПКО: одно для обычных счетов, другое — для счетов без банка, а затем программно переключать их в обработчике ПередВыгрузкой. Автор темы пытался реализовать именно этот подход:
БИКБанка.ИмяПКО = "БанковскиеСчетаБезБанка".Выясним причину, почему это является «излишеством». КД 2.0 обладает встроенным, каноничным механизмом для решения подобных задач, который не требует создания дублей правил. Все решается на уровне одного ПКС с использованием объекта Структура.
Рассмотрим подробнее стандартный механизм. Если нам нужно передать данные для поиска ссылочного объекта (в нашем случае — банка) из строкового реквизита, достаточно сформировать структуру, где ключами будут являться имена свойств поиска в базе-приемнике, а значениями — наши строковые данные.
В ПКО «БанковскиеСчета» находим ПКС, которое отвечает за конвертацию свойства Банк (источник: Банк, приемник: Банк). Откроем обработчик «Перед выгрузкой» для этого ПКС и напишем следующий код:
Если НЕ ЗначениеЗаполнено(Источник.Банк) Тогда
Значение = Новый Структура("Код", Источник.БИКБанка);
КонецЕсли;
Как это работает:
Банк.Значение (которая по умолчанию содержит выгружаемую ссылку).Код, в который помещаем строку БИКБанка.Обратите внимание: чтобы этот код корректно отработал, в настройках ПКС реквизит-источник можно вообще очистить (оставить пустым), если вы планируете формировать значение исключительно программно.
После применения вышеописанного решения выгрузка пройдет успешно. Файл обмена будет содержать нужный узел со ссылкой на БИК. Однако на этапе загрузки в базу-приемник может оказаться, что реквизит Банк в банковском счете остался пустым. Выясним причину такого поведения.
Существует три основные причины, по которым объект в базе-приемнике может не записаться:
Код обязательно должно иметь установленную галочку «Поиск». Без этого система просто не будет знать, по какому полю сопоставлять переданную из структуры строку с объектами в базе.Банк может стоять галочка «Не замещать значение свойства у существующих объектов». Если банковский счет уже был ранее загружен в базу (даже с пустым банком), система проигнорирует новое значение. Убедитесь, что эта галочка снята.Наименование), запись объекта завершится ошибкой. В фоновом обмене эта ошибка может быть проглочена, и ссылка на банк просто не привяжется к счету.Чтобы избежать ошибок валидации, если банка еще нет в базе-приемнике, расширим передаваемую структуру минимально необходимыми данными-заглушками. Посмотрим на пример, как это сделать в том же обработчике «Перед выгрузкой» ПКС Банк:
Если НЕ ЗначениеЗаполнено(Источник.Банк) Тогда
Значение = Новый Структура;
Значение.Вставить("Код", Источник.БИКБанка);
Значение.Вставить("Наименование", "Банк с БИК " + Источник.БИКБанка); // Заглушка для обязательного поля
КонецЕсли;
В этом случае, даже если банка в приемнике нет, система создаст новый банк с заполненным кодом и техническим наименованием, успешно запишет его и подставит ссылку в реквизит Банк выгружаемого счета. При этом в ПКО «Классификатор банков» должны быть настроены ПКС как для поля Код, так и для поля Наименование.
Таким образом, использование переменной Значение с типом Структура — это надежный и гибкий инструмент разработчика в КД 2.0, позволяющий без лишних настроек конвертировать примитивные типы (строки, числа) в полноценные ссылочные объекты.