Константа в 1С 8.3: одно значение на всю базу и как с ним работать
Содержание
Константа в 1С:Предприятии — это объект конфигурации, который хранит одно значение на всю информационную базу: валюту учёта, флаг «используется валютный учёт», путь к каталогу обмена, процент максимальной скидки. В коде её читают так: Константы.ИмяКонстанты.Получить(), а записывают через Установить(Значение). История изменений у константы не ведётся: новое значение просто заменяет старое.
Константы используют и пользователи, и разработчики. Пользователь видит их как галочки и поля в настройках программы. Разработчик создаёт их в конфигураторе, ссылается на них из модулей, запросов и функциональных опций. Ниже — как это устроено на платформе 8.3 и где константа уместна, а где нет.
Константа в 1С: суть объекта и зачем он нужен
Представьте настройку, которая одна на всё предприятие и меняется редко. Заводить под неё справочник с одним элементом неудобно. Регистр с одной записью — громоздко. Для этого и придуман отдельный тип объекта метаданных — «Константы».
Что даёт константа:
- 📌 Одно значение — без строк, без измерений, без периодов.
- ⚡ Быстрый доступ — одна строка кода, без запроса и без поиска.
- 🔐 Собственные права — чтение и изменение настраиваются отдельно для каждой константы.
- 🧩 Связь с функциональными опциями — булева константа может включать и выключать целые разделы интерфейса.
- 🔄 Участие в обмене — константу можно включить в состав плана обмена, и её изменения будут регистрироваться.
В платформе 8.3 каждая константа хранится в своей таблице базы данных. Поэтому запись одной константы не блокирует чтение и запись другой.
Константа хранит значение для всей базы, а не для организации и не для пользователя. Если настройка должна различаться по организациям, нужен регистр сведений с измерением «Организация».
Какой тип данных может быть у константы
Тип задаётся в свойстве Тип в палитре свойств константы. Выбор шире, чем кажется.
| Тип | Пример применения | Что учесть |
|---|---|---|
| Булево | ИспользоватьВалютныйУчет | Основа для функциональных опций |
| Число | Максимальная скидка, % | Задайте длину и точность |
| Строка | Путь к каталогу обмена, адрес сервиса | Ограничьте длину, неограниченная строка хуже для запросов |
| Дата | Дата начала учёта в программе | Укажите состав: дата, время или дата и время |
| Ссылка на справочник | Основная валюта, основная организация | Значение — ссылка, а не копия данных |
| Ссылка на перечисление | Способ округления, вариант учёта | Список значений фиксирован в конфигурации |
| Ссылка на документ | Последний закрытый период как документ | Используется редко |
| ХранилищеЗначения | Настройки обмена, файл шаблона | Читается целиком при каждом обращении |
| Составной тип | Ссылка на один из нескольких справочников | Проверяйте тип значения в коде |
Таблицу значений, массив или структуру напрямую в константу не положить. Если нужно сохранить такую коллекцию, её помещают в константу с типом ХранилищеЗначения: Новый ХранилищеЗначения(Таблица), а при чтении извлекают методом Получить() у хранилища.
Если поменять тип уже заполненной константы, при обновлении конфигурации базы данных платформа попытается привести значение к новому типу. Значение, которое привести нельзя, потеряется. Запишите текущее значение до изменения.
Создаём константу в конфигураторе: порядок действий
Для собственной конфигурации порядок простой.
- Откройте базу в режиме
Конфигуратори откройте дерево конфигурации:Конфигурация → Открыть конфигурацию. - Найдите ветку
Константыв разделе общих объектов дерева. - Щёлкните по ней правой кнопкой и выберите
Добавить. - Заполните
Имя— латиница не обязательна, но без пробелов:МаксимальнаяСкидка. - Заполните
Синоним— его увидит пользователь: «Максимальная скидка, %». - Выберите
Типи при необходимости длину и точность. - При желании заполните
Подсказку— она появится у поля на форме. - Сохраните изменения и выполните
Конфигурация → Обновить конфигурацию базы данных(клавишаF7).
На вкладке прав ролей появится новый объект. Выдайте нужным ролям права Чтение и Изменение (для интерактивной работы ещё Просмотр и Редактирование), иначе пользователи без полных прав получат ошибку доступа.
Если конфигурация типовая
В типовую конфигурацию
на поддержке новые объекты добавлять напрямую не стоит: это снимает её с поддержки или усложняет обновления. Создайте расширение конфигурации
и добавьте константу в него. Проверить, что ваша версия платформы это позволяет, легко: в дереве расширения в контекстном меню ветки Константы должна быть доступна команда Добавить.
Расширение подключается без обновления основной конфигурации. Константа из расширения доступна в коде так же: Константы.МаксимальнаяСкидка.
Где пользователь увидит константу
Сама по себе новая константа нигде в интерфейсе не появится. Варианты:
- 🧾 Форма констант. В свойствах корня конфигурации есть
Основная форма констант. Создайте общую форму с основным реквизитом типаКонстантыНабор, выведите на неё поля — и укажите её в этом свойстве. - 🛠 Технический доступ. В режиме 1С:Предприятие через меню
Все функции(в новых версиях платформы оно называется «Функции для технического специалиста») откройте веткуКонстантыи отредактируйте значение в списке. - ⚙️ Своя форма настроек. В типовых конфигурациях константы выведены в формы раздела настроек. В 1С:Бухгалтерии 3.0 многие из них — это флажки в
Главное → Функциональность.
Чтение и запись константы из кода 1С
Объектом-менеджером констант является глобальное свойство Константы. Важная деталь: оно доступно на сервере, в толстом клиенте и во внешнем соединении, но не в тонком и веб-клиенте. В управляемой форме к константе обращаются через серверный вызов.
Получить значение
&НаКлиенте
Процедура ПроверитьСкидку(Команда)
Лимит = ЛимитСкидкиНаСервере();
Если Объект.ПроцентСкидки > Лимит Тогда
ТекстСообщения = "Скидка выше допустимой: " + Формат(Лимит, "ЧГ=0") + "%";
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщения;
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЛимитСкидкиНаСервере()
Возврат Константы.МаксимальнаяСкидка.Получить();
КонецФункции
Директива &НаСервереБезКонтекста здесь лучше обычной &НаСервере: данные формы не передаются на сервер, вызов легче.
Записать значение
Короткий вариант — одна строка на сервере:
Константы.МаксимальнаяСкидка.Установить(15);
Вариант через менеджер значения удобен, когда нужно прочитать, проверить и записать:
Менеджер = Константы.МаксимальнаяСкидка.СоздатьМенеджерЗначения();
Менеджер.Прочитать();
Если Менеджер.Значение <> 15 Тогда
Менеджер.Значение = 15;
Менеджер.Записать();
КонецЕсли;
Несколько констант сразу
Набор констант читает и записывает группу значений за один раз:
Набор = Константы.СоздатьНабор("МаксимальнаяСкидка, ИспользоватьСкидки");
Набор.Прочитать();
Набор.ИспользоватьСкидки = Истина;
Набор.МаксимальнаяСкидка = 10;
Набор.Записать();
Константа в запросе
В языке запросов константы доступны как поля таблицы Константы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Константы.МаксимальнаяСкидка КАК Лимит
|ИЗ
| Константы КАК Константы";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Лимит = Выборка.Лимит;
КонецЕсли;
Это удобно, когда значение константы нужно в условии большого запроса: не придётся отдельно читать его и передавать параметром.
Проверка при записи
У константы есть модуль менеджера значения. В нём обрабатывают события записи, например проверяют допустимый диапазон:
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Значение < 0 Или Значение > 50 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Максимальная скидка должна быть от 0 до 50%";
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Проверка ОбменДанными.Загрузка нужна, чтобы при загрузке данных обмена значение записывалось без бизнес-проверок.
Константа, регистр, справочник, параметр сеанса: что выбрать
Константу часто путают с соседними объектами. Разница — в том, сколько значений хранится, для кого и нужна ли история.
| Объект | Сколько значений | История | Где хранится | Когда выбрать |
|---|---|---|---|---|
| Константа | Одно на базу | Нет | В базе | Общая редкая настройка |
| Регистр сведений непериодический | Одно на набор измерений | Нет | В базе | Настройка по организации, складу |
| Регистр сведений периодический | Одно на измерения и дату | Да | В базе | Значение меняется со временем: ставки, курсы |
| Справочник | Много элементов | Нет | В базе | Список однотипных объектов |
| Параметр сеанса | Одно на сеанс | Нет | В памяти сеанса | Текущий пользователь, контекст сеанса |
| Хранилище общих настроек | Одно на ключ и пользователя | Нет | В базе | Личные настройки пользователя |
Ключевое отличие от регистра сведений: константа не умеет ответить на вопрос «какое значение было 1 марта». Если такой вопрос возникнет хотя бы в одном отчёте, сразу берите периодический регистр.
Частые ошибки разработчиков при работе с константами
- 🚫 Обращение с клиента. Код
Константы.Имя.Получить()в клиентской процедуре управляемой формы в тонком клиенте падает с ошибкой видаПеременная не определена (Константы). Решение — серверная функция, как в примере выше. - 🔒 Ошибка прав. Пользователь с ограниченной ролью не может прочитать константу. Либо дайте роли право
Чтение, либо читайте значение в общем модуле с флагомПривилегированный, если доступ должен быть у всех. - 🔁 Счётчик в константе. Константа, которую одновременно увеличивают десятки сеансов (номер, счётчик обращений), превращается в узкое место: каждая запись блокирует её таблицу. Для этого лучше регистр с отдельными записями.
- 🐘 Тяжёлое хранилище. В
ХранилищеЗначениякладут файл на десятки мегабайт, а потом читают константу при каждом открытии формы. Данные каждый раз тянутся целиком. Крупные файлы храните отдельно и читайте только по требованию. - 👤 Личная настройка в общей константе. Один пользователь поменял «свою» настройку — она изменилась у всех. Для персональных значений константа не подходит.
- 📉 Частое чтение в цикле. Вызов
Получить()в цикле на 10 000 строк — это 10 000 обращений к базе. Прочитайте значение один раз до цикла. Если оно нужно по всей конфигурации, кешируйте его в общем модуле с повторным использованием возвращаемых значений «На время сеанса» — но помните, что изменение константы такой сеанс увидит только после перезапуска.
Где константы встречаются на практике
Несколько типичных сценариев, по которым удобно понять, как мыслить при проектировании.
Включение функциональности
Булева константа ИспользоватьСкидки хранит факт: скидки на предприятии используются или нет. К ней привязывают функциональную опцию — в её свойстве Хранение указывают эту константу. Затем у реквизитов, команд и подсистем задают эту опцию. Пользователь снимает флажок в настройках — и поля скидок исчезают из всех форм без строчки кода.
Так устроены флажки раздела «Функциональность» в типовых конфигурациях: за большинством из них стоят как раз булевы константы.
Значение по умолчанию
Константа со ссылкой на справочник, например «Основная организация» или «Основной склад», подставляется в новые документы при заполнении. Для однофирменной базы это экономит несколько кликов в каждом документе. Для многофирменной лучше персональная настройка пользователя.
Интеграция и обмен
Адрес веб-сервиса, путь к каталогу выгрузки, логин технической учётной записи — классические константы. Пароли так хранить не стоит: значение видит любой, у кого есть право чтения. Для секретов в БСП предусмотрено безопасное хранилище, а без БСП ограничьте права на константу ролью администратора.
Служебная отметка
Дата последней успешной загрузки, номер версии данных после обновления. Регламентное задание читает константу, понимает, с какого места продолжить, и записывает новое значение в конце.
Можно ли посмотреть, кто и когда изменил константу?
Сколько констант можно создать в конфигурации?
Изменилась константа, а пользователи видят старое значение. Почему?
Попадают ли константы в выгрузку базы .dt?
Можно ли обратиться к константе по имени из строки?
Константы[ИмяКонстанты].Получить(), где ИмяКонстанты — строковая переменная. Удобно в универсальных обработках настроек.