При импорте сведений о сотрудниках или контрагентах из внешних систем (файлы Excel, веб-сервисы, сторонние базы данных) разработчики часто сталкиваются с необходимостью программного заполнения контактной информации. В конфигурациях на базе 1С:Предприятие 8 (таких как 1С:ЗУП 3.1, 1С:ERP или 1С:Комплексная автоматизация) адреса должны храниться в строгом соответствии с адресным классификатором. Если просто записать адрес в виде текстовой строки, программа пометит его как введенный в «свободной форме», что в дальнейшем сделает невозможным автоматическое заполнение регламентированной отчетности (например, ЕФС-1, 6-НДФЛ) из-за отсутствия правильных кодов ОКТМО, индексов и уникальных идентификаторов ФИАС/ГАР. Для организации считывания исходных таблиц можно использовать шаблон загрузки данных из табличного документа на базе БСП.
В этой статье мы подробно разберем, как программно сопоставить разрозненные элементы адреса (город, улица, дом, квартира) с адресным классификатором, автоматически определить почтовый индекс и корректно записать проверенный адрес в карточку физического лица.
Прежде чем перейти к написанию кода, разберем, как устроено хранение контактной информации в современных конфигурациях. За ведение КИ отвечает Библиотека стандартных подсистем (БСП). Вся контактная информация хранится в табличной части КонтактнаяИнформация соответствующего справочника (в нашем случае — ФизическиеЛица) либо в табличной части КонтактнаяИнформация связанных таблиц.
Адрес представляется в системе в двух видах:
Также важно помнить, что с августа 2021 года ФНС прекратила поддержку старого формата ФИАС. Современные решения 1С используют ГАР (Государственный адресный реестр), который поддерживает как административно-территориальное, так и муниципальное деление. Механизмы БСП автоматически учитывают эти изменения, поэтому крайне важно использовать типовые общие модули, а не пытаться делать сопоставление прямыми запросами к регистрам сведений адресных объектов. Для быстрого поиска нужных типовых процедур и функций подойдёт справочник по методам БСП с примерами использования.
Давайте подготовим структуру с исходными данными адреса. Часто на входе мы имеем текстовые поля без официальных сокращений (например, просто "Московская" вместо "Московская обл" или "Первомайская" вместо "Первомайская ул"). Механизмы БСП умеют распознавать названия улиц и регионов даже без жесткого указания типов объектов, но для повышения точности желательно передавать типы объектов отдельно, если они известны.
Создадим структуру для формирования адреса:
ПараметрыАдреса = Новый Структура;
ПараметрыАдреса.Вставить("Страна", "РОССИЯ");
ПараметрыАдреса.Вставить("Регион", "Тюменская обл");
ПараметрыАдреса.Вставить("Район", ""); // Заполняется, если есть
ПараметрыАдреса.Вставить("Город", "Тюмень г");
ПараметрыАдреса.Вставить("НаселенныйПункт", ""); // Заполняется для деревень/сел
ПараметрыАдреса.Вставить("Улица", "Первомайская ул");
ПараметрыАдреса.Вставить("Дом", "15");
ПараметрыАдреса.Вставить("Корпус", "");
ПараметрыАдреса.Вставить("Квартира", "10");
Очень часто во входящих данных отсутствует почтовый индекс. Давайте разберем, как программно определить почтовый индекс по имеющимся адресным сведениям с помощью типовых инструментов БСП. Для этого воспользуемся функциями обработки РасширенныйВводКонтактнойИнформации:
Функция ПолучитьПочтовыйИндекс(Знач ПараметрыАдреса) Экспорт
// Формируем промежуточный XML-адрес для анализа БСП
АдресXML = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ПараметрыАдреса, , Перечисления.ТипыКонтактнойИнформации.Адрес);
ПредставлениеАдреса = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(АдресXML, Перечисления.ТипыКонтактнойИнформации.Адрес);
// Преобразуем XML во внутренний объект XDTO для работы с контактной информацией
ХДТО = Обработки.РасширенныйВводКонтактнойИнформации.АдресXMLВXDTO(АдресXML, ПредставлениеАдреса);
ДанныеАдреса = ХДТО.Состав;
// Пытаемся получить индекс напрямую
ПочтовыйИндекс = Формат(Обработки.РасширенныйВводКонтактнойИнформации.ПочтовыйИндексАдреса(ДанныеАдреса), "ЧГ=");
// Если индекс не определен, задействуем механизм поиска по классификатору
Если Не ЗначениеЗаполнено(ПочтовыйИндекс) Тогда
ИндИОКТМО = Обработки.РасширенныйВводКонтактнойИнформации.ОпределитьПочтовыйИндексИОКТМОАдреса(ДанныеАдреса);
ПочтовыйИндекс = Формат(ИндИОКТМО.Индекс, "ЧГ=");
КонецЕсли;
Возврат ПочтовыйИндекс;
КонецФункции
Теперь рассмотрим, как выполнить валидацию подготовленного адреса на соответствие классификатору ГАР/ФИАС и записать его физическому лицу. Проверку будем выполнять с помощью функции РаботаСАдресами.ПроверитьАдрес. Запись адреса выполним наиболее надежным способом — через стандартный метод УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъекта.
Давайте объединим всю логику в одну процедуру:
Процедура ЗагрузитьАдресФизическогоЛица(ФизическоеЛицоСсылка, ПараметрыАдреса, ВидАдреса) Экспорт
// Шаг 3.1. Пытаемся определить почтовый индекс, если он не заполнен
Если Не ПараметрыАдреса.Свойство("Индекс") Или Не ЗначениеЗаполнено(ПараметрыАдреса.Индекс) Тогда
Индекс = ПолучитьПочтовыйИндекс(ПараметрыАдреса);
ПараметрыАдреса.Вставить("Индекс", Индекс);
КонецЕсли;
// Шаг 3.2. Генерируем XML-представление адреса
АдресXML = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ПараметрыАдреса, , Перечисления.ТипыКонтактнойИнформации.Адрес);
// Шаг 3.3. Проверяем адрес по классификатору ФИАС/ГАР
ПараметрыПроверки = Новый Структура;
ПараметрыПроверки.Вставить("ТолькоНациональныйАдрес", Истина);
ПараметрыПроверки.Вставить("ФорматАдреса", "ФИАС"); // Для современных конфигураций используйте ГАР
РезультатПроверки = РаботаСАдресами.ПроверитьАдрес(АдресXML, ПараметрыПроверки);
Если РезультатПроверки.Результат <> "Корректный" Тогда
ВызватьИсключение "Адрес не соответствует классификатору! Ошибка: " + РезультатПроверки.ОписаниеОшибки;
КонецЕсли;
// Шаг 3.4. Получаем официальное текстовое представление адреса
ПредставлениеАдреса = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(АдресXML, Перечисления.ТипыКонтактнойИнформации.Адрес);
// Шаг 3.5. Подготавливаем объект к записи КИ
ФизическоеЛицоОбъект = ФизическоеЛицоСсылка.ПолучитьОбъект();
// В зависимости от версии БСП, адрес может записываться в XML или JSON
// Преобразуем XML в JSON для современных версий конфигураций
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(АдресXML) Тогда
ЗначениеДляЗаписи = АдресXML;
Иначе
Попытка
ЗначениеДляЗаписи = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON(АдресXML);
Исключение
// Если конфигурация старая (например, старые релизы ЗУП 3.1.7), пишем XML-строку
ЗначениеДляЗаписи = АдресXML;
КонецПопытки;
КонецЕсли;
// Записываем КИ через стандартный программный интерфейс БСП
УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъекта(
ФизическоеЛицоОбъект,
ВидАдреса,
ЗначениеДляЗаписи,
ПредставлениеАдреса
);
// Сохраняем изменения в карточке физлица
ФизическоеЛицоОбъект.Записать();
КонецПроцедуры
Для вызова созданной процедуры нам необходимо передать ссылку на физическое лицо, заполненную структуру адреса и предопределенный элемент справочника ВидыКонтактнойИнформации. Давайте посмотрим на пример вызова:
// Определим физлицо, которому добавляем адреса
ФизЛицоРеф = Справочники.ФизическиеЛица.НайтиПоРеквизиту("ИНН", "770102030405");
Если ЗначениеЗаполнено(ФизЛицоРеф) Тогда
// 1. Готовим данные адреса по прописке
АдресПрописки = Новый Структура;
АдресПрописки.Вставить("Регион", "г Москва");
АдресПрописки.Вставить("Улица", "Тверская ул");
АдресПрописки.Вставить("Дом", "8");
АдресПрописки.Вставить("Квартира", "45");
ВидПрописка = Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица;
Попытка
ЗагрузитьАдресФизическогоЛица(ФизЛицоРеф, АдресПрописки, ВидПрописка);
Сообщить("Адрес по прописке успешно добавлен для " + ФизЛицоРеф);
Исключение
Предупреждение("Не удалось записать адрес прописки: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
При массовой загрузке адресов (например, при переносе тысяч сотрудников из исторических систем в ЗУП 3.1) локальный классификатор ГАР в базе данных может быть не обновлен или загружен не полностью из-за жестких требований к дисковому пространству. В таких ситуациях мы рекомендуем:
АдресныйКлассификатор.ИдентификаторыАдреса() позволяет отправлять запросы во внешнюю базу ФНС через Портал 1С:ИТС, возвращая точные GUID адресных объектов ГАР без необходимости держать терабайты данных локально.Используя приведенный шаблон кода, вы гарантируете, что все загруженные адреса будут корректно распознаваться платформой 1С, успешно проходить встроенные проверки и выгружаться в регламентированную отчетность без ручного вмешательства пользователей.