Почему 1С пишет «Поле объекта не обнаружено» и как найти виновника
Содержание
Поле объекта не обнаружено (Склад) означает одно: программный код обратился к свойству, которого у объекта нет. В скобках 1С пишет имя этого свойства, а перед двоеточием — модуль и номер строки, где сломалось. Исправляют не базу, а код или обработку, которые просят несуществующее поле.
Частое заблуждение — считать, что в базе «испортились метаданные» и надо срочно запускать тестирование и исправление. На практике чаще виноваты внешняя печатная форма, расширение или правила обмена, написанные под другой релиз конфигурации. Тестирование базы почти никогда не лечит эту ошибку, и о нём — в последнюю очередь.
Что значит ошибка «Поле объекта не обнаружено» в 1С
В 1С у каждого объекта есть набор свойств: реквизиты справочника, колонки таблицы значений, ключи структуры, поля выборки запроса. Код пишет Документ.Склад и ожидает, что такое свойство есть. Если его нет — платформа останавливает выполнение и показывает эту ошибку.
Типичный текст целиком выглядит так:
{ВнешняяОбработка.ПечатьТТН.МодульОбъекта(214)}: Поле объекта не обнаружено (СкладОтправитель)
Здесь всё, что нужно для диагностики:
- 📍
ВнешняяОбработка.ПечатьТТН— где лежит код (внешняя обработка, а не типовая конфигурация); - 🔢
(214)— номер строки в модуле; - 🏷️
СкладОтправитель— имя поля, которого не нашлось.
Какие объекты чаще всего «теряют» поле
| Что в коде | Почему поля нет |
|---|---|
| Реквизит справочника или документа | реквизит удалили или переименовали в новом релизе |
Неопределено.Наименование | переменная пустая, а код ждал ссылку |
| Ссылка другого типа | в реквизите составного типа лежит не тот объект |
| Ключ структуры | структуру собрали без этого ключа |
| Колонка таблицы значений | колонку не добавили или назвали иначе |
| Поле выборки запроса | в тексте запроса нет такого поля в ВЫБРАТЬ |
Последние четыре строки — чистые ошибки кода. Первая — несовместимость версий.
Чем отличается от похожих сообщений
Метод объекта не обнаружен (Записать)— та же природа, но речь о методе, а не о свойстве.Поле не найдено "Т.Склад"— ошибка в тексте запроса, её выдаёт механизм запросов при разборе текста.<Объект не найден>— битая ссылка в данных, это другая проблема, её ищут через поиск ссылок.
Как найти место ошибки: режим Предприятия и Конфигуратор
Шаг 1. Получите полный текст
- В окне ошибки нажмите ссылку Подробно (или «Подробный текст ошибки»).
- Скопируйте текст целиком, со стеком вызовов.
- Посмотрите на первую строку стека: имя модуля подскажет источник.
Расшифровка по началу строки:
ВнешняяОбработка.…илиВнешнийОтчет.…— подключённая извне обработка или отчёт;Расширение…или имя модуля с префиксом расширения — код расширения конфигурации ;Документ.…,Справочник.…,ОбщийМодуль.…— код самой конфигурации;ОбработкаОбъект.КонвертацияОбъектовИнформационныхБази похожие — механизм обмена по правилам.
Шаг 2. Воспроизведите ошибку под отладкой
Если доступ к Конфигуратору есть, проще всего поймать ошибку живьём:
- Откройте базу в Конфигураторе.
- В меню
ОтладкавключитеОстановка по ошибкеи отметьте нужный вид ошибок. - Запустите Предприятие через
Отладка → Начать отладку. - Повторите действие, которое вызывало ошибку.
Отладчик остановится на проблемной строке. Наведите курсор на переменную слева от точки и посмотрите её тип и значение. Ответ обычно сразу виден: там Неопределено, ссылка не на тот справочник или структура без нужного ключа.
Для внешней обработки откройте её файл .epf через Файл → Открыть в том же Конфигураторе и поставьте точку останова на строке из текста ошибки.
Шаг 3. Проверьте, есть ли поле в метаданных
Найдите объект в дереве конфигурации и откройте список его реквизитов и табличных частей. Нет поля с таким именем — значит, код написан под другую версию конфигурации. Поле есть — ищите проблему в данных или в типе переменной.
Поле объекта не обнаружено после обновления конфигурации
Обновление — самая частая точка, после которой ошибка «вдруг» появляется. Разработчики типовых конфигураций регулярно переименовывают реквизиты, переносят их в регистры сведений или в табличные части. Типовой код при этом поправлен, а всё, что подключено сбоку, — нет.
Что проверить по порядку:
- Обновление завершено. После загрузки нового релиза в Конфигураторе должна пройти команда
Конфигурация → Обновить конфигурацию базы данных(F7). Затем при первом запуске Предприятия отрабатывает обработчик обновления. Если его прервали, часть данных осталась в старом виде. - Кэш клиента. Старые метаданные могут остаться в кэше на компьютере пользователя. Запустите 1С с параметром
/ClearCacheили очистите кэш вручную при закрытой программе. - Доработки. Если конфигурация снята с поддержки и в ней есть свой код, при обновлении через объединение мог остаться старый фрагмент, обращающийся к удалённому реквизиту.
- Внешние обработки и расширения — им посвящён следующий раздел.
Строка запуска с очисткой кэша:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /ClearCache
Очищайте кэш только при закрытой 1С на этом компьютере. На других пользователей это не влияет, сеансы на сервере не обрываются.
Если конфигурация доработана
Откройте Конфигурация → Сравнить конфигурации и сравните основную конфигурацию с конфигурацией поставщика. Ищите в отчёте свои изменения в том модуле, который указан в тексте ошибки. Строку с удалённым реквизитом нужно переписать под новую структуру: найти, куда разработчики перенесли данные, и обращаться туда.
Внешние обработки, печатные формы и расширения
Это главный источник ошибки в обслуживаемых базах. Внешняя печатная форма, купленная три года назад, честно работала, пока в документе был реквизит Грузоотправитель. Новый релиз его переименовал — и форма падает при каждой печати.
Внешние обработки и отчёты
В 1С:Бухгалтерии 3.0 подключённые обработки лежат здесь: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
- Найдите обработку по имени из текста ошибки.
- Временно поставьте ей публикацию «Отключена», чтобы пользователи не натыкались на сбой.
- Запросите у автора версию под ваш релиз конфигурации.
- Если автора нет — передайте программисту текст ошибки целиком: правка обычно сводится к замене имени реквизита в одной-двух строках.
Расширения конфигурации
Расширения устроены так же: они знают имена реквизитов основной конфигурации на момент своей разработки. Список расширений в БП 3.0: Администрирование → Печатные формы, отчеты и обработки → Расширения.
- 🔌 Снимите флажок «Активно» у подозрительного расширения и перезапустите сеанс.
- ✅ Ошибка ушла — виновник найден, расширение нужно адаптировать к релизу.
- ❌ Ошибка осталась — верните флажок и ищите дальше.
Перед обновлением типовой конфигурации выпишите все внешние обработки и расширения. После обновления проверьте каждую на тестовой копии базы — это дешевле, чем разбирать ошибки у пользователей.
Ошибка при обмене данными и работе с внешними источниками
При обмене между базами ошибка возникает, когда одна сторона ждёт поле, которого у другой нет. Сценарии:
- 🔄 Обмен по правилам конвертации. Правила
.xmlописывают, какой реквизит куда переносить. Обновили одну из баз — в правилах остались старые имена. - 🔗 Обмен между разными релизами. Например, БП обновили, а связанную УТ — нет. Формат обмена разошёлся.
- 🧩 COM-соединение и внешние скрипты. Скрипт подключается к базе и читает
Объект.ИмяРеквизита, написанный под прошлую структуру. - 📥 Внешние источники данных. Таблица во внешней СУБД изменилась, а описание источника в конфигурации осталось прежним.
Что делать:
- По тексту ошибки определите, в какой базе она возникла: при выгрузке или при загрузке.
- Сверьте релизы обеих конфигураций. Для типовых синхронизаций разработчики указывают совместимые версии в документации к релизу.
- Для обмена по собственным правилам — выгрузите правила из «Конвертации данных» заново под текущие версии метаданных обеих баз.
- Для внешнего источника — обновите описание таблицы источника в Конфигураторе, чтобы набор полей совпал с реальной таблицей.
Не запускайте повторную загрузку пакета обмена «на авось» после правки правил. Сначала проверьте на копии: частично загруженный пакет может создать дубли.
Ошибка в собственном коде: как исправить надёжно
Если ошибка в вашем модуле, исправление зависит от того, что именно оказалось на месте объекта.
Переменная пустая или другого типа
Самый частый случай — реквизит составного типа. В поле «Контрагент» может лежать и контрагент, и физлицо, и Неопределено. Код ждёт ИНН у контрагента, а получает пустое значение.
Если ТипЗнч(Документ.Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
ИНН = Документ.Контрагент.ИНН;
Иначе
ИНН = "";
КонецЕсли;
Обращение к реквизиту у Неопределено всегда даёт эту ошибку. Поэтому проверку типа ставят до точки, а не после.
Структура без ключа
Если Параметры.Свойство("Склад") Тогда
Склад = Параметры.Склад;
КонецЕсли;
Метод Свойство() возвращает Истина, если ключ есть. Его же удобно использовать с выходным параметром: Параметры.Свойство("Склад", Склад).
Колонка таблицы значений
Если Таблица.Колонки.Найти("Склад") <> Неопределено Тогда
Склад = СтрокаТаблицы.Склад;
КонецЕсли;
Есть ли реквизит у объекта метаданных
Когда код должен работать с разными релизами конфигурации, проверяйте наличие реквизита через метаданные:
ЕстьАртикул = Метаданные.Справочники.Номенклатура.Реквизиты.Найти("Артикул") <> Неопределено;
Для произвольного объекта есть приём с маркером: в структуру кладут уникальное значение и заполняют её свойствами объекта. Если значение не изменилось — свойства у объекта нет.
Маркер = Новый УникальныйИдентификатор;
Проверка = Новый Структура("Склад", Маркер);
ЗаполнитьЗначенияСвойств(Проверка, ДокументОбъект);
ЕстьСклад = (Проверка.Склад <> Маркер);
Поле выборки запроса
Выборка.Склад падает, если в тексте запроса нет поля с псевдонимом Склад. Проверьте секцию ВЫБРАТЬ и псевдонимы после КАК. После правки текста запроса в конструкторе псевдоним иногда меняется автоматически — например, на Склад1.
| Ситуация | Чем проверить до обращения |
|---|---|
| Составной тип | ТипЗнч() |
| Структура | Свойство() |
| Таблица значений | Колонки.Найти() |
| Реквизит в метаданных | Метаданные….Реквизиты.Найти() |
| Произвольный объект | ЗаполнитьЗначенияСвойств с маркером |
Нужно ли тестировать и исправлять базу
«Поле объекта не обнаружено» — ошибка выполнения кода, а не повреждения таблиц. Поэтому Администрирование → Тестирование и исправление в Конфигураторе почти никогда её не убирает.
Запускать тестирование есть смысл в двух случаях:
- 🧱 после аварийного обрыва обновления конфигурации базы данных;
- 💥 если вместе с этой ошибкой появляются другие: битые ссылки
<Объект не найден>, сообщения о нарушении целостности, падения при открытии списков.
Порядок безопасного запуска:
- Сделайте полную выгрузку
.dtили резервную копию средствами СУБД. - Предупредите пользователей: для тестирования нужен монопольный доступ, все сеансы должны быть завершены.
- Сначала запустите только проверку, без исправления, и посмотрите журнал.
- Режим исправления включайте осознанно — режим «удалить ссылки на объекты» безвозвратно стирает данные из реквизитов.
Чего не делать при исправлении
- 🚫 Не добавляйте реквизит в типовую конфигурацию , чтобы «успокоить» старую обработку. Конфигурация снимется с поддержки или потребует объединения при каждом обновлении, а данных в новом реквизите всё равно не будет.
- 🚫 Не оборачивайте строку в
Попытка … Исключениебез обработки. Ошибка исчезнет с экрана, но печатная форма выйдет с пустыми полями, и это заметят только у контрагента. - 🚫 Не правьте внешнюю обработку
прямо в рабочей базе без копии файла. Сохраните исходный
.epfрядом, чтобы было к чему вернуться. - ✅ Правьте причину, а не симптом: найдите, куда разработчики перенесли данные, и читайте их оттуда.
Частые вопросы
Можно ли просто закрыть окно ошибки и работать дальше?
Почему ошибка только у одного пользователя?
/ClearCache и проверьте его настройки.