gifts2017

Универсальный поиск значений по метаданным

Опубликовал Евгений 111 (xronos) в раздел Программирование - Практика программирования

Из-за разбиения  команд на выполнение НаКлиенте и НаСервере часто возникает необходимость поиска значения в справочнике/регистре или документе, а писать запрос для каждого случая не всегда удобно и приводит к избыточности кода.

//Параметры :

//ТаблицаВыборки (тип Строка) - имя таблицы на языке запросов в которой будут искаться данные

//РеквизитПоиска (тип Строка) - имя реквизита помещаемого в условие

// ЗначенияРеквизитПоиска (тип соответствует типу РеквизитаПоиска) - значение для условия

// ДопРеквизит - дополнительное условие

// ЗначениеДопРеквизита -значение доп условия

// РеквизитРезультата - указывать если необходимо получить поле с именем отличное от Ссылка



&НаСервере
Функция ПоискЗначения(ТаблицаВыборки,РеквизитПоиска,ЗначенияРеквизитПоиска,ДопРеквизит = Неопределено,ЗначениеДопРеквизита = Неопределено,РеквизитРезультата = Неопределено ) Экспорт
Запрос = Новый Запрос;


Если
РеквизитРезультата = Неопределено Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица.Ссылка как Ссылка
|ИЗ
| "
+ТаблицаВыборки +" КАК Таблица
|ГДЕ
| Таблица."
+РеквизитПоиска+" = &ЗначенияДляПоиска";
Колонка = "Ссылка";
Иначе
ТекстЗапроса =
"ВЫБРАТЬ
| Таблица."
+РеквизитРезультата+" как "+РеквизитРезультата+"
|ИЗ
| "
+ТаблицаВыборки +" КАК Таблица
|ГДЕ
| Таблица."
+РеквизитПоиска+" = &ЗначенияДляПоиска";
Колонка = РеквизитПоиска;
КонецЕсли;


Если (
ДопРеквизит <> Неопределено) и (ЗначениеДопРеквизита <> Неопределено) Тогда
ТекстЗапроса = ТекстЗапроса +" И
|Таблица."
+ДопРеквизит+" = &ЗначениеДопРеквизита";


Запрос.УстановитьПараметр("ЗначениеДопРеквизита",ЗначениеДопРеквизита);
КонецЕсли;

Запрос.УстановитьПараметр("ЗначенияДляПоиска", ЗначенияДляПоиска);
Запрос.Текст = ТекстЗапроса;
Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если
ВыборкаДетальныеЗаписи.Количество() = 1 Тогда
Если
ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат
ВыборкаДетальныеЗаписи[0]
КонецЕсли;
ИначеЕсли
ВыборкаДетальныеЗаписи.Количество() > 1 Тогда
Возврат
Результат.Выгрузить(ОбходРезультатаЗапроса.Прямой).ВыгрузитьКолонку(Колонка);

Иначе
Возврат Неопределено

КонецЕсли;

КонецФункции

 

Разместил в общем модуле, применяю для поиска значений в регистрах/справочниках/документах.

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Алексей Константинов (alexk-is) 18.06.10 15:02
(0) Код модуля в статье можно и получше раскрасить
Evg-Lylyk; +1 Ответить
2. Александр Плюшкин (php5) 18.06.10 15:23
А чем не нравится функция ПредопределенноеЗначение() ?
Reaper_1C; +1 Ответить
3. Сергей Ожерельев (Поручик) 19.06.10 11:16
В русском языке нет слова Реквезит.
4. Евгений 111 (xronos) 21.06.10 13:37
(3) ПредопределенноеЗначение() можно использовать если есть предопределеные значения. Для Перечислений/Констант лучше использовать конечно ПредопределенноеЗначение.
5. Александр Астафьев (alexandr_astafiev) 31.07.10 14:07
косячок вроде мелкий , в запросе используется переменная - ЗначенияДляПоиска а в параметрах функции это называется - ЗначенияРеквизитПоиска или я ошибся?
6. Евгений (Djonny) 11.11.11 15:22