В системе 1С:Предприятие объект конфигурации «Константа» часто вызывает вопросы у начинающих разработчиков. С одной стороны, он похож на обычную переменную — хранит значение, к которому можно обращаться из кода. С другой — это полноценный объект конфигурации с уникальными свойствами: он сохраняет данные между сеансами, может иметь права доступа и даже участвовать в обмене данными. Почему же нельзя обойтись простыми переменными? И в каких случаях константы становятся единственно верным решением?
Эта статья не просто объяснит, что константы в 1С — это не «глобальные переменные», а механизм хранения статических данных с гарантированной сохранностью между запусками системы. Мы разберём реальные кейсы их применения — от хранения настроек интеграции до управления бизнес-логикой, а также покажем, как избежать типичных ошибок при работе с ними. Особое внимание уделим отличиям констант от других объектов (например, перечислений или регистров сведений), чтобы вы могли выбрать оптимальный инструмент для своей задачи.
Что такое константа в 1С и чем она отличается от переменной
Константа в 1С:Предприятие — это объект конфигурации, предназначенный для хранения одного значения, которое остаётся неизменным (или изменяется редко) в процессе работы программы. В отличие от переменных, которые существуют только во время выполнения кода, константы:
- 📌 Хранятся в базе данных — их значения сохраняются между сеансами работы пользователей.
- 🔒 Имеют права доступа — можно ограничить, кто может их изменять (например, только администраторы).
- 🔄 Участвуют в обмене данными — могут синхронизироваться между узлами распределённой информационной базы.
- 📝 Имеют историю изменений — в некоторых конфигурациях (например, 1С:ERP) ведётся журнал.
Главное отличие от переменных — константы не обнуляются при завершении сеанса. Например, если вы храните в константе ТекущийКурсДоллара, её значение останется актуальным для всех пользователей до следующего обновления. Переменная же, объявленная в модуле формы, исчезнет сразу после закрытия формы.
Где и как хранятся константы в базе 1С
Физически значения констант хранятся в системных таблицах базы данных 1С:Предприятие. В зависимости от режима работы (файловый или клиент-серверный) это могут быть:
- 🗃️ Файл
1Cv8.1CD— для файловых баз (все константы хранятся в одном бинарном файле). - 🖥️ Таблицы SQL-сервера — для клиент-серверных баз (например, Microsoft SQL Server или PostgreSQL). Константы обычно хранятся в таблице с префиксом
_Const.
Доступ к константам осуществляется через встроенный язык. Например, чтобы получить значение константы НаименованиеОрганизации, используется конструкция:
ТекущаяОрганизация = Константы.НаименованиеОрганизации.Получить;
При этом изменение константы требует явного сохранения:
Константы.НаименованиеОрганизации.Установить("Новое название ООО");
Константы.НаименованиеОрганизации.Записать;
Если константа используется часто, кэшируйте её значение в переменной модуля приложения, чтобы избежать лишних обращений к базе данных.
Основные сценарии использования констант
Константы применяются в случаях, когда необходимо хранить статичные или редко изменяемые данные, доступные всем пользователям системы. Рассмотрим типичные примеры:
| Сценарий | Пример константы | Альтернатива |
|---|---|---|
| Настройки интеграции | АдресСервераОбмена, ЛогинДляAPI |
Регистр сведений (если настроек много) |
| Глобальные параметры | МинимальнаяСуммаЗаказа, КоличествоДнейДляОплаты |
Перечисление (если значения фиксированные) |
| Управление бизнес-логикой | ИспользоватьСкидкиДляОптовиков (булево значение) |
Функциональные опции |
| Технические флаги | ВерсияКонфигурации, ДатаПоследнегоОбновления |
Регистр сведений с периодичностью |
Важно понимать, что константы не подходят для хранения:
- 📊 Динамических данных (например, остатков на складе — для этого есть регистры).
- 📋 Списков значений (лучше использовать справочники или перечисления).
- 🔄 Данных с историей изменений (тут уместнее регистры сведений с периодичностью).
Когда константы вредят производительности
Если в коде часто обращаться к константам в цикле (например, при обработке большого документа), это может замедлить работу, так как каждое обращение — это запрос к базе. В таких случаях лучше один раз прочитать значение в переменную.
Как создать и настроить константу в конфигураторе
Добавить константу в конфигурацию можно через дерево объектов конфигурации. Пошаговая инструкция:
- Откройте конфигуратор в режиме
1С:Предприятие. - В дереве объектов найдите ветку Общие → Константы.
- Нажмите правой кнопкой и выберите Добавить.
- Задайте имя (например,
МаксимальнаяСкидка) и синоним (отображаемое имя). - Выберите тип значения (число, строка, булево, дата и т.д.).
- При необходимости установите флаг «Показывать в списке выбора», если константу нужно редактировать через интерфейс.
После создания константу можно настроить:
- 🔐 Права доступа — в разделе
Администрирование → Праваограничьте, кто может её изменять. - 📎 Подписки на события — например, можно отслеживать изменение константы через событие
ПриЗаписи. - 🔄 Участие в обмене — включите флаг
Участвует в обмене данными, если константа должна синхронизироваться между базами.
☑️ Проверка перед созданием константы
Типичные ошибки при работе с константами и как их избежать
Неправильное использование констант может привести к потере данных, ошибкам в бизнес-логике или проблемам с производительностью. Рассмотрим самые распространённые ошибки:
⚠️ Внимание: Если константа используется в расчётах (например, СтавкаНДС), её изменение не приведёт к автоматическому перерасчёту старых документов. Это может вызвать несоответствия в отчётности!
Ошибка 1: Хранение динамических данных
Константы не предназначены для часто изменяемых значений. Например, если хранить в константе ТекущийКурсВалюты и обновлять его каждый час, это создаст ненужную нагрузку на базу. Лучше использовать регистр сведений с периодичностью.
Ошибка 2: Отсутствие контроля прав
По умолчанию константы может изменять любой пользователь с правами на редактирование. Если константа критична (например, РазрешитьУдалениеДокументов), обязательно настройте права в ролях:
// Пример ограничения в модуле прав
Если Не ЗначениеЗаполнено(Константы.РазрешитьУдалениеДокументов) Тогда
ОтказатьВДоступе;
КонецЕсли;
Ошибка 3: Прямое изменение без проверок
Всегда проверяйте новое значение константы перед записью. Например, если константа МинимальнаяСуммаЗаказа не может быть отрицательной:
Если НоваяСумма < 0 Тогда
ВызватьИсключение"Сумма не может быть отрицательной!";
КонецЕсли;
Перед изменением константы, влияющей на бизнес-логику, всегда делайте резервную копию базы или тестируйте изменения на копии.
Константы vs. регистры сведений vs. перечисления: что выбрать
Новички часто путают константы с другими объектами конфигурации. Разберём ключевые различия:
| Критерий | Константа | Регистр сведений | Перечисление |
|---|---|---|---|
| Хранение одного значения | ✅ Да | ❌ Нет (хранит множество записей) | ❌ Нет (хранит фиксированный список) |
| Поддержка истории изменений | ❌ Нет (только текущее значение) | ✅ Да (если настроена периодичность) | ❌ Нет |
| Использование в запросах | ❌ Нет (только через встроенный язык) | ✅ Да | ✅ Да |
| Изменяемость в runtime | ✅ Да (через код или интерфейс) | ✅ Да | ❌ Нет (только в конфигураторе) |
Когда выбирать константу:
- 🎯 Нужно хранить одно значение, общее для всех пользователей.
- 🔧 Значение изменяется редко (например, раз в месяц).
- 🔒 Требуется контроль прав на изменение.
Когда лучше использовать регистр сведений:
- 📅 Нужна история изменений (например, курсы валют по датам).
- 📊 Данные привязаны к другим объектам (например, настройки для каждого склада).
Когда подойдёт перечисление:
- 📋 Значения фиксированные и известны на этапе разработки (например,
ВидыОплаты: Наличные, Безналичные, Карта).
Практические примеры работы с константами в коде
Рассмотрим реальные фрагменты кода, где константы решают конкретные задачи.
Пример 1: Управление функциональностью
Допустим, в конфигурации есть флаг ИспользоватьУпрощённуюФормуОтчёта. В модуле отчёта можно написать:
Если Константы.ИспользоватьУпрощённуюФормуОтчёта.Получить Тогда
ВывестиУпрощённуюФорму;
Иначе
ВывестиПолнуюФорму;
КонецЕсли;
Пример 2: Хранение технических параметров
Константа АдресСервераОбмена может использоваться в модуле интеграции:
АдресСервера = Константы.АдресСервераОбмена.Получить;
Попытка
Соединение = Новый HTTPСоединение(АдресСервера,,,,, 30);
Исключение
ЗаписатьЖурналРегистрации("Ошибка подключения к" + АдресСервера, УровеньЖурнала.Ошибка);
КонецПопытки;
Пример 3: Контроль версий
Константа ВерсияКонфигурации поможет отслеживать обновления:
ТекущаяВерсия = Константы.ВерсияКонфигурации.Получить;
Если ТекущаяВерсия <"2.0.10" Тогда
ВыполнитьОбновлениеБазы;
Константы.ВерсияКонфигурации.Установить("2.0.10");
Константы.ВерсияКонфигурации.Записать;
КонецЕсли;
⚠️ Внимание: При работе с константами в распределённых базах (например, 1С:Управление холдингом) их изменение должно синхронизироваться через механизм обмена. В противном случае значения могут расходиться между узлами!
FAQ: Частые вопросы о константах в 1С
Можно ли сделать константу «только для чтения»?
Да, но не через свойства константы, а через настройку прав. В роли пользователя отключите право на изменение для этой константы. Также можно перехватить событие ПередЗаписью и отменить запись:
Процедура Константы_ПередЗаписью(Отказ)
Если ИмяКонстанты ="КритическаяКонстанта" Тогда
Отказ = Истина;
Сообщить("Изменение этой константы запрещено!");
КонецЕсли;
КонецПроцедуры
Как получить значение константы в запросе?
Непосредственно в тексте запроса обратиться к константе нельзя. Но можно использовать параметр запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование,
| Товары.Цена * &Множитель КАК ЦенаСоСкидкой
|ИЗ
| Справочник.Товары КАК Товары";
Запрос.УстановитьПараметр("Множитель", Константы.КоэффициентСкидки.Получить);
Что будет, если удалить константу из конфигурации?
При удалении константы из конфигуратора её значение остаётся в базе данных до выполнения операции Обновление конфигурации базы данных. После обновления данные будут утеряны. Чтобы избежать ошибок:
- Проверьте, нет ли ссылок на константу в коде (используйте
Поиск по текстам модулей). - Создайте резервную копию базы.
- Если константа использовалась в расчётах, перенесите её значение в другой объект (например, регистр сведений).
Как перенести константы при переходе на новую конфигурацию?
При переносе данных между базами константы можно экспортировать/импортировать через:
- Выгрузку/загрузку данных (формат
XMLилиDT). - Обработку «Перенос данных» (входит в поставку 1С:Предприятие).
- Ручной перенос — если констант мало, можно скопировать значения через интерфейс.
Важно: перед переносом сверьте имена и типы констант в старой и новой конфигурациях!
Можно ли сделать константу периодической?
Нет, константы в 1С:Предприятие всегда хранят одно текущее значение. Если нужна история изменений, используйте регистр сведений с периодичностью. Например, вместо константы КурсДоллара создайте регистр сведений КурсыВалют с измерением Валюта и ресурсом Курс, а также установите периодичность День.