При работе с внешними отчетами в конфигурациях на базе 1С:Предприятие 8.1 и 8.2 (например, «Управление производственным предприятием» ред. 1.3), разработчики часто сталкиваются с неприятной особенностью платформы. После изменения или переименования реквизитов во внешнем отчете попытка сохранить настройки формы или варианта отчета может вызвать ошибку «Поле объекта не обнаружено (ИмяРеквизита)». При этом поиск по коду не дает результатов, а удаление записей из регистров настроек не помогает. Разберем детально, почему это происходит и как окончательно устранить проблему.
В обычных формах 1С механизм сохранения настроек тесно привязан к структуре метаданных формы. Когда мы сохраняем отчет из конфигурации на диск как внешний, он копирует не только визуальную часть, но и внутренние идентификаторы, включая Имя формы и внутренний UUID. Проанализируем ситуацию: если в конфигурации остался «родной» отчет с таким же именем формы, платформа может использовать кэшированную структуру именно того, встроенного объекта.
Ошибка «Поле объекта не обнаружено» возникает в момент, когда платформа пытается выполнить сериализацию значений формы в хранилище. Она обращается к списку сохраняемых значений, который был сформирован еще до переименования реквизита. Если физически реквизит с именем Представитель больше не существует (вы его переименовали, например, в КонтактноеЛицо), а в свойствах формы он все еще числится как «сохраняемый», возникает исключение.
Как показала практика опытных разработчиков, самым быстрым и действенным способом является принудительное изменение Имени формы в метаданных внешнего отчета. Проанализируем, почему это работает: при изменении имени формы создается новый уникальный ключ для сохранения настроек в системных таблицах 1С. Платформа перестает ассоциировать этот внешний отчет со старыми настройками встроенного отчета.
ФормаОтчета на ФормаОтчета_Новая).Если изменение имени формы по каким-то причинам нежелательно, проверим внутренние настройки самой формы. В обычном приложении у каждой формы есть свойство, отвечающее за автоматическое сохранение данных. Рассмотрим, как его проверить:
Сохранять значения.Сохраняемые значения.Этот шаг критически важен, так как именно этот список определяет, к каким полям объекта будет обращаться платформа при вызове стандартных механизмов СохранитьНастройку() и ВосстановитьНастройку().
Иногда проблема кроется в локальном кэше пользователя. Платформа 1С кэширует структуру метаданных для ускорения работы, и если вы часто перезаписываете один и тот же внешний файл отчета, кэш может «залипнуть». Выясним, как произвести глубокую очистку:
Во-первых, необходимо очистить временные файлы пользователя. Они находятся по пути:
%AppData%\1C\1Cv82\ (или 1Cv81)
Удалите папки с длинными буквенно-цифровыми именами (идентификаторами баз). Это заставит платформу заново пересчитать структуру метаданных внешнего отчета при его открытии.
Во-вторых, если в базе используется механизм «Настройки отчетов» (характерно для УПП), проверьте регистр сведений СохраненныеНастройки. Даже если вы удалили записи из справочника «Отчеты», записи в регистре могут остаться привязанными по UUID формы. Разберем пример кода для программной очистки «зависших» настроек конкретного отчета:
Процедура ОчиститьНастройкиОтчета(ИмяОтчета) Экспорт
Набор = РегистрыСведений.СохраненныеНастройки.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Установить(ИмяОтчета);
Набор.Записать();
Сообщить("Настройки для отчета " + ИмяОтчета + " успешно удалены.");
КонецПроцедуры
Рассмотрим еще один важный нюанс: Синоним и Имя самого отчета. Платформа 8.1/8.2 при формировании ключа сохранения может учитывать и эти параметры. Чтобы гарантированно избежать конфликтов с внутренними объектами конфигурации, рекомендуется:
вн_).ПередОткрытием или ПриОткрытии не используются жесткие ссылки на строковые имена реквизитов.Подводя итог, можно сказать, что ошибка «Поле объекта не обнаружено» при сохранении настроек в 90% случаев лечится изменением имени основной формы внешнего отчета. Это самый эффективный способ «сбросить» старые привязки метаданных. В остальных случаях помогает ревизия списка Сохраняемые значения в свойствах формы и очистка локального пользовательского кэша. Помните, что при копировании объектов из конфигурации во внешние файлы, они несут в себе «генетическую память» в виде старых идентификаторов, которую нужно обновлять вручную при изменении структуры реквизитов.