Почему 1С не находит метод у объекта и что с этим сделать программисту и бухгалтеру

· 9 мин

Содержание

Ошибка Метод объекта не обнаружен (ИмяМетода) в 1С означает одно: код обратился к объекту через точку, а у объекта такого метода нет. Исправить её быстро можно так: откройте подробности ошибки, посмотрите модуль и номер строки, затем проверьте имя метода и тип значения в этой строке. Чаще всего виновато одно из трёх: опечатка, переменная другого типа или вызов с клиента того, что работает только на сервере.

Данные базы от этой ошибки не страдают. Платформа прерывает выполнение кода до того, как что-то записалось, а транзакция, если она была открыта, откатывается. Поэтому чинить можно спокойно, без потерь данных, но и «пройти дальше» не получится, пока код не исправлен.

Что сообщает ошибка и где посмотреть подробности

Текст в скобках — это имя метода, который 1С не нашла. Например, Метод объекта не обнаружен (Записать) значит, что у объекта нет метода Записать().

Главное — не само сообщение, а место, где оно возникло. Нажмите в окне ошибки ссылку «Подробно» (или «Подробнее»). Появится стек вызовов вида:

{ВнешняяОбработка.ЗагрузкаПрайса.Форма.Форма.Форма(124)}: Ошибка при вызове метода контекста (ЗагрузитьНаСервере)
{ВнешняяОбработка.ЗагрузкаПрайса.Форма.Форма.Форма(212)}: Метод объекта не обнаружен (ПолучитьТаблицуЦен)
	Результат = МодульЦен.ПолучитьТаблицуЦен(Номенклатура);

Читать его так:

  • 📍 первая часть до точки — откуда код: ВнешняяОбработка, ВнешнийОтчет, ОбщийМодуль, Документ, Справочник, Обработка;
  • 📍 число в скобках — номер строки в модуле;
  • 📍 последняя строка — сам текст кода, на котором всё упало.

Если источник — ВнешняяОбработка или ВнешнийОтчет, проблема в подключённом файле .epf/.erf, а не в типовой конфигурации. Если в стеке есть имя расширения — смотреть нужно расширение. Это различие сразу говорит, кому писать: разработчику обработки, автору расширения или в поддержку конфигурации.

Скопируйте текст из окна «Подробно» целиком. Скриншот без стека почти бесполезен для разработчика: по нему не видно ни модуля, ни строки.

Пять причин, по которым 1С не находит метод объекта

Важная деталь платформы: вызов Объект.Метод() проверяется только при выполнении. Синтаксический контроль не знает, какой тип окажется в переменной, поэтому опечатку в Объект.Мтеод() он пропустит. А вот вызов несуществующей процедуры своего же модуля без точки отлавливается сразу, ещё при сохранении, с другим текстом: Процедура или функция с указанным именем не определена.

1. Опечатка или устаревшее имя

Самый простой случай: Докумнет.Записать(), Запрос.Выполнитъ(), латинская «с» вместо русской в имени. Сюда же относится переименованная процедура: типовой модуль обновили, функцию назвали иначе, а внешняя обработка вызывает старое имя.

2. В переменной лежит значение другого типа

Код рассчитывает на объект, а получает ссылку, структуру или строку. Классика — вызов Записать() у ссылки: у ДокументСсылка такого метода нет, он есть у ДокументОбъект. Ссылку сначала нужно превратить в объект методом ПолучитьОбъект().

Отдельно о Неопределено. Если переменная пустая, 1С пишет другое сообщение: Значение не является значением объектного типа (ИмяМетода). Так что «Метод объекта не обнаружен » говорит, что объект в переменной есть, просто не тот.

3. Данные формы вместо прикладного объекта

В управляемой форме реквизит Объект — это не документ, а его копия для формы, тип ДанныеФормыСтруктура. Методов модуля объекта, Записать(), Провести() у неё нет. Ошибка Метод объекта не обнаружен (Записать) в форме почти всегда отсюда.

4. Метод не экспортный или недоступен в этом контексте

Процедура общего модуля видна снаружи, только если объявлена с ключевым словом Экспорт. Кроме того, у общего модуля есть флажки контекста: «Клиент (управляемое приложение)», «Сервер», «Внешнее соединение», «Вызов сервера». Если модуль только серверный, а вызов идёт из клиентской процедуры, метода «не будет».

Ещё один вариант — перепутаны модуль объекта и модуль менеджера. Экспортная функция из модуля менеджера вызывается как Документы.ПоступлениеТоваровУслуг.ИмяФункции(), а из модуля объекта — через сам объект. Вызвать функцию модуля объекта через менеджер нельзя.

5. Режим совместимости или версия платформы

Метод появился в новой версии платформы, а конфигурация работает в режиме совместимости со старой. Например, СтрШаблон() и СтрРазделить() есть начиная с 8.3.6. Если в свойствах конфигурации стоит совместимость с более ранней версией, такие методы недоступны.

Та же история с внешней обработкой: её писали под новую платформу или новую редакцию конфигурации, а запускают в базе, где нужного метода ещё нет.

ПричинаКак узнатьЧто делать
Опечатка, старое имяимя в скобках не находится поиском по конфигурацииисправить имя
Не тот тип значенияТипЗнч() в отладчике показывает ссылку, структуру и т. п.привести к нужному типу
Данные формыошибка в модуле формы, тип ДанныеФормыСтруктураработать с объектом на сервере
Нет Экспорт или контекстапроцедура есть, но без Экспорт или флажков модулядобавить экспорт или вызов сервера
Совместимость, версияметод новый, в справке указана версия платформыобновить платформу, обработку или не использовать метод
Диагностика: выберите симптом

Как исправить ошибку «Метод объекта не обнаружен» в коде: порядок действий

Этот раздел для тех, у кого есть доступ к Конфигуратору или исходникам обработки.

Шаг 1. Найти строку

Откройте модуль из стека и перейдите на строку: Ctrl+G в редакторе модуля. Если ошибка во внешней обработке, откройте файл .epf через Файл → Открыть в Конфигураторе.

Шаг 2. Проверить имя

Найдите имя метода по всей конфигурации: Ctrl+Shift+F (глобальный поиск). Если процедуры с таким именем нет нигде — это опечатка или переименование. Сравните с синтакс-помощником: у встроенных объектов список методов там полный.

Шаг 3. Посмотреть тип значения

Поставьте точку останова на строку (F9), запустите отладку (F5) и повторите действие. Когда выполнение остановится, вычислите выражение ТипЗнч(ИмяПеременной) через Shift+F9. Тип сразу покажет, ссылка там, объект, структура или данные формы.

Без отладчика можно временно вывести тип сообщением:

Сообщить("Тип: " + Строка(ТипЗнч(Результат)));

Шаг 4. Исправить под причину

Для данных формы запись переносится на сервер:

&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
	ЗаписатьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаписатьНаСервере()
	ДокОбъект = РеквизитФормыВЗначение("Объект");
	ДокОбъект.Записать();
	ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры

Если нужна обычная запись формы с её проверками, проще вызвать метод самой формы Записать() на клиенте, а не объекта.

Для ссылки — получить объект:

ДокОбъект = ДокументСсылка.ПолучитьОбъект();
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

Если в переменной может прийти значение разного типа, проверьте его перед вызовом:

Если ТипЗнч(Значение) = Тип("Структура") Тогда
	Значение.Вставить("Сумма", 0);
ИначеЕсли ТипЗнч(Значение) = Тип("Соответствие") Тогда
	Значение.Вставить("Сумма", 0);
КонецЕсли;

Для общего модуля добавьте Экспорт к объявлению функции. Если вызов идёт с клиента в серверный модуль, у модуля должен стоять флажок «Вызов сервера», иначе обращайтесь к нему из серверной процедуры формы.

Шаг 5. Проверить остальные места

Одна и та же ошибка часто сидит в нескольких местах. Запустите Конфигурация → Проверка конфигурации с режимами для тонкого клиента, сервера и внешнего соединения. Проверка найдёт вызовы, недоступные в своём контексте, хотя опечатки через точку она не увидит.

Правку типовой конфигурации на поддержке без расширения делать нежелательно: следующее обновление её затрёт или усложнит. Для типовых объектов используйте расширение.

Типичные ситуации: обновление, COM, расширения

После обновления типовой конфигурации

Самый частый пользовательский сценарий. Бухгалтерия обновилась, и перестала работать дополнительная печатная форма или обработка загрузки. В стеке — ВнешняяОбработка и вызов процедуры типового общего модуля.

Причина в том, что разработчики типовой конфигурации иногда переименовывают и переносят служебные функции. Внешняя обработка про это не знает. Решение — новая версия обработки от её автора или правка вызова под новое имя.

Расширение после обновления

Расширение перехватывает метод типового модуля аннотацией &Перед, &После или &Вместо. Если в новом релизе этот метод убрали, расширение при подключении выдаст предупреждение, а при работе — ошибку. Откройте расширение в Конфигураторе и проверьте его на применимость к текущей конфигурации.

Внешнее соединение и COM

При обмене через COM вызываемые процедуры должны быть экспортными и находиться в общем модуле с флажком «Внешнее соединение». Если вызывается метод самого COM-объекта, проверьте, что зарегистрирован comcntr.dll той же версии, что и платформа на машине. Иначе вызов может уйти в объект другой версии, где состав методов другой.

Что делать, если вы не программист

Исправить код без Конфигуратора нельзя, но сузить проблему и передать её нужному человеку — можно. Порядок такой.

  1. Повторите действие и запишите, после чего появляется ошибка: какая кнопка, какой документ, какая обработка.
  2. Нажмите «Подробно» и скопируйте текст стека целиком.
  3. Посмотрите на начало стека. ВнешняяОбработка или ВнешнийОтчет — вопрос к тому, кто дал этот файл. Имя расширения — к автору расширения.
  4. Если ошибка появилась сразу после обновления, сообщите номер релиза. Его видно в окне Справка → О программе (меню с тремя полосками или знаком вопроса в верхней части окна).
  5. Попробуйте запустить базу с очисткой кэша. В свойствах базы в окне запуска добавьте в строку «Дополнительные параметры запуска» /ClearCache. Помогает, когда после обновления клиент держит старые модули.

Очистку кэша и перезапуск делайте после того, как закрыли свои документы: несохранённые изменения пропадут. На сервере 1С кэш чистится у каждого пользователя отдельно, другим сеансам это не мешает.

Временно отключить подозрительную внешнюю обработку можно в разделе Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки: откройте карточку и смените публикацию на «Отключена». Расширение отключают в окне «Управление расширениями конфигурации». Его можно найти через меню Все функции → Стандартные, если пункт «Все функции» включён в параметрах программы.

Не удаляйте расширения и обработки наугад: некоторые хранят данные, и после удаления они пропадут. Отключение безопаснее, его легко вернуть.

Как не получить эту ошибку снова

Для разработчика:

  • ✅ проверяйте тип значения перед вызовом, если функция может вернуть разное: ссылку, структуру, Неопределено;
  • ✅ в формах разделяйте клиент и сервер явно: прикладной объект живёт только на сервере;
  • ✅ не обращайтесь из внешних обработок к служебным функциям типовой конфигурации, если есть программный интерфейс БСП с пометкой для внешнего использования;
  • ✅ после обновления платформы и снятия режима совместимости прогоняйте Проверка конфигурации;
  • ✅ храните обработки и расширения с указанием релиза, под который они писались.

Для бухгалтера и администратора базы:

  • 🔸 перед обновлением составьте список внешних печатных форм, обработок и расширений;
  • 🔸 обновляйте сначала копию базы и проверяйте на ней эти обработки;
  • 🔸 держите контакт разработчика каждой внешней обработки.
Перед обновлением типовой конфигурации
Выполнено: 0 / 5

Частые вопросы

Почему ошибка появилась у одного пользователя, а у другого нет?
Код может идти разными ветками в зависимости от прав, настроек или выбранных данных. Ещё одна причина — старый кэш на одном компьютере: запуск с /ClearCache это исключает.
Можно ли просто нажать «ОК» и работать дальше?
Можно продолжить работу с другими документами. Но действие, на котором возникла ошибка, не выполнено: документ не записан, отчёт не построен.
Чем отличается от ошибки «Поле объекта не обнаружено»?
«Поле объекта не обнаружено» — нет реквизита или свойства, то есть обращение без скобок. «Метод объекта не обнаружен» — нет процедуры или функции, обращение со скобками.
Ошибка в типовой конфигурации без доработок — что делать?
Проверьте, что платформа не ниже рекомендованной для вашего релиза и что обновление завершилось полностью. Если да — это ошибка релиза, её исправляют в следующем, а сообщить о ней можно в поддержку конфигурации.
Поможет ли тестирование и исправление базы?
Нет. Ошибка в коде, а не в данных, поэтому тестирование информационной базы её не уберёт.