Уведомления
Очистить все

1С Универсальная функция для получения ссылочного значения по наименованию или коду.

1 Записи
1 Пользователи
0 Reactions
8,914 Просмотры
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 7 лет назад
Записи: 176
Создатель темы   [#1352]

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

Вот так вызываем нашу функцию:

ЗначениеПоля = НайтиЗначениеПоля(Метаданные.Справочники.СтруктураПредприятия.ПолноеИмя(), "ТекстПоиска");
ЗначениеПоля = НайтиЗначениеПоля(Метаданные.Справочники.Номенклатура.ПолноеИмя(), "ТекстПоиска");
ЗначениеПоля = НайтиЗначениеПоля(Метаданные.ПланыСчетов.Хозрасчетный.ПолноеИмя(), "ТекстПоиска");

Сама функция выглядит так:

&НаСервере
Функция НайтиЗначениеПоля(ПолноеИмяОбъекта, ТекстЗначения, ДополнительныйОтбор = Неопределено)
	
	ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта);
	
	МассивТекстовЗапроса = Новый Массив;
	Если ОбъектМетаданных.ДлинаНаименования <> 0 Тогда
		МассивТекстовЗапроса.Добавить(
		"ВЫБРАТЬ
		|	1 КАК Приоритет,
		|	Таблица.Ссылка
		|ИЗ
		|	&amp;ПолноеИмяОбъекта КАК Таблица
		|ГДЕ
		|	Таблица.Наименование = &amp;ТекстЗначения
		|	И &amp;ДополнительныйОтбор
		|");
	КонецЕсли;
	Если ОбъектМетаданных.ДлинаКода <> 0 Тогда
		МассивТекстовЗапроса.Добавить(
		"ВЫБРАТЬ
		|	2 КАК Приоритет,
		|	Таблица.Ссылка
		|ИЗ
		|	&amp;ПолноеИмяОбъекта КАК Таблица
		|ГДЕ
		|	Таблица.Код = &amp;ТекстЗначения
		|	И &amp;ДополнительныйОтбор
		|");
	КонецЕсли;
	
	ТекстЗапроса = 
	СтрСоединить(МассивТекстовЗапроса, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении())
	+ Символы.ПС
	+ "УПОРЯДОЧИТЬ ПО Приоритет";
	
	
	Запрос = Новый Запрос;
	Если ДополнительныйОтбор <> Неопределено Тогда
		МассивДополнительныйОтбор = Новый Массив;
		Для Каждого КлючИЗначение Из ДополнительныйОтбор Цикл
			МассивДополнительныйОтбор.Добавить(СтрШаблон("Таблица.%1 = &amp;%1", КлючИЗначение.Ключ));
			Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
		КонецЦикла;
		ТекстДополнительныйОтбор = СтрСоединить(МассивДополнительныйОтбор, Символы.ПС + "И" + " ");
	Иначе
		ТекстДополнительныйОтбор = "ИСТИНА";
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&amp;ПолноеИмяОбъекта", ПолноеИмяОбъекта);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&amp;ДополнительныйОтбор", ТекстДополнительныйОтбор);
	
	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр("ТекстЗначения", ТекстЗначения);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	КонецЕсли;
	
	Возврат ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмяОбъекта).ПустаяСсылка();
	
КонецФункции


   
Цитата
Поделиться: