Как программно добавить и проверить адреса физических лиц по классификатору в 1С

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

При импорте сведений о сотрудниках или контрагентах из внешних систем (файлы Excel, веб-сервисы, сторонние базы данных) разработчики часто сталкиваются с необходимостью программного заполнения контактной информации. В конфигурациях на базе 1С:Предприятие 8 (таких как 1С:ЗУП 3.1, 1С:ERP или 1С:Комплексная автоматизация) адреса должны храниться в строгом соответствии с адресным классификатором. Если просто записать адрес в виде текстовой строки, программа пометит его как введенный в «свободной форме», что в дальнейшем сделает невозможным автоматическое заполнение регламентированной отчетности (например, ЕФС-1, 6-НДФЛ) из-за отсутствия правильных кодов ОКТМО, индексов и уникальных идентификаторов ФИАС/ГАР. Для организации считывания исходных таблиц можно использовать шаблон загрузки данных из табличного документа на базе БСП.

В этой статье мы подробно разберем, как программно сопоставить разрозненные элементы адреса (город, улица, дом, квартира) с адресным классификатором, автоматически определить почтовый индекс и корректно записать проверенный адрес в карточку физического лица.

Понимание архитектуры хранения адресов в БСП

Прежде чем перейти к написанию кода, разберем, как устроено хранение контактной информации в современных конфигурациях. За ведение КИ отвечает Библиотека стандартных подсистем (БСП). Вся контактная информация хранится в табличной части КонтактнаяИнформация соответствующего справочника (в нашем случае — ФизическиеЛица) либо в табличной части КонтактнаяИнформация связанных таблиц.

Адрес представляется в системе в двух видах:

  1. Представление — простая текстовая строка, которую видит пользователь на форме (например, "г. Москва, ул. Ленина, д. 5, кв. 12").
  2. Значения полей — структурированные данные. В старых версиях БСП (включая ЗУП до релиза 3.1.14) использовалась структурированная строка в формате XML. В современных версиях БСП основным форматом стал JSON.

Также важно помнить, что с августа 2021 года ФНС прекратила поддержку старого формата ФИАС. Современные решения 1С используют ГАР (Государственный адресный реестр), который поддерживает как административно-территориальное, так и муниципальное деление. Механизмы БСП автоматически учитывают эти изменения, поэтому крайне важно использовать типовые общие модули, а не пытаться делать сопоставление прямыми запросами к регистрам сведений адресных объектов. Для быстрого поиска нужных типовых процедур и функций подойдёт справочник по методам БСП с примерами использования.

Шаг 1. Формирование исходной структуры адреса

Давайте подготовим структуру с исходными данными адреса. Часто на входе мы имеем текстовые поля без официальных сокращений (например, просто "Московская" вместо "Московская обл" или "Первомайская" вместо "Первомайская ул"). Механизмы БСП умеют распознавать названия улиц и регионов даже без жесткого указания типов объектов, но для повышения точности желательно передавать типы объектов отдельно, если они известны.

Создадим структуру для формирования адреса:


ПараметрыАдреса = Новый Структура;
ПараметрыАдреса.Вставить("Страна", "РОССИЯ");
ПараметрыАдреса.Вставить("Регион", "Тюменская обл");
ПараметрыАдреса.Вставить("Район", ""); // Заполняется, если есть
ПараметрыАдреса.Вставить("Город", "Тюмень г");
ПараметрыАдреса.Вставить("НаселенныйПункт", ""); // Заполняется для деревень/сел
ПараметрыАдреса.Вставить("Улица", "Первомайская ул");
ПараметрыАдреса.Вставить("Дом", "15");
ПараметрыАдреса.Вставить("Корпус", "");
ПараметрыАдреса.Вставить("Квартира", "10");

Шаг 2. Получение почтового индекса по элементам адреса

Очень часто во входящих данных отсутствует почтовый индекс. Давайте разберем, как программно определить почтовый индекс по имеющимся адресным сведениям с помощью типовых инструментов БСП. Для этого воспользуемся функциями обработки РасширенныйВводКонтактнойИнформации:


Функция ПолучитьПочтовыйИндекс(Знач ПараметрыАдреса) Экспорт
    // Формируем промежуточный XML-адрес для анализа БСП
    АдресXML = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ПараметрыАдреса, , Перечисления.ТипыКонтактнойИнформации.Адрес);
    ПредставлениеАдреса = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(АдресXML, Перечисления.ТипыКонтактнойИнформации.Адрес);
    
    // Преобразуем XML во внутренний объект XDTO для работы с контактной информацией
    ХДТО = Обработки.РасширенныйВводКонтактнойИнформации.АдресXMLВXDTO(АдресXML, ПредставлениеАдреса);
    ДанныеАдреса = ХДТО.Состав;
    
    // Пытаемся получить индекс напрямую
    ПочтовыйИндекс = Формат(Обработки.РасширенныйВводКонтактнойИнформации.ПочтовыйИндексАдреса(ДанныеАдреса), "ЧГ=");
    
    // Если индекс не определен, задействуем механизм поиска по классификатору
    Если Не ЗначениеЗаполнено(ПочтовыйИндекс) Тогда
        ИндИОКТМО = Обработки.РасширенныйВводКонтактнойИнформации.ОпределитьПочтовыйИндексИОКТМОАдреса(ДанныеАдреса);
        ПочтовыйИндекс = Формат(ИндИОКТМО.Индекс, "ЧГ=");
    КонецЕсли;
    
    Возврат ПочтовыйИндекс;
КонецФункции

Шаг 3. Проверка адреса по классификатору и запись в объект

Теперь рассмотрим, как выполнить валидацию подготовленного адреса на соответствие классификатору ГАР/ФИАС и записать его физическому лицу. Проверку будем выполнять с помощью функции РаботаСАдресами.ПроверитьАдрес. Запись адреса выполним наиболее надежным способом — через стандартный метод УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъекта.

Давайте объединим всю логику в одну процедуру:


Процедура ЗагрузитьАдресФизическогоЛица(ФизическоеЛицоСсылка, ПараметрыАдреса, ВидАдреса) Экспорт
    
    // Шаг 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С, успешно проходить встроенные проверки и выгружаться в регламентированную отчетность без ручного вмешательства пользователей.

← На главную