AronMav
2/14/2019 - 6:33 PM

Поиск объектов по любым реквизитам(БСП)

Поиск объектов по любым реквизитам(БСП)

Функция позволяет найти ссылку на объект любого типа в конфигурации ERP2.0 (либо любой другой построенной на БСП). Поиск может выполняться по реквизитам основной таблицы, значениям дополнительных реквизитов по табличной части «Дополнительные реквизиты», значениям доп. сведений (регистр сведений «ДополнительныеСведения»).

Используется объектная модель работы с запросом (СхемаЗапроса). Поддерживается в версиях платформы: 8.3.5 и выше. Параметры:

Имя параметра Тип Описание ИмяТаблицы Строка Имя таблицы, по которой осуществляется поиск. Пример: «Справочник.Номенклатура» СтруктураРеквизитов Структура В качестве ключа передается имя реквизита основной таблицы, в качестве значения — значение реквизита СоответствиеДопРеквизитов Соответствие В качестве ключа передается ссылка на доп. реквизит — элемент плана вида характеристик «ДополнительныеРеквизитыИСведения», в качестве значения — значение реквизита СоответствиеДопСведений Соответствие В качестве ключа передается ссылка на доп. сведение — элемент плана вида характеристик «ДополнительныеРеквизитыИСведения», в качестве значения — значение доп. сведения

Имя параметраТипОписание
ИмяТаблицыСтрокаИмя таблицы, по которой осуществляется поиск. Пример: «Справочник.Номенклатура»
СтруктураРеквизитовСтруктураВ качестве ключа передается имя реквизита основной таблицы, в качестве значения — значение реквизита
СоответствиеДопРеквизитовСоответствиеВ качестве ключа передается ссылка на доп. реквизит — элемент плана вида характеристик «ДополнительныеРеквизитыИСведения», в качестве значения — значение реквизита
СоответствиеДопСведенийСоответствиеВ качестве ключа передается ссылка на доп. сведение — элемент плана вида характеристик «ДополнительныеРеквизитыИСведения», в качестве значения — значение доп. сведения
Функция СсылкаНаОбъектПоРеквизитам(ИмяТаблицы, СтруктураРеквизитов = Неопределено, СоответствиеДопРеквизитов = Неопределено, СоответствиеДопСведений = Неопределено)
 
    ИмяТаблицыВЗапросе = СтрЗаменить(ИмяТаблицы, ".", "");
 
    СхемаЗапроса = Новый СхемаЗапроса;
 
    ЗапросПакета    = СхемаЗапроса.ПакетЗапросов[0];
    ОператорВыбора    = ЗапросПакета.Операторы[0];
 
    Если СтруктураРеквизитов <> Неопределено Тогда
 
        ИсточникСправочник    = ОператорВыбора.Источники.Добавить(ИмяТаблицы, ИмяТаблицыВЗапросе);
 
        ОператорВыбора.ВыбираемыеПоля.Добавить(ИмяТаблицыВЗапросе + ".Ссылка");
 
        Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
            ОператорВыбора.Отбор.Добавить(ИмяТаблицыВЗапросе + "." + КлючИЗначение.Ключ + " = &" + КлючИЗначение.Ключ);
        КонецЦикла;
 
        Если СоответствиеДопРеквизитов <> Неопределено
            ИЛИ СоответствиеДопСведений <> Неопределено Тогда
 
            ЗапросПакета.ТаблицаДляПомещения = "ОсновнаяТаблица";
 
            ЗапросПакета    = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
            ОператорВыбора    = ЗапросПакета.Операторы[0];
 
        КонецЕсли;
 
    КонецЕсли;
 
    Если СоответствиеДопРеквизитов <> Неопределено Тогда
 
        Для Сч = 0 По СоответствиеДопРеквизитов.Количество()-1 Цикл
 
            ИсточникСправочник    = ОператорВыбора.Источники.Добавить(ИмяТаблицы + ".ДополнительныеРеквизиты", ИмяТаблицыВЗапросе + "ДополнительныеРеквизиты");
 
            ОператорВыбора.ВыбираемыеПоля.Добавить(ИмяТаблицыВЗапросе + "ДополнительныеРеквизиты.Ссылка");
 
            ОператорВыбора.Отбор.Добавить(ИмяТаблицыВЗапросе + "ДополнительныеРеквизиты.Свойство = &Свойство" + Формат(Сч+1, "ЧГ=0"));
            ОператорВыбора.Отбор.Добавить(ИмяТаблицыВЗапросе + "ДополнительныеРеквизиты.Значение = &Значение" + Формат(Сч+1, "ЧГ=0"));
 
            Если СтруктураРеквизитов <> Неопределено Тогда
 
                ИсточникОсновнаяТаблица = ОператорВыбора.Источники.Добавить("ОсновнаяТаблица", "ОсновнаяТаблица");
 
                Соединение = ИсточникОсновнаяТаблица.Соединения.Добавить(ИсточникСправочник);
                ИсточникОсновнаяТаблица.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
 
            КонецЕсли;
 
            Если СоответствиеДопРеквизитов.Количество()> 1
                ИЛИ СоответствиеДопСведений <> Неопределено Тогда
 
                ЗапросПакета.ТаблицаДляПомещения = "ДопРеквизит" + Формат(Сч+1, "ЧГ=0");
 
                ЗапросПакета    = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
                ОператорВыбора    = ЗапросПакета.Операторы[0];
 
            КонецЕсли;
 
        КонецЦикла;
 
    КонецЕсли;
 
    Если СоответствиеДопСведений <> Неопределено Тогда
 
        Для Сч = 0 По СоответствиеДопСведений.Количество()-1 Цикл
 
            ИсточникРегистр    = ОператорВыбора.Источники.Добавить("РегистрСведений.ДополнительныеСведения", "ДополнительныеСведения");
 
            ОператорВыбора.ВыбираемыеПоля.Добавить("ДополнительныеСведения.Объект");
            ЗапросПакета.Колонки[0].Псевдоним = "Ссылка";
 
            ОператорВыбора.Отбор.Добавить("ДополнительныеСведения.Свойство = &Сведение" + Формат(Сч+1, "ЧГ=0"));
            ОператорВыбора.Отбор.Добавить("ДополнительныеСведения.Значение = &ЗначениеСведения" + Формат(Сч+1, "ЧГ=0"));
 
            Если СтруктураРеквизитов <> Неопределено Тогда
 
                ИсточникОсновнаяТаблица = ОператорВыбора.Источники.Добавить("ОсновнаяТаблица", "ОсновнаяТаблица");
 
                Соединение = ИсточникОсновнаяТаблица.Соединения.Добавить(ИсточникРегистр, "ОсновнаяТаблица.Ссылка = ДополнительныеСведения.Объект");
                ИсточникОсновнаяТаблица.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
 
            КонецЕсли;
 
            Если СоответствиеДопСведений.Количество()> 1
                ИЛИ СоответствиеДопРеквизитов <> Неопределено Тогда
 
                ЗапросПакета.ТаблицаДляПомещения = "ДопСведение" + Формат(Сч+1, "ЧГ=0");
 
                ЗапросПакета    = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
                ОператорВыбора    = ЗапросПакета.Операторы[0];
 
            КонецЕсли;
 
        КонецЦикла;
 
    КонецЕсли;
 
    Если СоответствиеДопРеквизитов <> Неопределено
        И (СоответствиеДопРеквизитов.Количество() <> 1 ИЛИ СоответствиеДопСведений <> Неопределено) Тогда
 
        ИсточникВТ1 = ОператорВыбора.Источники.Добавить("ДопРеквизит1", "ДопРеквизит1");
 
        ОператорВыбора.ВыбираемыеПоля.Добавить("ДопРеквизит1.Ссылка");
 
        Для Сч = 1 По СоответствиеДопРеквизитов.Количество()-1 Цикл
 
            СчСтрока = Формат(Сч+1, "ЧГ=0");
 
            ИсточникВТ = ОператорВыбора.Источники.Добавить("ДопРеквизит" + СчСтрока, "ДопРеквизит" + СчСтрока);
            Соединение = ИсточникВТ1.Соединения.Добавить(ИсточникВТ, "ДопРеквизит1.Ссылка = ДопРеквизит" + СчСтрока + ".Ссылка");
            ИсточникВТ1.Соединения[ИсточникВТ1.Соединения.Количество()-1].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
 
        КонецЦикла;
 
    КонецЕсли;
 
    Если СоответствиеДопСведений <> Неопределено
        И (СоответствиеДопСведений.Количество()> 1 ИЛИ СоответствиеДопРеквизитов <> Неопределено) Тогда
 
        Если СоответствиеДопРеквизитов = Неопределено Тогда
 
            ИсточникВТ1 = ОператорВыбора.Источники.Добавить("ДопСведение1", "ДопСведение1");
 
            ОператорВыбора.ВыбираемыеПоля.Добавить("ДопСведение1.Ссылка");
 
            СтартовыйИндекс        = 1;
            ИмяПервойТаблицы    = "ДопСведение1";
 
        Иначе
 
            СтартовыйИндекс        = 0;
            ИмяПервойТаблицы    = "ДопРеквизит1";
 
        КонецЕсли;
 
        Для Сч = СтартовыйИндекс По СоответствиеДопСведений.Количество()-1 Цикл
 
            СчСтрока = Формат(Сч+1, "ЧГ=0");
 
            ИсточникВТ = ОператорВыбора.Источники.Добавить("ДопСведение" + СчСтрока, "ДопСведение" + СчСтрока);
            Соединение = ИсточникВТ1.Соединения.Добавить(ИсточникВТ, ИмяПервойТаблицы + ".Ссылка = ДопСведение" + СчСтрока + ".Ссылка");
            ИсточникВТ1.Соединения[ИсточникВТ1.Соединения.Количество()-1].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
 
        КонецЦикла;
 
    КонецЕсли;
 
    Запрос = Новый Запрос;
 
    Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
 
    Если СтруктураРеквизитов <> Неопределено Тогда
 
        Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
            Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
        КонецЦикла;
 
    КонецЕсли;
 
    Если СоответствиеДопРеквизитов <> Неопределено Тогда
 
        Сч = 1;
 
        Для Каждого КлючИЗначение Из СоответствиеДопРеквизитов Цикл
 
            СчСтрока = Формат(Сч, "ЧГ=0");
 
            Запрос.УстановитьПараметр("Свойство" + СчСтрока, КлючИЗначение.Ключ);
            Запрос.УстановитьПараметр("Значение" + СчСтрока, КлючИЗначение.Значение);
 
            Сч = Сч + 1;
 
        КонецЦикла;
 
    КонецЕсли;
 
    Если СоответствиеДопСведений <> Неопределено Тогда
 
        Сч = 1;
 
        Для Каждого КлючИЗначение Из СоответствиеДопСведений Цикл
 
            СчСтрока = Формат(Сч, "ЧГ=0");
 
            Запрос.УстановитьПараметр("Сведение" + СчСтрока, КлючИЗначение.Ключ);
            Запрос.УстановитьПараметр("ЗначениеСведения" + СчСтрока, КлючИЗначение.Значение);
 
            Сч = Сч + 1;
 
        КонецЦикла;
 
    КонецЕсли;
 
    РезультатЗапроса = Запрос.Выполнить();
 
    Если РезультатЗапроса.Пустой() Тогда
        Возврат Неопределено;
    КонецЕсли;
 
    Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий();
 
    Возврат Выборка.Ссылка;
 
КонецФункции