Untitled Diff
144 lines
&НаСервере
&НаСервере
Функция ПолучитьМассивЭлементовПоТипу(ТаблицаПостроитель, Таблица, ТипРеквизита, Колонка)
Функция ПолучитьМассивЭлементовПоТипу(ТаблицаПостроитель, Таблица, ТипРеквизита, Колонка)
нМассив = Новый Массив;
нМассив = Новый Массив;
XMLИмяТипа = XMLТип(ТипРеквизита).ИмяТипа;
Если ТипРеквизита = Тип("Строка") Тогда
Если ТипРеквизита = Тип("Строка") Тогда
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл нМассив.Добавить(СокрЛП(Формат(Элемент, "ЧГ=0"))) КонецЦикла
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл нМассив.Добавить(СокрЛП(Формат(Элемент, "ЧГ=0"))) КонецЦикла
ИначеЕсли ТипРеквизита = Тип("Число") Тогда
ИначеЕсли ТипРеквизита = Тип("Число") Тогда
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл нМассив.Добавить(?(НРег(Элемент) = "да" ИЛИ НРег(Элемент) = "истина" ИЛИ НРег(Элемент) = "включено", 1, ?(НРег(Элемент) = "нет" ИЛИ НРег(Элемент) = "ложь" ИЛИ НРег(Элемент) = "выключено", 0, СтрЗаменить(СокрЛП(Элемент), " ", "")))) КонецЦикла
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл нМассив.Добавить(?(НРег(Элемент) = "да" ИЛИ НРег(Элемент) = "истина" ИЛИ НРег(Элемент) = "включено", 1, ?(НРег(Элемент) = "нет" ИЛИ НРег(Элемент) = "ложь" ИЛИ НРег(Элемент) = "выключено", 0, СтрЗаменить(СокрЛП(Элемент), " ", "")))) КонецЦикла
ИначеЕсли ТипРеквизита = Тип("Дата") Тогда
ИначеЕсли ТипРеквизита = Тип("Дата") Тогда
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл нМассив.Добавить(Новый Структура("Значение, Примечание", мПривестиКДате(Элемент, Новый ОписаниеТипов("Дата")).Дата, мПривестиКДате(Элемент, Новый ОписаниеТипов("Дата")).Примечание)) КонецЦикла
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл нМассив.Добавить(Новый Структура("Значение, Примечание", мПривестиКДате(Элемент, Новый ОписаниеТипов("Дата")).Дата, мПривестиКДате(Элемент, Новый ОписаниеТипов("Дата")).Примечание)) КонецЦикла
ИначеЕсли ТипРеквизита = Тип("Булево") Тогда
ИначеЕсли ТипРеквизита = Тип("Булево") Тогда
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл Если НРег(Элемент) = "да" ИЛИ НРег(Элемент) = "истина" ИЛИ НРег(Элемент) = "включено" ИЛИ НРег(Элемент) = "1" Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", Истина, "")) ИначеЕсли НРег(Элемент) = "нет" ИЛИ НРег(Элемент) = "ложь" ИЛИ НРег(Элемент) = "выключено" ИЛИ НРег(Элемент) = "0" Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", Ложь, "")) Иначе нМассив.Добавить(Новый Структура("Значение, Примечание", Элемент, "Неправильный формат")) КонецЕсли КонецЦикла
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл Если НРег(Элемент) = "да" ИЛИ НРег(Элемент) = "истина" ИЛИ НРег(Элемент) = "включено" ИЛИ НРег(Элемент) = "1" Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", Истина, "")) ИначеЕсли НРег(Элемент) = "нет" ИЛИ НРег(Элемент) = "ложь" ИЛИ НРег(Элемент) = "выключено" ИЛИ НРег(Элемент) = "0" Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", Ложь, "")) Иначе нМассив.Добавить(Новый Структура("Значение, Примечание", Элемент, "Неправильный формат")) КонецЕсли КонецЦикла
ИначеЕсли ТипРеквизита = Тип("ВидДвиженияНакопления") Тогда
ИначеЕсли ТипРеквизита = Тип("ВидДвиженияНакопления") Тогда
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл Если ВРег(Элемент) = "ПРИХОД" ИЛИ ВРег(Элемент) = "+" Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", ВидДвиженияНакопления.Приход, "")) ИначеЕсли ВРег(Элемент) = "РАСХОД" ИЛИ ВРег(Элемент) = "-" Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", ВидДвиженияНакопления.Расход, "")) Иначе нМассив.Добавить(Новый Структура("Значение, Примечание", Элемент, "Неправильный формат")) КонецЕсли КонецЦикла
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл Если ВРег(Элемент) = "ПРИХОД" ИЛИ ВРег(Элемент) = "+" Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", ВидДвиженияНакопления.Приход, "")) ИначеЕсли ВРег(Элемент) = "РАСХОД" ИЛИ ВРег(Элемент) = "-" Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", ВидДвиженияНакопления.Расход, "")) Иначе нМассив.Добавить(Новый Структура("Значение, Примечание", Элемент, "Неправильный формат")) КонецЕсли КонецЦикла
ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИначеЕсли СтрНачинаетсяС(XMLИмяТипа, "EnumRef") Тогда
Менеджер = ПолучитьМенеджераПоТипу(ТипРеквизита);
Соответствие = Новый Соответствие;
Соответствие = Новый Соответствие;
Для каждого Перечисление Из ПолучитьМенеджераПоТипу(ТипРеквизита) Цикл Соответствие.Вставить(Строка(Перечисление), Перечисление) КонецЦикла;
Для каждого Перечисление Из Менеджер Цикл Соответствие.Вставить(Строка(Перечисление), Перечисление) КонецЦикла;
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл Если Соответствие[Элемент] <> Неопределено Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", Соответствие[Элемент], "")) Иначе нМассив.Добавить(Новый Структура("Значение, Примечание", Элемент, "Значение не найдено")) КонецЕсли КонецЦикла;
Для каждого Элемент Из ТаблицаПостроитель.ВыгрузитьКолонку(Колонка.НомерКолонки) Цикл Если Соответствие[Элемент] <> Неопределено Тогда нМассив.Добавить(Новый Структура("Значение, Примечание", Соответствие[Элемент], "")) Иначе нМассив.Добавить(Новый Структура("Значение, Примечание", Элемент, "Значение не найдено")) КонецЕсли КонецЦикла;
Иначе
Иначе
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
Менеджер = ПолучитьМенеджераПоТипу(ТипРеквизита);
Менеджер = ПолучитьМенеджераПоТипу(ТипРеквизита);
ИщемПоПредставлению = Ложь;
ИщемПоПредставлению = Ложь;
ИмяКлассаМетаданных = СтрРазделить(XMLИмяТипа, ".")[0];
Если Справочники.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
Если ИмяКлассаМетаданных = "CatalogRef" Тогда
ИмяОбъектаМетаданных = "Справочник"
ИмяОбъектаМетаданных = "Справочник"
ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИначеЕсли ИмяКлассаМетаданных = "ChartOfAccountsRef" Тогда
ИмяОбъектаМетаданных = "ПланСчетов"
ИмяОбъектаМетаданных = "ПланСчетов"
ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИначеЕсли ИмяКлассаМетаданных = "ChartOfCharacteristicTypesRef" Тогда
ИмяОбъектаМетаданных = "ПланВидовХарактеристик"
ИмяОбъектаМетаданных = "ПланВидовХарактеристик"
ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИначеЕсли ИмяКлассаМетаданных = "BusinessProcessRef" Тогда
ИмяОбъектаМетаданных = "БизнесПроцесс"
ИмяОбъектаМетаданных = "БизнесПроцесс"
ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИначеЕсли ИмяКлассаМетаданных = "TaskRef" Тогда
ИмяОбъектаМетаданных = "Задача"
ИмяОбъектаМетаданных = "Задача"
ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИначеЕсли ИмяКлассаМетаданных = "ChartOfCalculationTypesRef" Тогда
ИмяОбъектаМетаданных = "ПланВидовРасчета"
ИмяОбъектаМетаданных = "ПланВидовРасчета"
ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИначеЕсли ИмяКлассаМетаданных = "DocumentRef" Тогда
ИщемПоПредставлению = Истина;
ИщемПоПредставлению = Истина;
ИмяОбъектаМетаданных = "Документ"
ИмяОбъектаМетаданных = "Документ"
Иначе
Иначе
Возврат нМассив
Возврат нМассив
КонецЕсли;
КонецЕсли;
ИскатьПо = Колонка.ИскатьПо;
ИскатьПо = Колонка.ИскатьПо;
Если ПустаяСтрока(ИскатьПо) И БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
Если ПустаяСтрока(ИскатьПо) И БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
Возврат нМассив
Возврат нМассив
ИначеЕсли ПустаяСтрока(ИскатьПо) И Документы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИначеЕсли ПустаяСтрока(ИскатьПо) И Документы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
ИскатьПо = "Номер"
ИскатьПо = "Номер"
ИначеЕсли ПустаяСтрока(ИскатьПо)Тогда
ИначеЕсли ПустаяСтрока(ИскатьПо)Тогда
СтрокаОсновногоПредставления = Строка(МетаданныеТипа.ОсновноеПредставление);
СтрокаОсновногоПредставления = Строка(МетаданныеТипа.ОсновноеПредставление);
Если СтрокаОсновногоПредставления = "ВВидеКода" Тогда
Если СтрокаОсновногоПредставления = "ВВидеКода" Тогда
ИскатьПо = "Код"
ИскатьПо = "Код"
ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНаименования" Тогда
ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНаименования" Тогда
ИскатьПо = "Наименование"
ИскатьПо = "Наименование"
ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНомера" Тогда
ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНомера" Тогда
ИскатьПо = "Номер"
ИскатьПо = "Номер"
КонецЕсли
КонецЕсли
КонецЕсли;
КонецЕсли;
Запрос = Новый Запрос;
Запрос = Новый Запрос;
ТекстЗапроса =
ТекстЗапроса =
"ВЫБРАТЬ
"ВЫБРАТЬ
| Максимум(_Таблица.Ссылка) КАК Ссылка,
| Максимум(_Таблица.Ссылка) КАК Ссылка,
| Количество(_Таблица.Ссылка) КАК Количество,
| Количество(_Таблица.Ссылка) КАК Количество,
| ПРЕДСТАВЛЕНИЕ(_Таблица." + ИскатьПо + ") КАК " + ИскатьПо + "
| ПРЕДСТАВЛЕНИЕ(_Таблица." + ИскатьПо + ") КАК " + ИскатьПо + "
|ИЗ
|ИЗ
| "+ИмяОбъектаМетаданных+"." + МетаданныеТипа.Имя + " КАК _Таблица
| "+ИмяОбъектаМетаданных+"." + МетаданныеТипа.Имя + " КАК _Таблица
|ГДЕ";
|ГДЕ";
Если ИскатьПо = "Представление" И ИщемПоПредставлению Тогда
Если ИскатьПо = "Представление" И ИщемПоПредставлению Тогда
ТекстЗапроса = ТекстЗапроса + "
ТекстЗапроса = ТекстЗапроса + "
| (_Таблица.Номер В (&Номер)
| (_Таблица.Номер В (&Номер)
| ИЛИ _Таблица.Дата В (&Дата))";
| ИЛИ _Таблица.Дата В (&Дата))";
Иначе
Иначе
ТекстЗапроса = ТекстЗапроса + "
ТекстЗапроса = ТекстЗапроса + "
| _Таблица." + ИскатьПо + " В (&ИскатьПо)";
| _Таблица." + ИскатьПо + " В (&ИскатьПо)";
КонецЕсли;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
ТекстЗапроса = ТекстЗапроса + "
|
|
|СГРУППИРОВАТЬ ПО
|СГРУППИРОВАТЬ ПО
| _Таблица." + ИскатьПо;
| _Таблица." + ИскатьПо;
Запрос.Текст = ТекстЗапроса;
Запрос.Текст = ТекстЗапроса;
ТЗ = ТаблицаПостроитель.Скопировать(, ТаблицаПостроитель.Колонки[Колонка.НомерКолонки].Имя);
ТЗ = ТаблицаПостроитель.Скопировать(, ТаблицаПостроитель.Колонки[Колонка.НомерКолонки].Имя);
ТЗ.Свернуть(ТЗ.Колонки[0].Имя);
ТЗ.Свернуть(ТЗ.Колонки[0].Имя);
Если ИскатьПо = "Представление" И ИщемПоПредставлению Тогда
Если ИскатьПо = "Представление" И ИщемПоПредставлению Тогда
СтруктураПредставления = ПолучитьМассивНомеровИДатДокументов(ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0].Имя), МетаданныеТипа.Синоним);
СтруктураПредставления = ПолучитьМассивНомеровИДатДокументов(ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0].Имя), МетаданныеТипа.Синоним);
Запрос.УстановитьПараметр("Номер", СтруктураПредставления.МассивНомеров);
Запрос.УстановитьПараметр("Номер", СтруктураПредставления.МассивНомеров);
Запрос.УстановитьПараметр("Дата", СтруктураПредставления.МассивДат);
Запрос.УстановитьПараметр("Дата", СтруктураПредставления.МассивДат);
ИначеЕсли ТипЗнч(Менеджер.ПустаяСсылка()[ИскатьПо]) = Тип("Число") Тогда
ИначеЕсли ТипЗнч(Менеджер.ПустаяСсылка()[ИскатьПо]) = Тип("Число") Тогда
МассивЧисел = Новый Массив;
МассивЧисел = Новый Массив;
Для каждого Элемент Из ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0].Имя) Цикл Попытка МассивЧисел.Добавить(Число(Элемент)) Исключение КонецПопытки КонецЦикла;
Для каждого Элемент Из ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0].Имя) Цикл Попытка МассивЧисел.Добавить(Число(Элемент)) Исключение КонецПопытки КонецЦикла;
Запрос.УстановитьПараметр("ИскатьПо", МассивЧисел)
Запрос.УстановитьПараметр("ИскатьПо", МассивЧисел)
Иначе
Иначе
Запрос.УстановитьПараметр("ИскатьПо", ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0].Имя));
Запрос.УстановитьПараметр("ИскатьПо", ТЗ.ВыгрузитьКолонку(ТЗ.Колонки[0].Имя));
КонецЕсли;
КонецЕсли;
Результат = Запрос.Выполнить().Выгрузить();
Результат = Запрос.Выполнить().Выгрузить();
Для каждого Элемент Из Результат Цикл Элемент[ИскатьПо] = СокрЛП(ВРег(Элемент[ИскатьПо])) КонецЦикла;
Для каждого Элемент Из Результат Цикл Элемент[ИскатьПо] = СокрЛП(ВРег(Элемент[ИскатьПо])) КонецЦикла;
Результат.Индексы.Добавить(ИскатьПо);
Результат.Индексы.Добавить(ИскатьПо);
Для каждого Строка Из ТаблицаПостроитель Цикл нМассив.Добавить(Новый Структура("Значение, Примечание", ?(Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо) <> Неопределено, Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо).Ссылка, Неопределено), ?(ЗначениеЗаполнено(Строка[Колонка.НомерКолонки]), ?(Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо) <> Неопределено, ?(Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо).Количество = 1, "", "Не однозначное представление. Вариантов: " + Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо).Количество), "Элемент не найден"), ""))) КонецЦикла
Для каждого Строка Из ТаблицаПостроитель Цикл нМассив.Добавить(Новый Структура("Значение, Примечание", ?(Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо) <> Неопределено, Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо).Ссылка, Неопределено), ?(ЗначениеЗаполнено(Строка[Колонка.НомерКолонки]), ?(Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо) <> Неопределено, ?(Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо).Количество = 1, "", "Не однозначное представление. Вариантов: " + Результат.Найти(ВРег(Строка[Колонка.НомерКолонки]), ИскатьПо).Количество), "Элемент не найден"), ""))) КонецЦикла
КонецЕсли;
КонецЕсли;
Возврат нМассив
Возврат нМассив
КонецФункции
КонецФункции
&НаСервереБезКонтекста
&НаСервереБезКонтекста
// Функция возвращает менеджер по типу значения
// Функция возвращает менеджер по типу значения
//
//
// Параметры:
// Параметры:
// ТипЗначения - Тип значения, по которому нужна вернуть менеджер
// ТипЗначения - Тип значения, по которому нужна вернуть менеджер
//
//
// Возвращаемое значение:
// Возвращаемое значение:
// менеджер
// менеджер
Функция ПолучитьМенеджераПоТипу(ТипЗначения)
Функция ПолучитьМенеджераПоТипу(ТипЗначения)
Если Не ТипЗначения = Неопределено Тогда
XMLИмяТипа = XMLТип(ТипЗначения).ИмяТипа;
МенеджерыОбъектовМетаданных = Новый Структура("Справочники, Перечисления, Документы, ПланыВидовХарактеристик, ПланыСчетов, ПланыВидовРасчета, БизнесПроцессы, Задачи",
Возврат Новый(СтрЗаменить(XMLИмяТипа, "Ref", "Manager"));
Справочники,
Перечисления,
Документы,
ПланыВидовХарактеристик,
ПланыСчетов,
ПланыВидовРасчета,
БизнесПроцессы,
Задачи);
Для Каждого МенеджерОбъектаМетаданных Из МенеджерыОбъектовМетаданных Цикл Если МенеджерОбъектаМетаданных.Значение.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда Возврат МенеджерОбъектаМетаданных.Значение[Метаданные.НайтиПоТипу(ТипЗначения).Имя] КонецЕсли КонецЦикла
Иначе
Возврат Неопределено
КонецЕсли
КонецФункции
КонецФункции