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