К статье
Практический материал

Разработка и Конфигурация · 12 мин

Метод контекста в 1С: что это такое и как с ним работать

Что такое метод контекста в 1С, чем отличаются контексты формы, объекта и модуля, как правильно вызывать процедуры и избегать ошибок «метод не обнаружен».

Метод контекста в 1С — это процедура или функция, которая доступна для вызова только внутри определённого контекста выполнения: формы, объекта, общего модуля или модуля приложения. Понимание контекстов — одна из базовых тем для разработчика на платформе 1С:Предприятие, потому что большинство ошибок вида «Метод объекта не обнаружен» возникает именно из-за неправильного выбора места вызова.

Контекст определяет, какие переменные, реквизиты и методы «видит» исполняемый код. Например, в модуле формы доступны реквизиты формы и её элементы, а в модуле объекта справочника — реквизиты самого объекта и его табличные части. Один и тот же метод в разных контекстах может быть доступен или недоступен, и платформа строго это контролирует.

Ситуация усложняется в управляемых формах, где код делится между клиентом и сервером с помощью директив &НаКлиенте и &НаСервере. Здесь метод контекста существует только на той стороне, где он объявлен, и попытка вызвать серверную процедуру напрямую с клиента приведёт к ошибке компиляции модуля.

Что такое контекст выполнения в 1С

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

Метод контекста — это процедура или функция, объявленная внутри конкретного модуля. Она «принадлежит» этому контексту и может обращаться к его данным напрямую, без дополнительных обращений. Например, метод в модуле объекта справочника может работать с реквизитами объекта просто по имени, потому что они входят в его контекст.

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

Основные виды контекстов и их методы

В типовой конфигурации разработчик чаще всего сталкивается с несколькими видами контекстов. Каждый из них имеет собственный набор доступных методов и данных.

  • Контекст формы — реквизиты формы, элементы управления, команды, данные основного реквизита (например, объекта документа). Методы формы вызываются только внутри модуля этой формы или извне через объект формы.
  • Контекст объекта — реквизиты и табличные части объекта конфигурации (справочника, документа). Методы модуля объекта срабатывают при операциях с объектом: записи, проведении, заполнении.
  • Контекст общего модуля — набор экспортных процедур и функций, доступных из любого места конфигурации по имени модуля.
  • Контекст модуля приложения и внешнего соединения — глобальные обработчики событий, такие как ПриНачалеРаботыСистемы.

Экспортные методы (объявленные с ключевым словом Экспорт) видны за пределами своего модуля, обычные — только внутри него. Это базовый механизм инкапсуляции во встроенном языке 1С.

КонтекстЧто доступноТипичное применение методов
ФормаРеквизиты формы, элементы, командыОбработчики событий элементов, команды формы
ОбъектРеквизиты и табличные части объектаЗаполнение, проверка, проведение
Общий модульТолько параметры вызова и другие общие модулиПереиспользуемая бизнес-логика
Модуль приложенияГлобальные переменные сеансаСобытия запуска и завершения системы

Клиентский и серверный контекст в управляемых формах

В управляемых формах каждый метод дополнительно привязан к стороне исполнения через директивы компиляции. Это самая частая причина путаницы у начинающих разработчиков.

Директивы компиляции

Директива &НаКлиенте означает, что метод существует только в клиентском контексте формы. Директива &НаСервере — только на сервере. Есть также варианты &НаСервереБезКонтекста и &НаКлиентеНаСервереБезКонтекста, которые не имеют доступа к данным формы и используются для вспомогательных вычислений.

&НаКлиенте

Процедура КнопкаРассчитатьНажатие(Элемент)

РассчитатьНаСервере(Объект.Ссылка);

КонецПроцедуры

&НаСервереБезКонтекста

Процедура РассчитатьНаСервере(Ссылка)

// работа с данными через запрос

КонецПроцедуры

Ключевое правило: метод, объявленный с директивой &НаСервере, имеет доступ к данным формы (реквизитам, элементам управления данными), а метод &НаСервереБезКонтекста — нет. Зато «без контекста» вызов выполняется быстрее, потому что платформе не нужно сериализовать и передавать всё состояние формы на сервер и обратно.

Как вызывается серверный метод с клиента

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

Как правильно вызывать методы контекста

Правильный вызов начинается с понимания, где находится нужный метод и какие данные ему доступны. Ниже — типовой порядок действий при проектировании вызова.

Порядок действий
  1. 1
    Определите, где исполняется текущий код: клиент, сервер, модуль объекта или общий модуль
  2. 2
    Проверьте, в каком контексте объявлен нужный метод и есть ли у него ключевое слово Экспорт
  3. 3
    Убедитесь, что данные, нужные методу, доступны в его контексте или переданы параметрами
  4. 4
    Для вызова с клиента на сервер используйте серверную процедуру формы или серверный общий модуль
  5. 5
    Проверьте результат: откройте форму, выполните действие и убедитесь, что нет ошибок компиляции модуля

Для вызова метода общего модуля используется имя модуля: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Наименование"). Общий модуль должен иметь подходящие флаги: «Сервер» для серверных вызовов, «Клиент (управляемое приложение)» для клиентских. Вызов серверного общего модуля с клиента возможен только если у модуля включён флаг «Вызов сервера».

Методы объекта вызываются через сам объект: ДокОбъект.Записать() или ДокОбъект.Заполнить(Основание), если такой экспортный метод объявлен в модуле объекта. Из формы объекта доступ к методам модуля объекта идёт через преобразование реквизита формы в объект: РеквизитФормыВЗначение("Объект").

Типичные ошибки при работе с контекстами

Большинство проблем с методами контекста проявляются в виде ошибок компиляции или выполнения. Знание типовых сценариев помогает находить причину быстрее.

Типичные ошибки
01
Ошибка «Метод объекта не обнаружен» — метод объявлен без Экспорт или вызывается из другого контекста, где он не виден
02
Вызов серверной процедуры без директивы — метод компилируется только на клиенте и недоступен на сервере
03
Обращение к реквизитам формы из метода &НаСервереБезКонтекста — данных формы там нет, возникает ошибка
04
Передача мутабельных объектов (ДокументОбъект) между клиентом и сервером — такие типы не сериализуются, передавайте ссылку
05
Лишние серверные вызовы в цикле на клиенте — каждый вызов это обращение к серверу, форма работает медленно

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

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

Как проверить, что метод вызывается корректно

Проверка начинается со статического анализа: конфигуратор проверяет модули при сохранении и при команде «Конфигурация → Проверка конфигурации». Включите проверку модулей для нужных режимов (тонкий клиент, веб-клиент, сервер) — это выявит несоответствие директив до запуска.

Контрольные точки

Как проверить результат

Компиляция модуля
Норма

Проверка конфигурации завершается без ошибок по модулю

Тревожный признак

Ошибки «Процедура или функция не обнаружена»

Вызов в отладчике
Норма

Точка останова внутри метода срабатывает, параметры заполнены

Тревожный признак

Отладчик не заходит в метод или параметры пустые

Поведение формы
Норма

Действие выполняется один раз и даёт ожидаемый результат

Тревожный признак

Множественные серверные вызовы, форма подтормаживает

Для диагностики лишних серверных вызовов полезен замер производительности (кнопка «Замер производительности» в конфигураторе). Если в замере видно много вызовов серверных процедур формы с контекстом, это признак того, что логику стоит перенести в общий модуль без контекста или объединить вызовы в один.

Удобное правило: весь интерактив — на клиенте, вся работа с базой — на сервере, вся переиспользуемая логика — в общих модулях. Если метод формы вырос больше пары десятков строк и не работает с элементами формы, его почти наверняка стоит вынести в общий модуль.
ПЗ
Практическое замечание

Когда какой подход выбирать

Выбор контекста для размещения метода влияет на производительность, поддерживаемость и возможность повторного использования кода.

Маршрут решения

Как выбрать действие

Метод реагирует на действие пользователя в формеОставьте его в модуле формы с директивой &НаКлиенте
Метод читает или пишет данные в базуРазместите его в серверном общем модуле или в &НаСервереБезКонтекста
Логика нужна в нескольких формах и объектахВынесите её в общий модуль с флагом Экспорт
Метод меняет реквизиты объекта перед записьюИспользуйте модуль объекта и его события (ПередЗаписью, ОбработкаЗаполнения)

Избегайте крайности «всё в форме»: такой код невозможно переиспользовать и сложно тестировать. Обратная крайность — десятки мелких общих модулей — затрудняет навигацию по конфигурации. Разумный ориентир: общий модуль объединяет методы одной предметной области, а форма содержит только обработчики событий и их простую обвязку.

Итог

Что важно запомнить

Метод контекста в 1С доступен только внутри своего контекста: формы, объекта, общего модуля. В управляемых формах контекст дополнительно делится директивами &НаКлиенте и &НаСервере. Ошибки «метод не обнаружен» почти всегда означают неверный контекст вызова, отсутствие Экспорт или неподходящие флаги общего модуля.

Частые вопросы о методах контекста в 1С

Чем метод контекста отличается от обычной процедуры?

Любая процедура в 1С объявляется внутри какого-либо модуля, поэтому формально каждая из них является методом своего контекста. Термин «метод контекста» подчёркивает, что вызов возможен только там, где этот контекст существует: например, метод формы нельзя вызвать из модуля объекта напрямую.

Почему возникает ошибка «Метод объекта не обнаружен»?

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

Что выбрать: &НаСервере или &НаСервереБезКонтекста?

Если методу нужны реквизиты и данные формы — используйте &НаСервере. Если достаточно нескольких параметров (ссылка, список значений), выбирайте &НаСервереБезКонтекста: такой вызов не передаёт всё состояние формы на сервер и выполняется заметно легче.

Можно ли вызвать метод клиентского контекста с сервера?

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

Как передать данные объекта в общий модуль?

Передавайте ссылку на объект или примитивные значения параметрами. Сам объект (ДокументОбъект, СправочникОбъект) между клиентом и сервером не передаётся — в серверном общем модуле получите объект по ссылке через метод ПолучитьОбъект() и работайте с ним там.

Где посмотреть, какие методы доступны в текущем контексте?

В конфигураторе используйте контекстную подсказку (Ctrl+Пробел) внутри модуля — она показывает доступные переменные и методы именно этого контекста. Полный список встроенных методов контекста формы или объекта описан в синтакс-помощнике по соответствующему типу.