К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как обратиться к константе на клиенте 1С

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

Константы в 1С хранятся в базе данных, поэтому напрямую обратиться к ним можно только в серверном контексте. В тонком и веб-клиенте конструкция Константы.ИмяКонстанты.Получить() недоступна — компилятор выдаст ошибку о недопустимости вызова на клиенте. Это архитектурное ограничение управляемого приложения, а не ошибка конфигурации.

Стандартное решение — передать значение константы с сервера на клиент. Для этого пишется серверная функция, которая читает константу и возвращает результат, а клиентский код вызывает её. Дополнительно применяют кэширование на время сеанса, чтобы не дёргать сервер при каждом обращении.

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

Почему константа недоступна на клиенте напрямую

В управляемом приложении 1С клиент и сервер — разделённые контексты исполнения. Клиент работает с интерфейсом и локальными данными формы, а обращения к базе данных (включая таблицу констант) выполняет только сервер. Менеджер Константы относится к прикладным объектам, привязанным к данным, поэтому платформа запрещает его использование в клиентских модулях.

Если попытаться написать в модуле формы с директивой &НаКлиенте строку Значение = Константы.ВалютаУчета.Получить();, при проверке модуля или в момент исполнения возникнет ошибка вида «Переменная не определена (Константы)» либо сообщение о недоступности объекта в данном контексте. Это ожидаемое поведение, и обходить его нужно штатными средствами, а не хаками.

Исключение — толстый клиент в режиме обычного приложения и файловые базы в старых конфигурациях, где контексты фактически совмещены. Но для управляемых форм и современных режимов работы ориентироваться на это не стоит.

Базовый способ: серверная функция в общем модуле

Самый прямой подход — создать общий модуль с флагом «Сервер» и поместить туда функцию, возвращающую значение константы. Клиентский код вызывает эту функцию, платформа выполняет серверный вызов, и результат возвращается на клиент.

Пример реализации. В общем модуле РаботаСКонстантами (флаги: Сервер, Вызов сервера):

Функция ПолучитьВалютуУчета() Экспорт

Возврат Константы.ВалютаУчета.Получить();

КонецФункции

В клиентском коде формы обращение выглядит так:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

ВалютаУчета = РаботаСКонстантами.ПолучитьВалютуУчета();

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

Обязательно установите у общего модуля флаг «Вызов сервера» — без него клиент не сможет обратиться к серверным экспортным процедурам. Флаг «Клиент (управляемое приложение)» для такого модуля не нужен, если в нём только серверные функции.

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

Оптимизация: кэширование через повторное использование значений

Если константа нужна часто — например, валюта учёта требуется в десятках мест при работе пользователя, — каждый вызов серверной функции порождает отдельное обращение к серверу. Это лишний трафик и задержки, особенно заметные на веб-клиенте и медленных каналах.

Решение — общий модуль с включённым свойством «Повторное использование возвращаемых значений» (значение «На время вызова» или «На время сеанса»). Платформа закэширует результат функции, и повторные вызовы с теми же параметрами не будут инициировать серверный вызов.

// Общий модуль КэшКонстант, повторное использование — «На время сеанса»

Функция ВалютаУчета() Экспорт

Возврат Константы.ВалютаУчета.Получить();

КонецФункции

Для констант, которые меняются крайне редко (наименование организации, режим учёта), подходит «На время сеанса». Если значение может измениться в течение рабочего дня и важна актуальность — используйте «На время вызова» или обычный серверный вызов без кэша.

Чтение константы в контексте формы

В модуле формы доступна директива &НаСервере, поэтому можно обойтись без общего модуля: объявить серверную процедуру формы, прочитать константу там и положить значение в реквизит формы. Клиентские процедуры затем работают уже с реквизитом.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ВалютаУчета = Константы.ВалютаУчета.Получить(); // ВалютаУчета — реквизит формы

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

Этот вариант удобен, когда значение нужно только внутри одной формы. Плюс — серверный вызов выполняется один раз при создании формы и не требует отдельного обращения позже. Минус — решение не переиспользуется: для другой формы код придётся дублировать или всё-таки выносить в общий модуль.

Если значение понадобилось уже после открытия формы, вызов из клиентской процедуры в серверную процедуру той же формы также возможен — это штатный серверный вызов контекста формы.

Особые случаи: несколько констант и составные типы

Получение сразу нескольких констант

Когда на клиент нужно передать несколько значений, не делайте по функции на каждую константу — каждая порождает отдельный серверный вызов. Используйте метод Константы.СоздатьНаборКонстант() с перечислением имён или верните структуру:

Функция НастройкиУчета() Экспорт

Результат = Новый Структура;

Результат.Вставить("Валюта", Константы.ВалютаУчета.Получить());

Результат.Вставить("Организация", Константы.ОсновнаяОрганизация.Получить());

Возврат Результат;

КонецФункции

Константы со ссылочными и составными типами

Если константа хранит ссылку (например, элемент справочника), на клиент вернётся ссылка — с ней можно работать в интерфейсе, открывать форму объекта, передавать в другие серверные вызовы. Но получить реквизиты этой ссылки (наименование, код) на клиенте нельзя — для этого нужен ещё один серверный вызов или передача готовых данных структурой.

Константы типа «Хранилище значения» требуют дополнительной распаковки на сервере через метод Получить() у объекта хранилища. Передавать на клиент само хранилище или сериализованные данные большого объёма не стоит — извлеките на сервере только нужное.

Типичные ошибки
01
Вызов Константы.Имя.Получить() в клиентской процедуре — ошибка компиляции или исполнения, код не работает
02
Отдельный серверный вызов на каждую константу в цикле — резкое падение производительности на веб-клиенте
03
Кэш «На время сеанса» для часто меняющейся константы — пользователи видят устаревшее значение
04
Попытка прочитать реквизиты ссылки-константы на клиенте — ошибка недоступности контекста
05
Забытый флаг «Вызов сервера» у общего модуля — клиент не видит экспортные функции модуля

Проверка результата и отладка

После внедрения проверьте работу именно в том клиенте, где будут работать пользователи: тонком или веб-клиенте. Поведение в толстом клиенте может скрыть ошибку контекста, которая проявится у реальных пользователей.

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

Контрольные точки

Как проверить результат

Компиляция модуля формы
Норма

Нет ошибок о недоступности менеджера Константы

Тревожный признак

Ошибка «Переменная не определена (Константы)» — чтение осталось в клиентском коде

Значение на клиенте
Норма

Переменная или реквизит формы содержит актуальное значение константы

Тревожный признак

Пустое значение — проверьте, что константа заполнена в базе

Количество серверных вызовов
Норма

Один вызов на открытие формы или на сеанс при кэшировании

Тревожный признак

Вызов на каждое обращение — нужно кэширование или реквизит формы

Частые вопросы

Можно ли записать константу из клиентского кода?

Напрямую — нет, по той же причине: запись выполняется на сервере. Создайте серверную процедуру, которая вызовет Константы.Имя.Установить(Значение), и передайте значение параметром из клиентского кода. Учтите, что запись требует соответствующих прав у пользователя.

Что вернёт Получить(), если константа не заполнена?

Значение по умолчанию для типа константы: пустая строка, ноль, пустая ссылка соответствующего типа. Ошибки не будет, поэтому логику, зависящую от константы, стоит защищать проверкой на заполненность.

Работает ли кэш повторно используемых значений в веб-клиенте?

Да, механизм повторного использования работает во всех клиентах. В веб-клиенте выигрыш особенно заметен, так как каждый серверный вызов — это сетевой запрос.

Чем константа отличается от параметра сеанса при работе на клиенте?

Параметр сеанса устанавливается один раз при старте сеанса и доступен в привилегированном контексте; константа — обычные данные в базе. Для настроек, привязанных к пользователю, часто удобнее параметры сеанса или функциональные опции, а константы подходят для глобальных значений системы.

Как увидеть значение константы без программирования?

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

Итог

Что важно запомнить

Константа читается только на сервере; на клиент значение доставляется через серверную функцию общего модуля с флагом «Вызов сервера» или через реквизит формы в ПриСозданииНаСервере. Для частых обращений включайте повторное использование значений и не забывайте обновлять кэш после изменения константы.