Как в 1С:УПП 1.3 получить адреса сотрудников отдельными полями: город, улица, дом, квартира?

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

При подготовке списков сотрудников для контролирующих органов, банков или муниципальной администрации часто возникает требование предоставить адресные данные не одной длинной строкой, а в виде отдельных колонок: город (или населенный пункт), улица, дом, корпус, квартира. В типовых конфигурациях на платформе 1С:Предприятие 8.2 / 8.3 на обычных формах (таких как «Управление производственным предприятием 1.3» или «Зарплата и управление персоналом 2.5») в большинстве отчетов адрес выводится целиком.

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

Структура хранения адресов в 1С:УПП 1.3

Для правильного построения выборки выясним, в каких объектах конфигурации хранятся данные о сотрудниках и их адресах:

  1. Справочник «ФизическиеЛица» и Справочник «СотрудникиОрганизаций». Важно помнить, что контактная информация (включая адреса по прописке и проживанию) в системе привязывается именно к ФизическиеЛица, а не к конкретному трудовому договору или элементу справочника сотрудников.
  2. Регистр сведений «КонтактнаяИнформация». В этом регистре содержатся все телефоны, адреса и электронная почта. Он имеет следующие ключевые реквизиты:
    1. Объект — ссылка на физическое лицо.
    2. Тип — значение перечисления Перечисление.ТипыКонтактнойИнформации.Адрес.
    3. Вид — ссылка на справочник ВидыКонтактнойИнформации (например, «Юридический адрес физ. лица», который в пользовательском интерфейсе отображается как адрес по прописке).
    4. Поле1 – Поле9 — поля классификатора КЛАДР/ФИАС, где хранятся составные части адреса:
      1. Поле1 — Почтовый индекс;
      2. Поле2 — Регион / Область / Край;
      3. Поле3 — Район;
      4. Поле4 — Город;
      5. Поле5 — Населенный пункт (село, деревня, поселок);
      6. Поле6 — Улица;
      7. Поле7 — Номер дома;
      8. Поле8 — Корпус / строение;
      9. Поле9 — Номер квартиры / офиса.
    5. Представление — адрес, собранный в одну сплошную строку.
  3. Регистр сведений «РаботникиОрганизаций». Именно этот периодический регистр определяет, работает сотрудник на выбранную дату или уже уволен, в отличие от простого реквизита ДатаУвольнения, который может быть не заполнен или не отражать кадровых перемещений.

Анализ ошибок в базовом запросе

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


ВЫБРАТЬ
    СотрудникиОрганизаций.Физлицо КАК Физлицо,
    СотрудникиОрганизаций.ДатаУвольнения,
    КонтактнаяИнформация.Вид,
    КонтактнаяИнформация.Поле4 КАК Город,
    КонтактнаяИнформация.Поле5 КАК Село_Дер_Прочее,
    КонтактнаяИнформация.Поле6 КАК Улица,
    КонтактнаяИнформация.Поле7 КАК Дом,
    КонтактнаяИнформация.Поле8 КАК Корпус,
    КонтактнаяИнформация.Поле9 КАК Квартира,
    СотрудникиОрганизаций.Актуальность
ИЗ
    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
        ПО КонтактнаяИнформация.Объект.Ссылка = СотрудникиОрганизаций.Физлицо.Ссылка
ГДЕ
    СотрудникиОрганизаций.ДатаУвольнения = &ДатаУвольнения
    И КонтактнаяИнформация.Вид.Код = &Код
    И СотрудникиОрганизаций.Код МЕЖДУ &Номер И &Номер2
    И СотрудникиОрганизаций.Актуальность = &Актуальность
СГРУППИРОВАТЬ ПО
    СотрудникиОрганизаций.Физлицо,
    СотрудникиОрганизаций.ДатаУвольнения,
    КонтактнаяИнформация.Вид,
    КонтактнаяИнформация.Поле7,
    КонтактнаяИнформация.Поле9,
    КонтактнаяИнформация.Поле6,
    КонтактнаяИнформация.Поле4,
    КонтактнаяИнформация.Поле8,
    КонтактнаяИнформация.Поле5,
    СотрудникиОрганизаций.Актуальность
УПОРЯДОЧИТЬ ПО
    Физлицо

Проанализируем слабые места этого кода:

  1. Обращение через точку к реквизиту .Ссылка: конструкция КонтактнаяИнформация.Объект.Ссылка порождает лишнее соединение в СУБД, так как поле Объект уже содержит ссылку. Достаточно писать: КонтактнаяИнформация.Объект = СотрудникиОрганизаций.Физлицо.
  2. Определение работающих сотрудников по реквизиту ДатаУвольнения: в 1С:УПП состояние сотрудника является периодическим. Если сотрудник принят по совместительству, переведен или уволен задним числом, проверка реквизитов справочника даст неверные результаты. Кадровое состояние следует получать из регистра РегистрСведений.РаботникиОрганизаций.
  3. Дублирование строк при совместительстве: если один человек занимает две должности, в справочнике СотрудникиОрганизаций создано два элемента. Без отбора по уникальным физлицам адрес будет задвоен.
  4. Отбор по коду вида информации: условие КонтактнаяИнформация.Вид.Код = &Код зависит от нумерации в конкретной базе. Надежнее использовать предопределенные значения: ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресФизЛица).
  5. Избыточная группировка: блок СГРУППИРОВАТЬ ПО без агрегатных функций (СУММА, КОЛИЧЕСТВО) создает излишнюю нагрузку на сервер. Для исключения дублей достаточно указать ВЫБРАТЬ РАЗЛИЧНЫЕ.

Оптимальный запрос для консоли запросов и отчетов

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


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Работники.Физлицо КАК Физлицо,
    Работники.Физлицо.Наименование КАК ФИО,
    ВЫБОР
        КОГДА КонтактнаяИнформация.Поле4 <> "" ТОГДА КонтактнаяИнформация.Поле4
        ИНАЧЕ КонтактнаяИнформация.Поле5
    КОНЕЦ КАК Город_НаселенныйПункт,
    КонтактнаяИнформация.Поле6 КАК Улица,
    КонтактнаяИнформация.Поле7 КАК Дом,
    КонтактнаяИнформация.Поле8 КАК Корпус,
    КонтактнаяИнформация.Поле9 КАК Квартира
ИЗ
    РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ТекущаяДата, ) КАК Работники
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        ПО Работники.Физлицо = КонтактнаяИнформация.Объект
            И (КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресФизЛица))
            И (КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
ГДЕ
    Работники.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
    И (Работники.ПериодЗавершения = ДАТАВРЕМЯ(1, 1, 1)
        ИЛИ Работники.ПериодЗавершения > &ТекущаяДата)

УПОРЯДОЧИТЬ ПО
    ФИО

Разберем параметры этого запроса:

  1. &ТекущаяДата — дата, на которую проверяется факт работы сотрудника (например, ТекущаяДата() или конец отчетного месяца).
  2. Конструкция ВЫБОР КОГДА ... ИНАЧЕ ... КОНЕЦ гарантирует, что если поле Поле4 (Город) не заполнено (актуально для жителей сельской местности), в колонку попадет значение из поля Поле5 (Населенный пункт).
  3. Фильтр по ПериодЗавершения исключает сотрудников, у которых закончился срок временного перевода или трудового договора.

Получение данных через «Универсальный отчет» без программирования

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

  1. Откроем меню: Операции → Отчеты → Универсальный отчет (по регистрам, документам, справочникам).
  2. В шапке отчета выберем:
    1. Тип объекта: Регистр сведений;
    2. Объект: Контактная информация;
    3. Таблица: Основная.
  3. Нажмем кнопку Настройка и перейдем на вкладку Отбор:
    1. Добавим поле Тип со значением Адрес;
    2. Добавим поле Вид со значением Юридический адрес физ. лица;
    3. Добавим поле Объект.В архиве со значением Нет.
  4. На вкладке Колонки отключим лишние поля и оставим флаги напротив:
    1. Объект (ФИО сотрудника);
    2. Поле4 (Город);
    3. Поле6 (Улица);
    4. Поле7 (Дом);
    5. Поле9 (Квартира).
  5. Нажмем Сформировать. Полученную таблицу можно сохранить в формат Excel (Ctrl + S) для дальнейшей передачи в администрацию.

Программный парсинг адреса, введенного строкой

В ситуациях, когда адреса вносились пользователями вручную без использования адресного классификатора, поля Поле1–Поле9 могут оставаться пустыми, а данные содержатся только в реквизите Представление. В конфигурации 1С:УПП 1.3 для программного разбора адреса предусмотрены функции общего модуля УправлениеКонтактнойИнформацией:


// Пример программного разбора строкового адреса в структуру
СтрокаАдреса = Выборка.Представление;
ТаблицаКомпонентов = УправлениеКонтактнойИнформацией.РазложитьАдресВТаблицу(СтрокаАдреса);

// Извлечение необходимых полей из полученной таблицы
Для Каждого Стр Из ТаблицаКомпонентов Цикл
    Если Стр.Тип = "Город" Тогда
        Город = Стр.Значение;
    ИначеЕсли Стр.Тип = "Улица" Тогда
        Улица = Стр.Значение;
    ИначеЕсли Стр.Тип = "Дом" Тогда
        Дом = Стр.Значение;
    ИначеЕсли Стр.Тип = "Квартира" Тогда
        Квартира = Стр.Значение;
    КонецЕсли;
КонецЦикла;

Использование регистра сведений КонтактнаяИнформация в связке со срезом последних регистра РаботникиОрганизаций позволяет быстро и без искажения данных формировать точные списки адресов с разделением на любые требуемые реквизиты.

← На главную