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