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

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

⚠️ Внимание: Если вы работаете с константами в 1С:Бухгалтерии 3.0 или 1С:ERP, учитывайте, что некоторые системные константы (например, ОсновнаяОрганизация) могут иметь дополнительные обработчики событий. Их изменение вручную без проверки логики может нарушить работу типовых механизмов.

1. Базовый синтаксис: как получить значение константы

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

Пример получения значения константы СтавкаНДС:

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

Если константа имеет составной тип (например, СписокЗначений или СправочникСсылка), метод Получить() вернёт объект этого типа. Для простых типов (число, строка, булево) результат будет соответствовать типу константы.

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

// Для 1С 8.2 и ниже

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

Чтобы проверить существование константы перед обращением (актуально для динамически создаваемых расширений), используйте конструкцию:

Если Константы.Свойство("НоваяКонстанта") Тогда

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

КонецЕсли;

📊 Как часто вы работаете с константами в 1С?
Ежедневно
Несколько раз в неделю
Редко
Только при настройке системы

2. Обращение к константам в управляемых формах

В управляемых формах (тонкий клиент, веб-клиент) прямой вызов Константы.Имя.Получить() может привести к ошибке, если форма выполняется на клиенте, а константа доступна только на сервере. Для корректной работы используйте серверные процедуры или функции.

Пример безопасного получения константы в управляемой форме:

&НаСервере

Функция ПолучитьСтавкуНДС()

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

КонецФункции

&НаКлиенте

Процедура ПриОткрытии(Отказ)

СтавкаНДС = ПолучитьСтавкуНДС(); // Вызов серверной функции

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

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ)

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

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

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

Убедиться, что константа существует в конфигурации|Проверить права доступа к константе|Учитывать контекст выполнения (сервер/клиент)|Кэшировать часто используемые значения-->

3. Работа с константами в внешних обработках и отчётах

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

Способ 1: Передача через параметры

При открытии обработки передайте значение константы как параметр:

Параметры = Новый Структура();

Параметры.Вставить("СтавкаНДС", Константы.СтавкаНДС.Получить());

ОткрытьФорму("Обработка.РасчетЦен.Форма", Параметры);

Способ 2: Использование ПолучениеДанных

В модуле обработки добавьте процедуру получения данных:

&НаСервере

Функция ПолучитьКонстанту(ИмяКонстанты)

Возврат Константы[ИмяКонстанты].Получить();

КонецФункции

Затем вызовите её из основной формы:

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

⚠️ Внимание: В 1С:БП 3.0 и 1С:ЗУП 3.1 некоторые константы (например, ОрганизацияПоУмолчанию) могут быть привязаны к текущему пользователю. В этом случае передавайте не только значение, но и ссылку на объект (организацию, подразделение).

4. Изменение значений констант: правила и ограничения

Чтобы изменить значение константы, используйте метод Установить(). Однако учитывайте следующие нюансы:

  • 🔒 Права доступа: Пользователь должен иметь право на изменение константы (настраивается в ролях).
  • 📝 Транзакции: Изменение константы в транзакции фиксируется только после её подтверждения.
  • 🔄 Кэширование: После изменения значение константы может оставаться в кэше — используйте ОчиститьКэшКонстант().
  • 🚫 Запрещённые константы: Некоторые системные константы (например, ВерсияКонфигурации) блокированы для изменения.

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

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

Попытка

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

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

ОчиститьКэшКонстант(); // Очистка кэша

Исключение

ОтменитьТранзакцию();

Сообщить("Ошибка изменения константы: " + ОписаниеОшибки());

КонецПопытки;

⚠️ Внимание: В 1С:КА 2.4 и 1С:УНФ 1.6 изменение констант, связанных с настройками обмена данными (например, ПрефиксИнформационнойБазы), может привести к ошибкам синхронизации. Перед изменением остановите фоновые задания обмена.

Что будет, если не очистить кэш после изменения константы?

Если не вызвать ОчиститьКэшКонстант(), система может продолжать использовать старое значение константы из кэша до перезапуска сеанса или принудительной очистки. Это приведёт к некорректной работе отчётов, документов и других объектов, которые опираются на актуальное значение константы. В некоторых случаях (например, при изменении ОсновнойОрганизации) это может вызвать ошибки в типовых механизмах бухгалтерского учёта.

5. Особенности работы с константами в расширениях

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

  • 🔧 Только чтение: Из расширения можно только читать константы основной конфигурации, но не изменять их.
  • 🆕 Собственные константы: В расширении можно создать свои константы, но они будут доступны только в его контексте.
  • 🔄 Приоритет значений: Если в расширении и основной конфигурации есть константы с одинаковым именем, приоритет имеет значение из основной конфигурации.

Пример чтения константы из основной конфигурации в расширении:

СтавкаНДС = Константы.СтавкаНДС.Получить(); // Чтение из основной базы

НоваяСтавка = Расширения.МоёРасширение.Константы.НоваяСтавка.Получить(); // Чтение из расширения

Если требуется динамически переопределять константы, используйте обработчики событий. Например, в расширении можно подписаться на событие ПриПолученииДанныхКонстанты и возвращать своё значение:

Процедура ПриПолученииДанныхКонстанты(ИмяКонстанты, Значение) Экспорт

Если ИмяКонстанты = "СтавкаНДС" Тогда

Значение = 10; // Переопределяем значение

КонецЕсли;

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

⚠️ Внимание: В 1С:БГУ 2.0 и 1С:Документооборот расширения могут конфликтовать с типовыми механизмами, если переопределяют константы, используемые в регламентных заданиях (например, ПериодХраненияЛогов). Перед внедрением тестируйте совместимость.

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

Ошибки при работе с константами часто ведут к трудноотслеживаемым багам. Рассмотрим самые распространённые случаи и способы их предотвращения.

Ошибка Причина Решение
Ошибка при вызове метода контекста (Получить) Константа не существует или опечатка в имени Проверьте имя константы через Константы.Свойство("Имя")
Недостаточно прав для изменения константы У пользователя нет роли с правом записи Настройте права в Администрирование → Пользователи и права
Константа не обновляется после изменения Значение кэшировано Вызовите ОчиститьКэшКонстант() или перезапустите сеанс
Тип не совпадает (ожидался Число) Попытка записать значение неверного типа Проверьте тип константы в конфигураторе

⚠️ Внимание: В 1С:Розница 2.3 при изменении констант, связанных с настройками кассового оборудования (например, ПортCOMДляККТ), требуется перезапуск службы 1С:Предприятия, иначе изменения не применятся.

Критическая особенность: В 1С 8.3.20+ при работе с константами в фоновых заданиях их значения кэшируются на уровне сеанса задания. Если константа изменилась после запуска задания, оно продолжит использовать старое значение до завершения. Чтобы избежать этого, принудительно обновляйте кэш в коде задания:

ОчиститьКэшКонстант(Истина); // Принудительная очистка кэша
💡

Если вам нужно временно отключить кэширование констант для отладки, добавьте в параметры запуска 1С ключ /DisableConstantsCache. Это замедлит работу системы, но поможет выявить ошибки, связанные с устаревшими значениями.

7. Оптимизация производительности при работе с константами

Частое обращение к константам может замедлять работу системы, особенно в циклах или массовых операциях. Следующие приёмы помогут оптимизировать код:

  • Кэширование в переменных: Сохраняйте значение константы в переменную, если оно используется многократно.
  • 🔄 Массовое чтение: Для группы констант используйте Константы.ПолучитьЗначения().
  • 📊 Индексирование: В SQL-запросах к константам добавляйте условия по индексируемым полям.
  • 🛠 Расширения vs. константы: Для часто изменяемых параметров используйте регистры сведений вместо констант.

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

СписокКонстант = Новый Массив();

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

СписокКонстант.Добавить("ВалютаУчета");

СписокКонстант.Добавить("ОсновнойСклад");

ЗначенияКонстант = Константы.ПолучитьЗначения(СписокКонстант);

Если константа используется в SQL-запросе, подставляйте её значение напрямую, а не через функцию:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Сумма * &СтавкаНДС КАК СуммаСНДС

|ИЗ

| Документ.РеализацияТоваровУслуг";

Запрос.УстановитьПараметр("СтавкаНДС", Константы.СтавкаНДС.Получить());

⚠️ Внимание: В 1С:УХ 3.0 и 1С:Торговля 12 чрезмерное использование констант в отчётах с большими выборками может приводить к таймаутам. Для таких случаев переносите логику в виртуальные таблицы или используйте временные таблицы.

💡

Константы — это не замена регистров сведений или справочников. Они предназначены для хранения редко изменяемых параметров. Если значение меняется чаще 1 раза в месяц, рассмотрите альтернативные объекты конфигурации.

8. Альтернативы константам: когда их использовать

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

Задача Рекомендуемый объект Преимущества
Хранение часто изменяемых параметров Регистр сведений Версионирование, история изменений, фильтрация по периодам
Настройки пользователя Хранилище настроек (ПользовательскиеНастройки) Индивидуальные настройки для каждого пользователя
Глобальные флаги включения функционала Функциональные опции Управление видимостью интерфейсов без изменения кода
Хранение сложных структур данных Справочники с реквизитами Гибкая структура, возможность добавления новых полей

Пример использования регистра сведений вместо константы для ставки НДС:

СтавкаНДС = РегистрыСведений.СтавкиНалогов.ПолучитьПоследнее(, НачалоДня(ТекущаяДата()));

⚠️ Внимание: В 1С:ERP 2.5 для хранения параметров обмена данными с внешними системами рекомендуется использовать планы обмена или регистры сведений, а не константы. Это упрощает настройку и отладку интеграций.

📊 Какую альтернативу константам вы используете чаще?
Регистры сведений
Хранилище настроек
Функциональные опции
Справочники
Не использую альтернативы

FAQ: Ответы на частые вопросы

Можно ли обратиться к константе из модуля объекта (например, документа)?

Да, в модуле объекта доступен глобальный контекст, поэтому можно использовать стандартный синтаксис:

Процедура ПередЗаписью(Отказ)

Если Константы.БлокироватьРедактирование.Получить() Тогда

Отказ = Истина;

Сообщить("Редактирование документов заблокировано!");

КонецЕсли;

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

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

Как узнать, какие константы есть в конфигурации?

Список констант можно посмотреть:

  • 🔍 В Конфигураторе: откройте ветку Общие → Константы.
  • 📋 В предприятии: используйте отчёт Анализ использования объектов (доступен в режиме "Все функции").
  • 💻 Через запрос:
    Запрос = Новый Запрос;
    

    Запрос.Текст = "ВЫБРАТЬ Имя ИЗ Метаданные.Константы";

    Результат = Запрос.Выполнить();

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

Это связано с механизмом кэширования. Чтобы применить изменения:

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

В 1С 8.3.18+ кэш констант обновляется автоматически при изменении конфигурации, но в некоторых случаях (например, при работе с расширениями) может потребоваться ручная очистка.

Можно ли создать константу динамически во время выполнения?

Нет, константы — это объекты конфигурации, и их структура фиксирована. Однако можно:

  • 🔧 Использовать хранилище значений для временных данных.
  • 📦 Создать дополнительный справочник с настройками.
  • 🔄 В 1С 8.3.21+ для динамических параметров можно использовать глобальные переменные (но это не рекомендуется для постоянного хранения).

Пример с глобальной переменной:

Если Не ГлобальныйКонтекст.Свойство("ДинамическаяНастройка") Тогда

ГлобальныйКонтекст.Вставить("ДинамическаяНастройка", Новый Структура());

КонецЕсли;

ГлобальныйКонтекст.ДинамическаяНастройка.Вставить("Параметр1", Значение);

Как обратиться к константе из внешней обработки, если нет прав на чтение?

Если у пользователя нет прав на чтение константы, но требуется её значение, можно:

  • 🔑 Передать значение как параметр при открытии обработки.
  • 📄 Использовать промежуточный документ с реквизитом, в который записывается значение константы.
  • 🔧 Настроить роль с минимальными правами только на чтение нужной константы.

Пример с промежуточным документом:

// В основной базе

Док = Документы.ПередачаДанных.СоздатьДокумент();

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

Док.Записать();

// Во внешней обработке

СтавкаНДС = Документы.ПередачаДанных.Последний().ЗначениеКонстанты;