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