Как исправить ошибку «сведения о виде контактной информации были повреждены или некорректно заполнены» при сохранении карточки контрагента?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой IT и автоматизация бизнеса
← На главную

При попытке сохранить карточку контрагента или отредактировать контактные данные пользователи типовых конфигураций (1С:УНФ, 1С:Бухгалтерия, 1С:УТ, 1С:КА, 1С:ERP) могут столкнуться с критической ошибкой: «Сведения о виде контактной информации "" были повреждены или некорректно заполнены, т.к. обязательное поле тип не заполнено». При возникновении этого окна дальнейшее сохранение карточки блокируется, и форму можно закрыть только без сохранения внесенных изменений.

Разберем детально, почему возникает данный сбой, как провести диагностику базы данных и какими методами восстановить корректную работу справочника.

Причины возникновения ошибки

Механизм хранения контактной информации реализован на базе Библиотеки стандартных подсистем (БСП). Ошибка возникает в момент десериализации или валидации строк контактной информации в табличной части КонтактнаяИнформация объекта или при обращении к справочнику ВидыКонтактнойИнформации. Выясним ключевые предпосылки проблемы:

  1. Пустой реквизит «Тип» в справочнике видов КИ: В справочнике ВидыКонтактнойИнформации у одного или нескольких элементов реквизит Тип (значение перечисления ТипыКонтактнойИнформации) остался незаполненным. В пользовательском интерфейсе это поле программно блокируется от изменения после создания элемента, из-за чего исправить его вручную стандартным способом невозможно.
  2. Ошибки синхронизации и переноса данных: При регулярном обмене данными (например, между 1С:Бухгалтерией и 1С:УНФ) правила конвертации могут создавать новые нетиповые элементы видов контактной информации без правильного заполнения типа либо загружать строки с конкатенацией нескольких значений (например, два номера телефона, объединенные в одну строку представления), которые в принимающей конфигурации считаются некорректными.
  3. Повреждение XML-структуры контактных данных: Контактные данные хранятся в табличной части в виде форматированных XML/XDTO-строк. Если в результате программного сбоя, некорректной свертки или нетипового переноса в табличной части контрагента появилась строка с пустой ссылкой на вид или тип КИ, валидатор БСП аварийно завершает работу при открытии или сохранении карточки.

Шаг 1. Диагностика поврежденных записей через консоль запросов

Проанализируем состояние информационной базы. Для точного поиска некорректных данных выполним два запроса с помощью консоли запросов.

Сначала проверим справочник ВидыКонтактнойИнформации на наличие элементов с пустой ссылкой на тип:


ВЫБРАТЬ
    Ссылка,
    Наименование,
    Родитель,
    ПометкаУдаления
ИЗ
    Справочник.ВидыКонтактнойИнформации
ГДЕ
    Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка)

Затем проверим табличные части справочника Контрагенты, чтобы выявить строки с некорректными данными:


ВЫБРАТЬ
    Ссылка КАК Контрагент,
    НомерСтроки,
    Вид,
    Тип,
    Представление
ИЗ
    Справочник.Контрагенты.КонтактнаяИнформация
ГДЕ
    Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка)
    ИЛИ Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка)

Шаг 2. Исправление вида контактной информации с помощью внешней обработки

Если запрос показал наличие элементов справочника ВидыКонтактнойИнформации с незаполненным реквизитом Тип, исправим их программно. Создадим простую внешнюю обработку или выполним код во внешней обработке «Групповая обработка справочников и документов» / в обработке «Выполнение произвольного алгоритма»:


// Пример программного заполнения типа для поврежденного вида КИ
ВыбранныйВидКИ = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Юридический адрес");

Если ЗначениеЗаполнено(ВыбранныйВидКИ) Тогда
    ОбъектВидКИ = ВыбранныйВидКИ.ПолучитьОбъект();
    ОбъектВидКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
    ОбъектВидКИ.Записать();
КонецЕсли;

Если поврежденных элементов несколько, рассмотрим универсальный алгоритм обхода всех некорректных записей справочника:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Ссылка,
    |	Наименование
    |ИЗ
    |	Справочник.ВидыКонтактнойИнформации
    |ГДЕ
    |	Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка)";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    ОбъектВида = Выборка.Ссылка.ПолучитьОбъект();
    // Определяем тип на основе наименования или задаем адрес по умолчанию
    Если СтрНайти(ВРег(Выборка.Наименование), "ТЕЛЕФОН") > 0 Тогда
        ОбъектВида.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
    ИначеЕсли СтрНайти(ВРег(Выборка.Наименование), "EMAIL") > 0 Или СтрНайти(ВРег(Выборка.Наименование), "ПОЧТА") > 0 Тогда
        ОбъектВида.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
    Иначе
        ОбъектВида.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
    КонецЕсли;
    
    ОбъектВида.Записать();
КонецЦикла;

Шаг 3. Использование типовой обработки «Групповое изменение реквизитов»

Если под рукой нет средств разработки, используем штатный функционал программы:

  1. Перейдем в раздел Администрирование -> Обслуживание -> Корректировка данных -> Групповое изменение реквизитов.
  2. В поле «Изменять» выберем объект Виды контактной информации.
  3. Нажмем Дополнительные параметры и установим флажки Показывать служебные реквизиты и Разрешить редактирование предопределенных элементов.
  4. По кнопке «Добавить условие отбора» укажем: Тип Равно <Не заполнено>.
  5. В списке доступных реквизитов найдем поле Тип, установим напротив него флажок и выберем соответствующее значение перечисления (например, Адрес или Телефон).
  6. Нажмем Изменить реквизиты.

Шаг 4. Очистка поврежденных строк в табличной части контрагентов

Если повреждение находится непосредственно в табличной части контрагента (например, записана пустая строка или ссылка на удаленный вид КИ), удалим некорректные строки программно:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Ссылка КАК Контрагент
    |ИЗ
    |	Справочник.Контрагенты.КонтактнаяИнформация
    |ГДЕ
    |	Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка)
    |	ИЛИ Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка)";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    ОбъектКонтрагент = Выборка.Контрагент.ПолучитьОбъект();
    Индекс = ОбъектКонтрагент.КонтактнаяИнформация.Количество() - 1;
    
    Пока Индекс >= 0 Цикл
        СтрокаКИ = ОбъектКонтрагент.КонтактнаяИнформация[Индекс];
        Если НЕ ЗначениеЗаполнено(СтрокаКИ.Вид) Или НЕ ЗначениеЗаполнено(СтрокаКИ.Тип) Тогда
            ОбъектКонтрагент.КонтактнаяИнформация.Удалить(Индекс);
        КонецЕсли;
        Индекс = Индекс - 1;
    КонецЦикла;
    
    ОбъектКонтрагент.Записать();
КонецЦикла;

Рекомендации по предотвращению сбоя при синхронизации

Чтобы избежать повторного появления ошибки после очередного сеанса обмена данными между базами, проконтролируем следующие параметры:

  1. Поиск и удаление дублей: Запустим типовую обработку Поиск и удаление дублей для справочника Виды контактной информации. Если при переносе создались пользовательские дубликаты предопределенных видов (например, «Юридический адрес контрагента»), объединим их с оригинальными предопределенными элементами.
  2. Согласованность настроек множественности: В конфигурациях-источниках и приемниках проверим флаг «Разрешить ввод нескольких значений» для одинаковых видов контактной информации. Несогласованность этих правил приводит к слиянию строк в невалидный формат представления при переносе.
← На главную