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