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