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