Как работают предопределённые элементы 1С: от Конфигуратора до запроса
Содержание
Предопределённый элемент — это запись справочника (или плана счетов, плана видов характеристик, плана видов расчёта), которую вы создаёте один раз в Конфигураторе и дальше дёргаете из кода по имени: Справочники.Валюты.Рубль. Платформа гарантирует, что такой элемент есть в базе и имеет постоянный идентификатор, который пользователь не сможет случайно изменить или удалить.
Нужен он там, где код должен опираться на конкретный элемент справочника: ставка НДС 20%, статус заказа «Выполнен», счёт 41 «Товары». Код обращается к имени, заданному в Конфигураторе, а не к наименованию или коду — и потому не сломается, когда бухгалтер переименует элемент или сменит его код.
Ниже — чем предопределённый элемент отличается от константы и перечисления, как его завести, как сослаться в модуле и в запросе, и о какие ограничения чаще всего спотыкаются.
Чем предопределённый элемент отличается от константы
Эти два механизма часто путают, потому что оба настраиваются в Конфигураторе и хранят «что-то постоянное». Но решают они разные задачи.
Константа хранит ровно одно значение на всю базу: название организации, ставку по умолчанию, флаг «вести учёт по складам». У константы нет ссылочности — это именно значение (строка, число, ссылка), лежащее в единственном экземпляре.
Предопределённый элемент — это полноценная запись справочника со своими реквизитами. У него есть ссылка, его можно подставлять в документы, использовать как значение реквизита, хранить в движениях регистров.
| Критерий | Константа | Предопределённый элемент |
|---|---|---|
| Что это | одно значение | запись справочника / плана |
| Есть ссылка | нет | да |
| Реквизиты | нет | есть, как у обычного элемента |
| Сколько экземпляров | один | столько, сколько завели |
| Типичное применение | настройка, флаг, значение по умолчанию | фиксированный элемент справочника (счёт, статус, вид) |
Простое правило: если значение нужно подставлять в документы и регистры как элемент справочника — это предопределённый элемент; если это одна настройка на базу — константа.
Какие объекты поддерживают предопределённые элементы
Предопределённые данные можно задать не для всего. Их поддерживают четыре вида объектов:
- 📒 Справочники — самый частый случай (валюты, виды цен, типы контрагентов).
- 💰 Планы счетов — счета и субсчета бухгалтерского учёта.
- 🏷️ Планы видов характеристик — предопределённые характеристики и настройки.
- 🧮 Планы видов расчёта — виды начислений и удержаний.
Отдельно стоят перечисления: в них вообще все значения предопределённые, но механизм другой. У значения перечисления нет реквизитов, его нельзя добавить в режиме «1С:Предприятие» — весь набор задаётся в Конфигураторе и меняется только там. Обращение похоже: Перечисления.СтавкиНДС.НДС20.
Если по смыслу нужен закрытый список без доп. реквизитов (пол, вид операции, да/нет) — берите перечисление. Если элементы должны иметь реквизиты и пополняться пользователем, но несколько штук обязаны существовать всегда — справочник с предопределёнными.
Как создать предопределённый элемент в Конфигураторе
Предопределённые элементы заводятся только в Конфигураторе, в режиме «1С:Предприятие» их добавить нельзя.
- Откройте нужный объект в дереве конфигурации (например, справочник
Валюты). - В окне редактирования объекта перейдите на закладку Прочее и нажмите кнопку Предопределённые (в разных релизах — отдельная закладка «Предопределённые»).
- В открывшемся списке добавьте элемент (
Insили команда добавления в командной панели). - Задайте два главных поля: Имя — идентификатор для кода (латиница или кириллица без пробелов, например
Рубль); Наименование — то, что увидит пользователь.
Имя в коде — это именно поле Имя, а не Наименование и не Код. Наименование пользователь потом может сменить, а Имя живёт только в Конфигураторе и в коде.
После добавления элемента он ещё не в базе — он появится там при обновлении конфигурации базы данных и запуске. В типовых конфигурациях на БСП начальное заполнение предопределённых идёт через обработчик при обновлении информационной базы; в простой самописной конфигурации платформа создаёт их автоматически при первом обращении.
Начиная с платформы 8.3.3 у объекта есть свойство Обновление предопределённых данных со значениями «Обновлять автоматически», «Не обновлять автоматически» и «Авто». Оно управляет тем, будет ли платформа сама досоздавать недостающие предопределённые при обновлении. Связь элемента в базе с его описанием в конфигурации хранится в служебном поле Имя предопределённых данных (PredefinedDataName).
Если значение свойства — «Не обновлять автоматически», ответственность за создание и заполнение элементов ложится на код. В конфигурациях на БСП для этого используют обработчик начального заполнения (процедуру ПриНачальномЗаполнении в модуле менеджера объекта), который вызывается при обновлении информационной базы и создаёт недостающие предопределённые с нужными реквизитами. Такой подход даёт контроль: вы сами решаете, какие поля проставить и как себя вести, если элемент уже есть.
Как обратиться к предопределённому значению в коде
Самый короткий способ — через менеджер объекта по имени из Конфигуратора:
ВалютаУчёта = Справочники.Валюты.Рубль;
СчётТоваров = ПланыСчетов.Хозрасчётный.Товары;
СтатусГотов = Справочники.СтатусыЗаказов.Выполнен;
Такое обращение возвращает ссылку (СправочникСсылка.Валюты и т. п.). Оно компилируется на этапе проверки — если имени нет, конфигурация просто не соберётся.
Когда имя элемента заранее неизвестно (хранится в настройке, приходит параметром), используйте глобальную функцию ПредопределённоеЗначение:
ИмяПолнойСсылки = "Справочник.Валюты.Рубль";
Валюта = ПредопределённоеЗначение(ИмяПолнойСсылки);
В функцию передаётся полное имя в виде строки: вид объекта, точка, имя объекта, точка, имя элемента. Удобно, когда имя собирается динамически.
Проверить, предопределённый ли вообще элемент, и узнать его имя можно через реквизиты ссылки:
Если Элемент.Предопределённый Тогда
Имя = Элемент.ИмяПредопределённыхДанных; // например, "Рубль"
КонецЕсли;
Прямое обращение Справочники.Валюты.Рубль падает с ошибкой, если такого предопределённого в конфигурации уже нет (его удалили, а код остался). ПредопределённоеЗначение по несуществующему имени тоже вызовет ошибку — оборачивайте в проверку, если имя приходит извне.
Для перечислений синтаксис такой же, но без признака предопределённости: Перечисления.СтавкиНДС.НДС20. Пустую ссылку любого из этих объектов получают через ПустаяСсылка(): Справочники.Валюты.ПустаяСсылка(). Её удобно использовать в сравнениях, чтобы отличить незаполненное значение реквизита от конкретного элемента.
Как использовать предопределённое значение в запросе
В языке запросов для подстановки предопределённого значения есть функция ЗНАЧЕНИЕ (в англоязычном синтаксисе — VALUE). Она работает и для справочников, и для планов счетов, и для перечислений.
ВЫБРАТЬ
Остатки.Валюта,
Остатки.СуммаОстаток
ИЗ
РегистрНакопления.ДенежныеСредства.Остатки КАК Остатки
ГДЕ
Остатки.Валюта = ЗНАЧЕНИЕ(Справочник.Валюты.Рубль)
Несколько примеров для разных объектов:
- справочник —
ЗНАЧЕНИЕ(Справочник.Валюты.Рубль); - перечисление —
ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20); - план счетов
—
ЗНАЧЕНИЕ(ПланСчетов.Хозрасчётный.Товары); - пустая ссылка —
ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка).
ЗНАЧЕНИЕ вычисляется при компиляции запроса, поэтому фильтр по предопределённому элементу работает быстрее, чем передача ссылки параметром, и не зависит от того, какой код или наименование у элемента в базе.
В системе компоновки данных (СКД) ту же функцию используют в выражениях отбора и вычисляемых полях. А в пользовательских настройках отбора предопределённый элемент выбирается из списка как обычный — пользователю не обязательно знать, что он предопределённый.
Ограничения и особенности, о которые спотыкаются
Предопределённый элемент ведёт себя не совсем как обычный, и об этом важно помнить.
- Нельзя удалить в режиме «1С:Предприятие». Пока элемент связан с описанием в конфигурации, платформа не даст пометить его на удаление. Сначала его «открепляют» (убирают связь с предопределённым), и только потом удаляют.
- Удаление из Конфигуратора не удаляет запись. Если убрать элемент из списка предопределённых в Конфигураторе, запись в базе останется — но станет обычным элементом, у неё очистится
ИмяПредопределённыхДанных. КодСправочники.Валюты.Рубльпосле этого перестанет компилироваться. - Реквизиты пользователь менять может. Наименование, код, любые дополнительные реквизиты предопределённого элемента доступны для изменения в режиме предприятия. Неизменно только само имя (из Конфигуратора) и факт предопределённости.
- Дубли при неаккуратном обновлении. Если в конфигурации имя одно, а в базе связь потерялась, платформа при автоматическом обновлении может создать второй экземпляр. Тогда в справочнике окажется два похожих элемента, один из которых уже «настоящий» предопределённый.
Прежде чем убирать предопределённый из Конфигуратора в рабочей базе, проверьте поиском по конфигурации (Правка → Глобальный поиск), не осталось ли обращений Справочники.X.Имя в коде и ЗНАЧЕНИЕ(...) в запросах. Иначе получите ошибку компиляции или пустые отборы.
Предопределённые элементы в обмене данными и РИБ
При обмене через планы обмена и в распределённой информационной базе (РИБ) предопределённые элементы ведут себя иначе, чем обычные записи, и это стоит учитывать.
Ссылка элемента (внутренний GUID) в разных узлах, вообще говоря, своя. Обычные элементы платформа сопоставляет именно по ссылке — она переносится при обмене. А предопределённые в каждой базе создаются независимо (при обновлении конфигурации), поэтому их платформа связывает по имени предопределённых данных, а не по ссылке.
На практике это значит:
- 📌 Один и тот же предопределённый элемент (например, валюта
Рубль) в двух узлах — это разные ссылки, но платформа понимает, что это «один и тот же» элемент, по совпадениюИмяПредопределённыхДанных. - 📌 Если в одном узле элемент предопределённый, а в другом такого имени нет, при загрузке может появиться обычный элемент-двойник. Поэтому состав предопределённых в узлах РИБ должен совпадать.
- 📌 Отборы по предопределённым в запросах через
ЗНАЧЕНИЕ(...)корректны в любом узле: функция вычисляется от имени, а не от конкретной ссылки.
При выгрузке данных во внешний файл или при интеграции с другой базой не полагайтесь на то, что GUID предопределённого элемента совпадёт. Сопоставляйте по имени предопределённых данных — оно устойчиво.
Когда предопределённые лучше других способов идентификации
Сослаться на конкретный элемент справочника из кода можно по-разному. У каждого способа своя надёжность.
| Способ | Как ищет | Риск |
|---|---|---|
| По коду / наименованию | НайтиПоКоду, НайтиПоНаименованию | пользователь сменит код или имя — поиск сломается |
| По GUID | НайтиПоУникальномуИдентификатору | GUID разный в разных базах, перенос ломается |
| Константа со ссылкой | значение хранится в константе | нужно заполнить вручную, можно забыть |
| Предопределённый | по имени из Конфигуратора | имя неизменно, элемент гарантированно есть |
Предопределённые выигрывают там, где элемент — часть логики, а не просто данные пользователя. Ставка НДС, по которой считается налог; статус, по которому фильтруется список; счёт, на который ложится проводка, — всё это разумно делать предопределённым, чтобы код опирался на устойчивое имя.
Короткий пример разницы. Допустим, при проведении документа нужно взять счёт учёта товаров. Если искать его НайтиПоКоду("41"), то стоит бухгалтеру переименовать счёт или сменить код в своём плане счетов — проводка ляжет не туда или код выдаст ошибку. Если же счёт Товары заведён предопределённым, обращение ПланыСчетов.Хозрасчётный.Товары вернёт нужный элемент при любом коде и наименовании.
А вот обычные записи (конкретные контрагенты, номенклатура, сотрудники) предопределёнными делать не нужно: они создаются пользователем, и привязывать к ним код — плохая идея. Предопределёнными стоит делать только тот минимум элементов, на которые опирается логика конфигурации.
Частые вопросы
Можно ли добавить предопределённый элемент прямо в «1С:Предприятии»?
Чем `ПредопределённоеЗначение("…")` отличается от `Справочники.Валюты.Рубль`?
ПредопределённоеЗначение принимает имя строкой и нужна, когда имя заранее неизвестно (хранится в настройке или приходит параметром).Почему после удаления элемента из Конфигуратора он всё ещё виден в справочнике?
Как в запросе проверить, что элемент предопределённый?
Предопределённый (булево) и ИмяПредопределённыхДанных (строка с именем). Их можно вывести в выборку или поставить в условие отбора.