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