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

12.10.20

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

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

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

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

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

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

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

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

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

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4583    dsdred    53    

73

Как готовить и есть массивы

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

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

24.01.2024    5303    YA_418728146    25    

63

Планы обмена VS История данных

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6429    dsdred    36    

112

1С-ная магия

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18494    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12102    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8845    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6284    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    16003    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 1475 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 236 12.10.20 09:23 Сейчас в теме
&НаСервере
Функция ПолучитьИмяПеречисления(ПеречислениеСсылка)  	
	Возврат xmlСтрока(ПеречислениеСсылка);
КонецФункции
Punisher_1C; miphtemp; ax-it; Istur; Evgeniy_V; 7268981@gmail.com; Golovanoff; Divedition; GeterX; user798852; ИТпроект; vik77; bykov.vsl; el_nov; inspam; evgenorvin; АннаШ; promagent; rise; magiceagle; Sintson; DrAku1a; stas_ganiev; triviumfan; +24 Ответить
7. Evg-Lylyk 4580 12.10.20 09:28 Сейчас в теме
Преобразование ссылки предопределенного в т.ч. перечисления можно сделать через XMLСтрока
Прикрепленные файлы:
Qupkbe; MikhailDr; magiceagle; stas_ganiev; triviumfan; +5 Ответить
10. SlavaKron 12.10.20 11:36 Сейчас в теме
На практике использование отдельной функции для перевода – слишком жирно для такой задачи. Оптимальнее кэшировать переводы перечислений в соответствие: ИмяЗначения - Ссылка, которое в свою очередь можно поместить в соответствие ИмяПеречисления - Соответствие "ленивым" заполнением.
cleaner_it; Азбука Морзе; +2 Ответить
11. Азбука Морзе 104 12.10.20 11:47 Сейчас в теме
(10) Это самый правильный подход со всех точек зрения.
12. FatPanzer 12.10.20 12:01 Сейчас в теме
(10) Для того, чтобы продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное что-то закэшировать, надо сначала это определить ;-)
В остальном - не спорю.
14. K_A_O 538 12.10.20 13:07 Сейчас в теме
А еще есть ПолучитьПолноеИмяПредопределенногоЗначения()
user798852; Chip2003; BarsukM; Valador; magiceagle; DrAku1a; triviumfan; dhurricane; +8 Ответить
15. triviumfan 93 12.10.20 21:04 Сейчас в теме
Надеюсь автор многое подчеркнул из комментариев, иногда они полезнее, чем сама статья :)
semagin@gmail.com; imozg; magiceagle; DrAku1a; JohnyDeath; +5 Ответить
16. savelievD 71 13.10.20 14:06 Сейчас в теме
Использование "ПредопределенноеЗначение" мне кажется приоритетней, чем своей серверной функции. Ведь платформа кеширует значение при первом обращении и теоретически можно избежать лишних серверных вызовов. Кеш будет считаться не актуальным только после обновлении конфигурации.
Но врать не буду, сам не проверял кешируется ли значение на клиенте, или на сервере)
Оставьте свое сообщение