В процессе разработки отчетов в конфигурации ЗУП 3.1 часто возникает потребность вывести адрес сотрудника не одной длинной строкой (представлением), а разбить его на составляющие элементы: индекс, город, улицу и номер дома. Давайте разберем, почему эта задача требует специального подхода и как ее реализовать наиболее эффективно.
Важно понимать, что в типовых конфигурациях на базе БСП (Библиотеки стандартных подсистем), к которым относится и ЗУП 3.1, контактная информация хранится не в виде отдельных полей для каждого элемента адреса. Она сохраняется в реквизите ЗначенияПолей табличной части КонтактнаяИнформация в формате XML.
Попытки извлечь данные с помощью строковых функций запроса (например, ПОДСТРОКА или НАЙТИ) являются ошибочными. Структура XML может меняться, а сами поля могут отсутствовать, если адрес был введен «вручную» без использования адресного классификатора ФИАС. Поэтому мы будем использовать только штатные механизмы БСП.
Для того чтобы получить доступ к отдельным частям адреса, нам необходимо «разобрать» XML-строку. В ЗУП 3.1 для этого предусмотрены специализированные функции общего модуля ЗарплатаКадры и УправлениеКонтактнойИнформациейСлужебный. Рассмотрим основной способ получения структуры данных:
// Пример получения структуры адреса из строки XML
СтруктураАдреса = ЗарплатаКадры.СтруктураАдресаИзXML(ВашАдрес);
Индекс = СтруктураАдреса.Индекс;
Город = СтруктураАдреса.Город;
Улица = СтруктураАдреса.Улица;
Дом = СтруктураАдреса.Дом;
Здесь переменная ВашАдрес — это содержимое реквизита ЗначенияПолей из контактной информации конкретного физического лица. Получив объект Структура, мы можем обращаться к его ключам и извлекать нужные нам значения.
Когда мы работаем в Системе компоновки данных (СКД), возникает сложность: вычисляемые поля не поддерживают прямое обращение к методам структур через точку (например, выражение РаботаСАдресами.СведенияОбАдресе(Адрес).Город вызовет ошибку). Чтобы обойти это ограничение, выполним следующие шаги:
XML-строку и имя поля, а возвращает уже готовое строковое значение. Это позволит нам вызывать функцию непосредственно в выражении вычисляемого поля СКД.МойОбщийМодуль.ПолучитьЧастьАдреса(ЛичныеДанные.КонтактнаяИнформация.Адрес, "Город").Если вы не хотите вносить изменения в конфигурацию, существует альтернативный способ — постобработка результата запроса СКД в модуле объекта внешнего отчета. Процедура выглядит следующим образом:
Шаг 1: В процедуре ПриКомпоновкеРезультата сначала выполним запрос к СКД, получив данные во временную ТаблицуЗначений.
Шаг 2: Обходим полученную таблицу циклом, вызывая типовую функцию ЗарплатаКадры.СтруктураАдресаИзXML для каждой строки.
Шаг 3: Записываем извлеченные данные (город, улицу, дом) в соответствующие колонки таблицы.
Для Каждого СтрокаТЗ Из РезультатТаблица Цикл
СтруктураАдреса = ЗарплатаКадры.СтруктураАдресаИзXML(СтрокаТЗ.ЗначенияПолей);
СтрокаТЗ.Город = СтруктураАдреса.Город;
СтрокаТЗ.Улица = СтруктураАдреса.Улица;
КонецЦикла;
Шаг 4: Передаем доработанную таблицу в СКД в качестве внешнего набора данных.
При выполнении данной задачи помните о следующих нюансах:
ФИАС), поле ЗначенияПолей может быть пустым или не содержать нужных тегов. В этом случае функции разбора вернут пустые значения, и программа не сможет «додумать» город или улицу.БСП постоянно появляются новые функции для работы с контактной информацией (например, с учетом приказа Минфина или конвертации в JSON). Перед написанием своего кода всегда проверяйте наличие готовых процедур в общих модулях РаботаСАдресами и УправлениеКонтактнойИнформацией.Реализация этой задачи требует внимательности к формату данных, но благодаря встроенным библиотекам 1С, задача решается достаточно быстро и эффективно. Удачи в доработке отчетов! Для отладки запросов и выражений компоновки данных подойдет консоль СКД для работы с представлениями ЗУП 3.1.