Как разобрать адрес контрагента на составляющие в СКД

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

При разработке отчетов в 1С:Управление торговлей 11.4 (и других конфигурациях на базе БСП) часто возникает задача вывести адрес не одной строкой, а раздельно по колонкам: индекс, регион, город, улица, номер дома и квартиры. Стандартное поле Представление в контактной информации для этого не подходит, так как оно содержит неструктурированный текст. Разберем подробно, как решить эту задачу в системе компоновки данных (СКД), используя встроенные механизмы платформы и программный код.

Постановка задачи и выбор подхода

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

  1. Представление: готовая текстовая строка (например, "101000, Москва г, ул Покровка, дом 1").
  2. ЗначенияПолей: структурированная строка в формате XML или JSON, содержащая детальные идентификаторы ФИАС и разбитые части адреса.

Для корректного разбора нам необходимо работать именно с полем ЗначенияПолей. Рассмотрим три основных способа реализации этой задачи.

Способ 1. Использование вычисляемых полей и функций общего модуля

Проанализируем самый гибкий метод, который позволяет разбирать адрес прямо «на лету» в процессе формирования отчета. В СКД можно вызвать функцию общего модуля, передать ей структурированную строку адреса и получить нужный компонент.

Шаг 1. Создание функции в общем модуле или расширении

Поскольку нам нужно вызывать функцию из СКД, она должна быть Экспортной и находиться в модуле с установленными флагами Сервер и Вызов сервера. Если вы не хотите менять типовую конфигурацию, создайте расширение и добавьте туда новый общий модуль (например, Расш1_РаботаСАдресами).

Пример программного кода для разбора JSON-структуры адреса:


Функция ПолучитьЧастьАдреса(Значение, Часть) Экспорт
    
    Если НЕ ЗначениеЗаполнено(Значение) Тогда
        Возврат "";
    КонецЕсли;
    
    Попытка
        // В новых версиях БСП адрес хранится в формате JSON
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(Значение);    
        Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
        ЧтениеJSON.Закрыть();
        
        Если Часть = "Индекс" Тогда
            Возврат Данные.ZIPcode;
        ИначеЕсли Часть = "Регион" Тогда
            Возврат Данные.area;
        ИначеЕсли Часть = "Город" Тогда
            // Проверяем город или населенный пункт
            Возврат ?(ЗначениеЗаполнено(Данные.city), Данные.city, Данные.locality);
        ИначеЕсли Часть = "Улица" Тогда
            Возврат Данные.street;
        ИначеЕсли Часть = "Дом" Тогда
            Возврат Данные.houseNumber;
        КонецЕсли;
    Исключение
        // Если формат не JSON (например, старый XML), используем стандартные методы БСП
        Сведения = РаботаСАдресами.СведенияОбАдресе(Значение);
        Если Часть = "Индекс" Тогда Возврат Сведения.Индекс;
        ИначеЕсли Часть = "Регион" Тогда Возврат Сведения.Регион;
        ИначеЕсли Часть = "Город" Тогда Возврат Сведения.Город;
        ИначеЕсли Часть = "Улица" Тогда Возврат Сведения.Улица;
        ИначеЕсли Часть = "Дом" Тогда Возврат Сведения.Дом;
        КонецЕсли;
    КонецПопытки;
    
    Возврат "";
    
КонецФункции

Шаг 2. Настройка СКД

Рассмотрим порядок действий в конструкторе схемы компоновки данных:

  1. В наборе данных (запросе) обязательно выберите поле ЗначенияПолей из таблицы контактной информации партнеров.
  2. Перейдите на закладку Вычисляемые поля.
  3. Добавьте новое поле (например, Город).
  4. В колонке Выражение пропишите вызов вашей функции: Расш1_РаботаСАдресами.ПолучитьЧастьАдреса(ЗначенияПолей, "Город").
  5. Повторите действия для всех необходимых частей адреса (Индекс, Улица и т.д.).

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

Выясним, как упростить задачу, если в вашей конфигурации уже есть мощные механизмы Библиотеки стандартных подсистем (БСП). Вместо написания своего парсера JSON, в выражении вычисляемого поля СКД можно попробовать вызвать типовые функции.

Посмотрим на примеры функций, которые часто доступны в общем модуле РаботаСАдресами или КонтактнаяИнформацияСлужебный:

Важный нюанс: Стандартная функция СведенияОбАдресе возвращает структуру. Платформа 1С в СКД позволяет обращаться к свойствам структур через точку, но это может работать не во всех версиях или требовать предварительной проверки на NULL.

Способ 3. Подготовка данных в Объектной схеме (ТЗ)

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

В этом случае эффективнее использовать следующий алгоритм:

  1. Получите все данные запросом во временную таблицу.
  2. Выгрузите результат запроса в ТаблицуЗначений.
  3. Обойдите таблицу циклом и заполните колонки адреса, используя пакетный метод КонтактнаяИнформацияСлужебный.СформироватьПредставленияСлужебный(). Это гораздо быстрее, чем парсить каждую строку отдельно.
  4. Передайте готовую ТаблицуЗначений в СКД как Набор данных - объект.

Типичные ошибки при разборе адреса

Разберем основные трудности, с которыми сталкиваются разработчики:

Таким образом, самым надежным способом является сочетание использования вычисляемых полей СКД и экспортной функции, которая умеет обрабатывать как современный JSON-формат, так и старый XML, опираясь на стандартные возможности БСП.

← На главную