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