При перегрузке или переносе данных из конфигураций прошлого поколения (например, 1С:ЗУП 2.5) в современные редакции (1С:ЗУП 3.1) специалисты часто сталкиваются с изменением формата хранения контактной информации. В ЗУП 2.5 адреса хранились в разобранном виде по отдельным строковым полям (дом, корпус, квартира, регион) или в устаревшем текстовом формате, тогда как в ЗУП 3 подсистема библиотеки стандартных подсистем (БСП) использует специальную XML-структуру (а в новых релизах — дополнительно и JSON) в поле ЗначенияПолей.
Рассмотрим подробнее, как корректно сформировать структуру контактной информации и перенести адреса физических лиц.
Если перенос осуществляется с помощью типовых механизмов, логику разбора адресов и формирования XML можно посмотреть непосредственно в самой конфигурации ЗУП 3. Все правила конвертации встроенных переносов расположены в общих макетах:
ОбщийМакет.ЗарплатаКадрыПереносДанныхИзЗУП25 — правила переноса из типовой ЗУП 2.5;ОбщийМакет.ЗарплатаКадрыПереносДанныхИзЗУП25КОРП — правила для КОРП-версии;ОбщийМакет.ЗарплатаКадрыПереносДанныхИзБП30 — правила переноса из Бухгалтерии предприятия.Изучив алгоритмы обработки контактной информации в этих макетах, можно увидеть, как стандартные процедуры раскладывают строковые поля адреса и собирают их в правильный формат для БСП.
Если требуется написать собственную обработку переноса или загрузки адресов из внешних источников, не обязательно собирать XML-строку вручную. В библиотеке стандартных подсистем предусмотрены функции общего модуля УправлениеКонтактнойИнформацией.
Разберем по шагам алгоритм программного заполнения табличной части КонтактнаяИнформация у объекта справочника (например, ФизическиеЛица или Сотрудники):
ТипыКонтактнойИнформации и справочника ВидыКонтактнойИнформации).УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению() генерируем корректную XML-структуру для поля ЗначенияПолей.УправлениеКонтактнойИнформацией.ПредыдущаяСтруктураКонтактнойИнформацииXML().КонтактнаяИнформация, включая вспомогательные колонки Страна, Регион, Город, Представление и ЗначенияПолей.Проанализируем пример кода, выполняющего описанный алгоритм:
Для Каждого Строка Из ТаблицаКонтактнаяИнформация Цикл
Тип = ПолучитьЗначениеПеречисления("ТипыКонтактнойИнформации", Строка.Тип);
Если Не ЗначениеЗаполнено(Строка.Вид) Тогда
Строка.Вид = ПолучитьВидКонтактнойИнформации(Строка.Вид_ИмяПредопределенного, Строка.Вид_Наименование, Тип, РодительВидаКИ);
КонецЕсли;
// Подготовка представления
Если Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
Представление = ?(Лев(Строка.Представление, 5) = "(495)", "+7 " + Строка.Представление, Строка.Представление);
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
Представление = Строка.Представление;
Представление = СтрЗаменить(Представление, "кв.", "квартира ");
Представление = СтрЗаменить(Представление, "оф.", "офис ");
// Генерация XML для поля ЗначенияПолей
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(Представление, Строка.Вид);
СтруктураКИ = УправлениеКонтактнойИнформацией.ПредыдущаяСтруктураКонтактнойИнформацииXML(ЗначенияПолей, Строка.Вид);
Если Строка.ВключатьСтрануВПредставление Тогда
Представление = СтруктураКИ.Страна + ", " + Представление;
КонецЕсли;
Иначе
Представление = Строка.Представление;
КонецЕсли;
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияXMLПоПредставлению(Представление, Строка.Вид);
// Добавление строки в табличную часть объекта
Если ЗначениеЗаполнено(Тип) И ЗначениеЗаполнено(Строка.Вид) И ЗначениеЗаполнено(ЗначенияПолей) Тогда
ОтобранныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Новый Структура("Тип, Вид", Тип, Строка.Вид));
Если ОтобранныеСтроки.Количество() > 0 Тогда
РедактируемаяСтрока = ОтобранныеСтроки[0];
Иначе
РедактируемаяСтрока = Объект.КонтактнаяИнформация.Добавить();
КонецЕсли;
РедактируемаяСтрока.Тип = Тип;
РедактируемаяСтрока.Вид = Строка.Вид;
РедактируемаяСтрока.ВидДляСписка = Строка.Вид;
РедактируемаяСтрока.Представление = Представление;
РедактируемаяСтрока.ЗначенияПолей = ЗначенияПолей;
// Дополнительные реквизиты для разных типов КИ
Если Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
РедактируемаяСтрока.АдресЭП = Представление;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
РедактируемаяСтрока.НомерТелефона = Представление;
РедактируемаяСтрока.НомерТелефонаБезКодов = Представление;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
РедактируемаяСтрока.Страна = ?(СтруктураКИ.Свойство("Страна"), СтруктураКИ.Страна, "");
РедактируемаяСтрока.Регион = ?(СтруктураКИ.Свойство("Регион"), СтруктураКИ.Регион, "");
РедактируемаяСтрока.Город = ?(СтруктураКИ.Свойство("Город"), СтруктураКИ.Город, "");
КонецЕсли;
КонецЕсли;
КонецЦикла;
При записи контактной информации обратите внимание на следующие нюансы:
1. Заполнение вспомогательных полей: Обязательно заполняйте реквизиты Страна, Регион и Город в табличной части. Если записать только XML-структуру в ЗначенияПолей, то в справочнике или формах отчетов адрес может отображаться не полностью.
2. Виды контактной информации: Реквизит Вид должен ссылаться на актуальные предопределенные элементы справочника ВидыКонтактнойИнформации целевой базы (например, АдресПоПропискеФизическиеЛица, ТелефонДомашнийФизическиеЛица).
3. Формат XML/JSON: БСП автоматически генерирует требуемую XDTO-схему при использовании стандартных методов модуля УправлениеКонтактнойИнформацией, поэтому ручное сшивание XML-строк через конкатенацию категорически не рекомендуется.