Получение Имени метаданных Перечисления по значению и поиск значения по Имени

12.10.20

Разработка - Механизмы платформы 1С

Простой алгоритм, позволяющий найти значение элемента Перечисления по Имени, а также совершить обратное преобразование.

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

Получить Имя элемента Перечисления по Ссылке можно следующим образом:

&НаСервере
Функция ПолучитьИмяПеречисления(Знач ПеречислениеСсылка)  	
	ИмяМетаданных = ПеречислениеСсылка.Метаданные().Имя;
	НазваниеМенеджера = "ПеречислениеМенеджер." + ИмяМетаданных;    
	Менеджер = Новый (НазваниеМенеджера); 
	Имя = ПеречислениеСсылка.Метаданные().ЗначенияПеречисления[Менеджер.Индекс(ПеречислениеСсылка)].Имя;
	Возврат Имя;  
КонецФункции

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

Получить Ссылку на элемент Перечисления по Имени можно так:

&НаСервере
Функция ПолучитьПеречислениеПоИмени(Знач Наименование, Знач Тип)  
	Если Тип <> "" Тогда	
		ПеречислениеСсылка = Неопределено;
		СтрокаВыполнить = "ПеречислениеСсылка = Перечисления." + Тип + "." + Наименование; 		 
		Попытка  		
			Выполнить СтрокаВыполнить; 		
		Исключение
		    Сообщить(ОписаниеОшибки());
		КонецПопытки; 		
	Иначе 
		ПеречислениеСсылка = Неопределено;	
	КонецЕсли;
	Возврат ПеречислениеСсылка;  	
КонецФункции

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

Перечисления

См. также

Механизмы платформы 1С Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    6968    bayselonarrend    126    

61

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    9611    dsdred    62    

111

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

23.06.2024    13934    bayselonarrend    21    

164

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    8412    dsdred    18    

82

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    30427    YA_418728146    33    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dhurricane 12.10.20 07:21 Сейчас в теме
Зачем используется метод "Выполнить"? Все заметно проще:
// 1 способ
ПеречислениеСсылка = Перечисления[Тип][Наименование];

// 2 способ
ПолноеИмяПеречисления = СтрШаблон("Перечисление.%1.%2", Тип, Наименование);
ПеречислниеСсылка = ПредопределенноеЗначение("ПолноеИмяПеречисления );
sacred_a; DrAku1a; stas_ganiev; Артано; suepifanov; +5 Ответить
3. FatPanzer 12.10.20 07:43 Сейчас в теме
Эти способы тоже предполагают "оборачивание" в попытку, что не является нормальным.
4. Xershi 1540 12.10.20 08:10 Сейчас в теме
(3) способ 2 не требует попытки, вернет пустую ссылку, если тип известен, с пустым типом не тестировал.
5. FatPanzer 12.10.20 08:12 Сейчас в теме
(4) Если такого типа перечисления нет - скорее всего будет ошибка. Потому что ПредопределенноеЗначение() не умеет возвращать Неопределено, оно умеет возвращать только ссылку...
8. dhurricane 12.10.20 11:05 Сейчас в теме
(3) Если Вы про приведенные мной, то почему же "предполагают"? Хотите заворачивайте, хотите - нет. Первый способ Вы сами же используете в своем примере. Второй действительно потребует оборачивание, если необходимо вернуть пустую ссылку вместо исключения. Зато работает на клиенте. В общем, можно выбрать по вкусу.
9. FatPanzer 12.10.20 11:09 Сейчас в теме
(8) Первый способ я использую только тогда, когда удостоверился в существовании такой ссылки (проанализировав метаданные), и поэтому не требуется никакой попытки - я проверил и существование типа перечисления и существование значения перечисления. Если не проверять - то можно нарваться на ошибку. Соответственно: если не проверять метаданные, то необходимо оборачивать в попытку.
Второй способ необходимо оборачивать на тот случай, если в системе вообще не существует такого типа перечисления, ибо тогда тоже вывалится ошибка. Значит, надо оборачивать.
13. dhurricane 12.10.20 12:11 Сейчас в теме
(9)
Первый способ я использую только тогда, когда удостоверился в существовании такой ссылки (проанализировав метаданные), и поэтому не требуется никакой попытки
Так ведь я же не целиком код функции привел. :-) Моя претензия заключалась в необходимости использования метода "Выполнить". Альтернативу ей я и представил. "Обвязка" здесь подразумевалась любая, по желанию разработчика.

Что же касается таки попытки, то все зависит от задачи же. На мой вкус ситуация, когда нужно вернуть пустую ссылку встречается заметно реже, нежели когда должно быть выброшено исключение. Поэтому про попытку вообще ничего не пишу.
17. sacred_a 13.09.23 13:40 Сейчас в теме
(1)
ПолноеИмяПеречисления = СтрШаблон("Перечисление.%1.%2", Тип, Наименование);
ПеречислниеСсылка = ПредопределенноеЗначение("ПолноеИмяПеречисления );


Спасибо, работает, только там ПредопределенноеЗначение(ПолноеИмяПеречисления);
2. FatPanzer 12.10.20 07:39 Сейчас в теме
За использование попытки вместо нормального поиска по коллекции метаданных надо организовывать персональный ад.
Простой алгоритм - не равно - правильный алгоритм.

&НаСервере
Функция ПолучитьПеречислениеПоИмени(Знач ТипПеречисления, Знач ИмяПеречисления)
	
	Перем Результат;
	
	МетаданныеПеречисления = Метаданные.Перечисления.Найти(ТипПеречисления);
	Если МетаданныеПеречисления <> Неопределено Тогда
		МетаданныеЗначенияПеречисления = МетаданныеПеречисления.ЗначенияПеречисления.Найти(ИмяПеречисления);
		Если МетаданныеЗначенияПеречисления <> Неопределено Тогда
			Результат = Перечисления[ТипПеречисления][ИмяПеречисления];
		Иначе
			Результат = Перечисления[ТипПеречисления].ПустаяСсылка();
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
Показать
cleaner_it; DimDiemon; i_lo; stas_ganiev; dabu-dabu; nayd; Артано; +7 Ответить
6. noprogrammer 239 12.10.20 09:23 Сейчас в теме
&НаСервере
Функция ПолучитьИмяПеречисления(ПеречислениеСсылка)  	
	Возврат xmlСтрока(ПеречислениеСсылка);
КонецФункции
nvpwasp; mikki_1C; nexor; Punisher_1C; miphtemp; ax-it; Istur; Evgeniy_V; 7268981@gmail.com; Golovanoff; Divedition; GeterX; green_forest_polli; ИТпроект; vik77; bykov.vsl; el_nov; inspam; evgenorvin; АннаШ; promagent; rise; magiceagle; Sintson; DrAku1a; stas_ganiev; triviumfan; +27 Ответить
7. Evg-Lylyk 4979 12.10.20 09:28 Сейчас в теме
Преобразование ссылки предопределенного в т.ч. перечисления можно сделать через XMLСтрока
Прикрепленные файлы:
Qupkbe; MikhailDr; magiceagle; stas_ganiev; triviumfan; +5 Ответить
10. SlavaKron 12.10.20 11:36 Сейчас в теме
На практике использование отдельной функции для перевода – слишком жирно для такой задачи. Оптимальнее кэшировать переводы перечислений в соответствие: ИмяЗначения - Ссылка, которое в свою очередь можно поместить в соответствие ИмяПеречисления - Соответствие "ленивым" заполнением.
cleaner_it; Азбука Морзе; +2 Ответить
11. Азбука Морзе 108 12.10.20 11:47 Сейчас в теме
(10) Это самый правильный подход со всех точек зрения.
12. FatPanzer 12.10.20 12:01 Сейчас в теме
(10) Для того, чтобы продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное что-то закэшировать, надо сначала это определить ;-)
В остальном - не спорю.
14. K_A_O 551 12.10.20 13:07 Сейчас в теме
А еще есть ПолучитьПолноеИмяПредопределенногоЗначения()
user1715233; green_forest_polli; Chip2003; BarsukM; Valador; magiceagle; DrAku1a; triviumfan; dhurricane; +9 Ответить
15. triviumfan 100 12.10.20 21:04 Сейчас в теме
Надеюсь автор многое подчеркнул из комментариев, иногда они полезнее, чем сама статья :)
semagin@gmail.com; imozg; magiceagle; DrAku1a; JohnyDeath; +5 Ответить
16. savelievD 73 13.10.20 14:06 Сейчас в теме
Использование "ПредопределенноеЗначение" мне кажется приоритетней, чем своей серверной функции. Ведь платформа кеширует значение при первом обращении и теоретически можно избежать лишних серверных вызовов. Кеш будет считаться не актуальным только после обновлении конфигурации.
Но врать не буду, сам не проверял кешируется ли значение на клиенте, или на сервере)
Оставьте свое сообщение