Как правильно вывести адрес доставки в печатную форму в 1С без лишних запятых?

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

При доработке типовых печатных форм (например, счета на оплату или заказа покупателя) разработчики часто сталкиваются с ситуацией, когда добавленный в макет адрес выводится в искаженном виде. Вместо привычной строки на печать выходит текст с множеством запятых и суффиксами: ,4000000, Нская обл, , Нск г, , 18 км рзд, 10, , 7, дом, корпус, кв.. Разберем по шагам, почему возникает эта ошибка и как программно получить красивое, человекочитаемое представление адреса.

Выясним причину некорректного вывода

В конфигурациях 1С (особенно классических версиях, таких как Управление торговлей 10.3, Управление производственным предприятием 1.3 и Комплексная автоматизация 1.1) строковый реквизит АдресДоставки хранит данные в сериализованном позиционном формате классификатора адресов (КЛАДР). В этой строке каждая позиция строго зафиксирована и отделена запятой:

[Индекс], [КодРегиона], [Регион], [Район], [Город], [НаселенныйПункт], [Улица], [Дом], [Корпус], [Квартира], [ТипДома], [ТипКорпуса], [ТипКвартиры]

Если в коде формирования печатной формы написать прямое присвоение:

ОбластьМакета.Параметры.АдресДоставки = АдресДоставки;

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

Способ 1. Решение для обычных форм (УТ 10.3, УПП 1.3, КА 1.1)

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

Разберем реализацию в коде формирования печатной формы:


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

Как работает данный метод внутри платформы:

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

Способ 2. Решение для конфигураций на Библиотеке Стандартных Подсистем (БСП)

Если разработка ведется в современных конфигурациях на управляемых формах (Управление торговлей 11, ERP, КА 2), адресная информация обычно хранится в формате XML/JSON или привязана к контактной информации партнеров и контрагентов. В этом случае применяются другие штатные механизмы.

Если адрес хранится в сериализованном виде в строковом реквизите, выполним следующее преобразование:


ОбластьМакета.Параметры.АдресДоставки = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(АдресДоставки);

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


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

Нюансы и рекомендации при работе с адресами

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