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