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