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