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