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