Как правильно получить наименование банка из банковского счета в ПКС Конвертации данных?

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

При настройке правил обмена в конфигурации «Конвертация данных 2.1» часто возникает задача передать в приемник не ссылку на справочник, а строковое представление связанного поля. Например, в объекте-приемнике требуется записать наименование банка строкой, тогда как в базе-источнике (например, «1С:Бухгалтерия предприятия») есть только ссылка на справочник БанковскиеСчета или БанковскиеСчетаОрганизаций.

Попытка напрямую обратиться к свойствам через код вида Значение = Источник.Банк.Наименование; в обработчике «Перед выгрузкой» правила конвертации свойств (ПКС) нередко приводит к ошибке выполнения: «Поле объекта не обнаружено (Банк)». Разберем, почему возникает эта ошибка и какие варианты решения задачи существуют.

Причина ошибки: контекст переменной Источник в ПКС

Проанализируем контекст выполнения обработчиков в «Конвертации данных 2.1». Главное заблуждение заключается в том, что в обработчике ПКС переменная Источник ошибочно принимается за значение самого конвертируемого реквизита.

В действительности контекст обработчиков ПКС устроен следующим образом:

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

Вариант 1. Быстрое исправление через обработку переменной Значение или реквизита документа

Если мы хотим оставить логику непосредственно в ПКС конкретного правила выгрузки документа, рассмотрим два корректных способа написания кода в обработчике «Перед выгрузкой»:

Способ А. Использование предопределенной переменной Значение

Если в таблице ПКС в колонке «Источник» уже выбран реквизит СчетОрганизации, система сама поместит ссылку на банковский счет в переменную Значение. Нам остается лишь безопасно извлечь наименование банка:


Если ЗначениеЗаполнено(Значение) И ЗначениеЗаполнено(Значение.Банк) Тогда
    Значение = Значение.Банк.Наименование;
Иначе
    Значение = "";
КонецЕсли;

Способ Б. Прямое обращение через объект-источник

Если в ПКС колонка «Источник» оставлена пустой (вычисляемое свойство), мы обращаемся к реквизиту через объект верхнего уровня Источник:


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

Вариант 2. Создание отдельного ПКО для конвертации счета в строку (рекомендуемый подход)

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

Согласно стандартам разработки в КД 2.1, правильнее выделить конвертацию ссылки в строку в отдельное правило конвертации объектов (ПКО):

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

Такой подход обеспечивает повторное использование кода и упрощает поддержку правил обмена.

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

Рассмотрим еще один гибкий способ, применяемый при сложных вычислениях. В обработчике «Перед выгрузкой» ПКО документа формируется структура исходящих данных:


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

В строке ПКС для реквизита-приемника устанавливаем флаг «Получить из входящих данных», а в качестве источника указываем ключ структуры — НаименованиеБанка.

Тонкости типовых конфигураций и безопасность разыменования

Обратим внимание на важные детали при работе с банковскими реквизитами в типовых конфигурациях 1С:

  1. Неоднородность классификаторов: В современных конфигурациях (например, «1С:Бухгалтерия предприятия 3.0») реквизит Банк может ссылаться как на справочник КлассификаторБанков, так и содержать строковые реквизиты для счетов в зарубежных банках (международные реквизиты, SWIFT). При необходимости учитывайте возможность отсутствия ссылки на справочник банков.
  2. Проверка на заполненность: Никогда не обращайтесь через две точки (Источник.СчетОрганизации.Банк.Наименование) без предварительной проверки реквизитов функцией ЗначениеЗаполнено(), иначе при выгрузке документа с незаполненным счетом обмен завершится критической ошибкой.
← На главную