Разработка и Конфигурация · 12 мин
Метод контекста в 1С: что это такое и как с ним работать
Что такое метод контекста в 1С, чем отличаются контексты формы, объекта и модуля, как правильно вызывать процедуры и избегать ошибок «метод не обнаружен».
Метод контекста в 1С — это процедура или функция, которая доступна для вызова только внутри определённого контекста выполнения: формы, объекта, общего модуля или модуля приложения. Понимание контекстов — одна из базовых тем для разработчика на платформе 1С:Предприятие, потому что большинство ошибок вида «Метод объекта не обнаружен» возникает именно из-за неправильного выбора места вызова.
Контекст определяет, какие переменные, реквизиты и методы «видит» исполняемый код. Например, в модуле формы доступны реквизиты формы и её элементы, а в модуле объекта справочника — реквизиты самого объекта и его табличные части. Один и тот же метод в разных контекстах может быть доступен или недоступен, и платформа строго это контролирует.
Ситуация усложняется в управляемых формах, где код делится между клиентом и сервером с помощью директив &НаКлиенте и &НаСервере. Здесь метод контекста существует только на той стороне, где он объявлен, и попытка вызвать серверную процедуру напрямую с клиента приведёт к ошибке компиляции модуля.
Что такое контекст выполнения в 1С
Контекст — это окружение, в котором выполняется код встроенного языка. Оно включает набор доступных переменных, реквизитов, методов и свойств. Платформа 1С:Предприятие формирует контекст автоматически в зависимости от того, где расположен модуль: в форме, в объекте конфигурации, в общем модуле или в модуле приложения.
Метод контекста — это процедура или функция, объявленная внутри конкретного модуля. Она «принадлежит» этому контексту и может обращаться к его данным напрямую, без дополнительных обращений. Например, метод в модуле объекта справочника может работать с реквизитами объекта просто по имени, потому что они входят в его контекст.
Важно различать встроенные методы контекста (предоставляемые платформой, например Записать() у объекта документа) и методы, которые разработчик объявляет сам в модуле. Оба типа подчиняются одним правилам видимости: вызвать их можно только там, где соответствующий контекст существует.
Основные виды контекстов и их методы
В типовой конфигурации разработчик чаще всего сталкивается с несколькими видами контекстов. Каждый из них имеет собственный набор доступных методов и данных.
- Контекст формы — реквизиты формы, элементы управления, команды, данные основного реквизита (например, объекта документа). Методы формы вызываются только внутри модуля этой формы или извне через объект формы.
- Контекст объекта — реквизиты и табличные части объекта конфигурации (справочника, документа). Методы модуля объекта срабатывают при операциях с объектом: записи, проведении, заполнении.
- Контекст общего модуля — набор экспортных процедур и функций, доступных из любого места конфигурации по имени модуля.
- Контекст модуля приложения и внешнего соединения — глобальные обработчики событий, такие как
ПриНачалеРаботыСистемы.
Экспортные методы (объявленные с ключевым словом Экспорт) видны за пределами своего модуля, обычные — только внутри него. Это базовый механизм инкапсуляции во встроенном языке 1С.
| Контекст | Что доступно | Типичное применение методов |
|---|---|---|
| Форма | Реквизиты формы, элементы, команды | Обработчики событий элементов, команды формы |
| Объект | Реквизиты и табличные части объекта | Заполнение, проверка, проведение |
| Общий модуль | Только параметры вызова и другие общие модули | Переиспользуемая бизнес-логика |
| Модуль приложения | Глобальные переменные сеанса | События запуска и завершения системы |
Клиентский и серверный контекст в управляемых формах
В управляемых формах каждый метод дополнительно привязан к стороне исполнения через директивы компиляции. Это самая частая причина путаницы у начинающих разработчиков.
Директивы компиляции
Директива &НаКлиенте означает, что метод существует только в клиентском контексте формы. Директива &НаСервере — только на сервере. Есть также варианты &НаСервереБезКонтекста и &НаКлиентеНаСервереБезКонтекста, которые не имеют доступа к данным формы и используются для вспомогательных вычислений.
&НаКлиенте
Процедура КнопкаРассчитатьНажатие(Элемент)
РассчитатьНаСервере(Объект.Ссылка);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РассчитатьНаСервере(Ссылка)
// работа с данными через запрос
КонецПроцедуры
Ключевое правило: метод, объявленный с директивой &НаСервере, имеет доступ к данным формы (реквизитам, элементам управления данными), а метод &НаСервереБезКонтекста — нет. Зато «без контекста» вызов выполняется быстрее, потому что платформе не нужно сериализовать и передавать всё состояние формы на сервер и обратно.
Как вызывается серверный метод с клиента
Клиентский метод может вызвать серверный напрямую по имени — платформа сама организует серверный вызов. Обратный вызов (с сервера на клиент) невозможен: сервер не знает о состоянии клиентского приложения. Поэтому вся интерактивная логика — вопросы пользователю, открытие форм, предупреждения — должна оставаться на клиенте.
Как правильно вызывать методы контекста
Правильный вызов начинается с понимания, где находится нужный метод и какие данные ему доступны. Ниже — типовой порядок действий при проектировании вызова.
- 1Определите, где исполняется текущий код: клиент, сервер, модуль объекта или общий модуль
- 2Проверьте, в каком контексте объявлен нужный метод и есть ли у него ключевое слово Экспорт
- 3Убедитесь, что данные, нужные методу, доступны в его контексте или переданы параметрами
- 4Для вызова с клиента на сервер используйте серверную процедуру формы или серверный общий модуль
- 5Проверьте результат: откройте форму, выполните действие и убедитесь, что нет ошибок компиляции модуля
Для вызова метода общего модуля используется имя модуля: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Наименование"). Общий модуль должен иметь подходящие флаги: «Сервер» для серверных вызовов, «Клиент (управляемое приложение)» для клиентских. Вызов серверного общего модуля с клиента возможен только если у модуля включён флаг «Вызов сервера».
Методы объекта вызываются через сам объект: ДокОбъект.Записать() или ДокОбъект.Заполнить(Основание), если такой экспортный метод объявлен в модуле объекта. Из формы объекта доступ к методам модуля объекта идёт через преобразование реквизита формы в объект: РеквизитФормыВЗначение("Объект").
Типичные ошибки при работе с контекстами
Большинство проблем с методами контекста проявляются в виде ошибок компиляции или выполнения. Знание типовых сценариев помогает находить причину быстрее.
Особого внимания заслуживает ошибка «Переменная не определена» при обращении к общему модулю. Она означает, что у общего модуля не включён нужный флаг исполнения (например, клиентский код пытается вызвать модуль, доступный только на сервере) или имя модуля написано с опечаткой.
Ещё одна частая проблема — попытка вызвать метод формы извне. Методы формы по умолчанию доступны только внутри формы. Для внешнего вызова метод должен быть экспортным, а вызывающая сторона должна иметь ссылку на объект формы, что на практике применимо редко и обычно заменяется оповещениями (Оповестить / ОбработкаОповещения).
Как проверить, что метод вызывается корректно
Проверка начинается со статического анализа: конфигуратор проверяет модули при сохранении и при команде «Конфигурация → Проверка конфигурации». Включите проверку модулей для нужных режимов (тонкий клиент, веб-клиент, сервер) — это выявит несоответствие директив до запуска.
Как проверить результат
Проверка конфигурации завершается без ошибок по модулю
Ошибки «Процедура или функция не обнаружена»
Точка останова внутри метода срабатывает, параметры заполнены
Отладчик не заходит в метод или параметры пустые
Действие выполняется один раз и даёт ожидаемый результат
Множественные серверные вызовы, форма подтормаживает
Для диагностики лишних серверных вызовов полезен замер производительности (кнопка «Замер производительности» в конфигураторе). Если в замере видно много вызовов серверных процедур формы с контекстом, это признак того, что логику стоит перенести в общий модуль без контекста или объединить вызовы в один.
Удобное правило: весь интерактив — на клиенте, вся работа с базой — на сервере, вся переиспользуемая логика — в общих модулях. Если метод формы вырос больше пары десятков строк и не работает с элементами формы, его почти наверняка стоит вынести в общий модуль.
Когда какой подход выбирать
Выбор контекста для размещения метода влияет на производительность, поддерживаемость и возможность повторного использования кода.
Как выбрать действие
Избегайте крайности «всё в форме»: такой код невозможно переиспользовать и сложно тестировать. Обратная крайность — десятки мелких общих модулей — затрудняет навигацию по конфигурации. Разумный ориентир: общий модуль объединяет методы одной предметной области, а форма содержит только обработчики событий и их простую обвязку.
Что важно запомнить
Метод контекста в 1С доступен только внутри своего контекста: формы, объекта, общего модуля. В управляемых формах контекст дополнительно делится директивами &НаКлиенте и &НаСервере. Ошибки «метод не обнаружен» почти всегда означают неверный контекст вызова, отсутствие Экспорт или неподходящие флаги общего модуля.
Частые вопросы о методах контекста в 1С
Чем метод контекста отличается от обычной процедуры?
Любая процедура в 1С объявляется внутри какого-либо модуля, поэтому формально каждая из них является методом своего контекста. Термин «метод контекста» подчёркивает, что вызов возможен только там, где этот контекст существует: например, метод формы нельзя вызвать из модуля объекта напрямую.
Почему возникает ошибка «Метод объекта не обнаружен»?
Чаще всего метод объявлен без ключевого слова Экспорт и недоступен извне модуля, либо вызов идёт из контекста, где метод не существует (например, серверный метод вызывается из клиентского кода без серверной «прослойки»). Также проверьте опечатки в имени и флаги исполнения общего модуля.
Что выбрать: &НаСервере или &НаСервереБезКонтекста?
Если методу нужны реквизиты и данные формы — используйте &НаСервере. Если достаточно нескольких параметров (ссылка, список значений), выбирайте &НаСервереБезКонтекста: такой вызов не передаёт всё состояние формы на сервер и выполняется заметно легче.
Можно ли вызвать метод клиентского контекста с сервера?
Нет, прямой вызов с сервера на клиент невозможен: сервер не имеет доступа к клиентскому приложению. Результат серверной обработки возвращается в клиентский метод, который её инициировал, и уже там выполняется интерактивная логика.
Как передать данные объекта в общий модуль?
Передавайте ссылку на объект или примитивные значения параметрами. Сам объект (ДокументОбъект, СправочникОбъект) между клиентом и сервером не передаётся — в серверном общем модуле получите объект по ссылке через метод ПолучитьОбъект() и работайте с ним там.
Где посмотреть, какие методы доступны в текущем контексте?
В конфигураторе используйте контекстную подсказку (Ctrl+Пробел) внутри модуля — она показывает доступные переменные и методы именно этого контекста. Полный список встроенных методов контекста формы или объекта описан в синтакс-помощнике по соответствующему типу.