Значение константы в 1С 8.3: через интерфейс, форму и встроенный язык
Содержание
Присвоить значение константе в 1С 8.3 можно тремя путями. Пользователь открывает Главное меню → Все функции → Константы, выбирает константу, вводит значение и нажимает «Записать и закрыть». Программист пишет одну строку на сервере: Константы.ИмяКонстанты.Установить(Значение).
Третий путь — через форму настроек конфигурации: в типовых решениях большинство констант спрятано за флажками и полями в разделе Администрирование. Всё это одинаково работает в любой конфигурации на платформе 8.3, разница только в том, где разработчик вывел нужную константу на экран.
Подготовка: права и доступ к списку констант
Константа — объект метаданных, который хранит одно значение на всю информационную базу. Не на пользователя и не на организацию, а одно на всех. Поменяли — изменилось у всех.
Перед тем как что-то менять, проверьте три вещи:
- 🔑 Права. У роли пользователя должно быть право «Изменение» на эту константу. Права «Чтение» хватит только чтобы увидеть значение.
- 👁 Команда «Все функции». В интерфейсе «Такси» она по умолчанию скрыта. Включается так:
Главное меню (☰) → Сервис → Параметры → флажок «Отображать команду "Все функции"». - 🧩 Тип константы. Посмотрите в конфигураторе, какой тип у неё задан: строка, число, ссылка на справочник, составной тип. От этого зависит, что можно ввести.
Если нужно лишь узнать текущее значение, а не менять его, хватит права «Чтение». Список констант откроется, но поле будет недоступно для ввода.
Как задать значение константы в режиме 1С:Предприятие
Способ 1. Через «Все функции»
Универсальный способ, работает в любой конфигурации на управляемых формах.
- Откройте
Главное меню → Все функции. - Разверните ветку «Константы».
- Дважды щёлкните нужную константу. Откроется её стандартная форма с одним полем.
- Введите значение или выберите его кнопкой выбора (для ссылочных типов).
- Нажмите «Записать и закрыть».
В списке видны только константы, к которым у вас есть хотя бы право «Чтение». Нет нужной — значит, роль её скрывает.
Способ 2. Через настройки программы
В типовых конфигурациях разработчики собрали константы в формы настроек. Например, в «Бухгалтерии предприятия 3.0» флажки в Администрирование → Функциональность и Администрирование → Общие настройки — это и есть константы, чаще всего связанные с функциональными опциями.
Плюс такого пути: форма настроек выполняет проверки и связанные действия, которых нет при прямой записи. Например, при включении флажка она может заполнить связанные данные или обновить интерфейс.
Для констант, выведенных в формы настроек, меняйте значение именно там, а не через «Все функции». Прямая запись обходит логику формы, и база может оказаться в несогласованном состоянии.
Способ 3. Через общую форму констант
Если в конфигурации есть общая форма констант (её задают в свойстве конфигурации «Основная форма констант»), её можно открыть из командного интерфейса. На такой форме лежат сразу несколько констант. Изменили поля, нажали «Записать» — записались все изменённые значения разом.
Константы в конфигураторе: тип, форма, модуль
Значение константы в конфигураторе не вводят. Там задают её устройство, а само значение живёт в данных базы и меняется только в режиме Предприятия или кодом.
Что настраивают в окне свойств константы:
| Свойство | Что даёт |
|---|---|
| Тип | Что можно хранить: строка, число, дата, булево, ссылка, хранилище значения, составной тип |
| Форма константы | Своя форма вместо стандартной с одним полем |
| Функциональные опции | Константу можно указать хранилищем функциональной опции |
| Модуль менеджера значения | Обработчики ПередЗаписью и ПриЗаписи |
| Права (в ролях) | Чтение и изменение для каждой роли |
Чтобы дать пользователям удобную форму для нескольких констант:
- В конфигураторе в ветке «Общие → Общие формы» добавьте новую форму.
- В конструкторе выберите тип «Форма констант».
- Отметьте константы, которые должны попасть на форму.
- В свойствах корня конфигурации укажите её как «Основную форму констант» или добавьте команду открытия в нужную подсистему.
- Обновите конфигурацию базы данных (
F7).
Основной реквизит такой формы — НаборКонстант. Поля на форме связаны с ним, и запись формы записывает весь набор.
Если база типовая и стоит на поддержке, не правьте её основную конфигурацию ради новой формы. Сделайте форму в расширении — так обновления не придётся сливать вручную.
Программное присваивание значения константе
Любое изменение константы кодом выполняется на сервере. На тонком клиенте глобальный контекст Константы недоступен, поэтому код в клиентской процедуре формы даст ошибку компиляции.
Метод Установить
Самый короткий вариант:
&НаСервереБезКонтекста
Процедура ЗадатьОсновнуюВалютуНаСервере(Валюта)
Константы.ВалютаРегламентированногоУчета.Установить(Валюта);
КонецПроцедуры
Чтение — симметрично:
Значение = Константы.ВалютаРегламентированногоУчета.Получить();
Имя константы пишется так, как оно задано в метаданных, а не синоним из интерфейса.
Менеджер значения
Нужен, когда перед записью хочется что-то проверить или выставить флаг ОбменДанными.Загрузка:
Менеджер = Константы.ИспользоватьВалютныйУчет.СоздатьМенеджерЗначения();
Менеджер.Прочитать();
Менеджер.Значение = Истина;
Менеджер.Записать();
При записи через менеджер срабатывают обработчики ПередЗаписью и ПриЗаписи из модуля менеджера значения. Если в ПередЗаписью установить Отказ = Истина, значение не запишется.
Набор констант
Набор пишет несколько констант одним действием:
Набор = Константы.СоздатьНабор("ИспользоватьВалютныйУчет,ИспользоватьНесколькоОрганизаций");
Набор.Прочитать();
Набор.ИспользоватьВалютныйУчет = Истина;
Набор.ИспользоватьНесколькоОрганизаций = Истина;
Набор.Записать();
Имена в строке перечисляются через запятую. Если вызвать СоздатьНабор() без параметров, в набор попадут все константы конфигурации — для записи пары значений это лишнее.
Вызов с клиента
Кнопка на форме обычно работает на клиенте. Схема такая: клиентская процедура собирает значение, серверная процедура его записывает.
&НаКлиенте
Процедура Сохранить(Команда)
СохранитьНаСервере(Объект.Организация);
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СохранитьНаСервере(Организация)
Константы.ОсновнаяОрганизация.Установить(Организация);
КонецПроцедуры
Строка ОбновитьПовторноИспользуемыеЗначения() сбрасывает кэш модулей с повторным использованием возвращаемых значений. Без неё код, который читает константу через такой модуль, ещё какое-то время будет видеть старое значение.
Типы данных: что можно записать в константу
Записываемое значение должно соответствовать типу константы. Платформа пытается привести его к типу, но полагаться на это опасно: число, записанное в константу типа «Строка», станет строкой с разделителями разрядов, а результат зависит от настроек.
| Тип константы | Как записать правильно |
|---|---|
| Строка | Передавайте строку; для чисел используйте Формат(Число, "ЧГ=0") |
| Число | Учитывайте длину и точность: лишние знаки после запятой отбросятся |
| Дата | Состав даты (дата, время, дата и время) задан в свойствах; время в константе «Дата» не сохранится |
| Булево | Только Истина или Ложь |
| Ссылка на справочник или документ | Передавайте ссылку, а не наименование или код |
| Перечисление | Перечисления.ИмяПеречисления.ИмяЗначения |
| ХранилищеЗначения | Оберните значение: Новый ХранилищеЗначения(Данные) |
| Составной тип | Любой тип из списка; перед чтением проверяйте ТипЗнч() |
Пример с хранилищем значения — так в константе держат таблицу настроек или файл:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Код");
Таблица.Колонки.Добавить("Ставка");
Строка = Таблица.Добавить();
Строка.Код = "01";
Строка.Ставка = 20;
Константы.ТаблицаСтавок.Установить(Новый ХранилищеЗначения(Таблица));
// Чтение
Хранилище = Константы.ТаблицаСтавок.Получить();
ТаблицаИзКонстанты = Хранилище.Получить();
Константу типа «ХранилищеЗначения» стандартная форма показать не сумеет — поле для ввода не появится. Такие значения задают только кодом.
Чтобы найти, где константа нужного типа используется в коде, в конфигураторе откройте контекстное меню константы и выберите «Найти ссылки на объект».
Массовое изменение и перенос значений между базами
Констант в базе обычно немного, но при внедрении или переходе на новую конфигурацию их бывает несколько десятков. Вручную переносить долго и легко ошибиться.
Внешняя обработка
Простейший вариант — внешняя обработка с одной серверной процедурой. Значения пишутся одной транзакцией: либо все, либо ни одного.
&НаСервере
Процедура ЗаписатьНаСервере()
НачатьТранзакцию();
Попытка
Константы.ИспользоватьВалютныйУчет.Установить(Истина);
Константы.ИспользоватьНесколькоОрганизаций.Установить(Истина);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Перенос из другой базы
| Способ | Когда подходит | На что обратить внимание |
|---|---|---|
| Ручной ввод | До 5–10 констант простых типов | Ссылки выбирайте заново из справочников новой базы |
| Обработка выгрузки и загрузки данных в XML | Одна и та же конфигурация в обеих базах | Ссылочные значения переносятся по уникальному идентификатору |
| Обмен по правилам конвертации | Разные конфигурации | Нужны правила для каждой константы |
| Внешнее соединение (COM) | Регулярная синхронизация из скрипта | Права пользователя, под которым подключаетесь |
Главная ловушка — ссылочные константы. Ссылка на организацию или склад из старой базы в новой может указывать на несуществующий объект. В поле появится «битая ссылка» вида <Объект не найден>. Проверьте такие константы после загрузки отдельно.
Загрузку в рабочую базу выполняйте после резервной копии и в нерабочее время: смена констант-функциональных опций меняет интерфейс у всех пользователей сразу.
Константы-флажки: связь с функциональными опциями
Большая часть констант типа «Булево» в типовых конфигурациях — хранилища функциональных опций. Функциональная опция включает и выключает в интерфейсе реквизиты, команды и целые разделы. Источник её значения — константа.
Что из этого следует на практике:
- 🔄 Интерфейс обновляется не сам. После записи константы кодом вызовите на клиенте
ОбновитьИнтерфейс(). Иначе пользователь увидит новые поля только после перезапуска. - 👥 Изменение затрагивает всех. Включили «Использовать несколько организаций» — у всех пользователей в документах появилось поле «Организация».
- ↩️ Выключить бывает нельзя. Формы настроек часто запрещают снимать флажок, если в базе уже есть данные, которые от него зависят. Запись в обход формы такую проверку пропустит, а документы останутся с заполненными, но скрытыми реквизитами.
Как понять, что константа — хранилище опции: в конфигураторе откройте ветку «Общие → Функциональные опции» и посмотрите свойство «Хранение» у каждой опции. Там указана константа. Обратный поиск — «Найти ссылки на объект» по самой константе: в результатах будет функциональная опция.
Если опция параметризована (например, по организации), её значение хранится уже не в константе, а в регистре сведений. Менять константу в этом случае бесполезно.
Почему значение не сохраняется или не применяется
Ещё два места, куда стоит смотреть:
- 📜 Журнал регистрации.
Администрирование → Обслуживание → Журнал регистрации(в БП 3.0), отбор по событию изменения данных и метаданным константы. Видно, кто и когда менял значение. - 🧪 Отладчик. Поставьте точку останова в
ПередЗаписьюмодуля менеджера значения. Если там стоит проверка, вы увидите, почему запись отклоняется.
Если у пользователя всё правильно, а значение всё равно «не то» — проверьте, не переписывает ли его регламентное задание или обмен с другой базой. Обмен приносит значение константы из узла-источника и затирает ручную правку.