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

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

Что такое константа в 1С и как с ней работать

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

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

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

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

Для чего нужны константы и где они находятся

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

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

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

Как создать константу в конфигураторе

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

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

Отдельно проверьте права: если у роли нет права «Чтение» на константу, обращение к ней из кода под этим пользователем вызовет исключение. Это частая причина ошибок «у администратора работает, у менеджера — нет».

Как прочитать и записать константу в коде

Работа с константами во встроенном языке выполняется через менеджер Константы. Доступ максимально простой — по имени константы, как к свойству:

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

// Запись значения
Константы.ПрефиксИнформационнойБазы.Установить("ЦО");

// Проверка булевой константы-флага
Если Константы.ВестиУчетПоОрганизациям.Получить() Тогда
    // логика мультиорганизационного учета
КонецЕсли;

Метод Получить() возвращает текущее значение, Установить() — записывает новое. Запись выполняется вне транзакции документа: константа изменяется сразу, и откат проведения документа её не вернёт. Поэтому не храните в константах данные, которые логически принадлежат документу.

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

Константа, параметр сеанса и функциональная опция: что выбрать

Три механизма часто путают, потому что все они «хранят настройки». Разница принципиальна, и неправильный выбор создаёт проблемы в эксплуатации.

Сравнение механизмов хранения настроек

Константа

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

Параметр сеанса

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

Функциональная опция

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

Регистр сведений

Нужен, когда настройка периодическая (меняется во времени) или различается по измерениям — например, учётная политика по организациям на дату.

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

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

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

Типичные ошибки
01
Хранение периодических данных в константе: при смене значения старая история теряется, и отчёты за прошлые периоды начинают считаться по новой настройке.
02
Чтение константы в цикле вместо однократного получения в переменную — лишние обращения к базе на каждой итерации.
03
Запись константы внутри транзакции проведения документа: при откате транзакции значение уже изменено или возникает конфликт блокировок.
04
Отсутствие прав на чтение константы у прикладных ролей — код падает с ошибкой доступа у обычных пользователей.
05
Хранение строки вместо ссылки на справочник: теряется контроль целостности, возможны опечатки и рассинхронизация.
06
Использование константы там, где нужен регистр сведений по организациям, — в многофирменной базе настройка становится общей для всех юрлиц.

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

Ограничения и безопасные границы самостоятельной работы

Константа не хранит историю изменений. Если вам нужно знать, какое значение действовало на прошлую дату, константа не подойдёт — используйте периодический регистр сведений. Это ограничение нельзя обойти настройкой, оно заложено в архитектуру объекта.

Второе ограничение — одно значение на базу. В базах с несколькими организациями или обособленными подразделениями глобальная константа может оказаться слишком грубым инструментом. Перед созданием константы ответьте на вопрос: «А не должна ли эта настройка различаться по организациям?» Если ответ «возможно» — сразу проектируйте регистр сведений.

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

Как проверить результат и найти нужную константу

После создания или изменения константы проверьте три вещи: значение читается из кода, права настроены для рабочих ролей, форма настроек отображает актуальное значение. Быстрая проверка — через консоль кода или функционал «Выполнить код»:

bsl
Сообщить(Константы.ПрефиксИнформационнойБазы.Получить());
Контрольные точки

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

Чтение значения из кода
Норма

Значение возвращается без исключений под рабочей ролью

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

Ошибка «Нарушение прав доступа» или пустое значение там, где оно заполнено

Запись через форму настроек
Норма

После сохранения и повторного открытия значение сохранилось

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

Значение сбрасывается — вероятно, форма не связана с константой

Функциональная опция
Норма

При смене флага скрываются/появляются связанные элементы интерфейса

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

Интерфейс не реагирует — константа не включена в состав опции

Найти, какая константа отвечает за конкретную настройку в типовой конфигурации, можно так: откройте форму настройки, через «Ещё → Изменить форму» или конфигуратор посмотрите, с каким реквизитом связано поле. Поиск по дереву конфигурации (Ctrl+F) по смысловому слову тоже часто срабатывает, потому что имена констант в типовых решениях говорящие.

При переносе данных между базами константы часто забывают включить в план обмена или обработку выгрузки. Если после переноса «всё работает, но настройки пустые» — проверьте, переносились ли константы вообще.
ПЗ
Практическое замечание

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

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

Реквизит принадлежит конкретному элементу справочника, и элементов может быть много. Константа одна на всю базу и не привязана ни к какому объекту. Если значение общее для всех — константа; если у каждого элемента своё — реквизит.

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

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

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

Штатной истории изменений у констант нет. Если аудит важен, включите версионирование через подсистему «Свойства» (в типовых, где поддерживается) или храните настройку в периодическом регистре сведений, где видна дата и ответственный.

Почему константа пустая, хотя в настройках значение заполнено?

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

Нужно ли монопольное доступ для добавления константы?

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

Что выбрать для учётной политики: константу или регистр сведений?

Если организация одна и политика не меняется задним числом — допустима константа. Если организаций несколько или политика действует с определённой даты и нужна история — только периодический регистр сведений с измерением «Организация». В типовых конфигурациях учётная политика хранится именно в регистрах.

Итог

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

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