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

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

Как обратиться к константе в 1С: чтение и запись значений

Как обратиться к константе в 1С: через менеджер констант, КонстантыМенеджер, запрос и форму. Примеры кода, типичные ошибки и проверка результата.

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

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

Ниже разобраны практические способы обращения к константам: через менеджер, через набор констант, через запрос и через форму, а также типичные ошибки, из-за которых код выдаёт «Поле объекта не обнаружено» или возвращает пустое значение.

Обращение к константе через менеджер: чтение и запись

Основной способ работы с константой в коде — глобальный контекст Константы. Каждая константа конфигурации доступна как свойство этого объекта, и у каждой есть свой менеджер с методами Получить() и Установить().

Чтение значения выглядит так:

НаименованиеОрганизации = Константы.НаименованиеОрганизации.Получить();

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

Запись выполняется методом Установить(), который автоматически фиксирует изменение в базе данных:

Константы.НаименованиеОрганизации.Установить("ООО Ромашка");

Метод Установить() записывает значение сразу, без дополнительного вызова Записать(). Если тип переданного значения не совпадает с типом константы, платформа выдаст ошибку преобразования — поэтому перед записью ссылочных значений убедитесь, что передаёте именно ссылку, а не строку с наименованием.

Чтение нескольких констант через набор

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

Набор создаётся методом СоздатьНабор() с перечислением имён нужных констант через запятую:

Набор = Константы.СоздатьНабор("ВалютаУчета, НаименованиеОрганизации");

Набор.Прочитать();

Валюта = Набор.ВалютаУчета;

Название = Набор.НаименованиеОрганизации;

Аналогично работает запись: заполняете свойства набора и вызываете Записать(). Все константы набора будут записаны в одной транзакции, что гарантирует целостность взаимосвязанных настроек — например, пары «использовать обмен» и «узел обмена».

Если нужен полный список констант конфигурации, используйте коллекцию метаданных: Метаданные.Константы. Это пригодится при построении универсальных обработок настроек, где имена констант заранее неизвестны.

Обращение к константе через запрос

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Константы.ВалютаУчета КАК Валюта,

| Константы.НаименованиеОрганизации КАК Организация

|ИЗ

| Константы КАК Константы";

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Валюта = Выборка.Валюта;

КонецЕсли;

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

Ограничение способа: запрос подходит только для чтения. Записать значение константы через запрос нельзя — для записи используйте менеджер или набор.

Способы обращения к константе

Константы.Имя.Получить()

Одно значение, простой код. Подходит для разового чтения, но в цикле создаёт лишние обращения к базе.

Набор констант

Несколько констант за одно чтение, запись в одной транзакции. Оптимально для пакетной работы с настройками.

Запрос к таблице Константы

Только чтение. Удобен внутри сложных запросов и при соединениях с другими таблицами.

Обращение к константе на клиенте и в тонком клиенте

В управляемом приложении код формы делится на клиентский и серверный. Менеджер констант доступен только на сервере, поэтому прямой вызов Константы.Имя.Получить() в клиентской процедуре приведёт к ошибке компиляции или выполнения.

Правильный шаблон — получить значение на сервере и передать его в клиентский контекст:

&НаСервереБезКонтекста

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

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

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

&НаКлиенте

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

Валюта = ПолучитьВалютуУчета();

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

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

Порядок чтения константы в управляемой форме
  1. 1
    Создайте серверную функцию с директивой &НаСервереБезКонтекста
  2. 2
    Внутри функции верните Константы.ИмяКонстанты.Получить()
  3. 3
    Вызовите функцию из клиентской процедуры формы
  4. 4
    Сохраните результат в реквизит формы, если значение нужно повторно
  5. 5
    Проверьте, что тип возвращаемого значения сериализуется (ссылки и примитивы — да, COM-объекты — нет)

Работа с константами в пользовательском режиме

Помимо кода, обратиться к константе можно интерактивно. В типовых конфигурациях константы обычно выведены в формы настроек: «Администрирование» → «Общие настройки», «Настройки обмена» и подобные разделы. Изменение значения в такой форме равнозначно вызову Установить().

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

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

Типичные ошибки при обращении к константам

Самая частая ошибка — «Поле объекта не обнаружено» при обращении Константы.ИмяКонстанты. Причина почти всегда в опечатке: имя в коде должно в точности совпадать с именем константы в конфигураторе, включая регистр букв не обязательно, но написание — обязательно. Проверьте имя в дереве метаданных.

Вторая группа ошибок связана с контекстом выполнения: попытка вызвать менеджер констант в клиентской процедуре управляемой формы или на внешнем соединении без нужного контекста. Решение — перенести обращение на сервер, как показано выше.

Третья типичная ситуация — константа «возвращает пустое значение». Это нормально для константы, которой никогда не присваивали значение: платформа вернёт значение по умолчанию для типа (пустая строка, ноль, пустая ссылка). Перед использованием ссылочных констант проверяйте заполненность через ЗначениеЗаполнено().

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

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

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

После записи через Установить() проверку выполняют повторным чтением: если Получить() возвращает новое значение, запись прошла успешно. При записи через набор полезно обернуть вызов в попытку-исключение, чтобы перехватить ошибки блокировок при параллельной работе пользователей.

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

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

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

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

Получить() возвращает значение ожидаемого типа

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

Возвращается пустое значение или ошибка «Поле объекта не обнаружено»

Запись константы
Норма

Повторный Получить() возвращает новое значение

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

Значение осталось прежним — проверьте права и исключения

Константа в функциональной опции
Норма

После установки Истина связанные разделы появились в интерфейсе

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

Интерфейс не изменился — обновите сеанс или проверьте состав опции

Итог

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

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

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

Можно ли обратиться к константе по имени, заданному строкой?

Да, через индексное обращение: Константы["ИмяКонстанты"].Получить(). Это удобно в универсальных обработках, где имя константы приходит как параметр. Перед обращением проверьте существование через Метаданные.Константы.Найти(Имя), чтобы избежать ошибки.

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

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

Почему запись константы вызывает ошибку блокировки?

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

Можно ли хранить в константе список значений или таблицу?

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

Как узнать, кто и когда изменил константу?

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