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

Разработка и Конфигурация · 14 мин

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

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

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

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

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

Где встречаются предопределенные элементы и как они устроены

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

Каждый предопределенный элемент имеет три ключевых свойства: имя (идентификатор для обращения из кода), наименование (то, что видит пользователь) и код. Имя подчиняется правилам именования переменных встроенного языка: без пробелов, начинается с буквы. Наименование может быть любым и его разрешено менять пользователю.

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

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

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

КритерийОбычный элементПредопределенный элемент
Кто создаетПользователь в режиме «Предприятие»Разработчик в конфигураторе
Обращение из кодаПоиск по коду, наименованию или ссылкеПрямое обращение по имени
УдалениеРазрешеноОграничено или запрещено
Изменение имениНе применимо (имени нет)Только в конфигураторе
Изменение наименованияРазрешеноОбычно разрешено пользователю

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

Как создать предопределенный элемент в конфигураторе

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

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

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

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

Как обратиться к предопределенному элементу из кода

Основной способ — обращение через менеджер объекта по имени. Платформа предоставляет два синтаксиса: классический (через точку) и безопасный (через метод).

bsl
// Классическое обращение — вызовет исключение, если элемента нет
ВалютаРубль = Справочники.Валюты.Рубль;

// Безопасное обращение — вернет Неопределено при отсутствии
ВалютаРубль = Справочники.Валюты.ПредопределенныйЭлемент("Рубль");
Если ВалютаРубль = Неопределено Тогда
    // элемент отсутствует в данных
КонецЕсли;

Метод ПредопределенныйЭлемент() предпочтительнее в прикладном коде: он не вызывает исключение, если элемент по какой-то причине отсутствует в данных (например, после загрузки данных из другой базы). Классическое обращение через точку короче, но при отсутствии элемента прерывает выполнение с ошибкой.

Для проверки, является ли конкретная ссылка предопределенной, используется метод объекта Предопределенный() — он возвращает Истина для предопределенных элементов. Это полезно, например, при написании обработок удаления данных, чтобы случайно не затронуть служебные элементы.

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

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

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

Типичные ошибки
01
Поиск элемента по наименованию вместо обращения по предопределенному имени — код ломается после переименования элемента пользователем.
02
Удаление предопределенного элемента обработкой без проверки метода Предопределенный() — алгоритмы конфигурации начинают падать с ошибкой.
03
Переименование предопределенного элемента в конфигураторе без анализа кода — все обращения по старому имени перестают работать.
04
Добавление предопределенных элементов в типовую конфигурацию без необходимости — усложняет последующие обновления.

Как восстановить отсутствующий предопределенный элемент

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

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

Маршрут решения

Как выбрать действие

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

Когда использовать предопределенные элементы, а когда — нет

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

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

Сравнение подходов

Предопределенный элемент

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

Константа со ссылкой на элемент

Подходит для настроек вроде «основная организация» — пользователь меняет значение сам. Ограничение: нужно программно проверять заполненность.

Поиск по наименованию или коду

Допустим только в разовых обработках миграции. В прикладном коде ненадежен: пользователь может переименовать элемент.

При проектировании собственной конфигурации полезно сразу выписать список данных, которые нужны коду, и разделить их на две группы: «жестко зашитые» (предопределенные) и «настраиваемые» (константы и регистры настроек). Такое разделение упрощает сопровождение и снижает количество обращений в поддержку.

Проверка результата и контрольные точки

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

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

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

Элемент в списке в режиме «Предприятие»
Норма

Элемент присутствует, открывается, наименование корректное

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

Элемента нет или он задвоен

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

Возвращается ссылка без исключения

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

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

Метод Предопределенный() у объекта
Норма

Возвращает Истина для нужного элемента

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

Возвращает Ложь — связь имени с элементом потеряна

Журнал регистрации после обновления
Норма

Нет ошибок создания предопределенных данных

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

Есть ошибки реструктуризации или создания элементов

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

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

Часто задаваемые вопросы

Можно ли удалить предопределенный элемент в режиме «1С:Предприятие»?

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

Что произойдет, если переименовать предопределенный элемент в пользовательском режиме?

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

Почему после обмена данными появилось два одинаковых элемента?

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

Чем отличается обращение Справочники.Валюты.Рубль от метода ПредопределенныйЭлемент()?

Обращение через точку короче, но вызывает исключение, если элемента нет в данных. Метод ПредопределенныйЭлемент("Рубль") в той же ситуации вернет Неопределено, что позволяет обработать отсутствие элемента программно и не прерывать работу пользователя. В прикладном коде безопаснее второй вариант.

Можно ли сделать предопределенным элемент документа или регистра?

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

Как узнать, какие предопределенные элементы есть в объекте?

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

Итог

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

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