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

· 9 мин

Содержание

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

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

Подготовка: права и доступ к списку констант

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

Перед тем как что-то менять, проверьте три вещи:

  • 🔑 Права. У роли пользователя должно быть право «Изменение» на эту константу. Права «Чтение» хватит только чтобы увидеть значение.
  • 👁 Команда «Все функции». В интерфейсе «Такси» она по умолчанию скрыта. Включается так: Главное меню (☰) → Сервис → Параметры → флажок «Отображать команду "Все функции"».
  • 🧩 Тип константы. Посмотрите в конфигураторе, какой тип у неё задан: строка, число, ссылка на справочник, составной тип. От этого зависит, что можно ввести.

Если нужно лишь узнать текущее значение, а не менять его, хватит права «Чтение». Список констант откроется, но поле будет недоступно для ввода.

Как задать значение константы в режиме 1С:Предприятие

Способ 1. Через «Все функции»

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

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

В списке видны только константы, к которым у вас есть хотя бы право «Чтение». Нет нужной — значит, роль её скрывает.

Способ 2. Через настройки программы

В типовых конфигурациях разработчики собрали константы в формы настроек. Например, в «Бухгалтерии предприятия 3.0» флажки в Администрирование → Функциональность и Администрирование → Общие настройки — это и есть константы, чаще всего связанные с функциональными опциями.

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

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

Способ 3. Через общую форму констант

Если в конфигурации есть общая форма констант (её задают в свойстве конфигурации «Основная форма констант»), её можно открыть из командного интерфейса. На такой форме лежат сразу несколько констант. Изменили поля, нажали «Записать» — записались все изменённые значения разом.

Константы в конфигураторе: тип, форма, модуль

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

Что настраивают в окне свойств константы:

СвойствоЧто даёт
ТипЧто можно хранить: строка, число, дата, булево, ссылка, хранилище значения, составной тип
Форма константыСвоя форма вместо стандартной с одним полем
Функциональные опцииКонстанту можно указать хранилищем функциональной опции
Модуль менеджера значенияОбработчики ПередЗаписью и ПриЗаписи
Права (в ролях)Чтение и изменение для каждой роли

Чтобы дать пользователям удобную форму для нескольких констант:

  1. В конфигураторе в ветке «Общие → Общие формы» добавьте новую форму.
  2. В конструкторе выберите тип «Форма констант».
  3. Отметьте константы, которые должны попасть на форму.
  4. В свойствах корня конфигурации укажите её как «Основную форму констант» или добавьте команду открытия в нужную подсистему.
  5. Обновите конфигурацию базы данных (F7).

Основной реквизит такой формы — НаборКонстант. Поля на форме связаны с ним, и запись формы записывает весь набор.

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

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

Любое изменение константы кодом выполняется на сервере. На тонком клиенте глобальный контекст Константы недоступен, поэтому код в клиентской процедуре формы даст ошибку компиляции.

Метод Установить

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

&НаСервереБезКонтекста
Процедура ЗадатьОсновнуюВалютуНаСервере(Валюта)
	Константы.ВалютаРегламентированногоУчета.Установить(Валюта);
КонецПроцедуры

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

Значение = Константы.ВалютаРегламентированногоУчета.Получить();

Имя константы пишется так, как оно задано в метаданных, а не синоним из интерфейса.

Менеджер значения

Нужен, когда перед записью хочется что-то проверить или выставить флаг ОбменДанными.Загрузка:

Менеджер = Константы.ИспользоватьВалютныйУчет.СоздатьМенеджерЗначения();
Менеджер.Прочитать();
Менеджер.Значение = Истина;
Менеджер.Записать();

При записи через менеджер срабатывают обработчики ПередЗаписью и ПриЗаписи из модуля менеджера значения. Если в ПередЗаписью установить Отказ = Истина, значение не запишется.

Набор констант

Набор пишет несколько констант одним действием:

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

Имена в строке перечисляются через запятую. Если вызвать СоздатьНабор() без параметров, в набор попадут все константы конфигурации — для записи пары значений это лишнее.

Вызов с клиента

Кнопка на форме обычно работает на клиенте. Схема такая: клиентская процедура собирает значение, серверная процедура его записывает.

&НаКлиенте
Процедура Сохранить(Команда)
	СохранитьНаСервере(Объект.Организация);
	ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры

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

Строка ОбновитьПовторноИспользуемыеЗначения() сбрасывает кэш модулей с повторным использованием возвращаемых значений. Без неё код, который читает константу через такой модуль, ещё какое-то время будет видеть старое значение.

Типы данных: что можно записать в константу

Записываемое значение должно соответствовать типу константы. Платформа пытается привести его к типу, но полагаться на это опасно: число, записанное в константу типа «Строка», станет строкой с разделителями разрядов, а результат зависит от настроек.

Тип константыКак записать правильно
СтрокаПередавайте строку; для чисел используйте Формат(Число, "ЧГ=0")
ЧислоУчитывайте длину и точность: лишние знаки после запятой отбросятся
ДатаСостав даты (дата, время, дата и время) задан в свойствах; время в константе «Дата» не сохранится
БулевоТолько Истина или Ложь
Ссылка на справочник или документПередавайте ссылку, а не наименование или код
ПеречислениеПеречисления.ИмяПеречисления.ИмяЗначения
ХранилищеЗначенияОберните значение: Новый ХранилищеЗначения(Данные)
Составной типЛюбой тип из списка; перед чтением проверяйте ТипЗнч()

Пример с хранилищем значения — так в константе держат таблицу настроек или файл:

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Код");
Таблица.Колонки.Добавить("Ставка");
Строка = Таблица.Добавить();
Строка.Код = "01";
Строка.Ставка = 20;

Константы.ТаблицаСтавок.Установить(Новый ХранилищеЗначения(Таблица));

// Чтение
Хранилище = Константы.ТаблицаСтавок.Получить();
ТаблицаИзКонстанты = Хранилище.Получить();

Константу типа «ХранилищеЗначения» стандартная форма показать не сумеет — поле для ввода не появится. Такие значения задают только кодом.

Чтобы найти, где константа нужного типа используется в коде, в конфигураторе откройте контекстное меню константы и выберите «Найти ссылки на объект».

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

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

Внешняя обработка

Простейший вариант — внешняя обработка с одной серверной процедурой. Значения пишутся одной транзакцией: либо все, либо ни одного.

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

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

СпособКогда подходитНа что обратить внимание
Ручной вводДо 5–10 констант простых типовСсылки выбирайте заново из справочников новой базы
Обработка выгрузки и загрузки данных в XMLОдна и та же конфигурация в обеих базахСсылочные значения переносятся по уникальному идентификатору
Обмен по правилам конвертацииРазные конфигурацииНужны правила для каждой константы
Внешнее соединение (COM)Регулярная синхронизация из скриптаПрава пользователя, под которым подключаетесь

Главная ловушка — ссылочные константы. Ссылка на организацию или склад из старой базы в новой может указывать на несуществующий объект. В поле появится «битая ссылка» вида <Объект не найден>. Проверьте такие константы после загрузки отдельно.

Загрузку в рабочую базу выполняйте после резервной копии и в нерабочее время: смена констант-функциональных опций меняет интерфейс у всех пользователей сразу.

Константы-флажки: связь с функциональными опциями

Большая часть констант типа «Булево» в типовых конфигурациях — хранилища функциональных опций. Функциональная опция включает и выключает в интерфейсе реквизиты, команды и целые разделы. Источник её значения — константа.

Что из этого следует на практике:

  • 🔄 Интерфейс обновляется не сам. После записи константы кодом вызовите на клиенте ОбновитьИнтерфейс(). Иначе пользователь увидит новые поля только после перезапуска.
  • 👥 Изменение затрагивает всех. Включили «Использовать несколько организаций» — у всех пользователей в документах появилось поле «Организация».
  • ↩️ Выключить бывает нельзя. Формы настроек часто запрещают снимать флажок, если в базе уже есть данные, которые от него зависят. Запись в обход формы такую проверку пропустит, а документы останутся с заполненными, но скрытыми реквизитами.

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

Если опция параметризована (например, по организации), её значение хранится уже не в константе, а в регистре сведений. Менять константу в этом случае бесполезно.

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

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

Ещё два места, куда стоит смотреть:

  • 📜 Журнал регистрации. Администрирование → Обслуживание → Журнал регистрации (в БП 3.0), отбор по событию изменения данных и метаданным константы. Видно, кто и когда менял значение.
  • 🧪 Отладчик. Поставьте точку останова в ПередЗаписью модуля менеджера значения. Если там стоит проверка, вы увидите, почему запись отклоняется.

Если у пользователя всё правильно, а значение всё равно «не то» — проверьте, не переписывает ли его регламентное задание или обмен с другой базой. Обмен приносит значение константы из узла-источника и затирает ручную правку.

Частые вопросы

Можно ли хранить в константе разные значения для разных пользователей?
Нет. Константа одна на всю базу. Для пользовательских значений используют регистр сведений с измерением «Пользователь» или хранилище пользовательских настроек.
Можно ли изменить значение константы в конфигураторе?
Нет. В конфигураторе задают тип, форму и права. Значение меняют в режиме 1С:Предприятие или кодом.
Как узнать, кто поменял значение константы?
Откройте журнал регистрации и отберите события изменения данных по нужной константе. Если журнал выключен или уровень логирования низкий, истории не будет.
Можно ли менять константу в обработчике проведения документа?
Технически да, но не стоит. Каждое проведение будет блокировать таблицу константы, и параллельные пользователи начнут ждать друг друга. Для изменяемых данных используйте регистры.
Чем Установить отличается от менеджера значения?
Результат одинаковый. Менеджер значения позволяет прочитать текущее значение, изменить его и выставить ОбменДанными.Загрузка перед записью.