Значение константы в 1С 8.3: через интерфейс, Конфигуратор и встроенный язык
Содержание
Чтобы присвоить значение константе в 1С, пользователю достаточно открыть её через Главное меню → Все функции → Константы, ввести значение и нажать «Записать и закрыть». В коде значение задают одной строкой на сервере: Константы.ИмяКонстанты.Установить(Значение). Ниже оба пути, плюс то, что ломается чаще всего: права, типы, кэш и блокировки.
Константа в 1С:Предприятии 8.3 — объект метаданных, который хранит одно значение на всю базу: основную валюту, название организации по умолчанию, флаг включения функциональности. Значение одно для всех пользователей и не зависит от даты. Если нужна история изменений по датам — это задача периодического регистра сведений, а не константы.
Где задать значение константы в пользовательском режиме
В типовых конфигурациях на базе БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) почти все константы спрятаны за формами настроек. Флажки в разделе Администрирование — «Общие настройки», «Настройки пользователей и прав», «Проведение документов» и другие — это и есть константы. Включили флажок, и платформа записала Истина в соответствующую константу.
Поэтому первый способ — штатный:
- Откройте раздел
Администрирование. - Выберите нужную группу настроек.
- Установите флажок или выберите значение из списка.
- Закройте форму: запись происходит сразу при изменении.
Штатная форма лучше прямого редактирования: при включении флажка конфигурация часто выполняет дополнительные действия — проверяет данные, заполняет связанные настройки, обновляет интерфейс. Прямая правка константы эти действия пропускает.
Список всех констант через «Все функции»
Если константы нет в настройках или нужно увидеть точное значение, откройте полный список:
- Нажмите кнопку главного меню (значок с тремя полосками в левом верхнем углу).
- Перейдите
Сервис → Параметры. - Включите флажок «Отображать команду “Все функции”» и нажмите «Применить».
- Снова откройте главное меню и выберите
Все функции. - В дереве разверните ветку
Константы. - Дважды щёлкните по нужной константе.
- Введите значение и нажмите «Записать и закрыть».
В новых релизах БСП та же команда в главном меню называется «Функции для технического специалиста» — содержимое дерева одинаковое.
Команда «Все функции» показывает только то, на что у пользователя есть право просмотра. Пустая ветка Константы — признак нехватки прав, а не отсутствия констант.
Форма констант конфигурации
У конфигурации может быть основная форма констант. Если она задана, при открытии ветки Константы целиком откроется она, а не список. В типовых решениях эту роль выполняют формы раздела Администрирование, поэтому отдельная форма констант встречается чаще в самописных базах.
Создание и настройка константы в Конфигураторе
В Конфигураторе значение константы не вводят: там описывают её саму. Значение задаётся только в режиме Предприятия или кодом.
Порядок создания:
- Откройте Конфигуратор и выберите
Конфигурация → Открыть конфигурацию. - В дереве разверните
Общие → Константы. - Нажмите «Добавить» и задайте имя, например
ОсновнойСклад. - На вкладке «Основные» выберите тип значения.
- Откройте вкладку «Права» и выдайте ролям права «Чтение» и «Изменение».
- Выполните
Конфигурация → Обновить конфигурацию базы данных(клавишаF7).
После обновления у константы появляется пустое значение своего типа: 0 для числа, пустая строка, Ложь, пустая ссылка. Чтобы задать начальное значение, нужен один из способов из следующих разделов — например, обработчик первоначального заполнения.
Модуль менеджера значения
У каждой константы есть «Модуль менеджера значения». В нём доступны события ПередЗаписью и ПриЗаписи. Здесь удобно проверить корректность значения до записи:
Процедура ПередЗаписью(Отказ)
Если Значение < 0 Тогда
ОбщегоНазначения.СообщитьПользователю("Значение не может быть отрицательным.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
В типовой конфигурации не правьте объекты основной конфигурации напрямую: это снимает её с поддержки. Новую константу или обработчик добавляйте в расширение. Расширения в 8.3 умеют добавлять собственные константы.
Программное присваивание значения константе
Объект Константы доступен только на сервере, в толстом клиенте и во внешнем соединении. В модуле формы код пишут в процедуре с директивой &НаСервере или в общем серверном модуле.
Способ 1. Метод Установить()
Самый короткий вариант:
&НаСервере
Процедура ЗаписатьСкладНаСервере(Склад)
Константы.ОсновнойСклад.Установить(Склад);
КонецПроцедуры
Чтение — симметрично:
Склад = Константы.ОсновнойСклад.Получить();
Установить() сразу пишет значение в базу. События ПередЗаписью и ПриЗаписи при этом срабатывают.
Способ 2. Менеджер значения
Менеджер нужен, когда требуется управлять записью: отключить обработчики при загрузке, проверить заполнение, подготовить значение в несколько шагов.
Менеджер = Константы.ОсновнойСклад.СоздатьМенеджерЗначения();
Менеджер.Прочитать();
Менеджер.Значение = Склад;
Менеджер.ОбменДанными.Загрузка = Истина; // без бизнес-логики обработчиков
Менеджер.Записать();
Флаг ОбменДанными.Загрузка ставьте только для служебной загрузки данных. При обычной работе он лишний: проверки в ПередЗаписью написаны не зря.
Способ 3. Набор констант
Если за один раз меняются несколько констант, используйте набор. Он записывает их одной операцией:
Набор = Константы.СоздатьНабор("ОсновнойСклад, ОсновнаяВалюта");
Набор.Прочитать();
Набор.ОсновнойСклад = Склад;
Набор.ОсновнаяВалюта = Валюта;
Набор.Записать();
На этом же объекте строятся формы настроек. Основной реквизит такой формы имеет тип КонстантыНабор, а элементы формы привязаны к его полям — поэтому флажки в Администрирование пишут значения без отдельного кода.
Какой способ выбрать
| Способ | Когда применять | На что смотреть |
|---|---|---|
Установить() | Одна константа, простое значение | Работает только на сервере |
| Менеджер значения | Нужен контроль записи или загрузка без обработчиков | Флаг Загрузка отключает проверки |
| Набор констант | Несколько связанных настроек | Пишутся все константы набора |
| Пользовательский режим | Разовая правка администратором | Нужно право «Изменение» |
Типы значений: что можно хранить в константе
Тип выбирают при создании, и от него зависит, что примет константа.
- 🔢 Число — задайте длину и точность. Константа длиной 10 и точностью 2 примет
12345678.99, но не123456789.5. - 🔤 Строка — длина
0означает неограниченную строку. Такую строку нельзя использовать в условиях отбора и сортировки запроса без приведения. - 📅 Дата — выберите состав: дата, время или дата и время.
- ✅ Булево — основа функциональных опций: флажок в настройках включает и выключает целые подсистемы.
- 🔗 Ссылка — на справочник, перечисление, план счетов . Значение по умолчанию — пустая ссылка.
- 📦 ХранилищеЗначения — для произвольных данных: таблицы, структуры, файла.
С хранилищем работают в два слоя:
// запись
Настройки = Новый Структура("Порог, Email", 1000, "buh@example.ru");
Константы.НастройкиОбмена.Установить(Новый ХранилищеЗначения(Настройки));
// чтение
Настройки = Константы.НастройкиОбмена.Получить().Получить();
Первый Получить() возвращает хранилище, второй — то, что в нём лежит.
Составной тип
Константе можно назначить несколько типов. Тогда перед использованием значения проверяйте его тип:
Значение = Константы.ПолучательУведомлений.Получить();
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Пользователи") Тогда
// работа с пользователем
КонецЕсли;
Смена типа существующей константы в Конфигураторе меняет структуру хранения. Платформа попытается преобразовать значение, но строка «Основной» в ссылку на справочник не превратится — значение станет пустым. Перед обновлением структуры сделайте выгрузку информационной базы в .dt.
Массовое заполнение и перенос значений между базами
Отдельных констант в базе немного, но при переносе настроек или первом запуске новой конфигурации их бывает несколько десятков.
Начальное заполнение при обновлении
В конфигурациях на БСП начальные значения задают в обработчиках обновления — процедурах, которые выполняются один раз после обновления на новую версию. Для своей константы в расширении это обычная процедура с Установить(), которую регистрируют как обработчик. Плюс подхода: значение появится во всех базах, куда придёт обновление, без ручной работы.
Перенос из одной базы в другую
Варианты по степени трудозатрат:
- Вручную — открыть константы в обеих базах и переписать значения. Подходит, если их до десяти.
- Обработка выгрузки в XML — универсальные обработки выгрузки-загрузки данных переносят константы наравне со справочниками. Ссылочные значения сопоставляются по уникальному идентификатору, поэтому справочник-источник должен быть в базе-приёмнике с теми же ссылками.
- Внешняя обработка — читает константы в одной базе через внешнее соединение и пишет в другую. Удобно, когда ссылки нужно сопоставлять по коду или наименованию.
Пример выгрузки всех констант с их значениями в таблицу — пригодится для сравнения двух баз:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Имя");
Таблица.Колонки.Добавить("Значение");
Для Каждого ОбъектМетаданных Из Метаданные.Константы Цикл
Строка = Таблица.Добавить();
Строка.Имя = ОбъектМетаданных.Имя;
Строка.Значение = Константы[ОбъектМетаданных.Имя].Получить();
КонецЦикла;
Код выполняйте от пользователя с полными правами: при нехватке прав на чтение хотя бы одной константы цикл прервётся с ошибкой.
Запись нескольких констант в транзакции
Если значения связаны и должны поменяться вместе, оберните запись в транзакцию — или используйте набор констант из предыдущего раздела:
НачатьТранзакцию();
Попытка
Константы.ОсновнойСклад.Установить(Склад);
Константы.ОсновнаяВалюта.Установить(Валюта);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Почему значение константы не записывается или не применяется
Большинство проблем с константами укладываются в пять сценариев.
Почему константа — плохой счётчик
При записи платформа блокирует константу целиком. Если её меняет каждый проведённый документ, параллельные проведения встают в очередь, а в нагруженной базе — падают с конфликтом блокировок. Для нумерации и счётчиков есть нумераторы и регистры сведений с измерением, по которому блокировка ставится точечно.
Проверка, что значение действительно записано
Самый быстрый способ — консоль запросов:
ВЫБРАТЬ
Константы.ОсновнойСклад
ИЗ
Константы КАК Константы
Если запрос возвращает старое значение, запись не прошла: ищите отказ в ПередЗаписью или исключение в транзакции. Если новое — проблема в кэше или в коде, который читает другую константу.
Если ничего не помогло
- 🔍 Включите в Конфигураторе остановку по ошибке (
Отладка → Остановка по ошибке) и повторите запись — отладчик покажет строку отказа. - 📜 Откройте журнал регистрации с отбором по метаданным константы: там видно, кто и когда менял значение.
- 🧩 Отключите расширения по очереди: подписка из расширения может отменять запись.
Можно ли задать значение константы в Конфигураторе?
Видно ли в журнале регистрации, кто изменил константу?
Зависит ли значение константы от пользователя или организации?
Можно ли менять константу, когда в базе работают пользователи?
Как очистить значение константы?
Константы.Имя.Установить(Неопределено) для ссылочного и составного типа приведёт значение к пустому, для числа укажите 0, для строки — пустую строку.