Как правильно получить адрес контрагента в 1С:БГУ 2.0 для внешней печатной формы

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет
← На главную

При разработке внешних печатных форм в конфигурации «Бухгалтерия государственного учреждения 2.0» (БГУ 2.0) программисты часто сталкиваются с тем, что стандартные попытки получить адрес контрагента через простые функции возвращают пустую строку. Это связано с тем, что архитектура хранения контактной информации в современных решениях 1С базируется на Библиотеке стандартных подсистем (БСП), которая использует сложные механизмы хранения данных в виде XML-структур или специализированных регистров.

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

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

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

Рассмотрим правильный вариант вызова этой функции. Чтобы получить юридический адрес, нам необходимо передать ссылку на предопределенный вид контактной информации:


ФактАдрес = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(
    Контрагент, 
    Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента
);
ОбластьД.Параметры.ФактАдресКонтрагента = ФактАдрес;

Важный нюанс: если вам нужен фактический адрес, используйте Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента. Обратите внимание, что в разных редакциях БГУ названия предопределенных элементов могут незначительно отличаться, поэтому всегда проверяйте их наличие в синтакс-помощнике или непосредственно в пользовательском режиме (Справочники — Виды контактной информации).

Способ 2. Использование специализированных функций БГУ

В конфигурации БГУ 2.0 существуют дополнительные программные модули, упрощающие жизнь разработчику печатных форм. Один из наиболее надежных методов — использование модуля ФормированиеПечатныхФорм. Этот метод удобен тем, что он принимает строковый идентификатор вида адреса, что иногда проще, чем искать ссылку на справочник.

Разберем пример получения юридического адреса:


Адрес = ФормированиеПечатныхФорм.ПолучитьАдресИзКонтактнойИнформации(Контрагент, "Юридический");

Или фактического:


Адрес = ФормированиеПечатныхФорм.ПолучитьАдресИзКонтактнойИнформации(Контрагент, "Фактический");

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

Способ 3. Получение данных через запрос (традиционный метод)

Иногда возникают ситуации, когда использование встроенных функций невозможно (например, при формировании данных внутри сложного пакета запросов для повышения производительности). В этом случае нам необходимо обратиться к источнику данных напрямую. В БГУ 2.0 контактная информация может храниться либо в табличной части КонтактнаяИнформация справочника Контрагенты, либо в одноименном регистре сведений.

Проанализируем структуру запроса, который выбирает представление адреса. Важно накладывать фильтр не только по владельцу (ссылке), но и по типу и виду информации, чтобы не получить вместо адреса номер телефона или адрес электронной почты.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КИ.Представление КАК Адрес
    |ИЗ
    |	Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
    |ГДЕ
    |	КИ.Ссылка = &Контрагент
    |	И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
    |	И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)";

Запрос.УстановитьПараметр("Контрагент", НужныйКонтрагент);
Результат = Запрос.Выполнить();

Обратите внимание на важный момент: если поле Представление в запросе оказывается пустым, это означает, что адрес хранится в структурированном виде (XML/JSON) в поле ЗначенияПолей. В современных версиях 1С это норма, так как это позволяет хранить адрес по ФИАС. В таком случае полученную строку ЗначенияПолей нужно дополнительно обработать функцией:

УправлениеКонтактнойИнформацией.СформироватьПредставлениеКонтактнойИнформацииПоЗначениюПолей(ЗначенияПолей);

Способ 4. Получение всех сведений одной структурой

Если в печатной форме помимо адреса вам нужны ИНН, КПП и полное наименование организации, эффективнее всего использовать метод ОбщегоНазначения.СведенияОЮридическомФизЛице. Рассмотрим, как это работает по шагам:

  1. Подготавливаем дату, на которую сведения актуальны (обычно дата документа).
  2. Вызываем функцию, передавая ссылку на контрагента.
  3. Получаем структуру, из которой извлекаем нужные поля.

Сведения = ОбщегоНазначения.СведенияОЮридическомФизЛице(Контрагент, ДатаДокумента);
ЮридическийАдрес = Сведения.ЮридическийАдрес;
ФактическийАдрес = Сведения.ФактическийАдрес;
ИНН = Сведения.ИНН;

Этот способ является наиболее предпочтительным для ВПФ, так как он минимизирует количество обращений к базе данных и возвращает сразу весь набор реквизитов, необходимых для оформления «шапки» или «подвала» документа.

Почему адрес может не выводиться?

Рассмотрим типичные причины, по которым даже правильный код может не давать результата:

Подводя итог, для разработки качественной ВПФ в БГУ 2.0 рекомендуем использовать либо УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта с явным указанием вида, либо комплексный метод ОбщегоНазначения.СведенияОЮридическомФизЛице. Это обеспечит стабильную работу формы при обновлениях конфигурации и корректное отображение адресов, введенных через классификаторы ФИАС/ГАР.

← На главную