К статье
Практический материал

Справочники и Данные · 11 мин

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

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

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

Типичная задача выглядит так: в процедуре нужно записать документ с конкретным значением реквизита, и это значение должно существовать в любой базе, где развёрнута конфигурация. Решение — создать предопределенный элемент в конфигураторе, а в коде получать его через Справочники.ИмяСправочника.ИмяЭлемента или через метод ПредопределенноеЗначение. Ниже разобран полный цикл: от включения возможности редактирования конфигурации до проверки результата в пользовательском режиме.

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

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

Предопределенный элемент оправдан, когда логика программы жёстко привязана к конкретной записи справочника. Классические примеры: валюта регламентированного учёта, основная организация, ставка НДС по умолчанию, вид цен «Розничная». Если такой записи нет, код падает с ошибкой или создаёт дубли при поиске по наименованию.

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

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

Подготовка: что проверить перед созданием

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

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

Пошаговое создание предопределенного элемента в конфигураторе

Основной сценарий одинаков для большинства конфигураций на платформе 8.3. Последовательность действий:

Порядок действий
  1. 1
    Откройте конфигуратор и разверните в дереве конфигурации ветку «Справочники».
  2. 2
    Найдите нужный справочник и откройте его палитру свойств или форму редактирования объекта.
  3. 3
    Перейдите на закладку «Прочее» и нажмите кнопку «Предопределенные» (в некоторых версиях — ссылка «Предопределенные элементы» внизу окна редактирования).
  4. 4
    В открывшемся списке добавьте новый элемент: задайте Имя (латиницей, без пробелов — по нему будет идти обращение из кода) и Наименование (то, что увидит пользователь).
  5. 5
    При необходимости заполните дополнительные реквизиты элемента — они доступны в этой же таблице, если у справочника есть реквизиты.
  6. 6
    Закройте окно, сохраните конфигурацию (Ctrl+S) и выполните обновление конфигурации базы данных (клавиша F7), подтвердив реструктуризацию.
  7. 7
    Запустите режим «Предприятие» и убедитесь, что элемент появился в списке справочника.

Имя предопределенного элемента должно быть уникальным в рамках справочника и соответствовать правилам именования идентификаторов: латинские буквы, цифры, подчёркивания, начинаться с буквы. Менять имя после того, как на элемент завязан код и базы уже обновлены, нежелательно: платформа воспримет это как удаление старого элемента и создание нового, и старая запись останется в данных как обычная (непредопределенная).

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

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

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

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

bsl
ВалютаРубль = Справочники.Валюты.ПредопределенноеЗначение("Рубль");
Если ВалютаРубль.Пустая() Тогда
    ВызватьИсключение "Не найден предопределенный элемент справочника Валюты";
КонецЕсли;

В запросах предопределенные значения подставляются через параметр-ссылку или через функцию ЗНАЧЕНИЕ(Справочник.Валюты.Рубль). Второй вариант выполняется быстрее, так как не требует вычисления параметра, но имя должно существовать на момент написания запроса.

Особенности в типовых конфигурациях на БСП

В конфигурациях на базе Библиотеки стандартных подсистем (УТ, КА, ERP, БП и другие) механизм предопределенных элементов работает в связке с обработчиками обновления. При обновлении конфигурации платформа сопоставляет список предопределенных элементов из метаданных с данными информационной базы: создаёт недостающие, переименовывает изменённые и помечает на удаление те, что исчезли из метаданных.

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

Типичные ошибки и способы их устранения

Типичные ошибки
01
Элемент создан в конфигураторе, но не появился в базе — не выполнено обновление конфигурации базы данных (F7) или обновление завершилось с ошибкой реструктуризации.
02
Обращение по имени выдаёт ошибку — имя в коде не совпадает с именем предопределенного элемента; проверьте регистр и опечатки.
03
Дубли элементов в справочнике — раньше запись создавалась кодом через поиск по наименованию, а теперь добавлен ещё и предопределенный; старую запись нужно заменить во всех документах и удалить.
04
Пользователь переименовал наименование, и отчёты «перестали видеть» элемент — отчёты, ищущие по наименованию, а не по предопределенному имени, работают ненадёжно; перепишите их на ЗНАЧЕНИЕ() или параметр.
05
Нельзя пометить элемент на удаление — это нормальное поведение для предопределенных; если удаление действительно нужно, сначала уберите элемент из списка предопределенных в конфигураторе и обновите базу.

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

Проверка результата

Контрольные точки

Как проверить результат

Элемент в списке справочника
Норма

Запись видна в режиме «Предприятие», у неё корректное наименование

Тревожный признак

Записи нет или она дублируется — обновление не выполнено или есть старый аналог

Защита от удаления
Норма

При попытке пометить на удаление платформа выдаёт предупреждение о предопределенном элементе

Тревожный признак

Элемент помечается на удаление свободно — он не предопределенный

Обращение из кода
Норма

Справочники.Имя.ИмяЭлемента возвращает непустую ссылку

Тревожный признак

Ошибка обращения или пустая ссылка — проверьте имя и обновление базы

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

Итог

Что важно запомнить

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

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

Можно ли создать предопределенный элемент без конфигуратора, прямо в режиме «Предприятие»?

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

Что произойдёт с документами, если удалить предопределенный элемент из конфигуратора?

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

Почему код Справочники.Валюты.НайтиПоНаименованию("Рубль") хуже предопределенного элемента?

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

Можно ли сделать предопределенной группу справочника?

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

Элемент есть в конфигураторе, но в базе пустая ссылка — что делать?

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

Нужно ли снимать конфигурацию с поддержки ради одного предопределенного элемента?

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