Как добавить предопределенный элемент в справочник 1С и обращаться к нему из кода

· 9 мин

Содержание

Предопределенный элемент создают в конфигураторе: откройте окно редактирования справочника, на вкладке «Прочее» нажмите кнопку «Предопределенные», добавьте строку, задайте имя, код и наименование, затем обновите конфигурацию базы данных (F7). После этого элемент появится в базе, и к нему можно обращаться из кода как Справочники.ИмяСправочника.ИмяЭлемента.

Так же настраиваются предопределенные данные планов видов характеристик, планов счетов и планов видов расчета. Ниже — что именно хранит платформа, какие поля можно заполнить в конфигураторе, а какие только программно, и как не получить ошибку «Предопределенный элемент не существует» после обновления.

Как устроены предопределенные данные в 1С 8.3

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

Где встречаются предопределенные данные:

  • 📁 Справочники — статьи затрат, виды контактной информации, базовые единицы измерения.
  • 🏷️ Планы видов характеристик — виды субконто, дополнительные свойства.
  • 📒 Планы счетов — сами счета с признаками учета и видами субконто.
  • 💰 Планы видов расчета — базовые начисления и удержания.

Связь записи с метаданными

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

Отсюда два следствия:

  1. Переименование наименования в пользовательском режиме ничего не ломает: код ищет запись по имени, а не по наименованию.
  2. Если в базе окажутся две записи с одинаковым ИмяПредопределенныхДанных, платформа не сможет выбрать нужную — это источник ошибки «не уникален» (о ней ниже).

Чем предопределенный элемент отличается от обычного

ПризнакОбычный элементПредопределенный
Где создаетсяв пользовательском режиме или кодомв конфигураторе
Удаление пользователемможнонельзя
Обращение из кодачерез поиск по коду или наименованиюнапрямую по имени
Переносится обновлением конфигурациинетда

Пошагово: создаем предопределенный элемент справочника

Возьмем пример: справочник СтатьиЗатрат, в который нужно добавить предопределенную статью «Аренда офиса» с именем Аренда.

Шаг 1. Откройте редактор предопределенных

  1. В дереве конфигурации раскройте ветку «Справочники».
  2. Дважды щелкните СтатьиЗатрат — откроется окно редактирования объекта.
  3. Перейдите на вкладку «Прочее».
  4. Нажмите кнопку «Предопределенные».

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

Если конфигурация на поддержке и объект не снят с замка, кнопка добавления будет недоступна. Включите возможность изменения конфигурации или правьте объект в собственной (не типовой) конфигурации.

Шаг 2. Добавьте элемент

Нажмите «Добавить» (или Insert) и заполните поля:

  • 🔤 Имя — идентификатор для кода: Аренда. Только буквы, цифры и подчеркивание, первой не может быть цифра.
  • 🔢 Код — например, 000000001. Длина и тип кода берутся из свойств справочника.
  • 📝 Наименование — «Аренда офиса», это видит пользователь.

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

Шаг 3. Сохраните и обновите базу

  1. Закройте редактор предопределенных.
  2. Сохраните конфигурацию.
  3. Выполните «Обновить конфигурацию базы данных» (F7).

После обновления и запуска в режиме «Предприятие» элемент появится в списке справочника. В списке он помечается особой пиктограммой.

Реквизиты и табличные части предопределенных элементов

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

Их заполняют одним из трех способов:

СпособКогда подходитРиски
Вручную в режиме «Предприятие»одна база, данные меняются редков новой базе придется повторять
Кодом в обработчике обновлениятираж конфигурации, много базошибка в коде перезапишет правки пользователя
Механизм начального заполнения БСПконфигурация на БСП 3.xнужно знать, как устроен механизм

Заполнение кодом

Минимальный пример: заполнить реквизит СчетУчета у статьи Аренда, если он пуст.

Процедура ЗаполнитьСтатьюАренда() Экспорт

    Ссылка = Справочники.СтатьиЗатрат.Аренда;
    Если Не ЗначениеЗаполнено(Ссылка.СчетУчета) Тогда
        Объект = Ссылка.ПолучитьОбъект();
        Объект.СчетУчета = ПланыСчетов.Хозрасчетный.ОбщехозяйственныеРасходы;
        Объект.Записать();
    КонецЕсли;

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

Проверка ЗначениеЗаполнено нужна, чтобы не затереть то, что пользователь уже поправил руками. Имя счета в примере условное — подставьте предопределенный счет своего плана счетов.

В конфигурациях на БСП 3.x принято другое место: процедура ПриНачальномЗаполненииЭлементов в модуле менеджера справочника. Там описывается таблица значений с именем предопределенного и значениями реквизитов, а БСП сама заполняет их при создании базы и при обновлении версии.

Планы видов характеристик и планы счетов

У них в редакторе предопределенных полей больше:

  • 🏷️ ПВХ — кроме имени, кода и наименования задается тип значения характеристики. Для вида субконто «Контрагенты» это СправочникСсылка.Контрагенты.
  • 📒 План счетов — вид счета (активный, пассивный, активно-пассивный), признак забалансового, признаки учета и до заданного в свойствах максимума видов субконто.

Виды субконто счета выбираются из предопределенных элементов ПВХ, указанного в свойстве плана счетов. Поэтому сначала создают вид субконто в ПВХ, потом подключают его к счету.

Ссылки на предопределенные элементы из других объектов

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

Где это используется:

  1. Значение заполнения реквизита. В свойствах реквизита документа укажите Значение заполнения — выберите предопределенную статью. Новый документ откроется с уже подставленной «Арендой».
  2. Параметры выбора. У реквизита можно ограничить выбор, например, только элементами внутри предопределенной группы: параметр Отбор.Родитель со значением этой группы.
  3. Виды субконто счетов. Как описано выше, счет плана счетов ссылается на предопределенные виды субконто.
  4. Предопределенные значения в формах. В условном оформлении и отборах динамического списка тоже выбирается конкретный предопределенный элемент.

Если удалить предопределенный элемент из конфигурации, все такие ссылки в метаданных станут пустыми или сломаются при проверке. Перед удалением найдите, где он используется: в контекстном меню элемента есть команда поиска ссылок на объект.

Зависимость от порядка создания

Платформа создает предопределенные записи при инициализации данных. Если элемент справочника А ссылается в реквизите на элемент справочника Б, задавайте это значение после создания обоих — кодом обработчика обновления, а не в момент первого запуска.

Обращение к предопределенным элементам из кода и запросов

Есть четыре способа получить ссылку. Выбор зависит от того, где выполняется код.

ГдеКак писатьПример
Сервер, модуль объектачерез менеджерСправочники.СтатьиЗатрат.Аренда
Клиент (модуль формы, &НаКлиенте)глобальная функцияПредопределенноеЗначение("Справочник.СтатьиЗатрат.Аренда")
Запросфункция языка запросовЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.Аренда)
Проверка признакареквизит записиСсылка.Предопределенный, Ссылка.ИмяПредопределенныхДанных

На клиенте менеджеров справочников нет, поэтому Справочники.… там не скомпилируется. ПредопределенноеЗначение() работает и на клиенте, и на сервере.

Пример запроса:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Расходы.Сумма КАК Сумма
|ИЗ
|    РегистрНакопления.Расходы КАК Расходы
|ГДЕ
|    Расходы.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.Аренда)";

В запросе можно отбирать и все предопределенные записи разом: ГДЕ СтатьиЗатрат.Предопределенный.

Список имен предопределенных

Менеджер справочника умеет вернуть массив имен всех предопределенных элементов:

Имена = Справочники.СтатьиЗатрат.ПолучитьИменаПредопределенных();
Для Каждого Имя Из Имена Цикл
    Сообщить(Имя);
КонецЦикла;

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

Проверка перед изменением

Если в форме элемента нужно запретить менять что-то у предопределенных записей, проверяйте Объект.Предопределенный в ПриСозданииНаСервере и блокируйте поле. Так пользователь не сломает, например, код, на который завязана выгрузка.

Обновление конфигурации и инициализация данных

Когда предопределенный элемент реально появляется в базе, управляет свойство справочника «Обновление предопределенных данных» на вкладке «Прочее»:

  • ⚙️ Авто — значение по умолчанию; в обычной базе записи создаются автоматически.
  • ✅ Обновлять автоматически — платформа всегда создает недостающие предопределенные.
  • ⛔ Не обновлять автоматически — записи создает только код или обмен.

Распределенная база (РИБ)

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

Для управления этим есть глобальные методы:

  • УстановитьИнициализациюПредопределенныхДанных(Истина) — отметить, что инициализация уже выполнена, и платформа не будет создавать записи сама.
  • ПолучитьИнициализациюПредопределенныхДанных() — проверить текущее состояние.
  • ИнициализироватьПредопределенныеДанные() — принудительно создать недостающие записи.

В типовых конфигурациях на БСП это уже реализовано в подсистеме обмена данными. В своей конфигурации с РИБ вызывайте установку признака до первого обращения к предопределенным в узле.

Перед выпуском новой версии с предопределенными
Выполнено: 0 / 5

Ошибки предопределенных элементов и их исправление

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

Диагностика: выберите симптом

Как найти дубли

Запрос для поиска повторяющихся имен:

ВЫБРАТЬ
    Т.ИмяПредопределенныхДанных КАК Имя,
    КОЛИЧЕСТВО(Т.Ссылка) КАК Записей
ИЗ
    Справочник.СтатьиЗатрат КАК Т
ГДЕ
    Т.Предопределенный
СГРУППИРОВАТЬ ПО
    Т.ИмяПредопределенныхДанных
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Т.Ссылка) > 1

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

Исправление дублей — изменение данных в рабочей базе. Сначала сделайте резервную копию, исправьте на копии, проверьте документы, и только потом повторите в рабочей базе вне рабочего времени.

Частые промахи разработчика

  • 🔁 Переименовали имя элемента в конфигураторе. Для платформы это удаление старого и создание нового: в базе может появиться вторая запись. Если нужно только поменять отображение — меняйте наименование, а не имя.
  • 🧩 Сослались на элемент в клиентском коде через менеджер. Модуль не скомпилируется. На клиенте — только ПредопределенноеЗначение().
  • 📦 Загрузили данные из другой базы без предопределенных. После загрузки проверьте, что каждое имя из ПолучитьИменаПредопределенных() находит запись.

Частые вопросы

Можно ли сделать предопределенным уже существующий элемент справочника?
Да. Создайте предопределенный элемент в конфигураторе, а затем кодом запишите его имя в реквизит ИмяПредопределенныхДанных существующей записи, предварительно убрав лишнюю созданную платформой запись. Делайте это на копии базы.
Может ли пользователь удалить предопределенный элемент?
Нет, интерактивно удалить его нельзя. Наименование и реквизиты пользователь менять может, если на это есть права.
Сколько предопределенных элементов можно создать?
Жесткого практического предела нет, но каждый элемент проверяется при инициализации данных. Для сотен записей, которые меняются, лучше обычные элементы и заполнение обработкой.
Чем ПредопределенноеЗначение() отличается от Справочники.Имя.Элемент?
Результат одинаковый — ссылка. Но ПредопределенноеЗначение() принимает строку и доступна на клиенте, а обращение через менеджер работает только на сервере.
Нужно ли пересоздавать предопределенные после обновления типовой конфигурации?
Нет. Новые предопределенные платформа добавит сама при обновлении, а заполнение их реквизитов выполнят обработчики обновления конфигурации.