При доработке типовых печатных форм (например, счета на оплату или заказа покупателя) разработчики часто сталкиваются с ситуацией, когда добавленный в макет адрес выводится в искаженном виде. Вместо привычной строки на печать выходит текст с множеством запятых и суффиксами: ,4000000, Нская обл, , Нск г, , 18 км рзд, 10, , 7, дом, корпус, кв.. Разберем по шагам, почему возникает эта ошибка и как программно получить красивое, человекочитаемое представление адреса.
В конфигурациях 1С (особенно классических версиях, таких как Управление торговлей 10.3, Управление производственным предприятием 1.3 и Комплексная автоматизация 1.1) строковый реквизит АдресДоставки хранит данные в сериализованном позиционном формате классификатора адресов (КЛАДР). В этой строке каждая позиция строго зафиксирована и отделена запятой:
[Индекс], [КодРегиона], [Регион], [Район], [Город], [НаселенныйПункт], [Улица], [Дом], [Корпус], [Квартира], [ТипДома], [ТипКорпуса], [ТипКвартиры]
Если в коде формирования печатной формы написать прямое присвоение:
ОбластьМакета.Параметры.АдресДоставки = АдресДоставки;
в табличный документ передается необработанная внутренняя строка со всеми пустыми позициями и техническими суффиксами. На экранной форме документа адрес отображается корректно только потому, что алгоритмы формы перехватывают значение и на лету преобразуют его в читаемый вид. Чтобы получить аналогичный результат в печатной форме, нам нужно вызывать штатные функции формирования представления адреса.
Рассмотрим, как преобразовать внутреннюю строку адреса в печатное представление с помощью типового общего модуля УправлениеКонтактнойИнформацией. В этих конфигурациях предусмотрена специальная экспортная функция ПолучитьПредставлениеАдресаПоСтрока().
Разберем реализацию в коде формирования печатной формы:
Если ЗначениеЗаполнено(АдресДоставки) Тогда
ОбластьМакета.Параметры.АдресДоставки = УправлениеКонтактнойИнформацией.ПолучитьПредставлениеАдресаПоСтрока(АдресДоставки);
Иначе
ОбластьМакета.Параметры.АдресДоставки = "";
КонецЕсли;
Как работает данный метод внутри платформы:
ПолучитьСтруктуруАдресаИзСтроки().ПолучитьПредставлениеАдресаПоСтруктуре() удаляет пустые поля и собирает итоговую строку, корректно подставляя сокращения: например, д. 10, кв. 7 вместо 10, , 7, дом, корпус, кв..Если разработка ведется в современных конфигурациях на управляемых формах (Управление торговлей 11, ERP, КА 2), адресная информация обычно хранится в формате XML/JSON или привязана к контактной информации партнеров и контрагентов. В этом случае применяются другие штатные механизмы.
Если адрес хранится в сериализованном виде в строковом реквизите, выполним следующее преобразование:
ОбластьМакета.Параметры.АдресДоставки = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(АдресДоставки);
Если же адрес доставки берется напрямую из контактной информации партнера или контрагента, эффективнее сразу запросить готовое строковое представление через общий модуль:
ОбластьМакета.Параметры.АдресДоставки = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
Шапка.Партнер,
Справочники.ВидыКонтактнойИнформации.АдресДоставки,
Шапка.Дата,
Истина
);
ЗначениеЗаполнено() перед передачей в функции парсинга, чтобы избежать лишних вызовов процедур разбора пустых строк.УправлениеКонтактнойИнформацией доступны как на сервере, так и в толстом клиенте обычного приложения, поэтому их можно безопасно размещать в модулях менеджеров или модулях объектов документов.СформироватьПредставлениеАдресаЗаПределамиРФ(), однако общая функция ПолучитьПредставлениеАдресаПоСтрока() автоматически распознает признак адреса вне РФ и обработает его корректно.