Как в отчетах 1С:ЗУП 3.1 разбить адрес сотрудника на отдельные колонки?

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

В процессе разработки отчетов в конфигурации ЗУП 3.1 часто возникает потребность вывести адрес сотрудника не одной длинной строкой (представлением), а разбить его на составляющие элементы: индекс, город, улицу и номер дома. Давайте разберем, почему эта задача требует специального подхода и как ее реализовать наиболее эффективно.

Понимание структуры данных

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

Попытки извлечь данные с помощью строковых функций запроса (например, ПОДСТРОКА или НАЙТИ) являются ошибочными. Структура XML может меняться, а сами поля могут отсутствовать, если адрес был введен «вручную» без использования адресного классификатора ФИАС. Поэтому мы будем использовать только штатные механизмы БСП.

Решение через программные функции

Для того чтобы получить доступ к отдельным частям адреса, нам необходимо «разобрать» XML-строку. В ЗУП 3.1 для этого предусмотрены специализированные функции общего модуля ЗарплатаКадры и УправлениеКонтактнойИнформациейСлужебный. Рассмотрим основной способ получения структуры данных:


// Пример получения структуры адреса из строки XML
СтруктураАдреса = ЗарплатаКадры.СтруктураАдресаИзXML(ВашАдрес);
Индекс = СтруктураАдреса.Индекс;
Город  = СтруктураАдреса.Город;
Улица  = СтруктураАдреса.Улица;
Дом    = СтруктураАдреса.Дом;

Здесь переменная ВашАдрес — это содержимое реквизита ЗначенияПолей из контактной информации конкретного физического лица. Получив объект Структура, мы можем обращаться к его ключам и извлекать нужные нам значения.

Интеграция в отчеты на базе СКД

Когда мы работаем в Системе компоновки данных (СКД), возникает сложность: вычисляемые поля не поддерживают прямое обращение к методам структур через точку (например, выражение РаботаСАдресами.СведенияОбАдресе(Адрес).Город вызовет ошибку). Чтобы обойти это ограничение, выполним следующие шаги:

  1. Создадим собственную функцию-обертку: В общем серверном модуле напишем функцию, которая принимает XML-строку и имя поля, а возвращает уже готовое строковое значение. Это позволит нам вызывать функцию непосредственно в выражении вычисляемого поля СКД.
  2. Использование функции в СКД: В вычисляемых полях отчета укажем вызов нашей функции: МойОбщийМодуль.ПолучитьЧастьАдреса(ЛичныеДанные.КонтактнаяИнформация.Адрес, "Город").

Вариант с внешней обработкой или постобработкой

Если вы не хотите вносить изменения в конфигурацию, существует альтернативный способ — постобработка результата запроса СКД в модуле объекта внешнего отчета. Процедура выглядит следующим образом:

Шаг 1: В процедуре ПриКомпоновкеРезультата сначала выполним запрос к СКД, получив данные во временную ТаблицуЗначений.

Шаг 2: Обходим полученную таблицу циклом, вызывая типовую функцию ЗарплатаКадры.СтруктураАдресаИзXML для каждой строки.

Шаг 3: Записываем извлеченные данные (город, улицу, дом) в соответствующие колонки таблицы.


Для Каждого СтрокаТЗ Из РезультатТаблица Цикл
    СтруктураАдреса = ЗарплатаКадры.СтруктураАдресаИзXML(СтрокаТЗ.ЗначенияПолей);
    СтрокаТЗ.Город = СтруктураАдреса.Город;
    СтрокаТЗ.Улица = СтруктураАдреса.Улица;
КонецЦикла;

Шаг 4: Передаем доработанную таблицу в СКД в качестве внешнего набора данных.

Важные рекомендации и предостережения

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

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

← На главную