После обновления конфигурации «1С:Бухгалтерия предприятия 3.0» или выполнения синхронизации данных пользователи нередко сталкиваются с аварийным завершением работы программы при попытке открыть карточку контрагента либо создать нового партнера. В окне ошибки выводится сообщение вида: {ОбщийМодуль.УправлениеКонтактнойИнформацией.Модуль(1945)}: Поле объекта не обнаружено (ЗаголовокКонтактнаяИнформацияПоле1) СледующийЗаголовок = Форма.Элементы["Заголовок" + ИмяСледующегоРеквизита];. Разберем механику возникновения этой ошибки и подробно рассмотрим все проверенные варианты её устранения.
В подсистеме работы с контактной информацией Библиотеки стандартных подсистем (БСП) элементы пользовательского интерфейса (поля ввода, надписи, командные панели) создаются динамически при компоновке управляемой формы на сервере. Логика модуля последовательно обходит коллекцию доступных видов контактной информации и связывает их с визуальными элементами.
Сбой происходит по следующим ключевым причинам:
ВидыКонтактнойИнформации предусмотрен специальный служебный реквизит РеквизитДопУпорядочивания. При выполнении синхронизации или переноса данных из другой информационной базы свойство ОбменДанными.Загрузка устанавливается в значение Истина. В этом режиме платформенные подписки на события ПередЗаписью и ПриЗаписи отключаются. В результате реквизит упорядочивания остается незаполненным, и алгоритм динамического построения интерфейса путает порядок следования полей.УправлениеКонтактнойИнформацией используется жесткое обращение к коллекции формы по сформированному имени: Форма.Элементы["Заголовок" + ИмяСледующегоРеквизита]. Если элемент не был сгенерирован или порядок нарушен, обращение по индексу вызывает исключение, тогда как безопасный метод Найти() вернул бы Неопределено.КонтактнаяИнформация контрагента могут возникнуть дублирующие строки (например, несколько фактических или юридических адресов с одинаковым видом).Проанализируем самый простой и быстрый способ исправления, не требующий изменения конфигурации. Поскольку реквизит упорядочивания не заполнился при пакетной загрузке, нам необходимо инициировать штатную подписку на событие, которая вызовет процедуру заполнения порядка.
Рассмотрим порядок действий для перезаписи элементов:
Виды контактной информации, настроим отбор по родителю «Справочник "Контрагенты"» и выполним запись без изменения реквизитов.Для программистов доступно быстрое решение через внешнюю обработку или консоль кода. Запустим следующий фрагмент:
Выборка = Справочники.ВидыКонтактнойИнформации.Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектКИ = Выборка.ПолучитьОбъект();
Попытка
ОбъектКИ.Записать();
Исключение
Сообщить("Не удалось записать: " + Строка(ОбъектКИ));
КонецПопытки;
КонецЦикла;
При стандартной записи платформенный обработчик автоматически вызовет функцию НастройкаПорядкаЭлементов.ЗаполнитьЗначениеРеквизитаУпорядочивания(), и правильные индексы будут восстановлены.
Если простая перезапись не помогла, разберем ситуацию с порядком следования добавленных видов контактной информации. Все пользовательские элементы обязательно должны располагаться ниже предопределенных элементов системы.
Виды контактной информации.Нередко обмен данными создает дубли предопределенных элементов. Проверим базу на наличие лишних записей:
Виды контактной информации.Если ошибка возникает не у всех контрагентов, а только у определенных карточек, проанализируем данные конкретного объекта. Ошибка может крыться в троении строк адресов внутри табличной части КонтактнаяИнформация.
Напишем небольшую процедуру для обхода табличной части проблемного контрагента и устранения дублей:
КонтрагентОбъект = КонтрагентСсылка.ПолучитьОбъект();
ТаблицаКИ = КонтрагентОбъект.КонтактнаяИнформация.Выгрузить();
ТаблицаКИ.Свернуть("Вид, Тип", "ЗначенияПолей, Представление");
КонтрагентОбъект.КонтактнаяИнформация.Загрузить(ТаблицаКИ);
КонтрагентОбъект.Записать();
После удаления дубликатов строк динамический генератор формы снова сможет корректно сопоставить визуальные элементы с данными табличной части.
Если база находится на официальной поддержке и вносить изменения в основную конфигурацию нельзя, а проблему нужно устранить моментально для всех пользователей без правки данных, применим расширение конфигурации.
УправлениеКонтактнойИнформацией.&Вместо или &ИзменениеИКонтроль. Заменим жесткое обращение по индексу на безопасный поиск:
СледующийЗаголовок = Форма.Элементы.Найти("Заголовок" + ИмяСледующегоРеквизита);
Если СледующийЗаголовок <> Неопределено Тогда
// Штатная логика размещения элементов
КонецЕсли;
Такой подход защитит базу от критических ошибок даже в том случае, если в информационной базе продолжат циркулировать некорректные данные из внешних источников.