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

12.10.20

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

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

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

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

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

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

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

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

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

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

См. также

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

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

23.06.2024    7443    bayselonarrend    20    

154

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

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

13.03.2024    5942    dsdred    16    

80

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

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

24.01.2024    17663    YA_418728146    26    

71

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

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

11.12.2023    11221    dsdred    44    

130

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

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

06.10.2023    23756    SeiOkami    48    

135

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

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

14.09.2023    18828    human_new    27    

80

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

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

28.08.2023    14729    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 1555 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Строка(ПеречислениеСсылка);
КонецФункции
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; +25 Ответить
7. Evg-Lylyk 4841 12.10.20 09:28 Сейчас в теме
Преобразование ссылки предопределенного в т.ч. перечисления можно сделать через XMLСтрока
Прикрепленные файлы:
Qupkbe; MikhailDr; magiceagle; stas_ganiev; triviumfan; +5 Ответить
10. SlavaKron 12.10.20 11:36 Сейчас в теме
На практике использование отдельной функции для перевода – слишком жирно для такой задачи. Оптимальнее кэшировать переводы перечислений в соответствие: ИмяЗначения - Ссылка, которое в свою очередь можно поместить в соответствие ИмяПеречисления - Соответствие "ленивым" заполнением.
cleaner_it; Азбука Морзе; +2 Ответить
11. Азбука Морзе 106 12.10.20 11:47 Сейчас в теме
(10) Это самый правильный подход со всех точек зрения.
12. FatPanzer 12.10.20 12:01 Сейчас в теме
(10) Для того, чтобы продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное что-то закэшировать, надо сначала это определить ;-)
В остальном - не спорю.
14. K_A_O 539 12.10.20 13:07 Сейчас в теме
А еще есть ПолучитьПолноеИмяПредопределенногоЗначения()
user1715233; green_forest_polli; Chip2003; BarsukM; Valador; magiceagle; DrAku1a; triviumfan; dhurricane; +9 Ответить
15. triviumfan 97 12.10.20 21:04 Сейчас в теме
Надеюсь автор многое подчеркнул из комментариев, иногда они полезнее, чем сама статья :)
semagin@gmail.com; imozg; magiceagle; DrAku1a; JohnyDeath; +5 Ответить
16. savelievD 73 13.10.20 14:06 Сейчас в теме
Использование "ПредопределенноеЗначение" мне кажется приоритетней, чем своей серверной функции. Ведь платформа кеширует значение при первом обращении и теоретически можно избежать лишних серверных вызовов. Кеш будет считаться не актуальным только после обновлении конфигурации.
Но врать не буду, сам не проверял кешируется ли значение на клиенте, или на сервере)
Оставьте свое сообщение