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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

СсылкаНаСклад = Справочники.Склады.ОсновнойСклад;

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

Второй способ — метод ПредопределенноеЗначение, который принимает строковое имя и подходит, когда имя элемента вычисляется динамически:

ИмяЭлемента = "Склады.ОсновнойСклад";

СсылкаНаСклад = ПредопределенноеЗначение(ИмяЭлемента);

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

Заметьте разницу в формате строки: для ПредопределенноеЗначение используется полный путь вида «Справочник.ИмяСправочника.ИмяЭлемента». Частая ошибка — передать туда только имя элемента без указания объекта метаданных. В этом случае метод вернет неопределенное поведение или ошибку в зависимости от контекста.

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

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

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

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

Использование предопределенного элемента как значения по умолчанию

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

В коде это выглядит так:

ДокументОбъект.Валюта = Константы.ОсновнаяВалюта.Получить();

Если ДокументОбъект.Валюта.Пустая() Тогда

ДокументОбъект.Валюта = Справочники.Валюты.Рубль;

КонецЕсли;

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

Типичные ошибки и их диагностика

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

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

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

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

Проверка результата

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

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

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

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

Присутствует, помечен пиктограммой предопределенного

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

Отсутствует или есть два похожих элемента

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

Возвращается заполненная ссылка на нужную запись

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

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

Ссылки в документах
Норма

Документы ссылаются на предопределенный элемент

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

Часть документов указывает на дубликат

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

Итог

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

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

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

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

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

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

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

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

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

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

Напрямую по имени — нет. Передайте ссылку через параметр: сначала получите ее кодом (Справочники.Имя.Элемент), затем установите параметр запроса и используйте параметр в условии отбора. Это стандартная и рекомендуемая практика.

Удалится ли предопределенный элемент, если пользователь пометит его на удаление?

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

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

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