Ошибки платформы 1С

Ошибка при вызове метода контекста в 1С: как читать и исправлять

Коротко

«Ошибка при вызове метода контекста (ИмяМетода)» — служебная обёртка платформы: она сообщает лишь, что метод (Записать, Выполнить, Прочитать…) завершился исключением. Настоящая причина — в строках после «по причине:», и именно её нужно читать и чинить.

Программно первопричину достают через ИнформацияОбОшибке() и цепочку свойства Причина, полный стек — через ПодробноеПредставлениеОшибки() или журнал регистрации.

Что значит ошибка при вызове метода контекста в 1С: анатомия сообщения

Типичное сообщение в 1С 8.3 выглядит так:

{Документ.РеализацияТоваровУслуг.МодульОбъекта(112)}: Ошибка при вызове метода контекста (Записать)
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
по причине:
Поле "Склад" не заполнено

Читается оно снизу вверх:

  • В фигурных скобках — модуль и номер строки, где выполнен вызов;
  • В круглых скобках — имя метода контекста, внутри которого возникло исключение;
  • После «по причине:» — реальная ошибка. Причин может быть несколько, вложенных друг в друга: каждая следующая «по причине:» ближе к первоисточнику.

Отсюда главное правило: искать в интернете и чинить нужно не «ошибку при вызове метода контекста» (это тысяча разных проблем под одной обёрткой), а текст последней «по причине:». Обёртка лишь указывает, какой метод и в какой строке упал.

Ошибка при вызове метода контекста (Записать): запись и проведение

Самый частый вариант. Записать() у объекта — это не просто INSERT/UPDATE: платформа выполняет проверки заполнения, обработчики ПередЗаписью, ПриЗаписи, ОбработкаПроведения, подписки на события и движения по регистрам — исключение в любом из этих мест «всплывает» как ошибка метода Записать. Типовые первопричины:

  • Проверка заполнения — «Поле "…" не заполнено»: не пройден обязательный реквизит или ОбработкаПроверкиЗаполнения;
  • Явный ВызватьИсключение или установка Отказ = Истина в ПередЗаписью / ОбработкаПроведения конфигурации или расширения;
  • Подписки на события — чужой общий модуль, о котором вы не знаете, падает при записи вашего объекта;
  • Блокировки — «Конфликт блокировок при выполнении транзакции» или превышено время ожидания: объект параллельно пишет другой сеанс или фоновое задание;
  • Уникальность — дубль кода/номера при отключённой автонумерации.

Диагностика: воспроизвести запись в обработке под отладчиком, поставить точку останова в ПередЗаписью и в подписках на события этого объекта, либо перехватить исключение и посмотреть цепочку причин (раздел про ИнформацияОбОшибке() ниже).

В Консоли кода это делается без обработки-«времянки»: попросите агента «запиши документ РеализацияТоваровУслуг №123 в попытке и покажи подробное представление ошибки» — он сам напишет и выполнит код, а в ответе покажет полную цепочку «по причине:».

Ошибка при вызове метода контекста (Выполнить): запрос

Вариант «ошибка при вызове метода контекста (Выполнить)» почти всегда означает падение Запрос.Выполнить(), и первопричина — в тексте запроса, а не в месте вызова:

{(5, 4)}: Поле не найдено "Номенклатура.Артикул"
Номенклатура.<<?>>Артикул КАК Артикул

Числа в {(5, 4)} — строка и колонка внутри текста запроса (не модуля!), а маркер <<?>> стоит перед проблемным местом. Частые причины:

  • опечатка в имени поля или таблицы — «Поле не найдено», «Таблица не найдена»;
  • не установлен параметр — «Не задано значение параметра "…"», если в тексте есть &Параметр, а УстановитьПараметр() не вызван;
  • синтаксис — незакрытая скобка, лишняя запятая, ошибка после ручной правки конкатенацией строк;
  • обращение к объекту, которого нет в конфигурации базы (код перенесли из другой базы).

Быстрый способ проверки — вывести Запрос.Текст перед выполнением и прогнать его в консоли запросов: конструктор сразу подсветит проблемное место.

Ошибка при вызове метода контекста (Прочитать): файл и формат

«Ошибка при вызове метода контекста (Прочитать)» возникает у методов чтения — ТабличныйДокумент.Прочитать(), ТекстовыйДокумент.Прочитать(), ЧтениеXML и подобных. Смотрите «по причине:», обычно там одно из:

  • «Неверный формат файла» — расширение не соответствует содержимому (например, .xls, который на деле HTML из выгрузки), файл битый или обрезан при передаче;
  • Файл занят другим процессом — открыт в Excel или не освобождён предыдущим кодом (не вызван Закрыть());
  • Нет файла или прав — путь указан локальный, а код выполняется на сервере, где такого каталога нет; типовая ловушка клиент-серверного режима 1С 8.3;
  • Кодировка — текст читается не в той кодировке и парсинг падает.

Проверяйте существование файла до чтения (Новый Файл(Путь).Существует()) и помните: серверный код видит только файловую систему сервера.

Другие варианты: (ПодключитьВнешнююКомпоненту), (ЗаписатьJSON), (ПрочитатьJSON)

Обёртка одна и та же для любого метода платформы, меняется только имя в скобках:

  • (ПодключитьВнешнююКомпоненту) — не найдена DLL, не совпадает разрядность (32-битная компонента в 64-битном сервере), не зарегистрирована или заблокирована политикой безопасности;
  • (ЗаписатьJSON) — «Передано значение недопустимого типа»: в структуре попалась ссылка, дата или другой тип, который сериализатор не умеет писать без функции преобразования (параметр ФункцияПреобразования);
  • (ПрочитатьJSON) — некорректный JSON на входе: сервер вернул HTML с ошибкой вместо JSON, BOM в начале файла, обрезанный ответ;
  • (Подключить), (Записать), (Выполнить) у COM-объектов — ошибка внутри внешнего приложения, текст причины приходит от него.

Алгоритм одинаковый: имя метода в скобках сужает область поиска, текст после «по причине:» называет конкретную проблему.

Как достать первопричину: ИнформацияОбОшибке() и ПодробноеПредставлениеОшибки()

В блоке Исключение функция ИнформацияОбОшибке() возвращает объект с описанием ошибки, а его свойство Причина — вложенную ошибку. Спускаясь по цепочке причин, получаем ту самую первопричину без ручного парсинга текста:

Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    Инфо = ИнформацияОбОшибке();
    // Спускаемся по цепочке "по причине:" к первоисточнику
    Пока Инфо.Причина <> Неопределено Цикл
        Инфо = Инфо.Причина;
    КонецЦикла;
    Сообщить("Первопричина: " + Инфо.Описание);
    Сообщить("Модуль: " + Инфо.ИмяМодуля + ", строка " + Инфо.НомерСтроки);
    ВызватьИсключение; // не глотаем ошибку
КонецПопытки;

Когда нужен весь стек одной строкой — для лога или сообщения администратору — используйте ПодробноеПредставлениеОшибки():

Попытка
    Запрос.Выполнить();
Исключение
    ТекстДляЛога = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    ЗаписьЖурналаРегистрации("ОбменДанными",
        УровеньЖурналаРегистрации.Ошибка, , , ТекстДляЛога);
    ВызватьИсключение;
КонецПопытки;
ПодробноеПредставлениеОшибки
ИнформацияОбОшибкеобъект, полученный из ИнформацияОбОшибке()
Строка

Подробное представление содержит все вложенные «по причине:», модули и номера строк — его пишут в лог. Пользователю показывают короткий текст: КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) вернёт только описание без служебного стека. Устаревшая функция ОписаниеОшибки() отдаёт один плоский текст без структуры — в новом коде предпочитайте ИнформацияОбОшибке().

Журнал регистрации: где лежит полный текст ошибки

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

Для серверных ошибок смотрите события с типом «Ошибка выполнения» — там видно и сеанс, и пользователя, и компьютер. Это быстрее, чем просить пользователя сделать скриншот, на котором обычно обрезана самая важная нижняя часть сообщения.

Полный текст из журнала регистрации можно целиком вставить в чат Консоли кода: агент разберёт цепочку «по причине:», определит модуль и строку падения и предложит проверочный код, который воспроизводит проблему на конкретном объекте.

Перехват через Попытка-Исключение без проглатывания

Обёртку перехватывают, когда падение метода — ожидаемый сценарий (недоступен файл, занята запись). Два правила, чтобы перехват не превратился в чёрную дыру:

  • Логировать всегда. Даже если ошибка «допустимая», в лог должно попасть подробное представление — иначе разовая проблема станет хронической и невидимой;
  • Пробрасывать дальше, если не обработали. ВызватьИсключение; без аргументов повторно возбуждает то же исключение с сохранением информации об ошибке.
// Плохо: ошибка исчезает бесследно
Попытка
    ОбъектОбмена.Записать();
Исключение
КонецПопытки;

// Хорошо: залогировали и решили осознанно
Попытка
    ОбъектОбмена.Записать();
Исключение
    ЗаписьЖурналаРегистрации("Обмен.ЗаписьОбъекта",
        УровеньЖурналаРегистрации.Ошибка, , ,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    Если НЕ ОшибкаДопустима Тогда
        ВызватьИсключение;
    КонецЕсли;
КонецПопытки;

Перехватывать стоит минимальный фрагмент кода — один вызов Записать() или Выполнить(), а не всю процедуру: иначе по тексту ошибки не понять, какой из десяти вызовов упал.

Частые ошибки при разборе «ошибки при вызове метода контекста»

  • Лечат обёртку, а не причину. Поиск по фразе «ошибка при вызове метода контекста (Записать)» даёт сотни несвязанных тем. Искать нужно текст после «по причине:» — он уникален для вашей проблемы.
  • Пустой блок Исключение. Проглоченная ошибка не исчезает — она возвращается позже в виде расхождений в данных, которые уже не отладить.
  • Читают только первую причину. Причины вложены: у «Ошибки при вызове метода контекста» может быть ещё две-три «по причине:» ниже. Диагноз ставится по самой нижней.
  • В (Выполнить) ищут проблему в модуле. Координаты {(5, 4)} указывают на строку и колонку текста запроса, а не модуля — правьте запрос.
  • Показывают пользователю подробное представление. ПодробноеПредставлениеОшибки() — для журнала и администратора; пользователю достаточно КраткоеПредставлениеОшибки().

Частые вопросы об ошибке при вызове метода контекста

Что означает «Ошибка при вызове метода контекста» без подробностей?

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

Как узнать реальную причину ошибки (Записать) при проведении?

Перехватите запись в Попытка-Исключение и разверните цепочку ИнформацияОбОшибке().Причина до конца — последняя причина и есть первоисточник. Чаще всего это проверка заполнения, Отказ в ПередЗаписью/ОбработкаПроведения, подписка на событие или конфликт блокировок.

Чем ИнформацияОбОшибке() отличается от ОписаниеОшибки()?

ОписаниеОшибки() возвращает один плоский текст. ИнформацияОбОшибке() — объект со свойствами Описание, ИмяМодуля, НомерСтроки и вложенной Причина, по которой можно программно дойти до первопричины. Для логов из него формируют строку через ПодробноеПредставлениеОшибки().

Тарифы

ИИ Консоль кода 1С

Продвинутый

Популярный выбор
Бесплатно

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Начать бесплатно

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно