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

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

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

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

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

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

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

Что такое предопределённый элемент и когда он нужен

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

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

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

Добавление предопределённого элемента в конфигураторе

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

Нажмите «Добавить» и заполните поля. Главное поле — «Имя»: оно должно быть корректным идентификатором (без пробелов, начинаться с буквы), потому что именно по нему элемент будет вызываться из кода. Дополнительно заполните «Код» и «Наименование» — они будут присвоены элементу при создании в базе. Если элемент должен быть группой, установите флаг «Это группа» (для иерархических справочников).

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

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

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

Основной способ — обращение через менеджер объекта по имени: Справочники.Валюты.Рубль. Такая конструкция возвращает ссылку на элемент, не выполняя запроса по наименованию. Для плана счетов синтаксис аналогичен: ПланыСчетов.Хозрасчетный.КассаОрганизации.

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

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

bsl
// Прямое обращение по имени
ВалютаРубль = Справочники.Валюты.Рубль;

// Обращение по имени из переменной
ИмяЭлемента = "Рубль";
Ссылка = Справочники.Валюты.ПредопределенныйЭлемент(ИмяЭлемента);

// Проверка существования перед использованием
Если Ссылка = Неопределено Тогда
    ВызватьИсключение "Предопределённый элемент не найден: " + ИмяЭлемента;
КонецЕсли;

Обновление имён предопределённых элементов

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

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

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

Типовые проблемы и их решение

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

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

Третья проблема — ошибка обновления конфигурации БД с сообщением о нарушении уникальности предопределённых данных. Она возникает, если в базе уже есть элемент, помеченный как предопределённый с тем же именем, но с другой ссылкой (например, после загрузки данных из обмена). Лечится поиском таких элементов и снятием с них признака предопределённости либо удалением дубликата.

Типичные ошибки
01
Обращение к элементу по наименованию через НайтиПоНаименованию вместо предопределённого имени — код ломается после переименования пользователем
02
Добавление имени в конфигураторе без обновления конфигурации базы данных — получение ошибки «элемент отсутствует» в пользовательском режиме
03
Имя с пробелами или кириллическими спецсимволами — невозможность обратиться к элементу напрямую из кода
04
Ручное удаление предопределённого элемента под полными правами — обрыв ссылок в регистрах и документах

Предопределённые элементы в расширениях конфигурации

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

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

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

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

Элемент виден в списке в пользовательском режиме
Норма

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

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

Элемента нет — не выполнено обновление конфигурации БД

Обращение из кода Справочники.Имя.ИмяЭлемента
Норма

Возвращается ссылка, заполненность проверяется без ошибок

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

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

Количество элементов с одинаковым наименованием
Норма

Один элемент, он же возвращается методом ПредопределенныйЭлемент

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

Дубли — требуется перенос ссылок и пометка лишнего на удаление

Когда предопределённый элемент не нужен: альтернативы

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

Ещё одна альтернатива — начальное заполнение данных при первом запуске (обработчики обновления или подсистема начального заполнения). Элемент создаётся кодом один раз, но не является предопределённым: пользователь может его менять. Это подходит для данных-примеров и стартовых настроек, но не для объектов, жёстко зашитых в алгоритмы.

Сравнение вариантов

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

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

Константа со ссылкой

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

Начальное заполнение кодом

Когда элемент — стартовый пример или настройка по умолчанию; ограничение — пользователь может изменить или удалить, код не должен на это полагаться

Итог

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

Имя предопределённого элемента задаётся в конфигураторе на закладке «Предопределённые», элемент появляется в базе после обновления конфигурации БД, а из кода к нему обращаются по имени через менеджер объекта. Дубли и ошибки отсутствия элемента почти всегда связаны с пропущенным обновлением или ручным удалением.

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

Может ли пользователь удалить предопределённый элемент?

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

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

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

Почему после обновления конфигурации появился дубль элемента?

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

Как обратиться к предопределённому элементу, если имя хранится в строке?

Используйте метод менеджера объекта ПредопределенныйЭлемент("Имя"). Он вернёт ссылку или Неопределено, если элемент отсутствует, поэтому результат стоит проверять перед использованием, особенно в коде, зависящем от расширений.

Работают ли предопределённые элементы в файловой и клиент-серверной базе одинаково?

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

Можно ли сделать предопределённым уже существующий элемент, введённый пользователем?

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