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

В этой статье мы разберём три основных способа добавления констант: через конфигуратор в режиме предприятия, программно с использованием встроенного языка, и через расширения для тиражных решений. Особое внимание уделим типичным ошибкам, которые приводят к падению производительности или некорректной работе системы. Все примеры актуальны для 1С:Предприятие 8.3 (включая последние релизы платформы), но majority принципов применимы и к более ранним версиям.

Если вы только начинаете осваивать разработку в 1С, этот материал поможет избежать распространённых ловушек. Опытные программисты найдут здесь нюансы работы с ХранилищеЗначения, транзакциями при изменении констант и оптимизацией доступа к ним в высоконагруженных системах.

1. Что такое константы в 1С и зачем они нужны

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

Основные сценарии использования:

  • 📌 Глобальные настройки: адрес электронной почты для рассылки, путь к папке обмена данными, параметры интеграции с внешними системами.
  • 🔢 Нормативно-справочная информация: ставки НДС, курсы валют (если не используются планы обмена), лимиты по скидкам.
  • 🔄 Флаги функционала: включение/отключение модулей (например, ИспользоватьУпрощеннуюФормуОтчетности).
  • 🛠 Технические параметры: тайм-ауты для HTTP-запросов, размер пакетов при обмене данными.

Важно понимать, что константы не предназначены для хранения данных, которые часто меняются или зависят от пользователя. Для таких случаев лучше использовать регистры сведений или справочники. Например, если ставка НДС меняется раз в несколько лет — это кандидат для константы. Если же она зависит от типа товара или контрагента, логичнее завести справочник.

⚠️ Внимание: В 1С:Управление торговлей 11 и 1С:ERP 2 часть "констант" перенесена в функциональные опции (механизм гибкой настройки интерфейса). Перед добавлением новой константы проверьте, не дублирует ли она существующую опцию в разделе Администрирование → Настройки программы.

2. Способ 1: Добавление константы через конфигуратор

Это самый простой и визуальный метод, который подходит для большинства задач. Инструкция актуальна для 1С:Предприятие 8.3 (все редакции, включая "Базовую").

Шаги для создания константы:

  1. Откройте конфигуратор в режиме 1С:Предприятие (для этого запустите программу с ключом /Config или выберите пункт в меню запуска).
  2. В дереве объектов конфигурации найдите ветку Общие → Константы и кликните правой кнопкой мыши. Выберите Добавить.
  3. В открывшемся окне заполните свойства:
    • Имя: латинскими буквами без пробелов (например, EmailForNotifications).
    • Синоним: отображаемое имя на русском (например, "Email для уведомлений").
    • Тип значения: выберите из списка (строка, число, булево, дата и т.д.).
    • Значение по умолчанию: начальное значение, которое будет установлено при создании новой базы.
  • Сохраните конфигурацию (Ctrl+S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).
  • После обновления конфигурации константа станет доступна в режиме 1С:Предприятие. Чтобы изменить её значение:

    1. Перейдите в Все функции → Стандартные → Константы (путь может отличаться в зависимости от конфигурации).
    2. Найдите вашу константу в списке и дважды кликните по ней.
    3. Введите новое значение и сохраните (ОК).
    4. Имя не содержит пробелов и специальных символов

      Тип значения соответствует хранимым данным (например, не "строка" для даты)

      Значение по умолчанию заполнено корректно

      Конфигурация сохранена и база обновлена-->

      Если константа не отображается в списке после обновления, проверьте:

      • 🔹 Права доступа: у вашей роли должна быть галочка Администрирование → Изменение констант.
      • 🔹 Режим работы: некоторые конфигурации (например, 1С:Бухгалтерия 3.0) скрывают редко используемые константы — включите отображение всех в настройках формы.
      • 🔹 Кэш метаданных: попробуйте очистить кэш (Сервис → Очистить кэш).

    3. Способ 2: Программное создание константы

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

    Пример кода для создания константы программно:

    // Получаем объект метаданных "Константы"
    

    Константы = Метаданные.Константы;

    // Создаем новую константу

    НоваяКонстанта = Константы.Добавить();

    НоваяКонстанта.Имя = "MaxDiscountPercent";

    НоваяКонстанта.Синоним = "Максимальная скидка, %";

    НоваяКонстанта.ТипЗначения = Тип("Число");

    НоваяКонстанта.ЗначениеПоУмолчанию = 20;

    // Сохраняем изменения в конфигурации

    Метаданные.Записать();

    // Обновляем базу данных (требует монопольного режима!)

    ОбновлениеКонфигурацииБазыДанных.Выполнить();

    Важные нюансы:

    • 🔧 Код должен выполняться в монопольном режиме (иначе возникнет ошибка блокировки).
    • 🔧 После добавления константы обязательно вызовите ОбновлениеКонфигурацииБазыДанных, иначе она не появится в базе.
    • 🔧 Для тиражных конфигураций (например, 1С:УТ 11) такой подход может нарушить поддержку. В этом случае лучше использовать расширения (см. следующий раздел).
    • Чтобы изменить значение существующей константы программно, используйте:

      Константа = Константы.НайтиПоИмени("MaxDiscountPercent");
      

      Если Константа <> Неопределено Тогда

      Константа.Значение = 25;

      Константа.Записать();

      КонецЕсли;

      ⚠️ Внимание: Изменение констант программно в рабочей базе может привести к конфликтам, если одновременно с вами их редактирует другой пользователь. Всегда используйте Транзакция и БлокировкаДанных для критичных операций:

      НачатьТранзакцию();
      

      БлокировкаДанных.Добавить("Константа.MaxDiscountPercent");

      // ... код изменения константы ...

      ЗафиксироватьТранзакцию();

      4. Способ 3: Добавление константы через расширение

      Если вы работаете с тиражной конфигурацией (например, 1С:ERP или 1С:КА 2), прямое изменение метаданных может привести к потере поддержки. В этом случае используйте расширения конфигурации — механизм, позволяющий добавлять объекты без модификации оригинальной конфигурации.

      Пошаговая инструкция:

      1. Откройте конфигуратор и перейдите в Конфигурация → Расширения конфигурации → Добавить.
      2. Создайте новое расширение с произвольным именем (например, "ДополнительныеНастройки").
      3. В дереве расширения найдите ветку Объекты → Константы и добавьте новую константу (аналогично способу 1).
      4. Сохраните расширение и обновите базу данных.

    Преимущества этого метода:

    • 🔄 Сохраняется возможность обновления тиражной конфигурации.
    • 🛡 Изменения изолированы: при отключении расширения константа исчезнет.
    • 📦 Расширение можно переносить между базами (экспорт/импорт через .cfe-файл).

    Ограничения:

    • ⚠️ Не все типы констант поддерживаются в расширениях (например, составные типы).
    • ⚠️ Доступ к константам расширения может отличаться в коде (используйте префикс Расширение.).
    Как проверить, что константа добавлена через расширение?

    В режиме предприятия откройте список констант и включите отображение колонки "Источник". Константы из расширений будут помечены соответствующим именем расширения.

    5. Типы данных констант и их особенности

    При создании константы критично правильно выбрать тип значения. Ошибка на этом этапе может привести к падению программы или потере данных. Рассмотрим основные типы и их применение:

    Тип Пример использования Ограничения Особенности хранения
    Строка Email, пути к файлам, API-ключи Макс. длина — 2 Гб (на практике ограничено СУБД) Занимает переменный объём в базе
    Число Ставки налогов, лимиты, пороговые значения Не подходит для денежных сумм (используйте Число(15,2)) Фиксированный размер (4 или 8 байт)
    Булево Флаги включения/отключения функций Нельзя хранить NULL (только Истина/Ложь) 1 бит в базе, но выравнивается до 1 байта
    Дата Даты начала/окончания акций, отчётных периодов Не хранит время (используйте ДатаВремя) 3 байта (даты до 3000 года)
    ХранилищеЗначения Сложные структуры (массивы, таблицы значений) Требует ручной сериализации/десериализации Хранится в BLOB-поле, может занимать много места

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

    НоваяКонстанта.ТипЗначения = Тип("СправочникСсылка.Контрагенты");

    Для хранения денежных сумм всегда указывайте точность:

    НоваяКонстанта.ТипЗначения = Тип("Число", 15, 2); // 15 знаков всего, 2 после запятой
    Константы.ПутьКОбмену.Значение = КаталогПрограммы() + "\Exchange\";

    Это гарантирует корректную работу на разных машинах.-->

    6. Типичные ошибки и как их избежать

    Даже опытные разработчики иногда допускают ошибки при работе с константами. Вот наиболее распространённые проблемы и способы их решения:

    1. Ошибка "Константа не найдена"

    Причины:

    • 🔍 Константа не обновлена в базе (забыли выполнить ОбновлениеКонфигурацииБазыДанных).
    • 🔍 Опечатка в имени при обращении (регистр имеет значение!).
    • 🔍 Константа добавлена в расширение, но в коде обращение идёт без префикса.

    2. Падение производительности

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

    • 📉 Группируйте связанные настройки в регистры сведений.
    • 📉 Для редко используемых констант установите флаг НеКэшировать (в свойствах объекта).

    3. Конфликты при одновременном изменении

    Если два пользователя одновременно меняют одну константу, последнее значение перезапишет предыдущее. Решение:

    Блокировка = Новый БлокировкаДанных;
    

    Блокировка.Добавить("Константа.СтавкаНДС");

    Если Блокировка.Заблокировать(10) Тогда // Тайм-аут 10 секунд

    Константы.СтавкаНДС.Значение = 20;

    Константы.СтавкаНДС.Записать();

    КонецЕсли;

    4. Потеря значений после обновления

    Если вы добавили константу в расширение, а затем отключили его, значение будет утеряно. Чтобы избежать этого:

    • 🔄 Создайте обработку миграции данных при отключении расширения.
    • 🔄 Храните критичные настройки дублирующе в регистре сведений.

    Строка (пути, email, API-ключи)

    Число (ставки, лимиты)

    Булево (флаги включения функций)

    Дата/Время (периоды акций)

    Другой тип-->

    7. Оптимизация работы с константами

    В высоконагруженных системах (например, в 1С:Управление холдингом с тысячами пользователей) неэффективное использование констант может стать узким местом. Следующие приёмы помогут улучшить производительность:

    1. Кэширование в памяти

    Если константа читается часто, но редко меняется, кэшируйте её значение при старте системы:

    Перем глСтавкаНДС;
    
    

    Процедура ПриНачалеРаботыСистемы()

    глСтавкаНДС = Константы.СтавкаНДС.Получить();

    КонецПроцедуры

    2. Пакетное чтение

    При загрузке формы с десятком констант лучше прочитать их за один запрос:

    МассивИмен = Новый Массив;
    

    МассивИмен.Добавить("СтавкаНДС");

    МассивИмен.Добавить("EmailДляОтчетов");

    // ...

    ЗначенияКонстант = Константы.ПолучитьЗначения(МассивИмен);

    3. Использование функциональных опций

    В современных конфигурациях (начиная с 1С:ERP 2.4) часть "констант" логичнее заменить на функциональные опции. Они:

    • 🔧 Поддерживают иерархию и зависимости.
    • 🔧 Автоматически управляют видимостью элементов интерфейса.
    • 🔧 Легче мигрируются между версиями.

    4. Разделение по подсистемам

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

    • 📦 Интеграция_ТокенAPI
    • 📦 Отчетность_ПериодХранения
    • 📦 Склад_МинимальныйОстаток
    • 💡

      Для констант, которые меняются реже чем раз в месяц, рассмотрите возможность переноса их в регистр сведений с периодом действия "На дату". Это снизит нагрузку на кэш и упростит аудит изменений.

      FAQ: Частые вопросы по работе с константами

      Можно ли создать константу с типом "Таблица значений"?

      Нет, напрямую такой тип не поддерживается. Альтернативы:

      1. Используйте тип ХранилищеЗначения и сериализуйте таблицу в него:
      2. Хранилище = Новый ХранилищеЗначения(Таблица);
        

        Константы.НастройкиТаблицы.Значение = Хранилище;

      3. Заведите отдельный регистр сведений с измерением "Настройка".
      Как сделать константу доступной только для администраторов?

      Ограничьте права на уровне ролей:

      1. Откройте конфигуратор и перейдите в Администрирование → Роли.
      2. Выберите роль (например, "Пользователь") и снимите галочку Чтение для вашей константы.
      3. Для роли "Администратор" оставьте полные права.

      В коде проверяйте доступ так:

      Если Не ЗначениеЗаполнено(Константы.СекретныйКлюч.Получить()) Тогда
      

      Сообщить("Доступ запрещён!");

      Возврат;

      КонецЕсли;

      Почему после добавления константы в расширении она не видна в форме?

      Возможные причины и решения:

      • 🔹 Не обновлена база: выполните Обновить конфигурацию базы данных.
      • 🔹 Фильтр в форме: проверьте настройки отображения колонок (включите "Показать все").
      • 🔹 Конфликт имён: в основной конфигурации уже есть объект с таким именем.
      • 🔹 Неверный префикс: при обращении используйте Расширение.ВашеРасширение.Константа.
      Как перенести константы между базами?

      Способы миграции:

      1. Через выгрузку/загрузку XML:
        • В исходной базе: Все функции → Стандартные → Выгрузка данных (выберите только константы).
        • В целевой базе: Загрузка данных из полученного файла.
    • Скриптом:
      // Пример для копирования одной константы
      

      Значение = Источник.Константы.СтавкаНДС.Получить();

      Приемник.Константы.СтавкаНДС.Значение = Значение;

    • Через расширение: экспортируйте .cfe-файл и импортируйте в другую базу.
    • ⚠️ Внимание: При переносе проверьте соответствие типов данных в исходной и целевой базе. Например, если в одной базе константа имеет тип Число(10,2), а в другой — Число(15,3), возможны ошибки округления.
      Можно ли отслеживать, кто и когда изменил константу?

      Да, для этого:

      1. Настройте журнал регистрации:
        • В конфигураторе: Администрирование → Журналы регистрации.
        • Добавьте событие ИзменениеКонстанты.
      2. Используйте подписку на событие:
        Процедура ПриИзмененииКонстанты(ИмяКонстанты, СтароеЗначение, НовоеЗначение) Экспорт
        

        ЗаписьЖурналаРегистрации("ИзменениеКонстанты",

        УровеньЖурналаРегистрации.Информация,

        "",

        СтрШаблон("Пользователь %1 изменил %2 с %3 на %4",

        ПользователиИнформационнойБазы.ТекущийПользователь(),

        ИмяКонстанты,

        СтароеЗначение,

        НовоеЗначение));

        КонецПроцедуры

      В тиражных конфигурациях (например, 1С:Бухгалтерия 3.0) часть констант уже ведёт лог изменений — проверьте настройки в разделе Администрирование → Настройки программы → Прочие настройки.