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

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

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

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

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

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

Материал ориентирован на платформу 1С:Предприятие 8.3 с управляемым приложением. В обычном приложении механика та же, но часть настроек обновления предопределенных данных работает иначе — это отмечено отдельно.

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

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

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

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

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

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

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

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

Главное преимущество предопределенных элементов — обращение по имени без запросов и поиска. Синтаксис зависит от типа объекта:

ВалютаРуб = Справочники.Валюты.Рубль; // ссылка на предопределенный элемент

ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад;

Счет = ПланыСчетов.Хозрасчетный.Поставщики;

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

ИмяПредопределенного = Ссылка.Предопределенный; // булево

Имя = Ссылка.ИмяПредопределенныхДанных; // строка с именем

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

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

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

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

Объект = Ссылка.ПолучитьОбъект();

Объект.ИмяПредопределенныхДанных = "ОсновнойСклад";

Объект.ОбменДанными.Загрузка = Истина;

Объект.Записать();

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

Режим обновления предопределенных данных

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

РежимЧто делает платформаКогда применять
АвтоСоздает и обновляет предопределенные элементы автоматически при обновлении конфигурации БДСтандартный выбор для большинства объектов
Не обновлять автоматическиЭлементы создаются, но изменения реквизитов из конфигуратора в базу не переносятсяКогда пользователи могут менять данные элемента и эти изменения нужно сохранять
Авто и обновление данныхПри обновлении перезаписывает данные элемента значениями из конфигуратораКогда эталонные значения задаются разработчиком и не должны меняться

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

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

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

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

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

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

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

Элемент отображается, открывается, не удаляется

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

Элемента нет или есть дубликат с тем же наименованием

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

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

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

Ошибка «Поле объекта не обнаружено»

Свойство элемента
Норма

Ссылка.Предопределенный = Истина

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

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

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

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

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

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

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

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

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

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

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

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

Гарантированное существование, обращение по имени, защита от удаления. Требует изменения конфигурации

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

Не требует доработки конфигурации, но ломается при переименовании и дает дубли

Хранение ссылки в константе

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

FAQ

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

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

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

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

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

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

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

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

Что делать, если обращение Справочники.Имя.ИмяЭлемента выдает ошибку?

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

Унаследуются ли предопределенные элементы при обмене данными между базами?

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

Итог

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

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