Первый шаг в 1С — абсолютно бесплатно.

📋 Константы в 1С 8.3

Константа — это объект метаданных, предназначенный для хранения одного значения, которое не изменяется во времени или изменяется очень редко. Каждая константа хранит ровно одно значение определённого типа .

Типичные примеры использования констант: наименование организации, ИНН, адрес, ФИО руководителя, настройки учётной политики, дата запрета редактирования. Значение константы вводится один раз и используется многократно во всех расчётах и документах .

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

Свойства константы в конфигураторе

При создании константы в дереве конфигурации заполняются следующие свойства:

Имя — идентификатор для обращения из кода. Например: НаименованиеОрганизации, ДатаЗапретаРедактирования.

Синоним — название для пользователя. Например: «Наименование организации», «Дата запрета редактирования».

Тип — тип данных константы. Может быть любым стандартным типом: Строка, Число, Дата, Булево, а также ссылочным типом (СправочникСсылка, ДокументСсылка и т.д.) или составным типом .

Длина — для строкового типа задаётся максимальная длина.

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

Основная форма — форма для редактирования константы. Если не задана явно, система генерирует форму автоматически .

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

Работа с константами в коде

Чтение значения (метод Получить)

Для чтения значения константы используется метод Получить(). Обращение к константе идёт через глобальный менеджер Константы .

Пример на сервере (в модуле приложения или общем модуле):

Процедура ВывестиДанныеОрганизации()

Наименование = Константы.НаименованиеОрганизации.Получить();

ИНН = Константы.ИНН.Получить();

ДатаРегистрации = Константы.ДатаРегистрации.Получить();

Сообщить("Организация: " + Наименование);

Сообщить("ИНН: " + ИНН);

Сообщить("Дата регистрации: " + ДатаРегистрации);

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

Проверка начального значения — если константа ещё не заполнена, она содержит значение по умолчанию для своего типа. Для даты это 00010101, для строки — пустая строка, для числа — 0, для булево — Ложь .

// Проверка, заполнена ли константа (на примере даты)

Если Константы.ДатаРегистрации.Получить() = '00010101' Тогда

// Константа не заполнена, устанавливаем значение по умолчанию

Константы.ДатаРегистрации.Установить(НачалоГода(ТекущаяДата()));

КонецЕсли;

Запись значения (метод Установить)

Для записи значения константы используется метод Установить(<Значение>) .

Пример на сервере:

// Установка значения константы

Константы.НаименованиеОрганизации.Установить("ООО Ромашка");

Константы.ИНН.Установить("7712345678");

 

Пример на клиенте (в форме константы или в модуле формы):

&НаКлиенте

Процедура ЗаписатьНаименование()

// На клиенте запись выполняется через серверный вызов

ЗаписатьНаименованиеНаСервере(НаименованиеОрганизации);

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

&НаСервере

Процедура ЗаписатьНаименованиеНаСервере(Значение)

Константы.НаименованиеОрганизации.Установить(Значение);

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

 

Важное замечание: запись константы следует выполнять вне транзакций, так как на время записи работа других сеансов, пытающихся записать эту же константу, приостанавливается. Это может стать «узким местом» при конкурентной работе. Не рекомендуется использовать константу в качестве счётчика проведённых документов в процедуре проведения .

Работа с набором констант

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

Создание набора:

// Создаём набор из двух констант

НаборКонстант = Константы.СоздатьНабор("ДатаРегистрации,НаименованиеОрганизации");

Чтение набора:

 

НаборКонстант.Прочитать();

// Теперь можно обращаться к значениям как к свойствам набора

Сообщить("Дата регистрации: " + НаборКонстант.ДатаРегистрации);

Сообщить("Наименование: " + НаборКонстант.НаименованиеОрганизации);

Запись набора:

// Изменяем значения в наборе

НаборКонстант.ДатаРегистрации = НачалоГода(ТекущаяДата());

НаборКонстант.НаименованиеОрганизации = "ООО Ромашка";

// Записываем все изменения одной операцией

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

Пример с созданием набора для нескольких констант:

// Создаём набор для констант

Набор = Константы.СоздатьНабор("CEO, Accountant");

Набор.CEO = "Иванов И.И.";

Набор.Accountant = "Петрова А.С.";

Набор.Записать();

Работа с константами на форме

Автоматическая форма константы

При создании константы система может автоматически сгенерировать форму для её редактирования. Для этого в свойствах константы устанавливается флаг «Использовать стандартные команды», а форма создаётся в ветке «Общие формы» .

Пользователь может открыть форму константы через команду в подсистеме или через меню «Все функции» → «Константы» .

 

Создание общей формы для нескольких констант

Если нужно редактировать несколько констант на одной форме, создаётся общая форма для ветки «Константы». В конструкторе формы выбираются константы, которые будут отображаться .

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

&НаКлиенте

Процедура ОткрытьФормуНастройки()

// Открытие формы константы по имени

ОткрытьФорму("Константа.НаименованиеОрганизации.Форма");

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

 

Пример работы с константами на форме (управляемая форма):

На форме размещаются реквизиты, связанные с константами. При записи формы значения сохраняются:

&НаКлиенте

Процедура ЗаписатьИЗакрыть(Команда)

ЗаписатьНаСервере();

Закрыть();

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

&НаСервере

Процедура ЗаписатьНаСервере()

// Запись значений констант из реквизитов формы

Константы.НаименованиеОрганизации.Установить(НаименованиеОрганизации);

Константы.ИНН.Установить(ИНН);

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

Клиент vs Сервер: особенности работы

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

Чтение константы на клиенте выполняется напрямую:

&НаКлиенте

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

Наименование = Константы.НаименованиеОрганизации.Получить();

Сообщить("Работаем в организации: " + Наименование);

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

 

Запись константы на клиенте невозможна напрямую — требуется серверный вызов:

&НаКлиенте

Процедура УстановитьНаименование(Значение)

УстановитьНаименованиеНаСервере(Значение);

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

&НаСервере

Процедура УстановитьНаименованиеНаСервере(Значение)

Константы.НаименованиеОрганизации.Установить(Значение);

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

Это связано с тем, что запись данных в информационную базу всегда выполняется на сервере.

Работа с константами в расширениях конфигурации

Начиная с версии платформы 8.3.16, появилась возможность создавать собственные константы непосредственно в расширениях конфигурации .

Обращение к константе расширения из кода самого расширения:

// Код находится в модуле расширения (например, в обработчике &Вместо)

Значение = Константы.ДополнительнаяИнформация.Получить();

Обращение выполняется через глобальный менеджер Константы так же, как и к константам основной конфигурации. Префикс расширения (например, МОЕ.Константы...) не используется — это неверный синтаксис .

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

Итоговая сводка методов

Обращение к константе: Константы.ИмяКонстанты — даёт доступ к объекту типа КонстантаМенеджер.

Чтение значения: Константы.ИмяКонстанты.Получить() — возвращает текущее значение константы.

Запись значения: Константы.ИмяКонстанты.Установить(<Значение>) — записывает новое значение.

Создание набора: Константы.СоздатьНабор("Константа1, Константа2") — создаёт объект КонстантыНабор для групповой работы.

Чтение набора: НаборКонстант.Прочитать() — читает все константы набора одной операцией.

Запись набора: НаборКонстант.Записать() — записывает все константы набора одной операцией.

 

Обход всех констант:

Для Каждого Константа Из Константы Цикл

Имя = Константа.Метаданные().Имя;

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

Сообщить(Имя + " = " + Значение);

КонецЦикла;

 

Этот код выведет значения всех констант, доступных в конфигурации .

📋 Перечисления в 1С 8.3

Перечисления в 1С 8.3

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

Основная особенность перечислений: их значения «не обезличены» для конфигурации — алгоритмы программы могут напрямую обращаться к конкретным значениям, что делает код более читаемым и защищённым от ошибок.

Когда использовать перечисление вместо справочника?

Пользователь не должен менять список значений ✅

Список значений фиксирован и известен при разработке ✅

Алгоритм опирается на конкретные значения ✅

Свойства перечисления в конфигураторе

При создании перечисления в дереве конфигурации заполняются следующие свойства:

Имя - Идентификатор для обращения из кода / ВидыНоменклатуры

Синоним - Название для пользователя / Виды номенклатуры Значения Набор допустимых значений (вкладка «Данные») Материал, Услуга, Работа

 

Для каждого значения перечисления также задаются:

Имя - Для обращения из кода: Перечисления.ВидыНоменклатуры.Материал

Синоним - Для отображения пользователю: «Материал»

ПоУмолчанию - Значение, подставляемое автоматически (может быть только одно)

Работа с перечислениями в коде

1. Обращение к значению перечисления (клиент и сервер)

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

// Пример: проверка значения

Если ТекСтрока.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда

// Выполняем действие для материалов

КонецЕсли;

Пример на сервере (в процедуре проведения документа):

Процедура ОбработкаПроведения(Отказ, Режим)

Движения.ОстаткиМатериалов.Записывать = Истина;

Для Каждого ТекСтрока Из ПереченьНоменклатуры Цикл

Если ТекСтрока.Номенклатура.ВидНоменклатуры =

Перечисления.ВидыНоменклатуры.Материал Тогда

Движение = Движения.ОстаткиМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

Движение.Материал = ТекСтрока.Номенклатура;

Движение.Количество = ТекСтрока.Количество;

КонецЕсли;

КонецЦикла;

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

Важно: значения перечисления доступны как на сервере, так и на клиенте, поскольку принадлежат глобальному контексту. Однако системные перечисления могут быть недоступны на клиенте в старых версиях платформы или при работе через расширения — в этом случае используется ПредопределенноеЗначение() или доступ по строковому имени.

2. Получение списка значений и обход всех элементов

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

// Получение количества значений

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

// Получение значения по индексу

Значение = Перечисления.ВидыНоменклатуры.ЗначениеПоНомеру(1);

// Обход всех значений

Для Каждого ЗначениеПеречисления Из Перечисления.ВидыНоменклатуры Цикл

Сообщить(ЗначениеПеречисления); // Выведет синоним значения

КонецЦикла;

Пример: заполнение списка выбора на форме:

&НаКлиенте

Процедура ЗаполнитьСписокВидовНоменклатуры()

Список = Новый СписокЗначений;

Для Каждого Вид Из Перечисления.ВидыНоменклатуры Цикл

Список.Добавить(Вид, Вид); // Значение и представление

КонецЦикла;

Элементы.ВидыНоменклатуры.СписокВыбора = Список;

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

Работа с перечислениями на форме

Ограничение выбора в модуле менеджера перечисления

Наиболее «чистый» способ ограничить список значений перечисления на всех формах сразу — обработчик ОбработкаПолученияДанныхВыбора в модуле менеджера перечисления:

// Модуль менеджера перечисления СпособыПогашенияЗадолженности

Процедура ОбработкаПолученияДанныхВыбора

|(ДанныеВыбора, Параметры, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Список = Новый СписокЗначений;

Список.Добавить(Перечисления.СпособыПогашенияЗадолженности.

|ПоДокументу);

Список.Добавить(Перечисления.СпособыПогашенияЗадолженности.);

|НеПогашать);

ДанныеВыбора = Список;

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

Динамическое ограничение выбора на конкретной форме

Если ограничение должно зависеть от контекста формы, используется обработчик НачалоВыбора у элемента формы:

&НаКлиенте

Процедура ВидНоменклатурыНачалоВыбора

|(Элемент, ДанныеВыбора,

|ВыборДобавлением, СтандартнаяОбработка)

// Формируем свой список только для этой формы

Список = Новый СписокЗначений;

Если УсловиеОтбора Тогда

Список.Добавить(Перечисления.ВидыНоменклатуры.Материал);

Иначе

Список.Добавить(Перечисления.ВидыНоменклатуры.Услуга);

КонецЕсли;

ДанныеВыбора = Список;

СтандартнаяОбработка = Ложь;

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

Обход ограничения видимости на клиенте (при работе с расширениями):

&НаКлиенте

Процедура ПолучитьЗначениеПеречисления()

// Вместо прямого обращения Перечисления.ОперацииЗакрытияМесяца.МойВидОперации

Значение = ПредопределенноеЗначение(

"Перечисление.ОперацииЗакрытияМесяца.МойВидОперации");

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

Получение имени значения перечисления из метаданных

Если у вас есть объект типа ПеречислениеСсылка и нужно получить имя значения (а не синоним), используется следующий приём:

Получение имени значения перечисления из метаданных

Если у вас есть объект типа ПеречислениеСсылка и нужно получить имя значения (а не синоним), используется следующий приём:

ЗначениеПеречисления = Перечисления.

|ВидыКонтрагентов.Организация;

// Получаем имя перечисления

ИмяПеречисления = ЗначениеПеречисления.Метаданные().Имя;

// Получаем индекс значения

Индекс = Перечисления[ИмяПеречисления].

|.Индекс(ЗначениеПеречисления);

// Получаем имя значения из метаданных

ИмяЗначения = Метаданные.Перечисления[ИмяПеречисления]

.ЗначенияПеречисления[Индекс].Имя;

// Результат: "Организация"

Итоговая сводка методов:

Перечисления.ИмяПеречисления.Значение Прямое обращение к значению

Перечисления.ВидыНоменклатуры.Материал

.КоличествоЗначений() Получить число значений

Перечисления.ВидыНом.ЗначениеПоНомеру(1)

.ЗначениеПоНомеру(Номер) Значение по индексу

Перечисления.Вид.ЗначениеПоНомеру(1)

.ПустаяСсылка() Пустая ссылка

Перечисления.ВидыНоменклатуры.ПустаяСсылка()

ПредопределенноеЗначение("Перечисление.Имя.Значение") Доступ через строку (для клиента/расширений)

ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Материал")