Как получить реквизиты банка организации во внешней печатной форме 1С:Бухгалтерия 3.0?

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

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

Выясняем причину: почему возникает ошибка «Поле объекта не обнаружено»?

Проанализируем классическую ситуацию. Разработчик пытается получить наименование банка или номер счета напрямую через точку от реквизита документа, например: СтруктурнаяЕдиница.Банк.Наименование или БанковскийСчет.НомерСчета. На этапе выполнения кода система аварийно завершает работу.

Давайте разберем по шагам, почему это происходит:

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

Для правильного решения этой задачи мы должны перенести всю логику получения данных на сервер и применить оптимизированные методы БСП.

Способ 1. Использование универсальных функций БСП (быстрый точечный запрос)

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

Рассмотрим пример кода, который необходимо выполнять строго в серверном контексте:


// Предположим, у нас есть ссылка на банковский счет организации
СсылкаНаСчет = ДокументОбъект.БанковскийСчет;

// Получаем нужные реквизиты самого банковского счета одной строкой
РеквизитыСчета = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаСчет, "НомерСчета, Банк, БИК, КоррСчет");

Если РеквизитыСчета <> Неопределено Тогда
    НомерСчета = РеквизитыСчета.НомерСчета;
    БИК        = РеквизитыСчета.БИК;
    КоррСчет   = РеквизитыСчета.КоррСчет;
    
    // Так как "Банк" — это ссылка на другой справочник, получаем его наименование отдельным быстрым запросом
    НаименованиеБанка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РеквизитыСчета.Банк, "Наименование");
КонецЕсли;

Этот способ является наиболее производительным, поскольку мы получаем из базы данных строго определенные поля, не нагружая оперативную память сервера чтением тяжелых объектов целиком.

Способ 2. Использование специализированных функций «1С:Бухгалтерии 3.0»

В конфигурации «Бухгалтерия предприятия» функции сбора информации об организациях и контрагентах для печатных форм глубоко стандартизированы. Для автоматического получения всех необходимых сведений с учетом историчности данных (на определенную дату) используется функция СведенияОЮрФизЛице переопределяемого модуля.

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


// Ссылка на организацию и дату документа берем из печатаемого объекта
Организация = СсылкаНаДокумент.Организация;
ДатаПечати  = СсылкаНаДокумент.Дата;
БанковскийСчет = СсылкаНаДокумент.БанковскийСчет;

// Получаем структуру сведений, передавая конкретный банковский счет в качестве параметра
СведенияОбОрганизации = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(
    Организация, 
    ДатаПечати, 
    , // ИспользоватьИнициалы (по умолчанию Истина)
    БанковскийСчет
);

В результате выполнения этого метода переменная СведенияОбОрганизации будет содержать готовую структуру со всеми заполненными реквизитами организации и выбранного банковского счета. Нам будут доступны поля: НомерСчета, Банк (представление банка), БИК, КоррСчет.

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


// Получаем красивую строку вида: "р/с 40702... в ПАО СБЕРБАНК г. Москва, БИК 044..., к/с 30101..."
ПредставлениеБанка = ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(
    СведенияОбОрганизации, 
    "НомерСчета,Банк,БИК,КоррСчет"
);

Проектируем правильную архитектуру внешней печатной формы

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

Рассмотрим пример готового шаблона модуля объекта внешней печатной формы, интегрируемой по стандартам БСП:


// Обязательная функция для регистрации во внешних обработках
Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.0.0.0");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработки.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма;
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Счет на оплату (с банковскими реквизитами)";
    НоваяКоманда.Идентификатор = "СчетСРеквизитамиБанка";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработки.СпособыВызоваКоманд.ВызовСервераМетода;
    НоваяКоманда.Модификатор = "ПечатьУникальная";
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

// Точка входа для формирования печатной формы, вызываемая платформой на сервере
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм, 
        "СчетСРеквизитамиБанка", 
        "Счет на оплату (с банковскими реквизитами)", 
        СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
    );
    
КонецПроцедуры

// Функция генерации табличного документа
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СчетНаОплату";
    
    Макет = ПолучитьМакет("Макет");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    
    Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл
        
        // 1. Извлекаем ключевые реквизиты документа оптимальным способом
        РеквизитыДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
            СсылкаНаДокумент, 
            "Организация, Дата, БанковскийСчет"
        );
        
        // 2. Получаем полные сведения об организации и банке
        СведенияОбОрганизации = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(
            РеквизитыДокумента.Организация, 
            РеквизитыДокумента.Дата, 
            , 
            РеквизитыДокумента.БанковскийСчет
        );
        
        // 3. Формируем текстовое представление банковских реквизитов одной строкой
        СтрокаРеквизитов = ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(
            СведенияОбОрганизации, 
            "НомерСчета,Банк,БИК,КоррСчет"
        );
        
        // 4. Заполняем параметры макета
        ОбластьШапка.Параметры.ОрганизацияПолучатель   = СведенияОбОрганизации.НаименованиеДляПечатныхФорм;
        ОбластьШапка.Параметры.БанковскиеРеквизитыСтрокой = СтрокаРеквизитов;
        
        // Заполнение отдельных полей, если требуется раздельный вывод в ячейки макета
        ОбластьШапка.Параметры.НомерСчета = СведенияОбОрганизации.НомерСчета;
        ОбластьШапка.Параметры.БИК        = СведенияОбОрганизации.БИК;
        ОбластьШапка.Параметры.КоррСчет   = СведенияОбОрганизации.КоррСчет;
        ОбластьШапка.Параметры.Банк       = СведенияОбОрганизации.Банк;
        
        ТабличныйДокумент.Вывести(ОбластьШапка);
        
    КонецЦикла;
    
    Возврат ТабличныйДокумент;
    
КонецФункции

Подведем итоги

Для успешного и быстрого вывода банковских реквизитов во внешних печатных формах 1С:Бухгалтерии 3.0 необходимо придерживаться следующих правил:

Соблюдение этих архитектурных стандартов 1С гарантирует высокую скорость работы ваших печатных форм и их отказоустойчивость при обновлении типовых конфигураций.

← На главную