Константа в 1С 8.3: одно значение на всю базу и как с ним работать

· 9 мин

Содержание

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

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

Константа в 1С: суть объекта и зачем он нужен

Представьте настройку, которая одна на всё предприятие и меняется редко. Заводить под неё справочник с одним элементом неудобно. Регистр с одной записью — громоздко. Для этого и придуман отдельный тип объекта метаданных — «Константы».

Что даёт константа:

  • 📌 Одно значение — без строк, без измерений, без периодов.
  • ⚡ Быстрый доступ — одна строка кода, без запроса и без поиска.
  • 🔐 Собственные права — чтение и изменение настраиваются отдельно для каждой константы.
  • 🧩 Связь с функциональными опциями — булева константа может включать и выключать целые разделы интерфейса.
  • 🔄 Участие в обмене — константу можно включить в состав плана обмена, и её изменения будут регистрироваться.

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

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

Какой тип данных может быть у константы

Тип задаётся в свойстве Тип в палитре свойств константы. Выбор шире, чем кажется.

ТипПример примененияЧто учесть
БулевоИспользоватьВалютныйУчетОснова для функциональных опций
ЧислоМаксимальная скидка, %Задайте длину и точность
СтрокаПуть к каталогу обмена, адрес сервисаОграничьте длину, неограниченная строка хуже для запросов
ДатаДата начала учёта в программеУкажите состав: дата, время или дата и время
Ссылка на справочникОсновная валюта, основная организацияЗначение — ссылка, а не копия данных
Ссылка на перечислениеСпособ округления, вариант учётаСписок значений фиксирован в конфигурации
Ссылка на документПоследний закрытый период как документИспользуется редко
ХранилищеЗначенияНастройки обмена, файл шаблонаЧитается целиком при каждом обращении
Составной типСсылка на один из нескольких справочниковПроверяйте тип значения в коде

Таблицу значений, массив или структуру напрямую в константу не положить. Если нужно сохранить такую коллекцию, её помещают в константу с типом ХранилищеЗначения: Новый ХранилищеЗначения(Таблица), а при чтении извлекают методом Получить() у хранилища.

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

Создаём константу в конфигураторе: порядок действий

Для собственной конфигурации порядок простой.

  1. Откройте базу в режиме Конфигуратор и откройте дерево конфигурации: Конфигурация → Открыть конфигурацию.
  2. Найдите ветку Константы в разделе общих объектов дерева.
  3. Щёлкните по ней правой кнопкой и выберите Добавить.
  4. Заполните Имя — латиница не обязательна, но без пробелов: МаксимальнаяСкидка.
  5. Заполните Синоним — его увидит пользователь: «Максимальная скидка, %».
  6. Выберите Тип и при необходимости длину и точность.
  7. При желании заполните Подсказку — она появится у поля на форме.
  8. Сохраните изменения и выполните Конфигурация → Обновить конфигурацию базы данных (клавиша F7).

На вкладке прав ролей появится новый объект. Выдайте нужным ролям права Чтение и Изменение (для интерактивной работы ещё Просмотр и Редактирование), иначе пользователи без полных прав получат ошибку доступа.

Если конфигурация типовая

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

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

Где пользователь увидит константу

Сама по себе новая константа нигде в интерфейсе не появится. Варианты:

  • 🧾 Форма констант. В свойствах корня конфигурации есть Основная форма констант. Создайте общую форму с основным реквизитом типа КонстантыНабор, выведите на неё поля — и укажите её в этом свойстве.
  • 🛠 Технический доступ. В режиме 1С:Предприятие через меню Все функции (в новых версиях платформы оно называется «Функции для технического специалиста») откройте ветку Константы и отредактируйте значение в списке.
  • ⚙️ Своя форма настроек. В типовых конфигурациях константы выведены в формы раздела настроек. В 1С:Бухгалтерии 3.0 многие из них — это флажки в Главное → Функциональность.

Чтение и запись константы из кода 1С

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

Получить значение

&НаКлиенте
Процедура ПроверитьСкидку(Команда)
    Лимит = ЛимитСкидкиНаСервере();
    Если Объект.ПроцентСкидки > Лимит Тогда
        ТекстСообщения = "Скидка выше допустимой: " + Формат(Лимит, "ЧГ=0") + "%";
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = ТекстСообщения;
        Сообщение.Сообщить();
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЛимитСкидкиНаСервере()
    Возврат Константы.МаксимальнаяСкидка.Получить();
КонецФункции

Директива &НаСервереБезКонтекста здесь лучше обычной &НаСервере: данные формы не передаются на сервер, вызов легче.

Записать значение

Короткий вариант — одна строка на сервере:

Константы.МаксимальнаяСкидка.Установить(15);

Вариант через менеджер значения удобен, когда нужно прочитать, проверить и записать:

Менеджер = Константы.МаксимальнаяСкидка.СоздатьМенеджерЗначения();
Менеджер.Прочитать();
Если Менеджер.Значение <> 15 Тогда
    Менеджер.Значение = 15;
    Менеджер.Записать();
КонецЕсли;

Несколько констант сразу

Набор констант читает и записывает группу значений за один раз:

Набор = Константы.СоздатьНабор("МаксимальнаяСкидка, ИспользоватьСкидки");
Набор.Прочитать();
Набор.ИспользоватьСкидки = Истина;
Набор.МаксимальнаяСкидка = 10;
Набор.Записать();

Константа в запросе

В языке запросов константы доступны как поля таблицы Константы:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Константы.МаксимальнаяСкидка КАК Лимит
|ИЗ
|    Константы КАК Константы";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Лимит = Выборка.Лимит;
КонецЕсли;

Это удобно, когда значение константы нужно в условии большого запроса: не придётся отдельно читать его и передавать параметром.

Проверка при записи

У константы есть модуль менеджера значения. В нём обрабатывают события записи, например проверяют допустимый диапазон:

Процедура ПередЗаписью(Отказ)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    Если Значение < 0 Или Значение > 50 Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Максимальная скидка должна быть от 0 до 50%";
        Сообщение.Сообщить();
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Проверка ОбменДанными.Загрузка нужна, чтобы при загрузке данных обмена значение записывалось без бизнес-проверок.

Константа, регистр, справочник, параметр сеанса: что выбрать

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

ОбъектСколько значенийИсторияГде хранитсяКогда выбрать
КонстантаОдно на базуНетВ базеОбщая редкая настройка
Регистр сведений непериодическийОдно на набор измеренийНетВ базеНастройка по организации, складу
Регистр сведений периодическийОдно на измерения и датуДаВ базеЗначение меняется со временем: ставки, курсы
СправочникМного элементовНетВ базеСписок однотипных объектов
Параметр сеансаОдно на сеансНетВ памяти сеансаТекущий пользователь, контекст сеанса
Хранилище общих настроекОдно на ключ и пользователяНетВ базеЛичные настройки пользователя

Ключевое отличие от регистра сведений: константа не умеет ответить на вопрос «какое значение было 1 марта». Если такой вопрос возникнет хотя бы в одном отчёте, сразу берите периодический регистр.

Где хранить настройку?

Частые ошибки разработчиков при работе с константами

  • 🚫 Обращение с клиента. Код Константы.Имя.Получить() в клиентской процедуре управляемой формы в тонком клиенте падает с ошибкой вида Переменная не определена (Константы). Решение — серверная функция, как в примере выше.
  • 🔒 Ошибка прав. Пользователь с ограниченной ролью не может прочитать константу. Либо дайте роли право Чтение, либо читайте значение в общем модуле с флагом Привилегированный, если доступ должен быть у всех.
  • 🔁 Счётчик в константе. Константа, которую одновременно увеличивают десятки сеансов (номер, счётчик обращений), превращается в узкое место: каждая запись блокирует её таблицу. Для этого лучше регистр с отдельными записями.
  • 🐘 Тяжёлое хранилище. В ХранилищеЗначения кладут файл на десятки мегабайт, а потом читают константу при каждом открытии формы. Данные каждый раз тянутся целиком. Крупные файлы храните отдельно и читайте только по требованию.
  • 👤 Личная настройка в общей константе. Один пользователь поменял «свою» настройку — она изменилась у всех. Для персональных значений константа не подходит.
  • 📉 Частое чтение в цикле. Вызов Получить() в цикле на 10 000 строк — это 10 000 обращений к базе. Прочитайте значение один раз до цикла. Если оно нужно по всей конфигурации, кешируйте его в общем модуле с повторным использованием возвращаемых значений «На время сеанса» — но помните, что изменение константы такой сеанс увидит только после перезапуска.

Где константы встречаются на практике

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

Включение функциональности

Булева константа ИспользоватьСкидки хранит факт: скидки на предприятии используются или нет. К ней привязывают функциональную опцию — в её свойстве Хранение указывают эту константу. Затем у реквизитов, команд и подсистем задают эту опцию. Пользователь снимает флажок в настройках — и поля скидок исчезают из всех форм без строчки кода.

Так устроены флажки раздела «Функциональность» в типовых конфигурациях: за большинством из них стоят как раз булевы константы.

Значение по умолчанию

Константа со ссылкой на справочник, например «Основная организация» или «Основной склад», подставляется в новые документы при заполнении. Для однофирменной базы это экономит несколько кликов в каждом документе. Для многофирменной лучше персональная настройка пользователя.

Интеграция и обмен

Адрес веб-сервиса, путь к каталогу выгрузки, логин технической учётной записи — классические константы. Пароли так хранить не стоит: значение видит любой, у кого есть право чтения. Для секретов в БСП предусмотрено безопасное хранилище, а без БСП ограничьте права на константу ролью администратора.

Служебная отметка

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

Можно ли посмотреть, кто и когда изменил константу?
Только через журнал регистрации: запись константы фиксируется там как изменение данных с именем пользователя и временем. Сама константа истории не хранит.
Сколько констант можно создать в конфигурации?
Жёсткого практического лимита нет: в крупных типовых конфигурациях их сотни. Ограничение скорее архитектурное — набор связанных настроек иногда удобнее держать в одном регистре сведений.
Изменилась константа, а пользователи видят старое значение. Почему?
Чаще всего значение закешировано в общем модуле с повторным использованием на время сеанса. Такие пользователи увидят новое значение после перезапуска программы.
Попадают ли константы в выгрузку базы .dt?
Да. Выгрузка информационной базы содержит все данные, включая значения констант. А вот выгрузка конфигурации в файл .cf переносит только описание константы, без значения.
Можно ли обратиться к константе по имени из строки?
Да: Константы[ИмяКонстанты].Получить(), где ИмяКонстанты — строковая переменная. Удобно в универсальных обработках настроек.