Константы 1С:Предприятия 8.3 от Конфигуратора до запроса

· 9 мин

Содержание

Константу в 1С 8.3 создают в Конфигураторе в ветке Общие → Константы, задают ей тип и обновляют конфигурацию базы данных. Значение пользователь вводит в форме констант или в панели настроек, а в коде его читают через Константы.Имя.Получить() и записывают через Константы.Имя.Установить(Значение).

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

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

Что проверить перед созданием константы

Константу часто заводят там, где нужен другой объект. Перед добавлением ответьте на три вопроса:

  • 📌 Значение одно на всю базу? Если оно разное у организаций, подразделений или пользователей — нужен регистр сведений с измерениями.
  • 📅 Нужна история? Если важно, какое значение действовало на прошлую дату, — периодический регистр сведений.
  • 🔁 Значение будет меняться часто, из разных сеансов? Константу как счётчик номеров использовать нельзя: каждая запись блокирует её таблицу, и параллельные сеансы встают в очередь.

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

1. Создание объекта «Константа» в Конфигураторе

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

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

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

Константа в расширении

Если менять основную конфигурацию нельзя, добавьте константу в расширение: Конфигурация → Расширения конфигурации → Добавить, затем в дереве расширения тот же путь Общие → Константы → Добавить. Расширения появились в платформе 8.3.6, а собственные объекты с хранимыми данными (включая константы) в них можно добавлять с более поздних версий платформы — на актуальной 8.3.2x это работает. Расширение должно иметь право изменять структуру базы, иначе при подключении появится предупреждение.

Имя константы в расширении лучше начинать с префикса расширения, например мр_ОсновнаяПапкаОбмена. Тогда при обновлении типовой конфигурации не возникнет конфликта, если поставщик добавит константу с тем же именем.

После записи расширения в базу структура тоже обновляется — это отдельный шаг от загрузки самого .cfe.

2. Тип значения и ограничения константы

Тип выбирают в палитре свойств, поле Тип. Доступны примитивные типы, ссылки на справочники, документы и перечисления, а также ХранилищеЗначения. Составной тип тоже разрешён, но без нужды его лучше не использовать: усложняются запросы и проверки.

ЗадачаТипЧто настроить
Флажок «использовать механизм»БулевоСвязать с функциональной опцией
Основная валюта, организация по умолчаниюСправочникСсылка.Валюты и т. п.Параметры выбора, если нужен отбор
Ставка, лимит, процентЧислоДлина и точность, неотрицательное
Путь, адрес, префиксСтрокаДлина строки, обычно 50–500
Вариант учёта из спискаПеречислениеСсылкаЗначение заполнения
Файл, настройки, картинкаХранилищеЗначенияЧтение и запись только кодом

Полезные свойства в палитре:

  • 🔢 Длина и точность числа. Значение, не влезающее в разрядность, записать не получится.
  • ✅ Проверка заполнения — Выдавать ошибку. Пустую константу тогда нельзя записать из формы.
  • 🔍 Параметры выбора и Связи параметров выбора — отбор в поле ввода, например только рублёвые счета.
  • 🧩 Форма — собственная форма константы, если стандартной мало.

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

Связь с функциональной опцией

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

3. Как пользователь вводит значение константы

Есть три пути, и какой сработает, зависит от того, как разработчик оформил константу.

Через «Все функции». Работает в любой конфигурации, если у пользователя есть права:

  1. Нажмите шестерёнку в заголовке окна — Сервис и настройки → Параметры.
  2. Включите флажок «Отображать команду “Все функции”» и нажмите Применить.
  3. Откройте Главное меню → Все функции → Константы.
  4. Дважды щёлкните нужную константу, задайте значение и нажмите Записать и закрыть.

Через общую форму констант. Разработчик создаёт общую форму, добавляет ей реквизит с типом КонстантыНабор, перетаскивает нужные константы на форму. Все значения записываются одной кнопкой. В конфигурациях на БСП так устроены панели раздела Администрирование: например, Администрирование → Общие настройки и Администрирование → Параметры учета в Бухгалтерии 3.0 — по сути наборы констант с удобными подписями.

Через раздел командного интерфейса. Если на закладке Подсистемы константа включена в раздел и стандартные команды разрешены, в панели навигации раздела появится ссылка на её форму.

Начальное значение при обновлении. Новая константа после F7 пустая: у Булево это Ложь, у числа 0, у ссылки — пустая ссылка. Если пустое значение ломает логику, заполните его кодом при первом запуске. В конфигурациях на БСП для этого пишут обработчик обновления информационной базы, в своей — проверяют значение при старте сеанса на сервере и записывают нужное.

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

4. Как установить значение константы программно

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

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

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

&НаСервереБезКонтекста
Процедура ЗадатьПапкуОбмена(Путь)
    Константы.ОсновнаяПапкаОбмена.Установить(Путь);
КонецПроцедуры

Метод Установить() сразу пишет значение в базу и вызывает обработчики модуля менеджера значения.

Менеджер значения: проверка и обработчики

Если перед записью нужно что-то проверить или выставить флаг загрузки при обмене, используйте менеджер значения:

Менеджер = Константы.ОсновнаяПапкаОбмена.СоздатьМенеджерЗначения();
Менеджер.Прочитать();
Менеджер.Значение = "D:\Exchange\";
Менеджер.ОбменДанными.Загрузка = Истина; // флаг читают обработчики, чтобы пропустить проверки
Менеджер.Записать();

У константы есть Модуль менеджера значения (контекстное меню константы — Открыть модуль менеджера значения). Там пишут обработчики ПередЗаписью(Отказ) и ПриЗаписи(Отказ). Текущее значение внутри модуля — ЭтотОбъект.Значение.

Процедура ПередЗаписью(Отказ)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    Если Не ПустаяСтрока(Значение) И Не СтрЗаканчиваетсяНа(Значение, "\") Тогда
        Значение = Значение + "\";
    КонецЕсли;
КонецПроцедуры

Набор констант: несколько значений одной транзакцией

Набор = Константы.СоздатьНабор("ОсновнаяПапкаОбмена, ИспользоватьОбменЧерезПапку");
Набор.Прочитать();
Набор.ОсновнаяПапкаОбмена = "D:\Exchange\";
Набор.ИспользоватьОбменЧерезПапку = Истина;
Набор.Записать();

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

СпособКогда применятьОбработчики модуля
Получить() / Установить()Одно значение, простая записьВызываются
Менеджер значенияНужен флаг загрузки или предварительное чтениеВызываются, можно отключить проверки через ОбменДанными.Загрузка
Набор константНесколько связанных значений сразуВызываются у каждой константы набора

Где брать значение на клиенте

Частые обращения к серверу за одной константой тормозят формы. Варианты:

  • 🧠 Общий модуль с повторным использованием возвращаемых значений «На время сеанса» — функция вызывается один раз, дальше результат берётся из кэша.
  • 📦 Параметры клиента при запуске, если значение нужно сразу после входа.
  • 🔎 Для булевых констант, связанных с функциональной опцией, — ПолучитьФункциональнуюОпцию("ИмяОпции"), она доступна и на клиенте.

Кэш на время сеанса не узнает об изменении константы. Пользователь увидит новое значение после перезапуска сеанса — учитывайте это при тестировании.

5. Константы в запросах и отчётах

В языке запросов есть таблица Константы, где каждая константа — отдельное поле:

ВЫБРАТЬ
    Константы.ОсновнаяВалюта КАК Валюта,
    Константы.ОсновнаяПапкаОбмена КАК Папка
ИЗ
    Константы КАК Константы

Таблица всегда возвращает одну строку, поэтому её удобно соединять с другими без условия связи или подставлять во вложенный запрос:

ВЫБРАТЬ
    Товары.Ссылка,
    Товары.Цена
ИЗ
    Справочник.Номенклатура КАК Товары
ГДЕ
    Товары.Цена > (ВЫБРАТЬ Константы.МинимальнаяЦена ИЗ Константы КАК Константы)

В системе компоновки данных константу проще передать параметром: прочитать её в модуле отчёта и установить через КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(). Так запрос остаётся чистым, а пользователь при желании может переопределить параметр в настройках отчёта.

6. Права на константы и защита значений

Для каждой константы в роли задают четыре права:

  • 👁 Чтение — получение значения кодом и в запросах.
  • ✏️ Изменение — запись значения кодом.
  • 📄 Просмотр — открытие формы константы в интерфейсе.
  • 🖊 Редактирование — изменение значения в форме.

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

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

УстановитьПривилегированныйРежим(Истина);
Константы.ДатаПервогоЗапуска.Установить(ТекущаяДатаСеанса());
УстановитьПривилегированныйРежим(Ложь);

Альтернатива — отметить у общего модуля свойство «Привилегированный». Тогда весь его код выполняется без проверки прав, поэтому туда не кладут ничего, что принимает произвольные данные от клиента.

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

7. Ошибки при работе с константами и их причины

Диагностика: выберите симптом

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

Частые вопросы о константах 1С

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