Константа в 1С 8.3: создание в конфигураторе и работа в коде

· 9 мин

Содержание

Константу создают в конфигураторе: в дереве конфигурации правой кнопкой по ветке Константы → Добавить, затем задают имя и тип данных. На этом объект готов — таблицы и формы, как у справочника, ему не нужны. Чтение и запись значения идут из встроенного языка методами Получить() и Установить().

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

Что хранит константа и когда её стоит заводить

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

  • 📌 название и реквизиты основной организации (в простых базах без учёта по нескольким юрлицам);
  • 💱 валюту регламентированного учёта;
  • ⚙️ флаги режимов учёта — вести ли партионный учёт, использовать ли ордерную схему склада;
  • 🔢 служебные значения — префикс базы, версию загруженных настроек, признак первого запуска.

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

Константа не хранит историю. Записали новое значение — старое затирается без следа. Нужна история изменений (например, как менялась ставка по датам) — это уже периодический регистр сведений.

Выбор типа данных для константы

Тип задаётся в свойстве Тип палитры свойств. Доступны те же типы, что и у реквизитов объектов:

Что хранимТип константы
Название, префикс, текстСтрока (укажите длину или «неограниченная»)
Числовой параметр, лимитЧисло (разрядность и точность)
Дата начала учётаДата (состав — дата, время или дата и время)
Флаг «включено/выключено»Булево
Ссылка на элемент справочникаСправочникСсылка.ИмяСправочника
Несколько возможных типовСоставной тип

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

Менять тип уже заполненной константы в рабочей базе опасно: при несовместимом типе значение будет потеряно или приведено к пустому. Сначала проверьте на копии.

Составной тип выбирают, когда значение может быть ссылкой разных видов — скажем, «ответственный» то пользователь, то сотрудник. Но чем проще тип, тем меньше потом проверок ТипЗнч() в коде, поэтому без явной необходимости составной тип лучше не брать.

Для ссылочного типа укажите конкретный справочник (СправочникСсылка.Валюты), а не обобщённую ссылку. Тогда на форме константы пользователь получит поле выбора из нужного списка, а в коде значение сразу будет правильного вида — без дополнительных проверок. Если константа должна хранить перечисление режимов (например, «метод ФИФО» / «по средней»), заведите объект Перечисление и укажите его тип у константы — это нагляднее, чем числовой код режима.

Как создать константу в конфигураторе: шаги

Порядок действий в конфигураторе 8.3 (интерфейс «Такси»):

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

Обновление структуры базы данных захватывает базу для изменения её структуры. Добавление новой константы проходит быстро, но в многопользовательской базе всё равно делайте это, когда сеансы завершены, — иначе пользователи получат ошибку соединения.

После обновления константа существует в базе, но пустая. Задать значение можно из кода (см. ниже) или через форму, которую нужно создать отдельно.

Если конфигурация типовая — добавляйте через расширение

Типовые конфигурации (Бухгалтерия предприятия, Зарплата и управление персоналом, Управление торговлей) стоят на поддержке. Добавите константу прямо в конфигурацию поставщика — базу придётся снимать с полной поддержки, и обновления усложнятся. Правильный путь для 8.3 — расширение конфигурации (доступно с версии платформы 8.3.6):

  1. В конфигураторе откройте Конфигурация → Расширения конфигурации и создайте расширение.
  2. В дереве расширения добавьте свою константу так же, как в обычной конфигурации.
  3. Сохраните расширение и обновите конфигурацию базы данных — загрузка .cfe и команда Обновить конфигурацию базы данных выполняются как отдельные шаги.

Своя константа живёт в расширении, типовая конфигурация остаётся на поддержке, и релизное обновление её не затирает. Обращение из кода — то же Константы.ИмяКонстанты.Получить().

Как дать пользователю редактировать константу

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

Самый прямой путь — общая форма констант:

  1. В дереве правой кнопкой по ветке Общие формы → Добавить → Форма.
  2. В конструкторе выберите тип Форма констант.
  3. Отметьте галочками константы, которые должны попасть на форму, и завершите конструктор.
  4. Платформа сама создаст реквизит-набор констант и разместит поля.
  5. Чтобы форма открывалась из меню, добавьте команду в нужную подсистему или вызовите форму из своего кода методом ОткрытьФорму("ОбщаяФорма.ИмяФормы").

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

Если константа — часть большой формы настроек, не плодите отдельные формы. Выведите на существующую форму настроек реквизит типа «набор констант» и привяжите поля к нему.

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

Из кода к константе обращаются через менеджер Константы. Прочитать одно значение:

Значение = Константы.НаименованиеОрганизации.Получить();

Записать одно значение:

Константы.НаименованиеОрганизации.Установить("ООО «Ромашка»");

Установить() сразу пишет значение в базу — это полноценная транзакция, отдельного Записать() после него не требуется.

Повторные вызовы Получить() в пределах сеанса дешёвые: значение берётся из кеша, а не из базы каждый раз. Поэтому заводить ради одного обращения переменную-кеш обычно смысла нет — читайте константу там, где она нужна.

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

МенеджерЗначения = Константы.НаименованиеОрганизации.СоздатьМенеджерЗначения();
МенеджерЗначения.Значение = "ООО «Ромашка»";
МенеджерЗначения.Записать();

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

Пример проверки, которая не даст записать пустое наименование:

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

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

Если надо прочитать или записать несколько констант одной операцией, создают набор:

Набор = Константы.СоздатьНабор("НаименованиеОрганизации, ОсновнаяВалюта");
Набор.Прочитать();
Набор.НаименованиеОрганизации = "ООО «Ромашка»";
Набор.ОсновнаяВалюта = ВалютаРубль;
Набор.Записать();

Запись набора идёт в одной транзакции: либо запишутся обе константы, либо ни одной. Это важно, когда значения связаны по смыслу и не должны разъехаться.

Константы кешируются на время сеанса. Если значение читается в модуле с установленным повторным использованием возвращаемых значений, после записи новое значение там может быть видно не сразу — учитывайте это при отладке.

Константы в распределённой информационной базе

В распределённой базе (РИБ) обмен описывается планом обмена, в состав которого включают объекты метаданных. Константа, добавленная в состав плана обмена, при изменении регистрируется к выгрузке и уходит на другие узлы. На приёмнике значение перезаписывается присланным.

Отсюда практическое правило:

  • ✅ Общая для всех узлов настройка (валюта учёта, глобальный флаг режима) — включайте константу в состав плана обмена, пусть расходится по узлам.
  • ❌ Настройка, своя для каждого узла (например, какой склад обслуживает именно эта точка), в константе и в составе обмена хранить нельзя — приёмник затрёт местное значение присланным из центра.

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

Когда вместо константы нужен другой объект

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

Что выбрать для хранения настройки?

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

Типичные ошибки при работе с константами

Ошибки здесь редко про синтаксис — чаще про неверный выбор объекта или про работу со значением:

  • Хранят в константе то, что зависит от организации или даты. Позже это приходится переносить в регистр сведений с миграцией данных.
  • Пытаются записать в константу значение не того типа — платформа выдаст ошибку приведения типа. Для составного типа проверяйте ТипЗнч() перед записью.
  • Забывают, что Получить() на пустой константе вернёт пустое значение её типа (пустую строку, 0, пустую дату), а не Неопределено. Проверку «заполнено ли» стройте от этого.
  • В РИБ оставляют узлозависимую настройку в составе обмена — значение узла затирается при приёме.
  • Правят значение прямо в коде конфигурации при каждом запуске, вместо того чтобы дать пользователю форму настроек.

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

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