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