Почему 1С не находит метод у объекта и что с этим сделать программисту и бухгалтеру
Содержание
Ошибка Метод объекта не обнаружен (ИмяМетода) в 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 той же версии, что и платформа на машине. Иначе вызов может уйти в объект другой версии, где состав методов другой.
Что делать, если вы не программист
Исправить код без Конфигуратора нельзя, но сузить проблему и передать её нужному человеку — можно. Порядок такой.
- Повторите действие и запишите, после чего появляется ошибка: какая кнопка, какой документ, какая обработка.
- Нажмите «Подробно» и скопируйте текст стека целиком.
- Посмотрите на начало стека.
ВнешняяОбработкаилиВнешнийОтчет— вопрос к тому, кто дал этот файл. Имя расширения — к автору расширения. - Если ошибка появилась сразу после обновления, сообщите номер релиза. Его видно в окне
Справка → О программе(меню с тремя полосками или знаком вопроса в верхней части окна). - Попробуйте запустить базу с очисткой кэша. В свойствах базы в окне запуска добавьте в строку «Дополнительные параметры запуска»
/ClearCache. Помогает, когда после обновления клиент держит старые модули.
Очистку кэша и перезапуск делайте после того, как закрыли свои документы: несохранённые изменения пропадут. На сервере 1С кэш чистится у каждого пользователя отдельно, другим сеансам это не мешает.
Временно отключить подозрительную внешнюю обработку можно в разделе Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки: откройте карточку и смените публикацию на «Отключена». Расширение отключают в окне «Управление расширениями конфигурации». Его можно найти через меню Все функции → Стандартные, если пункт «Все функции» включён в параметрах программы.
Не удаляйте расширения и обработки наугад: некоторые хранят данные, и после удаления они пропадут. Отключение безопаснее, его легко вернуть.
Как не получить эту ошибку снова
Для разработчика:
- ✅ проверяйте тип значения перед вызовом, если функция может вернуть разное: ссылку, структуру,
Неопределено; - ✅ в формах разделяйте клиент и сервер явно: прикладной объект живёт только на сервере;
- ✅ не обращайтесь из внешних обработок к служебным функциям типовой конфигурации, если есть программный интерфейс БСП с пометкой для внешнего использования;
- ✅ после обновления платформы и снятия режима совместимости прогоняйте
Проверка конфигурации; - ✅ храните обработки и расширения с указанием релиза, под который они писались.
Для бухгалтера и администратора базы:
- 🔸 перед обновлением составьте список внешних печатных форм, обработок и расширений;
- 🔸 обновляйте сначала копию базы и проверяйте на ней эти обработки;
- 🔸 держите контакт разработчика каждой внешней обработки.
Частые вопросы
Почему ошибка появилась у одного пользователя, а у другого нет?
/ClearCache это исключает.