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