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