Работа с предопределенными элементами в 1С:Предприятие — одна из самых частых задач при разработке и доработке конфигураций. Эти элементы (справочники, документы, планы видов характеристик) заранее заданы в системе и имеют уникальные идентификаторы, но их имена не всегда очевидны для программиста. Например, вам может понадобиться получить название предопределенной валюты "Рубль" или статуса документа "Проведен".
В этой статье мы разберем все актуальные способы получения имен предопределенных элементов, включая малоизвестные приемы для типовых и нетиповых конфигураций. Вы узнаете, как избежать ошибок при работе с метаданными, почему иногда возвращается пустая строка вместо имени, и как оптимизировать код для частых обращений к предопределенным значениям.
Что такое предопределенные элементы в 1С и зачем нужно их имя
Предопределенные элементы — это объекты метаданных, которые создаются автоматически при добавлении новой конфигурации или обновлении. Они имеют фиксированные UID (уникальные идентификаторы) и часто используются для:
- 🔹 Стандартных справочников (валюты, единицы измерения, страны мира)
- 🔹 Статусов документов ("Проведен", "Не проведен", "Удален")
- 🔹 Типовых ролей (например, "Полные права" в пользователях)
- 🔹 Системных констант (организация по умолчанию, основной склад)
Имя предопределенного элемента может понадобиться для:
- 📋 Отображения пользователю в отчетах или печатных формах
- 🔍 Поиска и фильтрации данных в запросах
- 🛠️ Отладки и логирования (чтобы понять, какой именно элемент используется)
- 🔄 Миграции данных между базами (сопоставление по именам)
Важно понимать, что имя и синоним предопределенного элемента — это разные вещи. Имя используется в коде (например, "Рубль" для валюты), а синоним — для отображения пользователю (например, "Российский рубль"). В этой статье речь пойдет именно о получении имени.
Способ 1: Получение имени через метод ПолноеИмя()
Самый простой и универсальный способ — использование метода ПолноеИмя(), который доступен для большинства объектов метаданных. Этот метод возвращает полный путь к элементу, включая имя конфигурации и имя самого элемента.
Пример кода для получения имени предопределенной валюты "Рубль":
СсылкаНаВалюту = Справочники.Валюты.Рубль;
ИмяЭлемента = СсылкаНаВалюту.ПолноеИмя();
// Вернет строку вида: "Справочник.Валюты.Рубль"
Чтобы выделить только имя элемента (без пути к справочнику), можно использовать функцию СтрЗаменить():
ИмяБезПути = СтрЗаменить(ИмяЭлемента, "Справочник.Валюты.", "");
Этот метод работает для:
- 📄 Справочников (
Справочник.Имя.Элемент) - 📑 Документов (
Документ.Имя.Статус) - 📊 Планов видов характеристик (
ПланВидовХарактеристик.Имя.Значение) - 🔧 Констант (
Константа.Имя)
⚠️ Внимание: МетодПолноеИмя()может вернуть пустую строку, если предопределенный элемент был удален из конфигурации, но ссылки на него остались в коде. В этом случае проверяйте существование элемента черезСправочники.Имя.НайтиПоНаименованию().
Если вам нужно получить имя предопределенного элемента в отчете или печатной форме, используйте функцию Строка(Ссылка.ПолноеИмя()) — это избавит от ошибок при выводе в табличные документы.
Способ 2: Использование запроса для получения имен
Если вам нужно получить имена нескольких предопределенных элементов сразу (например, всех валют или статусов документов), удобнее использовать запрос. Этот метод особенно полезен при работе с большими справочниками или когда требуется дополнительная фильтрация.
Пример запроса для получения имен всех предопределенных валют:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Справочник.Валюты.Ссылка КАК Ссылка,
| Справочник.Валюты.Наименование КАК Имя
|ИЗ
| Справочник.Валюты КАК Справочник.Валюты
|ГДЕ
| Справочник.Валюты.ЭтоГруппа = ЛОЖЬ
| И Справочник.Валюты.Предопределенный = ИСТИНА";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Имя); // Выведет: Рубль, Доллар США и т.д.
КонецЦикла;
Преимущества этого способа:
- 🔍 Можно получить имена сразу для группы элементов
- 📊 Легко добавить дополнительные поля (код, пометка удаления и т.д.)
- 🔄 Удобно использовать в циклах и массовых операциях
Недостатки:
- ⚠️ Более медленная работа по сравнению с прямым обращением
- 📉 Требует знания синтаксиса запросов 1С
| Способ | Скорость | Универсальность | Сложность |
|---|---|---|---|
ПолноеИмя() |
⚡ Быстро | ✅ Высокая | 🟢 Низкая |
| Запрос | 🐢 Медленно | ✅ Высокая | 🟡 Средняя |
| Метаданные | ⚡ Быстро | ❌ Низкая | 🔴 Высокая |
Способ 3: Работа с метаданными через Конфигуратор
Для разработчиков, которые имеют доступ к Конфигуратору 1С, есть возможность получить имена предопределенных элементов через встроенные инструменты. Этот способ полезен, когда нужно проанализировать структуру конфигурации или найти элемент по его UID.
Инструкция:
- Откройте конфигурацию в режиме
Конфигуратор. - Перейдите в меню
Операции → Открыть консоль запросов(или нажмитеCtrl+Alt+Q). - Введите запрос для получения метаданных:
ВЫБРАТЬМетаданные.Справочники.Имя КАК ИмяСправочника,
Метаданные.Справочники.ПредопределенныеЭлементы.Имя КАК ИмяЭлемента,
Метаданные.Справочники.ПредопределенныеЭлементы.Идентификатор КАК UID
ИЗ
Метаданные.Справочники КАК Метаданные.Справочники
ГДЕ
Метаданные.Справочники.Имя = "Валюты"
- Нажмите
Выполнитьи проанализируйте результат.
Этот метод позволяет:
- 🔍 Найти элемент по
UID, даже если его имя неизвестно - 📋 Получить полный список предопределенных элементов в справочнике
- 🔧 Проверить, не был ли элемент удален или переименован
⚠️ Внимание: Работа с метаданными через консоль запросов требует прав администратора. В некоторых конфигурациях (например, 1С:ERP или 1С:УТ 11) доступ к метаданным может быть ограничен.
Как найти UID предопределенного элемента без Конфигуратора?
Если у вас нет доступа к Конфигуратору, можно получить UID через встроенный язык. Например, для валюты "Рубль" используйте код:
Ссылка = Справочники.Валюты.Рубль;
Сообщить(Ссылка.УникальныйИдентификатор());
Этот код вернет строку вида {550e8400-e29b-41d4-a716-446655440000}, которую можно использовать для поиска в метаданных.
Способ 4: Прямое обращение через встроенный язык
Для опытных разработчиков самый быстрый способ — прямое обращение к предопределенному элементу через его имя в коде. Этот метод не требует дополнительных функций и работает максимально быстро.
Примеры:
// Для справочника
ИмяВалюты = Справочники.Валюты.Рубль.Наименование;
// Для документа
ИмяСтатуса = Документы.ЗаказПокупателя.Статусы.Проведен;
// Для плана видов характеристик
ИмяХарактеристики = ПланыВидовХарактеристик.ВидыНоменклатуры.Услуга;
Особенности метода:
- ⚡ Максимальная скорость — нет дополнительных вызовов функций
- 📌 Компактный код — идеально для часто используемых элементов
- ⚠️ Опасность ошибок — если элемент переименован, код перестанет работать
Чтобы избежать ошибок при переименовании, используйте конструкцию Попытка...Исключение:
Попытка
ИмяЭлемента = Справочники.Валюты.НесуществующаяВалюта.Наименование;
Исключение
Сообщить("Элемент не найден: " + ОписаниеОшибки());
КонецПопытки;
Проверьте существование элемента в конфигураторе|Убедитесь, что имя не содержит опечаток|Используйте Попытка...Исключение для критических участков|Документируйте используемые предопределенные элементы-->
Способ 5: Получение имени через API (для внешних систем)
Если вы работаете с 1С через REST API, OData или другие внешние интерфейсы, получить имя предопределенного элемента можно с помощью стандартных методов API. Этот способ актуален для интеграций с веб-сервисами или мобильными приложениями.
Пример запроса через OData (для 1С:Предприятие 8.3.20+):
GET /odata/standard.odata/Catalog_Валюты?$filter=IsPredefined eq true&$select=Description
Host: ваш_сервер:порт
Authorization: Basic ваш_токен
Ответ будет содержать массив объектов с полем Description, которое соответствует имени элемента:
{
"value": [
{"Description": "Рубль"},
{"Description": "Доллар США"},
{"Description": "Евро"}
]
}
Особенности работы с API:
- 🌐 Подходит для внешних систем (сайты, мобильные приложения)
- 🔒 Требует настройки прав доступа и аутентификации
- 📡 Может быть медленнее, чем внутренние методы 1С
- 🔧 Поддерживается не во всех версиях платформы (требуется 8.3.15+)
⚠️ Внимание: При работе с API имена предопределенных элементов могут возвращаться на разных языках в зависимости от настроек локализации сервера 1С. Убедитесь, что язык сеанса соответствует ожидаемому.
Типичные ошибки и как их избежать
При работе с предопределенными элементами разработчики часто сталкиваются с типичными ошибками, которые ведут к падению кода или некорректным результатам. Вот самые распространенные из них:
- Обращение к несуществующему элементу
Если предопределенный элемент был удален или переименован, прямое обращение вызовет ошибку. Всегда проверяйте существование:
Если Не ЗначениеЗаполнено(Справочники.Валюты.Рубль) ТогдаСообщить("Элемент не найден!");
КонецЕсли;
- Путаница между именем и синонимом
Имя элемента (например,
"Рубль") и его синоним (например,"Российский рубль") — это разные вещи. Для отображения пользователю используйтеПредставление():ПользовательскоеИмя = Справочники.Валюты.Рубль.Представление(); - Неучет прав доступа
Если у пользователя нет прав на чтение справочника, методы вроде
ПолноеИмя()вернут пустую строку. Проверяйте права через:Если Не ПравоДоступа("Чтение", Метаданные.Справочники.Валюты) ТогдаСообщить("Нет прав на чтение!");
КонецЕсли;
- Кэширование имен
Если вы часто обращаетесь к одному и тому же элементу, кэшируйте его имя, чтобы избежать повторных запросов:
Перем ИмяВалютыРубль;Функция ПолучитьИмяВалютыРубль()
Если Не ЗначениеЗаполнено(ИмяВалютыРубль) Тогда
ИмяВалютыРубль = Справочники.Валюты.Рубль.Наименование;
КонецЕсли;
Возврат ИмяВалютыРубль;
КонецФункции
Еще одна распространенная проблема — разные имена в разных конфигурациях. Например, в 1С:Бухгалтерия предопределенная валюта может называться "Рубль", а в 1С:ERP — "Рубль РФ". Всегда уточняйте имена в конкретной базе!
Перед использованием предопределенных элементов в коде проверьте их существование через Конфигуратор или запрос к метаданным. Это избавит от ошибок при обновлении конфигурации.
FAQ: Частые вопросы по работе с предопределенными элементами
Как получить имя предопределенного элемента, если известен только его UID?
Если у вас есть только UID (например, {550e8400-e29b-41d4-a716-446655440000}), используйте следующий код:
UID = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
Ссылка = Справочники.Валюты.НайтиПоUID(UID);
Если Ссылка.Пустая() Тогда
Сообщить("Элемент не найден!");
Иначе
Сообщить(Ссылка.Наименование);
КонецЕсли;
Этот метод работает для всех типов объектов (справочники, документы, планы видов характеристик).
Почему метод ПолноеИмя() возвращает пустую строку?
Это может происходить по нескольким причинам:
- Элемент был удален из конфигурации, но ссылки на него остались в коде.
- У пользователя нет прав на чтение этого справочника.
- Вы обращаетесь к элементу неверного типа (например, пытаетесь получить имя документа как справочника).
- В конфигурации отключена поддержка предопределенных данных (редко, но встречается в сильно кастомизированных базах).
Для диагностики используйте:
Сообщить(Ссылка.Пустая()); // Проверит, существует ли ссылка
Сообщить(Метаданные.Справочники.Валюты.Предопределенный); // Проверит, включена ли поддержка
Можно ли изменить имя предопределенного элемента?
Технически да, но это не рекомендуется. Изменение имени предопределенного элемента может привести к:
- 🔴 Ошибкам в типовом функционале (если элемент используется в стандартных процедурах)
- 🔴 Проблемам при обновлении конфигурации (конфликты с новой версией)
- 🔴 Потере данных, если элемент используется в регистрах или документах
Если переименование необходимо, сделайте это через Конфигуратор и проверьте все места в коде, где используется старый идентификатор. После изменения обязательно выполните тестирование и создайте резервную копию базы!
Как получить список всех предопределенных элементов в справочнике?
Используйте следующий код для получения полного списка:
Справочник = Метаданные.Справочники.Валюты;
СписокЭлементов = Новый Массив;
Для Каждого Элемент Из Справочник.ПредопределенныеЭлементы Цикл
Ссылка = Справочники.Валюты.НайтиПоНаименованию(Элемент.Имя);
Если Не Ссылка.Пустая() Тогда
СписокЭлементов.Добавить(Ссылка.Наименование);
КонецЕсли;
КонецЦикла;
Для вывода результата:
Для Каждого Имя Из СписокЭлементов Цикл
Сообщить(Имя);
КонецЦикла;
Как работать с предопределенными элементами в управляемых формах?
В управляемых формах (например, в 1С 8.3) для работы с предопределенными элементами используйте серверные методы. Пример для заполнения поля со списком валют:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Справочник.Валюты.Ссылка КАК Ссылка
ИЗ Справочник.Валюты КАК Справочник.Валюты
ГДЕ Справочник.Валюты.Предопределенный = ИСТИНА";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ЭлементСписка = ЭлементыФормы.СписокВалют.Список.Добавить(
Выборка.Ссылка.Наименование,
Выборка.Ссылка
);
КонецЦикла;
КонецПроцедуры
Для клиент-серверного взаимодействия передавайте ссылки на элементы, а не их имена, чтобы избежать проблем с локализацией.