Разработка и Конфигурация · 12 мин
Как сделать объект предопределенным в 1С
Как создать предопределенный элемент справочника или ПВХ в конфигураторе 1С, обратиться к нему из кода, исправить ошибки дублей и режим обновления предопределенных данных.
Предопределенный элемент — это элемент справочника, плана видов характеристик, плана счетов или плана видов расчета, который создается разработчиком в конфигураторе и нужен прикладному коду как точка отсчета. Классический пример — валюта «Рубль», склад «Основной» или элемент справочника «Номенклатура», к которому обращаются процедуры проведения документов. Без предопределенного элемента код вынужден искать объект по наименованию, а это ломается при первом же переименовании пользователем.
Сделать объект предопределенным можно двумя способами: через конфигуратор на этапе разработки (основной и правильный путь) и программно — превращением уже существующего элемента базы в предопределенный. Оба сценария разбираются ниже с точными действиями, проверками результата и типичными ошибками.
Материал ориентирован на платформу 1С:Предприятие 8.3 с управляемым приложением. В обычном приложении механика та же, но часть настроек обновления предопределенных данных работает иначе — это отмечено отдельно.
Что такое предопределенный элемент и когда он нужен
Предопределенный элемент отличается от обычного тем, что у него есть имя, заданное в метаданных, и платформа гарантирует его существование в базе. Пользователь видит такой элемент в списке (в типовых конфигурациях он часто помечен пиктограммой), но не может его удалить — при попытке удаления платформа выдаст отказ. Переименовать наименование можно, а вот имя предопределенного элемента остается неизменным.
Использовать предопределенные элементы стоит, когда код конфигурации должен однозначно ссылаться на конкретный объект: валюта учета, вид расчета «Оклад», счет «Поставщики», группа номенклатуры для автоподстановки. Если объект нужен только пользователю и код к нему не обращается — предопределенным его делать не нужно, достаточно обычного элемента.
Создание предопределенного элемента в конфигураторе
Основной сценарий выполняется в конфигураторе и занимает несколько минут. Порядок действий:
- Откройте конфигуратор, загрузите конфигурацию и найдите нужный объект (например, «Справочники» → «Валюты»).
- Откройте форму свойств объекта двойным щелчком и перейдите на закладку «Прочее».
- Нажмите кнопку «Предопределенные». Откроется список предопределенных элементов.
- Нажмите «Добавить», задайте «Имя» (латиницей, без пробелов — это программный идентификатор), «Код», «Наименование» и при необходимости заполните остальные реквизиты.
- Для иерархического справочника проверьте признак «Это группа», если элемент должен быть папкой.
- Сохраните конфигурацию и выполните обновление конфигурации базы данных (F7 → «Обновление конфигурации базы данных»).
- 1Откройте объект метаданных в конфигураторе
- 2Закладка «Прочее» → «Предопределенные»
- 3Добавьте элемент, задайте уникальное имя латиницей
- 4Заполните код, наименование и нужные реквизиты
- 5Обновите конфигурацию базы данных
- 6Проверьте появление элемента в режиме Предприятия
После обновления конфигурации БД платформа создаст элемент в базе автоматически при первом запуске. Если база файловая и монопольный доступ невозможен, обновление потребует завершения сеансов пользователей — учтите это при работе на рабочей базе.
Обращение к предопределенному элементу из кода
Главное преимущество предопределенных элементов — обращение по имени без запросов и поиска. Синтаксис зависит от типа объекта:
ВалютаРуб = Справочники.Валюты.Рубль; // ссылка на предопределенный элемент
ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад;
Счет = ПланыСчетов.Хозрасчетный.Поставщики;
Если нужно проверить, является ли произвольная ссылка предопределенной, или получить имя предопределенного элемента по ссылке, используются методы объекта:
ИмяПредопределенного = Ссылка.Предопределенный; // булево
Имя = Ссылка.ИмяПредопределенныхДанных; // строка с именем
В запросах предопределенность проверяется через поле «Предопределенный», а также доступна виртуальная таблица с именами предопределенных данных. Это удобно, когда нужно отобрать только «системные» элементы и исключить пользовательские.
Как сделать предопределенным уже существующий элемент базы
Частая ситуация: в базе уже есть элемент «Основной склад», созданный пользователем, и теперь разработчик добавил в конфигураторе предопределенный элемент с таким же наименованием. После обновления в базе появится дубликат — предопределенный элемент создастся отдельно, а старый останется обычным.
Чтобы не плодить дубли, есть два подхода. Первый — перед обновлением переименовать или удалить пользовательский элемент, а после обновления перенести ссылки на новый предопределенный с помощью обработки поиска и замены ссылок. Второй — программно «привязать» существующий элемент к предопределенному имени. В платформе 8.3 для этого у объекта есть свойство «ИмяПредопределенныхДанных», которое можно установить:
Объект = Ссылка.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = "ОсновнойСклад";
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
Такой прием работает, но требует осторожности: запись выполняется в обход части проверок, а сам предопределенный элемент с этим именем не должен уже существовать в базе, иначе получите конфликт. Перед изменениями на рабочей базе сделайте резервную копию.
Режим обновления предопределенных данных
У справочников и планов в свойствах есть параметр «Обновление предопределенных данных» с тремя значениями, от которого зависит поведение платформы при обновлении конфигурации:
| Режим | Что делает платформа | Когда применять |
|---|---|---|
| Авто | Создает и обновляет предопределенные элементы автоматически при обновлении конфигурации БД | Стандартный выбор для большинства объектов |
| Не обновлять автоматически | Элементы создаются, но изменения реквизитов из конфигуратора в базу не переносятся | Когда пользователи могут менять данные элемента и эти изменения нужно сохранять |
| Авто и обновление данных | При обновлении перезаписывает данные элемента значениями из конфигуратора | Когда эталонные значения задаются разработчиком и не должны меняться |
Ошибка выбора режима — частая причина «странного» поведения: разработчик меняет реквизит предопределенного элемента в конфигураторе, а в базе ничего не меняется, потому что стоит режим «Не обновлять автоматически». Проверяйте этот параметр в первую очередь, если изменения «не доезжают» до базы.
Работа с предопределенными элементами в пользовательском режиме
В режиме «Предприятие» предопределенные элементы ведут себя как обычные, но с ограничениями. Удалить их нельзя — платформа выдаст сообщение о невозможности удаления. Пометка на удаление также блокируется. Наименование и реквизиты редактировать можно, если это не запрещено правами и настройками объекта.
Если предопределенный элемент не виден в списке, проверьте: включен ли функциональный опционал, скрывающий элемент; не установлено ли ограничение на уровне записей (RLS); не отфильтрован ли список. Также элемент может физически отсутствовать, если обновление конфигурации БД завершилось с ошибками — тогда поможет повторный запуск обновления с монопольным доступом.
Как проверить результат
Элемент отображается, открывается, не удаляется
Элемента нет или есть дубликат с тем же наименованием
Справочники.Имя.ИмяЭлемента возвращает ссылку без исключения
Ошибка «Поле объекта не обнаружено»
Ссылка.Предопределенный = Истина
Ложь — элемент создан пользователем, а не конфигуратором
Типичные ошибки и их устранение
Первая распространенная проблема — дубли предопределенных элементов после обновления. Возникает, когда в базе уже был пользовательский элемент с похожим наименованием, а затем добавили предопределенный. Лечится поиском и заменой ссылок с последующим удалением лишнего элемента.
Вторая ошибка — переименование предопределенного элемента в конфигураторе без учета последствий. Старое имя перестает существовать, и весь код, обращавшийся к нему, начнет падать с исключением. Перед переименованием выполните глобальный поиск по имени элемента во всей конфигурации.
Третья ситуация — «Предопределенный элемент отсутствует в данных» при обращении из кода. Причины: обновление конфигурации БД не выполнялось, элемент удален из предопределенных в конфигураторе, либо обмен данными привел элемент в состояние без привязки. Проверить можно через консоль кода, запросив все предопределенные элементы объекта.
Предопределенные элементы в расширениях конфигурации
В расширении нельзя добавить собственный предопределенный элемент к заимствованному справочнику основной конфигурации — это ограничение платформы. Если требуется «свой» элемент для кода расширения, варианты такие: создать собственный справочник в расширении с предопределенными элементами, хранить ссылку в константе или использовать безопасный поиск по GUID с обработкой отсутствия элемента.
Обращаться к предопределенным элементам основной конфигурации из расширения можно штатно — по имени, если элемент существует в конфигурации-поставщике. Учитывайте, что при обновлении основной конфигурации поставщик может переименовать или удалить элемент, поэтому критичные обращения стоит оборачивать в попытку с понятным сообщением об ошибке.
Сравнение вариантов
Гарантированное существование, обращение по имени, защита от удаления. Требует изменения конфигурации
Не требует доработки конфигурации, но ломается при переименовании и дает дубли
Гибко для пользователя, но ссылку можно очистить, и код должен обрабатывать пустое значение
FAQ
Можно ли удалить предопределенный элемент из базы?
Напрямую — нет, платформа блокирует удаление и пометку на удаление. Чтобы избавиться от элемента, нужно удалить его из списка предопределенных в конфигураторе и обновить конфигурацию БД: после этого элемент станет обычным, и его можно удалить в режиме Предприятия, если на него нет ссылок.
Почему после обновления конфигурации появился дубликат элемента?
Потому что в базе уже существовал пользовательский элемент с похожим наименованием, а предопределенный создался отдельно. Перенесите ссылки со старого элемента на предопределенный через обработку поиска и замены ссылок, затем удалите дубликат.
Как узнать имя предопределенного элемента по ссылке?
Через свойство ссылки «ИмяПредопределенныхДанных» — оно вернет строку с именем, заданным в конфигураторе. У обычных элементов это свойство пустое. В запросах аналогичная информация доступна через соответствующее поле таблицы справочника.
Можно ли создать предопределенный элемент программно, без конфигуратора?
Полноценно — нет: имя предопределенного элемента задается только в метаданных. Программно можно лишь привязать существующий элемент базы к уже объявленному в конфигураторе имени через свойство «ИмяПредопределенныхДанных» объекта.
Что делать, если обращение Справочники.Имя.ИмяЭлемента выдает ошибку?
Проверьте три вещи: существует ли элемент с таким именем в списке предопределенных в конфигураторе, выполнялось ли обновление конфигурации базы данных после его добавления и совпадает ли имя с точностью до символа — обращение чувствительно к написанию.
Унаследуются ли предопределенные элементы при обмене данными между базами?
При обмене через планы обмена предопределенные элементы обычно создаются в узлах автоматически самой платформой при обновлении конфигурации, а не переносятся как данные. Если в правилах обмена предопределенные элементы участвуют явно, убедитесь, что сопоставление идет по имени предопределенных данных, иначе возможны дубли.
Что важно запомнить
Предопределенный элемент создается в конфигураторе через «Прочее» → «Предопределенные» и требует обновления конфигурации БД. Обращение из кода — по имени через менеджер объекта. Следите за режимом обновления предопределенных данных, не переименовывайте элементы без поиска обращений в коде и устраняйте дубли заменой ссылок.