Константа в 1С 8.3: создание в конфигураторе и работа в коде
Содержание
Константу создают в конфигураторе: в дереве конфигурации правой кнопкой по ветке Константы → Добавить, затем задают имя и тип данных. На этом объект готов — таблицы и формы, как у справочника, ему не нужны. Чтение и запись значения идут из встроенного языка методами Получить() и Установить().
Распространённое заблуждение — что в константе можно хранить список или таблицу. Нельзя: константа держит ровно одно значение на всю базу. Как только настройка должна отличаться по организациям, складам или датам, константа перестаёт подходить, и нужен регистр сведений . Ниже — как завести константу правильно, прочитать и записать её в коде, что происходит при обмене в распределённой базе и где константа уступает другим объектам.
Что хранит константа и когда её стоит заводить
Константа — это одно значение, общее для всей информационной базы. В типовых конфигурациях на константах держат то, что задаётся один раз и меняется редко:
- 📌 название и реквизиты основной организации (в простых базах без учёта по нескольким юрлицам);
- 💱 валюту регламентированного учёта;
- ⚙️ флаги режимов учёта — вести ли партионный учёт, использовать ли ордерную схему склада;
- 🔢 служебные значения — префикс базы, версию загруженных настроек, признак первого запуска.
Главный критерий: значение одно на всю базу и не зависит ни от организации, ни от даты. Если это так — константа даёт самый дешёвый способ хранения. В базе под неё заводится одна запись, обращение к ней быстрое, кода минимум.
Константа не хранит историю. Записали новое значение — старое затирается без следа. Нужна история изменений (например, как менялась ставка по датам) — это уже периодический регистр сведений.
Выбор типа данных для константы
Тип задаётся в свойстве Тип палитры свойств. Доступны те же типы, что и у реквизитов объектов:
| Что храним | Тип константы |
|---|---|
| Название, префикс, текст | Строка (укажите длину или «неограниченная») |
| Числовой параметр, лимит | Число (разрядность и точность) |
| Дата начала учёта | Дата (состав — дата, время или дата и время) |
| Флаг «включено/выключено» | Булево |
| Ссылка на элемент справочника | СправочникСсылка.ИмяСправочника |
| Несколько возможных типов | Составной тип |
Для строки сразу решите, ограничивать ли длину. Неограниченная строка хранится отдельно и чуть тяжелее в выборках — для короткого названия лучше задать фиксированную длину, например 150 символов.
Менять тип уже заполненной константы в рабочей базе опасно: при несовместимом типе значение будет потеряно или приведено к пустому. Сначала проверьте на копии.
Составной тип выбирают, когда значение может быть ссылкой разных видов — скажем, «ответственный» то пользователь, то сотрудник. Но чем проще тип, тем меньше потом проверок ТипЗнч() в коде, поэтому без явной необходимости составной тип лучше не брать.
Для ссылочного типа укажите конкретный справочник (СправочникСсылка.Валюты), а не обобщённую ссылку. Тогда на форме константы пользователь получит поле выбора
из нужного списка, а в коде значение сразу будет правильного вида — без дополнительных проверок. Если константа должна хранить перечисление режимов (например, «метод ФИФО» / «по средней»), заведите объект Перечисление и укажите его тип у константы — это нагляднее, чем числовой код режима.
Как создать константу в конфигураторе: шаги
Порядок действий в конфигураторе 8.3 (интерфейс «Такси»):
- Откройте конфигурацию на редактирование и найдите в дереве ветку
Константы— она на верхнем уровне, рядом соСправочникииДокументы. - Правой кнопкой по ветке →
Добавить(или выделите ветку и нажмитеInsert). - В палитре свойств задайте
Имя— латиницей или кириллицей, без пробелов, в стиле остальных объектов (например,НаименованиеОрганизации). - Заполните
Синоним— это представление, которое увидит пользователь на форме. ДляНаименованиеОрганизациисиноним — «Наименование организации». - В свойстве
Типвыберите тип данных из раздела «Выбор типа данных». - При необходимости впишите
Комментарий— он виден только разработчику и помогает не забыть назначение константы. - Сохраните конфигурацию (
F7— обновить в текущей базе, либоОбновить конфигурацию базы данных).
Обновление структуры базы данных захватывает базу для изменения её структуры. Добавление новой константы проходит быстро, но в многопользовательской базе всё равно делайте это, когда сеансы завершены, — иначе пользователи получат ошибку соединения.
После обновления константа существует в базе, но пустая. Задать значение можно из кода (см. ниже) или через форму, которую нужно создать отдельно.
Если конфигурация типовая — добавляйте через расширение
Типовые конфигурации (Бухгалтерия предприятия, Зарплата и управление персоналом, Управление торговлей) стоят на поддержке. Добавите константу прямо в конфигурацию поставщика — базу придётся снимать с полной поддержки, и обновления усложнятся. Правильный путь для 8.3 — расширение конфигурации
(доступно с версии платформы 8.3.6):
- В конфигураторе откройте
Конфигурация → Расширения конфигурациии создайте расширение. - В дереве расширения добавьте свою константу так же, как в обычной конфигурации.
- Сохраните расширение и обновите конфигурацию базы данных — загрузка
.cfeи командаОбновить конфигурацию базы данныхвыполняются как отдельные шаги.
Своя константа живёт в расширении, типовая конфигурация остаётся на поддержке, и релизное обновление её не затирает. Обращение из кода — то же Константы.ИмяКонстанты.Получить().
Как дать пользователю редактировать константу
Сама по себе константа не открывается двойным кликом, как справочник. Чтобы бухгалтер или администратор мог поменять значение в режиме 1С:Предприятие, нужна форма.
Самый прямой путь — общая форма констант:
- В дереве правой кнопкой по ветке
Общие формы→Добавить→Форма. - В конструкторе выберите тип
Форма констант. - Отметьте галочками константы, которые должны попасть на форму, и завершите конструктор.
- Платформа сама создаст реквизит-набор констант и разместит поля.
- Чтобы форма открывалась из меню, добавьте команду в нужную подсистему или вызовите форму из своего кода методом
ОткрытьФорму("ОбщаяФорма.ИмяФормы").
Платформа сама обеспечивает чтение набора при открытии и запись при нажатии кнопки Записать и закрыть. Отдельный код для сохранения писать не нужно.
Если константа — часть большой формы настроек, не плодите отдельные формы. Выведите на существующую форму настроек реквизит типа «набор констант» и привяжите поля к нему.
Чтение и запись константы во встроенном языке
Из кода к константе обращаются через менеджер Константы. Прочитать одно значение:
Значение = Константы.НаименованиеОрганизации.Получить();
Записать одно значение:
Константы.НаименованиеОрганизации.Установить("ООО «Ромашка»");
Установить() сразу пишет значение в базу — это полноценная транзакция, отдельного Записать() после него не требуется.
Повторные вызовы Получить() в пределах сеанса дешёвые: значение берётся из кеша, а не из базы каждый раз. Поэтому заводить ради одного обращения переменную-кеш обычно смысла нет — читайте константу там, где она нужна.
Когда нужно контролировать запись (проверить значение, выполнить действия до и после), используют менеджер значения:
МенеджерЗначения = Константы.НаименованиеОрганизации.СоздатьМенеджерЗначения();
МенеджерЗначения.Значение = "ООО «Ромашка»";
МенеджерЗначения.Записать();
У константы есть собственный модуль менеджера значения с событиями ПередЗаписью, ПриЗаписи и ОбработкаПроверкиЗаполнения. В них удобно запретить пустое значение или пересчитать зависимые данные при смене настройки. Модуль открывается из палитры свойств константы ссылкой Открыть у пункта «Модуль менеджера значения».
Пример проверки, которая не даст записать пустое наименование:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если НЕ ЗначениеЗаполнено(Значение) Тогда
Сообщить("Наименование организации не заполнено.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Эта процедура сработает при записи через менеджер значения и через форму констант. Если нужно ещё и пересчитать что-то после успешной записи — например, обновить служебный признак, — это делают в обработчике ПриЗаписи того же модуля.
Если надо прочитать или записать несколько констант одной операцией, создают набор:
Набор = Константы.СоздатьНабор("НаименованиеОрганизации, ОсновнаяВалюта");
Набор.Прочитать();
Набор.НаименованиеОрганизации = "ООО «Ромашка»";
Набор.ОсновнаяВалюта = ВалютаРубль;
Набор.Записать();
Запись набора идёт в одной транзакции: либо запишутся обе константы, либо ни одной. Это важно, когда значения связаны по смыслу и не должны разъехаться.
Константы кешируются на время сеанса. Если значение читается в модуле с установленным повторным использованием возвращаемых значений, после записи новое значение там может быть видно не сразу — учитывайте это при отладке.
Константы в распределённой информационной базе
В распределённой базе (РИБ) обмен описывается планом обмена, в состав которого включают объекты метаданных. Константа, добавленная в состав плана обмена, при изменении регистрируется к выгрузке и уходит на другие узлы. На приёмнике значение перезаписывается присланным.
Отсюда практическое правило:
- ✅ Общая для всех узлов настройка (валюта учёта, глобальный флаг режима) — включайте константу в состав плана обмена, пусть расходится по узлам.
- ❌ Настройка, своя для каждого узла (например, какой склад обслуживает именно эта точка), в константе и в составе обмена хранить нельзя — приёмник затрёт местное значение присланным из центра.
Для узлозависимых настроек есть два пути: не включать константу в состав плана обмена вовсе (тогда каждый узел держит своё значение локально) либо отключить для неё авторегистрацию и управлять выгрузкой вручную. Проверьте состав плана обмена до запуска РИБ: лишняя константа в обмене молча перетирает локальные настройки узлов, и ловить это потом тяжело.
Когда вместо константы нужен другой объект
Константа проста, но у неё жёсткий потолок: одно значение, без разрезов и без истории. Как только появляется измерение или время, выбирайте другой объект.
Частая развилка на практике — «одна настройка на организацию». Соблазн завести константу ОсновнойСклад велик, но стоит в базе появиться второй организации — и значение становится общим для обеих, что неверно. Регистр сведений с измерением Организация решает это сразу и без переделки структуры.
Типичные ошибки при работе с константами
Ошибки здесь редко про синтаксис — чаще про неверный выбор объекта или про работу со значением:
- Хранят в константе то, что зависит от организации или даты. Позже это приходится переносить в регистр сведений с миграцией данных.
- Пытаются записать в константу значение не того типа — платформа выдаст ошибку приведения типа. Для составного типа проверяйте
ТипЗнч()перед записью. - Забывают, что
Получить()на пустой константе вернёт пустое значение её типа (пустую строку, 0, пустую дату), а неНеопределено. Проверку «заполнено ли» стройте от этого. - В РИБ оставляют узлозависимую настройку в составе обмена — значение узла затирается при приёме.
- Правят значение прямо в коде конфигурации при каждом запуске, вместо того чтобы дать пользователю форму настроек.
Частые вопросы
Можно ли хранить в константе таблицу или список значений?
Чем менеджер значения отличается от метода Установить?
Установить() просто пишет значение. Менеджер значения, созданный через СоздатьМенеджерЗначения(), даёт доступ к событиям ПередЗаписью и ПриЗаписи и к проверке заполнения — он нужен, когда при записи должна срабатывать своя логика.Как узнать, что константа ещё не заполнена?
Получить() вернёт пустое значение типа константы: пустую строку, ноль, пустую дату, пустую ссылку. Сравнивайте результат с пустым значением нужного типа, а не с Неопределено.Почему новое значение константы не видно сразу после записи?
Установить().