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