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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обращение к такому элементу из кода выполняется напрямую через менеджер объекта:

bsl
ВалютаРуб = Справочники.Валюты.Рубль;
ВидНоменклатуры = Справочники.ВидыНоменклатуры.Товар;
СчетКассы = ПланыСчетов.Хозрасчетный.Касса;

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

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

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

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

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

Особенности для разных объектов метаданных

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

ОбъектКак добавитьОсобенности
СправочникВкладка «Прочее» → «Предопределенные»Доступно только если справочник не подчиненный либо учитывается иерархия; обращение Справочники.Имя.ИмяЭлемента
План видов характеристикКнопка «Предопределенные» в форме объектаЧасто используется для дополнительных реквизитов и свойств
План счетовВкладка «Предопределенные»Для счетов задаются признаки учета, запретить использование в проводках нельзя без настройки
План видов расчетаВкладка «Предопределенные»Задаются ведущие и базовые виды расчета, используется в ЗУП-подобных конфигурациях

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

Типичные ошибки и ограничения

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

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

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

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

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

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

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

В пользовательском режиме элемент виден и имеет пиктограмму предопределенного

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

Элемент отсутствует или выглядит как обычный — проверьте обновление конфигурации БД

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

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

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

Возвращается пустая ссылка или ошибка — имя не совпадает с описанным в конфигураторе

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

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

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

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

Быстрая программная проверка — выполнить в консоли кода обращение к элементу и вывести результат. Если ссылка заполнена и Предопределенный у объекта возвращает Истина, настройка выполнена правильно.

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

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

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

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

Нужно обращаться к элементу из кода и гарантировать его наличиеСоздавайте предопределенный элемент в конфигураторе
Конфигурацию менять нельзя, но нужна стабильная ссылкаИщите элемент по GUID или храните ссылку в константе/параметре
Элемент создается пользователем и состав заранее неизвестенИспользуйте обычные элементы с поиском по реквизиту-признаку, а не предопределенные
Дорабатывается типовая конфигурация на поддержкеИспользуйте расширение конфигурации с собственными предопределенными элементами

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

Итог

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

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

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

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

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

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

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

Как удалить предопределенный элемент?

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

Что произойдет с предопределенными элементами при обновлении типовой конфигурации?

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

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

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