Значение константы в 1С 8.3: через интерфейс, Конфигуратор и встроенный язык

· 8 мин

Содержание

Чтобы присвоить значение константе в 1С, пользователю достаточно открыть её через Главное меню → Все функции → Константы, ввести значение и нажать «Записать и закрыть». В коде значение задают одной строкой на сервере: Константы.ИмяКонстанты.Установить(Значение). Ниже оба пути, плюс то, что ломается чаще всего: права, типы, кэш и блокировки.

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

Где задать значение константы в пользовательском режиме

В типовых конфигурациях на базе БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) почти все константы спрятаны за формами настроек. Флажки в разделе Администрирование — «Общие настройки», «Настройки пользователей и прав», «Проведение документов» и другие — это и есть константы. Включили флажок, и платформа записала Истина в соответствующую константу.

Поэтому первый способ — штатный:

  1. Откройте раздел Администрирование.
  2. Выберите нужную группу настроек.
  3. Установите флажок или выберите значение из списка.
  4. Закройте форму: запись происходит сразу при изменении.

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

Список всех констант через «Все функции»

Если константы нет в настройках или нужно увидеть точное значение, откройте полный список:

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

В новых релизах БСП та же команда в главном меню называется «Функции для технического специалиста» — содержимое дерева одинаковое.

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

Форма констант конфигурации

У конфигурации может быть основная форма констант. Если она задана, при открытии ветки Константы целиком откроется она, а не список. В типовых решениях эту роль выполняют формы раздела Администрирование, поэтому отдельная форма констант встречается чаще в самописных базах.

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

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

Порядок создания:

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

После обновления у константы появляется пустое значение своего типа: 0 для числа, пустая строка, Ложь, пустая ссылка. Чтобы задать начальное значение, нужен один из способов из следующих разделов — например, обработчик первоначального заполнения.

Модуль менеджера значения

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

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

В типовой конфигурации не правьте объекты основной конфигурации напрямую: это снимает её с поддержки. Новую константу или обработчик добавляйте в расширение. Расширения в 8.3 умеют добавлять собственные константы.

Программное присваивание значения константе

Объект Константы доступен только на сервере, в толстом клиенте и во внешнем соединении. В модуле формы код пишут в процедуре с директивой &НаСервере или в общем серверном модуле.

Способ 1. Метод Установить()

Самый короткий вариант:

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

Чтение — симметрично:

Склад = Константы.ОсновнойСклад.Получить();

Установить() сразу пишет значение в базу. События ПередЗаписью и ПриЗаписи при этом срабатывают.

Способ 2. Менеджер значения

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

Менеджер = Константы.ОсновнойСклад.СоздатьМенеджерЗначения();
Менеджер.Прочитать();
Менеджер.Значение = Склад;
Менеджер.ОбменДанными.Загрузка = Истина; // без бизнес-логики обработчиков
Менеджер.Записать();

Флаг ОбменДанными.Загрузка ставьте только для служебной загрузки данных. При обычной работе он лишний: проверки в ПередЗаписью написаны не зря.

Способ 3. Набор констант

Если за один раз меняются несколько констант, используйте набор. Он записывает их одной операцией:

Набор = Константы.СоздатьНабор("ОсновнойСклад, ОсновнаяВалюта");
Набор.Прочитать();
Набор.ОсновнойСклад = Склад;
Набор.ОсновнаяВалюта = Валюта;
Набор.Записать();

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

Какой способ выбрать

СпособКогда применятьНа что смотреть
Установить()Одна константа, простое значениеРаботает только на сервере
Менеджер значенияНужен контроль записи или загрузка без обработчиковФлаг Загрузка отключает проверки
Набор константНесколько связанных настроекПишутся все константы набора
Пользовательский режимРазовая правка администраторомНужно право «Изменение»

Типы значений: что можно хранить в константе

Тип выбирают при создании, и от него зависит, что примет константа.

  • 🔢 Число — задайте длину и точность. Константа длиной 10 и точностью 2 примет 12345678.99, но не 123456789.5.
  • 🔤 Строка — длина 0 означает неограниченную строку. Такую строку нельзя использовать в условиях отбора и сортировки запроса без приведения.
  • 📅 Дата — выберите состав: дата, время или дата и время.
  • ✅ Булево — основа функциональных опций: флажок в настройках включает и выключает целые подсистемы.
  • 🔗 Ссылка — на справочник, перечисление, план счетов . Значение по умолчанию — пустая ссылка.
  • 📦 ХранилищеЗначения — для произвольных данных: таблицы, структуры, файла.

С хранилищем работают в два слоя:

// запись
Настройки = Новый Структура("Порог, Email", 1000, "buh@example.ru");
Константы.НастройкиОбмена.Установить(Новый ХранилищеЗначения(Настройки));

// чтение
Настройки = Константы.НастройкиОбмена.Получить().Получить();

Первый Получить() возвращает хранилище, второй — то, что в нём лежит.

Составной тип

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

Значение = Константы.ПолучательУведомлений.Получить();
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Пользователи") Тогда
    // работа с пользователем
КонецЕсли;

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

Массовое заполнение и перенос значений между базами

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

Начальное заполнение при обновлении

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

Перенос из одной базы в другую

Варианты по степени трудозатрат:

  1. Вручную — открыть константы в обеих базах и переписать значения. Подходит, если их до десяти.
  2. Обработка выгрузки в XML — универсальные обработки выгрузки-загрузки данных переносят константы наравне со справочниками. Ссылочные значения сопоставляются по уникальному идентификатору, поэтому справочник-источник должен быть в базе-приёмнике с теми же ссылками.
  3. Внешняя обработка — читает константы в одной базе через внешнее соединение и пишет в другую. Удобно, когда ссылки нужно сопоставлять по коду или наименованию.

Пример выгрузки всех констант с их значениями в таблицу — пригодится для сравнения двух баз:

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Имя");
Таблица.Колонки.Добавить("Значение");
Для Каждого ОбъектМетаданных Из Метаданные.Константы Цикл
    Строка = Таблица.Добавить();
    Строка.Имя = ОбъектМетаданных.Имя;
    Строка.Значение = Константы[ОбъектМетаданных.Имя].Получить();
КонецЦикла;

Код выполняйте от пользователя с полными правами: при нехватке прав на чтение хотя бы одной константы цикл прервётся с ошибкой.

Запись нескольких констант в транзакции

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

НачатьТранзакцию();
Попытка
    Константы.ОсновнойСклад.Установить(Склад);
    Константы.ОсновнаяВалюта.Установить(Валюта);
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;

Почему значение константы не записывается или не применяется

Большинство проблем с константами укладываются в пять сценариев.

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

Почему константа — плохой счётчик

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

Проверка, что значение действительно записано

Самый быстрый способ — консоль запросов:

ВЫБРАТЬ
    Константы.ОсновнойСклад
ИЗ
    Константы КАК Константы

Если запрос возвращает старое значение, запись не прошла: ищите отказ в ПередЗаписью или исключение в транзакции. Если новое — проблема в кэше или в коде, который читает другую константу.

Если ничего не помогло

  • 🔍 Включите в Конфигураторе остановку по ошибке (Отладка → Остановка по ошибке) и повторите запись — отладчик покажет строку отказа.
  • 📜 Откройте журнал регистрации с отбором по метаданным константы: там видно, кто и когда менял значение.
  • 🧩 Отключите расширения по очереди: подписка из расширения может отменять запись.
Можно ли задать значение константы в Конфигураторе?
Нет. В Конфигураторе описывают тип и права константы. Значение вводят в режиме Предприятия или задают кодом.
Видно ли в журнале регистрации, кто изменил константу?
Да, изменение константы фиксируется событием изменения данных с указанием пользователя и времени, если журнал регистрации ведётся на нужном уровне.
Зависит ли значение константы от пользователя или организации?
Нет, значение одно на всю информационную базу. Для разных значений по организациям используют регистр сведений с измерением «Организация».
Можно ли менять константу, когда в базе работают пользователи?
Да, монопольный режим не нужен. Но другие сеансы увидят новое значение только после сброса своего кэша, а изменённая функциональная опция — после обновления интерфейса.
Как очистить значение константы?
Присвойте пустое значение её типа: Константы.Имя.Установить(Неопределено) для ссылочного и составного типа приведёт значение к пустому, для числа укажите 0, для строки — пустую строку.