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