Почему не виден привилегированный общий модуль в обычном приложении 1С и как это исправить

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке в обычном приложении на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией: при попытке вызвать экспортную процедуру или функцию общего модуля из формы обработки возникает ошибка «Переменная не определена <ИмяМодуля>». Проблема проявляется именно тогда, когда у общего модуля устанавливается флаг «Привилегированный».

Рассмотрим подробно причины такого поведения платформы 1С, выясним, почему имя модуля пропадает из контекста клиента, и разберем проверенные способы решения этой проблемы.

Причина возникновения ошибки и механизм работы платформы

Разберем по шагам, что происходит в платформе 1С при настройке свойств общего модуля:

  1. Сброс клиентских флагов: Как только в свойствах общего модуля устанавливается флаг Привилегированный, платформа автоматический снимает флаги компиляции для клиента (например, Клиент (обычное приложение)). Модуль начинает компилироваться исключительно на стороне сервера.
  2. Исполнение в обычном приложении: В режиме обычного приложения код формы (включая обработчики событий кнопки или открытия) выполняется в клиентском контексте толстого клиента.
  3. Отсутствие экспорта имени: Если у серверного общего модуля не установлен флаг Вызов сервера, платформа не регистрирует имя этого модуля в глобальном клиентском контексте. В результате клиентский код на этапе синтаксического контроля и компиляции просто не «видит» имя модуля и выдает ошибку «Переменная не определена».

Решение 1. Установка флага «Вызов сервера»

Самый простой и быстрый способ вернуть видимость модулю на клиенте — настроить правильно свойства метаданных общего модуля.

Выясним, какие флаги должны быть включены у общего модуля в дереве метаданных:

  1. Включен флаг «Сервер».
  2. Включен флаг «Привилегированный».
  3. Включен флаг «Вызов сервера».

После установки флага Вызов сервера имя модуля экспортируется в контекст клиента, и вызов процедур вида МодульСервер.ВыполнитьПроцедуру() из модуля формы начинает работать корректно.

Важное ограничение: При использовании флага Вызов сервера функции модуля становятся границей между клиентом и сервером. Через эту границу запрещено передавать и возвращать мутабельные объекты (такие как СправочникОбъект, ДокументОбъект, ТаблицаЗначений, ДеревоЗначений). Допустимо использовать только немутабельные типы: ссылки (например, СправочникСсылка.Номенклатура), примитивные типы (число, строка, дата, булево) и структуры/массивы из них.

Решение 2. Программное включение привилегированного режима (Рекомендуемый стандарт)

Согласно стандартам разработки 1С, делать весь модуль одновременно доступным для вызова с клиента и привилегированным небезопасно с точки зрения безопасности данных. Любой клиентский код сможет обратиться к серверным функциям в обход встроенной системы прав доступа.

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

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


Процедура ВыполнитьОперациюПовышеннойСложности(Параметры) Экспорт

	// Включаем привилегированный режим для выполнения операции без проверки прав
	УстановитьПривилегированныйРежим(Истина);
	
	// Выполнение действий, требующих повышенных прав
	// ...
	
	// Отключаем привилегированный режим (или он отключится автоматически при завершении вызова)
	УстановитьПривилегированныйРежим(Ложь);

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

При использовании этого метода привилегированный режим действует только внутри конкретного участка кода, что полностью соответствует стандартам безопасной разработки.

Решение 3. Двухуровневая архитектура (Разделение общих модулей)

Если серверный logic достаточно объемен, проанализируем архитектурное решение с разделением на два модуля:

  1. Публичный модуль (Серверный): Имеет флаги Сервер и Вызов сервера, но НЕ имеет флага Привилегированный. Этот модуль принимаем вызовы от клиента, проверяет параметры и права пользователя.
  2. Служебный модуль (Привилегированный): Имеет флаги Сервер и Привилегированный, но НЕ имеет флага Вызов сервера. Этот модуль недоступен напрямую с клиента, но вызывается из первого публичного модуля на стороне сервера.

Такой подход гарантирует полное разделение клиентского интерфейса и служебных алгоритмов, работающих с привилегированными правами.

Косвенная причина: Проверка синтаксических ошибок

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

Если внутри общего модуля есть синтаксическая ошибка (например, обращение к несуществующей переменной или неверное имя функции), платформа 1С при старте или компиляции модуля не может зарегистрировать его имя в контексте приложения. Выполните синтаксический контроль модуля (сочетание клавиш Ctrl + F7 в конфигураторе), чтобы убедиться в отсутствии внутренних ошибок.

← На главную