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