При автоматизации загрузки данных из внешних файлов или сторонних систем часто возникает необходимость программно внести адресные данные физического лица в 1С. В современных типовых конфигурациях (например, 1С:Бухгалтерия предприятия 3.0) контактная информация хранится в специальном структурированном виде. Просто записать текстовую строку адреса в реквизит недостаточно — необходимо корректно сформировать внутреннее представление адреса для синхронизации с адресным классификатором (ФИАС / ГАР).
Рассмотрим подробнее, как устроена подсистема «Контактная информация» Библиотеки Стандартных Подсистем (БСП) и как с помощью штатных программных методов правильно записать адрес.
Проанализируем структуру хранения данных. В 1С контактная информация связывается с объектом-владельцем (справочник ФизическиеЛица или Контрагенты) и состоит из двух ключевых составляющих:
Если записать только текстовую строку, адрес перейдет в режим «свободной формы» и не будет согласован с загруженным классификатором. Чтобы этого избежать, мы должны использовать функции общего модуля УправлениеКонтактнойИнформацией.
Разберем по шагам, как преобразовать текстовое представление адреса в структурированные данные. В подсистеме БСП предусмотрена функция КонтактнаяИнформацияXMLПоПредставлению (или ее аналог для JSON в более новых версиях).
Обратите внимание на требование к входной строке: чтобы алгоритм распознавания 1С смог сопоставить элементы с классификатором без сброса в свободную форму, строковое представление должно соответствовать правилам наименования объектов (например, «Москва г, Ленина ул, дом 10, кв 5»).
Посмотрим на пример кода, с помощью которого можно сформировать структурированную запись и сохранить ее в регистр сведений контактной информации:
&НаСервереБезКонтекста
Процедура ЗаписатьАдресФизЛица(ПациентИлиФизЛицо, ТекстовыйАдрес, ВидАдреса)
// Получаем структурированную строку XML/JSON на основании текста и вида контактной информации
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(ТекстовыйАдрес, ВидАдреса);
// Создаем менеджер записи регистра сведений контактной информации
МенеджерЗаписи = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ПациентИлиФизЛицо;
МенеджерЗаписи.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
МенеджерЗаписи.Вид = ВидАдреса;
// Читаем существующую запись, если она есть
МенеджерЗаписи.Прочитать();
// Заполняем реквизиты адреса
МенеджерЗаписи.Представление = ТекстовыйАдрес;
МенеджерЗаписи.ЗначенияПолей = ЗначенияПолей;
// Сохраняем данные в базе
МенеджерЗаписи.Записать(Истина);
КонецПроцедуры
Если необходимо обработать массив физических лиц или исправить ранее загруженные неструктурированные данные, можно выполнить выборку из базы и обновить поля адресов в цикле.
Выясним, как выглядит обход записей с помощью запроса и последующая перезапись через менеджер записи:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КИ.Объект КАК Объект,
| КИ.Тип КАК Тип,
| КИ.Вид КАК Вид,
| КИ.Представление КАК Представление,
| КИ.ЗначенияПолей КАК ЗначенияПолей
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КИ
|ГДЕ
| КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Преобразуем текстовое представление в формат БСП
СформированныеЗначения = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(Выборка.Представление, Выборка.Вид);
// Записываем обновленные данные
МенеджерЗаписи = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.ЗначенияПолей = СформированныеЗначения;
МенеджерЗаписи.Записать(Истина);
КонецЕсли;
КонецЦикла;
УправлениеКонтактнойИнформацией и УправлениеКонтактнойИнформациейКлиентСервер. В них содержатся методы СформироватьЗаписьАдреса, СтруктураПолейАдреса и КонтактнаяИнформацияПоПредставлению, упрощающие работу со сложными объектами.ФизическиеЛица, нажав кнопку «Проверить заполнение».