Каждый специалист, работающий с типовыми конфигурациями на платформе 1С:Предприятие 8.3 (такими как «1С:Бухгалтерия предприятия 3.0», «1С:Управление нашей фирмой» или «1С:Зарплата и управление персоналом»), рано или поздно сталкивается с загадочными сбоями в механизме контактной информации. Одна из наиболее распространенных и неприятных проблем — внезапное исчезновение возможности вводить и редактировать «Фактический адрес» и «Юридический адрес» в карточке контрагента. Поля просто пропадают с формы, а вместо них остается пустое место или только «Почтовый адрес».
В этой статье мы подробно разберем, почему возникает эта проблема, как устроена логика Библиотеки стандартных подсистем (БСП) в части ведения контактной информации, и проанализируем четыре практических способа восстановления работоспособности базы данных.
Прежде чем приступать к активным действиям, выясним причину происходящего. Вся контактная информация (адреса, телефоны, email) в современных конфигурациях 1С хранится и управляется через специальный справочник ВидыКонтактнойИнформации. В этом справочнике есть предопределенные группы и элементы, созданные разработчиками на уровне конфигуратора. Для контрагентов это группа СправочникКонтрагенты («Контактная информация справочника "Контрагенты"»), внутри которой находятся предопределенные элементы «Юридический адрес контрагента», «Фактический адрес контрагента» и другие.
В нормальном состоянии система жестко контролирует эти элементы. Однако после очередного обновления или, что происходит значительно чаще, после некорректного обмена данными (например, с «1С:Управление торговлей», «1С:Зарплата и управление персоналом» или через универсальный формат EnterpriseData) механизм дает сбой. Происходит следующее:
ИмяПредопределенныхДанных у группы или конкретных адресов. Для платформы 1С эти элементы мгновенно превращаются из системных в «пользовательские» — как будто их вручную создал обычный оператор в режиме «1С:Предприятие».ВидыКонтактнойИнформации. Если система обнаруживает группу КИ, которая потеряла связь со своими метаданными (то есть у нее очищено имя предопределенного элемента), программный код автоматически устанавливает реквизит Используется (в некоторых версиях — Использование) в значение Ложь.Теперь, когда мы понимаем физику процесса, рассмотрим пошагово методы лечения нашей базы данных. Перед выполнением любых процедур обязательно создайте резервную копию базы данных (файловый бэкап .1CD или выгрузку .dt)!
Если вы имеете доступ к запуску внешних обработок или можете выполнить произвольный код на сервере (например, через обработку «Групповое изменение реквизитов» в режиме разработчика или через «Групповую обработку объектов» с возможностью выполнения кода), этот способ будет самым быстрым. Нам необходимо принудительно вернуть элементам справочника их предопределенные системные имена и установить признак использования.
Рассмотрим код, который возвращает правильные настройки для группы «Контрагенты» и основных видов адресов:
// 1. Восстанавливаем предопределенную группу справочника "Контрагенты"
ГруппаКонтрагенты = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Контактная информация справочника ""Контрагенты""");
Если ЗначениеЗаполнено(ГруппаКонтрагенты) Тогда
ОбъектГруппы = ГруппаКонтрагенты.ПолучитьОбъект();
ОбъектГруппы.ИмяПредопределенныхДанных = "СправочникКонтрагенты";
ОбъектГруппы.Используется = Истина;
// Отключаем общие обработчики БСП при записи, чтобы избежать отката изменений
ОбъектГруппы.ОбменДанными.Загрузка = Истина;
ОбъектГруппы.Записать();
Сообщить("Предопределенное имя для группы успешно восстановлено!");
КонецЕсли;
// 2. Восстанавливаем предопределенный Юридический адрес
ЮрАдрес = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Юридический адрес контрагента", , ГруппаКонтрагенты);
Если ЗначениеЗаполнено(ЮрАдрес) Тогда
ОбъектЮр = ЮрАдрес.ПолучитьОбъект();
ОбъектЮр.ИмяПредопределенныхДанных = "ЮрАдресКонтрагента";
ОбъектЮр.Используется = Истина;
ОбъектЮр.ОбменДанными.Загрузка = Истина;
ОбъектЮр.Записать();
Сообщить("Предопределенное имя для Юридического адреса восстановлено!");
КонецЕсли;
// 3. Восстанавливаем предопределенный Фактический адрес
ФактАдрес = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Фактический адрес контрагента", , ГруппаКонтрагенты);
Если ЗначениеЗаполнено(ФактАдрес) Тогда
ОбъектФакт = ФактАдрес.ПолучитьОбъект();
ОбъектФакт.ИмяПредопределенныхДанных = "ФактАдресКонтрагента";
ОбъектФакт.Используется = Истина;
ОбъектФакт.ОбменДанными.Загрузка = Истина;
ОбъектФакт.Записать();
Сообщить("Предопределенное имя для Фактического адреса восстановлено!");
КонецЕсли;
Важное примечание: Использование свойства ОбменДанными.Загрузка = Истина критически важно. Оно блокирует запуск прикладных обработчиков БСП в модуле объекта при вызове метода Записать(), позволяя нам обойти системные проверки и насильно записать нужные значения реквизитов.
Если вы сомневаетесь в своих навыках написания кода или база полностью заблокирована для программного изменения подобных реквизитов, воспользуемся проверенным и абсолютно безопасным методом переноса эталонных настроек из чистой базы.
Разберем этот процесс по шагам:
\1c\ts).Виды контактной информации. Нажмите кнопку «Выгрузить» и сохраните данные в XML-файл на диске.При загрузке платформа сопоставит элементы по уникальным идентификаторам (UUID). Все поврежденные предопределенные элементы в рабочей базе обновят свои свойства, вернут признак предопределенности и правильные значения флагов использования. Этот метод гарантирует стопроцентное восстановление структуры справочника без необходимости программирования.
Разработчики Библиотеки стандартных подсистем предусмотрели процедуры для экстренного восстановления системных данных. Мы можем принудительно запустить фоновую процедуру обновления видов контактной информации по умолчанию.
Для этого нам понадобится открыть консоль для выполнения кода (например, внешнюю обработку «Групповое изменение реквизитов» в режиме разработчика, выбрав любой объект, перейдя в настройки и выбрав вкладку выполнения произвольного алгоритма) и выполнить следующую команду:
УправлениеКонтактнойИнформациейСлужебный.ЗаполнитьПредопределенныеВидыКонтактнойИнформации();
Этот метод заставит БСП заново обратиться к метаданным конфигурации, сопоставить все элементы справочника с программным кодом, проставить правильные индексы упорядочивания на формах и активировать скрытые группы, у которых слетели настройки использования.
Очень часто после «кривого» обмена данными в справочнике ВидыКонтактнойИнформации образуется хаос из дублирующих записей. Например, система видит два элемента «Юридический адрес контрагента» — один предопределенный (но отключенный), а второй пользовательский (активный, пришедший из другой базы). Из-за этого карточка контрагента перестает понимать, какое именно поле выводить на форму, и скрывает оба.
Выполним очистку справочника от дублей:
Виды контактной информации. Поля для сравнения можно оставить по умолчанию (сравнение по наименованию).После того как работоспособность базы восстановлена, адреса снова отображаются и редактируются в карточках контрагентов, важно предотвратить повторение сбоя. Источник этой проблемы всегда кроется во внешних обменах.
Проанализируйте настройки синхронизации данных. Если обмен настроен через правила конвертации (КД 2.0), убедитесь, что для справочника ВидыКонтактнойИнформации отключен поиск по внутреннему идентификатору (UUID) или настроена корректная синхронизация по наименованию и родителю. В идеале, этот справочник вообще следует исключить из обмена, так как его структура должна определяться исключительно конфигурацией конкретной информационной базы.