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