Как обратиться к константе из расширения в 1С и исправить ошибку «Переменная не опознана»?

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

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

Почему возникает ошибка «Переменная не опознана»?

Выясним причину появления этой ошибки. Она возникает на этапе синтаксического контроля (компиляции кода). Платформа 1С просто не понимает написанное слово в контексте выполняемого модуля. Рассмотрим основные причины, по которым это происходит при работе с константами в расширениях:

  1. Прямое обращение по имени: Разработчик может попытаться обратиться к константе как к обычной переменной (например, МояКонстанта), забыв указать обращение через глобальный менеджер Константы. Правильный путь всегда должен включать имя менеджера.
  2. Пропущен префикс расширения: При создании новых объектов метаданных непосредственно в расширении платформа автоматически добавляет к их имени заданный префикс (например, Расш1_). Если константа в дереве метаданных называется Расш1_МояКонстанта, а в коде мы пишем Константы.МояКонстанта, компилятор выдаст ошибку, так как объекта без префикса просто не существует.

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

Рассмотрим подробнее разницу в способах обращения к константам. Многие разработчики путают получение менеджера значения и самого значения. Разберем на примерах.

Если мы напишем код следующим образом:

Менеджер = Константы.Расш1_МояКонстанта;

В этом случае выражение вернет объект типа МенеджерЗначенияКонстанты. С этим объектом можно производить различные действия, например, вызывать метод Установить() для записи нового значения, но само хранимое значение он не отдаст. Чтобы прочитать значение константы и использовать его в переменных или условиях, обязательно нужно использовать метод Получить(). Посмотрим на правильный пример:


ЗначениеКонстанты = Константы.Расш1_МояКонстанта.Получить();
Если ЗначениеКонстанты = Истина Тогда
    // Выполняем нужную логику
КонецЕсли;

Решение проблем с правами доступа

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

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

Посмотрим на пример использования второго варианта с привилегированным режимом:


УстановитьПривилегированныйРежим(Истина);
ВажноеЗначение = Константы.Расш1_МояСуперВажнаяКонстанта.Получить();
УстановитьПривилегированныйРежим(Ложь);

Ограничения версий платформы и режим совместимости

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

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

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

← На главную