При переносе данных между базами 1С:Бухгалтерия предприятия 3.0 с помощью стандартной обработки ВыгрузкаЗагрузкаДанныхXML83 технические специалисты часто сталкиваются с неприятной проблемой: справочник Контрагенты успешно переносится, но у созданных элементов полностью отсутствует контактная информация (адреса, телефоны, email). При этом в базе-источнике все реквизиты заполнены корректно, а базы имеют абсолютно идентичный релиз конфигурации.
В этой статье мы подробно разберем, почему «пропадают» адреса при переносе, как устроен механизм хранения контактной информации в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем), и рассмотрим пошаговые сценарии решения этой проблемы и предотвращения дублирования данных.
Для того чтобы понять причину сбоя, проанализируем внутреннюю структуру хранения контактных данных. В старых версиях конфигураций 1С (на платформе 8.2 и более ранних) для этого использовался отдельный регистр сведений. Однако в современных решениях на БСП, включая «Бухгалтерию предприятия 3.0», вся контактная информация хранится непосредственно в табличной части КонтактнаяИнформация самого справочника-владельца (в нашем случае — Контрагенты).
Каждая строка этой табличной части содержит следующие ключевые реквизиты:
ВидыКонтактнойИнформации. Это критически важный реквизит, определяющий конкретное назначение поля (например, «Юридический адрес контрагента» или «Фактический адрес контрагента»). Этот справочник заполняется предопределенными элементами на этапе инициализации информационной базы.СтраныМира (элемент «РОССИЯ»).Основная причина проблемы кроется в механизме работы платформы 1С v8.3 с предопределенными элементами. Разберем эту ситуацию по шагам.
Начиная с платформы 8.3, предопределенные элементы справочников создаются динамически при первом запуске информационной базы. Если две базы данных (источник и приемник) создавались независимо друг от друга (не через механизм РИБ), то для одних и тех же предопределенных элементов платформа генерирует абсолютно разные уникальные идентификаторы (UUID / GUID).
Когда мы выполняем перенос контрагентов с помощью обработки ВыгрузкаЗагрузкаДанныхXML83, происходит следующее:
КонтактнаяИнформация, где в реквизите Вид записан UUID вида контактной информации (например, «Юридический адрес») из базы-источника.СтраныМира. Например, создается дубликат предопределенной страны «РОССИЯ» с UUID из базы-источника.Контрагенты в базе-приемнике настроены на работу только с «родными» предопределенными элементами. Программа пытается вывести на форму поле «Юридический адрес», обращаясь к предопределенному элементу приемника. Но у загруженного контрагента строка КИ привязана к импортированному дублю. В результате поле на форме остается пустым, хотя физически данные в табличной части контрагента присутствуют.Именно из-за этого визуально ломается интерфейс карточки контрагента, пропадают нужные поля или, наоборот, появляются непредусмотренные реквизиты (например, «Рег. номер» или «Налоговый номер»), если произошел сбой в сопоставлении стран мира.
Если вы уже выполнили перенос данных и столкнулись с появлением дублирующихся элементов (например, две страны «РОССИЯ» или дубли видов контактной информации), стандартное объединение через обработку «Поиск и удаление дублей» не сработает. Платформа считает оба элемента предопределенными и заблокирует операцию удаления или изменения одного из них.
Чтобы решить эту задачу, нам потребуется временно снять признак предопределенности у дублирующего элемента, пришедшего из источника. Рассмотрим алгоритм действий:
Шаг 1. Напишем и запустим в базе-приемнике внешнюю обработку со следующим кодом для очистки имени предопределенных данных у дубликата:
// Выбираем дублирующийся элемент, который необходимо сделать обычным
СсылкаНаДубль = Справочники.СтраныМира.НайтиПоКоду("643"); // Код России
Если Не СсылкаНаДубль.Пустая() Тогда
ОбъектДубля = СсылкаНаДубль.ПолучитьОбъект();
// Снимаем признак предопределенности для платформы
ОбъектДубля.ИмяПредопределенныхДанных = "";
ОбъектДубля.Записать();
Сообщить("Признак предопределенности успешно снят с элемента: " + СсылкаНаДубль); КонецЕсли;
Шаг 2. После выполнения этого кода дублирующий элемент становится обычным элементом справочника с точки зрения платформы.
Шаг 3. Теперь откроем стандартную обработку Поиск и удаление дублей (раздел Администрирование — Обслуживание — Корректировка данных). Выберем нужный справочник, укажем правила поиска и выполним объединение. В качестве «Оригинала» обязательно укажем «родной» предопределенный элемент базы-приемника, а в качестве дубля — элемент с очищенным именем предопределенных данных. Программа автоматически заменит все ссылки в табличных частях КонтактнаяИнформация контрагентов, и адреса мгновенно появятся на формах.
Чтобы не заниматься ручным исправлением дублей после каждой выгрузки, мы можем предотвратить проблему на этапе переноса.
Рассмотрим использование современных версий обработки ВыгрузкаЗагрузкаДанныхXML.epf. В новых релизах этой обработки, входящих в состав дистрибутивов БСП, разработчики добавили встроенный механизм сопоставления предопределенных данных по имени (свойству ИмяПредопределенныхДанных), а не по жесткому UUID. Перед запуском выгрузки убедитесь, что вы используете самую актуальную версию этой обработки, скачанную с портала ИТС.
Если перенос выполняется через обработку УниверсальныйОбменДаннымиXML с использованием правил обмена, разработанных в программе «Конвертация данных 2.1», выполним следующие настройки в правилах конвертации объектов (ПКО):
ВидыКонтактнойИнформации и СтраныМира.КонтактнаяИнформация справочника Контрагенты настроим ПКС для свойства Вид так, чтобы поиск соответствующего вида КИ происходил по наименованию или родителю, исключая прямую передачу UUID.Благодаря этому при загрузке данных система определит, что предопределенный элемент уже существует в базе-приемнике (даже если у него другой UUID), и подставит правильную внутреннюю ссылку базы-приемника вместо создания дубликата.