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

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

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

Разберем детально, как правильно извлекать строковое представление адреса в конфигурации «Бухгалтерия предприятия 3.0», рассмотрим типовые методы общих модулей БСП и наиболее производительный подход на основе запроса.

Типичная ошибка при получении контактной информации

Проанализируем частую ошибку начинающих разработчиков. В коде формирования печатной формы нередко пишут следующее выражение:


// Ошибочный вариант:
ОбластьШапки.Параметры.АдресДоставки = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;

В этом случае в параметр области макета передается ссылка на элемент справочника ВидыКонтактнойИнформации. Платформа 1С преобразует ее в стандартное строковое представление объекта, то есть в название вида информации. Чтобы получить сам адрес конкретного контрагента, необходимо обратиться к данным, привязанным к объекту через подсистему контактной информации.

Способ 1. Использование универсальных методов модуля «УправлениеКонтактнойИнформацией»

В типовых конфигурациях на базе БСП для работы с адресами, телефонами и адресами электронной почты предусмотрен общий модуль УправлениеКонтактнойИнформацией. Если требуется получить контактные данные одного или нескольких объектов списком, применим метод КонтактнаяИнформацияОбъектов.

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


МассивКонтрагентов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ШапкаДокумента.Контрагент);
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
ТипАдреса = Перечисления.ТипыКонтактнойИнформации.Адрес;

ТаблицаАдресов = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(
    МассивКонтрагентов, 
    ТипАдреса, 
    ВидАдреса
);

Если ТаблицаАдресов.Количество() > 0 Тогда
    АдресКонтрагента = ТаблицаАдресов[0].Представление;
Иначе
    АдресКонтрагента = "";
КонецЕсли;

ОбластьШапки.Параметры.АдресДоставки = АдресКонтрагента;

Если для печатной формы критично учитывать дату совершения хозяйственной операции (например, если контрагент менял юридический адрес и в базе включена история контактной информации), применим специализированный метод для «Бухгалтерии предприятия»:


ТаблицаАдресов = УправлениеКонтактнойИнформациейБП.КонтактнаяИнформацияОбъектовНаДату(
    МассивКонтрагентов, 
    ТипАдреса, 
    ВидАдреса, 
    ШапкаДокумента.Дата
);

Способ 2. Быстрое получение представления адреса для одного объекта

Чтобы избежать создания массивов и ручной проверки количества строк в полученной таблице значений, используем функцию БСП, предназначенную для работы с единичным объектом — КонтактнаяИнформацияОбъекта. Передав в четвертый параметр значение Истина, мы сразу получаем готовую строку представления:


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

ОбластьШапки.Параметры.АдресДоставки = АдресКонтрагента;

Также в ряде версий БСП доступна функция ПредставлениеКонтактнойИнформацииОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации), которая компактно возвращает строковое значение контактных данных.

Способ 3. Комплексные данные через модуль «БухгалтерскийУчетПереопределяемый»

В конфигурации «1С:Бухгалтерия предприятия 3.0» формирование шапок накладных и счетов-фактур стандартизировано. Если помимо адреса для печатной формы требуются ИНН, КПП, телефон и полные наименования, оптимально использовать функцию СведенияОЮрФизЛице:


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

// Структура содержит готовые строковые поля:
ОбластьШапки.Параметры.ЮридическийАдрес = СведенияОКонтрагенте.ЮридическийАдрес;
ОбластьШапки.Параметры.ФактическийАдрес  = СведенияОКонтрагенте.ФактическийАдрес;
ОбластьШапки.Параметры.Телефоны          = СведенияОКонтрагенте.Телефоны;

Способ 4. Получение адреса запросом (наиболее производительный вариант)

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


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

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

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ОбластьШапки.Параметры.АдресДоставки = Выборка.ЮрАдрес;
КонецЕсли;

Важные практические нюансы

При разработке алгоритмов вывода адресов обратим внимание на следующие аспекты предметной логики:

  1. Различие между контрагентом и грузополучателем: В документе реализации покупатель (реквизит Контрагент) и фактический получатель товара могут различаться. Если реквизит Грузополучатель заполнен иным лицом или обособленным подразделением, адрес доставки необходимо считывать именно из ссылки грузополучателя.
  2. Правильный выбор вида информации: В справочнике ВидыКонтактнойИнформации предопределены различные элементы для контрагентов: ЮрАдресКонтрагента, ФактАдресКонтрагента, АдресДоставкиКонтрагента и ПочтовыйАдресКонтрагента. Для адреса доставки накладной рекомендуется использовать фактический адрес или адрес доставки, а не юридический.
  3. История изменений: Если в базе ведется история изменения контактной информации (включена соответствующая функциональная опция), данные распределяются по регистру сведений ИсторияКонтактнойИнформации. В этом случае чтение табличной части вернет текущее состояние адреса, а для печати документов прошлых периодов необходимо обращаться к методам БСП с передачей даты документа.
← На главную