RDT1C/DataProcessors/ирТестированиеМетаданных/Ext/ObjectModule.bsl
Администратор 7c4a4725ab 4.53
Добавлен инструмент "Конструктор регулярного выражения"
    Статистика по запросам MSSQL
        *Исправлена ошибка открытия формы в портативном варианте
    Консоль запросов
        *В режиме редактирования узла дерева запроса реализована возможность перехода к другим узлам дерева, но одновременно редактироваться по-прежнему может только один узел
    Тестирование метаданных
        +Добавлена кнопка "Новое окно"
        *Добавлена передача параметра "Автотест" при получении управляемых форм
    Консоль компоновки
        +Обработчику события ПередВыполнением добавлен параметр ВнешниеНаборыДанных
    Редактор изменений на узлах
        *Исправлена ошибка добавления регистрации изменений регистров через кнопку Подбор
    Динамический список
        +Теперь доступна сортировка по всем возможным колонкам
        +Добавлено поле количества строк в выбранной таблице без учета отбора
    Управление службами серверов 1С
        +Добавлена поддержка служб "Сервер отладки", "Сервер хранилища конфигураций", "Сервер администрирования"
        +Добавлена таблица доступных сборок платформы
4.54
    Конструктор регулярного выражения
        +Реализовано автообновление проверочного текста в процессе редактирования
        +Добавлены флажки "Многострочный" и "Игнорировать регистр"
        *Исправлена проблема пропажи служебных символов XML при обновлении проверочного текста
        *Исправлено удаление оформления из выражений параметров при генерации кода 1С
        +По кнопке "Сгенерировать код" теперь в параметр ТекстГдеИскать передается проверочный текст
        *Исправлена ошибка в портативном варианте при открытии формы настроек
    Консоль запросов
        *Исправлена свежая ошибка открытия конструктора запроса ИР
        *Исправлена свежая некритичная ошибка при добавлении запроса
    Управление службами серверов 1С
        +При выборе новой сборки платформы теперь явно указывается ее разрядность
        *Исправлено чтение сборок платформы для новых типов служб
2018-05-20 20:48:55 +03:00

517 lines
36 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем мНепустыеЗначения Экспорт ;
Перем мПлатформа Экспорт;
Перем мТекущееПолноеИмяМД Экспорт;
Функция ДобавитьСтрокуОшибки(ИмяОперации, Знач пИнформацияОбОшибке, ГлубинаОшибки = 0, Контекст = "КлиентскоеПриложение") Экспорт
#Если Сервер И Не Сервер Тогда
пИнформацияОбОшибке = ИнформацияОбОшибке();
#КонецЕсли
Если ГлубинаОшибки = 1 Тогда
Если Истина
И пИнформацияОбОшибке.Причина <> Неопределено
И пИнформацияОбОшибке.Причина.Причина <> Неопределено
Тогда
пИнформацияОбОшибке = пИнформацияОбОшибке.Причина;
КонецЕсли;
КонецЕсли;
Фрагменты = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(ИмяОперации);
СтрокаРезультатов = Ошибки.Добавить();
СтрокаРезультатов.Контекст = Контекст;
СтрокаРезультатов.Операция = Фрагменты[Фрагменты.ВГраница()];
Фрагменты.Удалить(Фрагменты.ВГраница());
Если Фрагменты.Количество() = 3 И Фрагменты[Фрагменты.ВГраница()] = "Форма" Тогда
СтрокаРезультатов.Операция = "Форма." + СтрокаРезультатов.Операция;
Фрагменты.Удалить(Фрагменты.ВГраница());
КонецЕсли;
СтрокаРезультатов.Метаданные = ирОбщий.ПолучитьСтрокуСРазделителемИзМассиваЛкс(Фрагменты, ".");
СтрокаРезультатов.ПодробноеОписаниеОшибки = ПодробноеПредставлениеОшибки(пИнформацияОбОшибке);
ОписаниеОшибки = пИнформацияОбОшибке.Описание;
Если пИнформацияОбОшибке.Причина <> Неопределено Тогда
ОписаниеОшибки = ОписаниеОшибки + ": " + ПодробноеПредставлениеОшибки(пИнформацияОбОшибке.Причина);
КонецЕсли;
СтрокаРезультатов.ОписаниеОшибки = ОписаниеОшибки;
СтрокаРезультатов.ИнформацияОбОшибке = пИнформацияОбОшибке;
Возврат СтрокаРезультатов;
КонецФункции
Функция ГлобальныйТестОбъектов(ЭтаФорма = Неопределено) Экспорт
#Если ВнешнееСоединение Тогда
СбойноеИмяМД = мТекущееПолноеИмяМД;
#КонецЕсли
ТипыМетаданных = ирКэш.Получить().ПолучитьТаблицуТиповМетаОбъектов(Истина, Ложь, Ложь);
ИндикаторТиповМетаданных = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ТипыМетаданных.Количество(), "Объекты. Типы метаданных");
Для Каждого СтрокаТипаМетаданных Из ТипыМетаданных Цикл
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТиповМетаданных);
Если ирОбщий.ЛиКорневойТипРегистраБДЛкс(СтрокаТипаМетаданных.Единственное) Тогда
Подтип = "НаборЗаписей";
ИначеЕсли СтрокаТипаМетаданных.Единственное = "Константа" Тогда
Подтип = "МенеджерЗначения";
Иначе //Если ирОбщий.ЛиКорневойТипСсылкиЛкс(СтрокаТипаМетаданных.Единственное) Тогда
Подтип = "Объект";
КонецЕсли;
Если Ложь
//Или СтрокаТипаМетаданных.Единственное = "ПланОбмена" // Временно. Антибаг платформы 8.2.16.352 http://partners.v8.1c.ru/forum/thread.jsp?id=1080147#1080147
Или СтрокаТипаМетаданных.Единственное = "Перечисление"
Или СтрокаТипаМетаданных.Единственное = "Перерасчет"
Тогда
Продолжить;
КонецЕсли;
КоллекцияМетаОбъектов = Метаданные[СтрокаТипаМетаданных.Множественное];
Индикатор2 = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияМетаОбъектов.Количество(), СтрокаТипаМетаданных.Множественное);
Для Каждого МетаОбъект Из КоллекцияМетаОбъектов Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор2);
КоличествоОшибок = Ошибки.Количество();
мТекущееПолноеИмяМД = МетаОбъект.ПолноеИмя();
#Если ВнешнееСоединение Тогда
Если СбойноеИмяМД <> Неопределено Тогда
Если СбойноеИмяМД = мТекущееПолноеИмяМД Тогда
СбойноеИмяМД = Неопределено;
КонецЕсли;
Продолжить;
КонецЕсли;
#КонецЕсли
Если Истина
И ОбъектыМетаданных.Количество() > 0
И ОбъектыМетаданных.НайтиПоЗначению(мТекущееПолноеИмяМД) = Неопределено
Тогда
Продолжить;
КонецЕсли;
ИмяОперации = мТекущееПолноеИмяМД + ".Объект";
Если ВыводитьСообщения Тогда
Сообщить("" + ТекущаяДата() + " " + ИмяОперации);
КонецЕсли;
ИмяТипаОбъекта = СтрЗаменить(мТекущееПолноеИмяМД, ".", Подтип + ".");
Попытка
Объект = Новый (ИмяТипаОбъекта); // Ошибки инициализации здесь все равно не ловятся попыткой. Проектное решение 1С https://partners.v8.1c.ru/forum/t/1302121/m/1302121
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ОписаниеОшибки = ИнформацияОбОшибке.Описание;
Если Найти(ОписаниеОшибки, "Тип не определен") <> 1 Тогда
ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке, 1);
КонецЕсли;
Продолжить;
КонецПопытки;
НачатьТранзакцию();
Попытка
Если Подтип = "Объект" Тогда
МенеджерТипа = ирОбщий.ПолучитьМенеджерЛкс(МетаОбъект);
Если ирОбщий.ЛиКорневойТипСсылкиЛкс(СтрокаТипаМетаданных.Единственное) Тогда
ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ " + МетаОбъект.ПолноеИмя() + " КАК Т";
МассивТиповСтрок = Новый Массив;
МассивТиповСтрок.Добавить(Ложь);
Если ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(МетаОбъект) Тогда
ТекстЗапроса = ТекстЗапроса + " ГДЕ Т.ЭтоГруппа = &ЭтоГруппа";
МассивТиповСтрок.Добавить(Истина);
КонецЕсли;
Запрос = Новый Запрос(ТекстЗапроса);
Для Каждого ТипСтроки Из МассивТиповСтрок Цикл
Если ПравоДоступа("Изменение", МетаОбъект) Тогда
Запрос.УстановитьПараметр("ЭтоГруппа", ТипСтроки);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Объект = Выборка.Ссылка.ПолучитьОбъект();
ПроверитьСсылочныйОбъект(Объект, ИмяОперации, СтрокаТипаМетаданных.Единственное,, ОбъектыНаСервере);
Если ПравоДоступа("Добавление", МетаОбъект) Тогда
КопияОбъекта = Выборка.Ссылка.Скопировать();
ПроверитьСсылочныйОбъект(КопияОбъекта, ИмяОперации, СтрокаТипаМетаданных.Единственное, Истина, ОбъектыНаСервере);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ПравоДоступа("Добавление", МетаОбъект) Тогда
Объект = ирОбщий.СоздатьСсылочныйОбъектПоМетаданнымЛкс(МетаОбъект);
ЗаполнитьРеквизитыНепустымиЗначениями(Объект, МетаОбъект);
Объект.Скопировать();
Если ПравоДоступа("Изменение", МетаОбъект) Тогда
ПроверитьСсылочныйОбъект(Объект, ИмяОперации, СтрокаТипаМетаданных.Единственное, Истина, ОбъектыНаСервере);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИначеЕсли Подтип = "НаборЗаписей" Тогда
Если ПравоДоступа("Изменение", МетаОбъект) Тогда
МенеджерТипа = ирОбщий.ПолучитьМенеджерЛкс(МетаОбъект); // Создаем чисто для проверки компиляции модуля менеджера
СтрокаНабора = Объект.Добавить();
ЗаполнитьРеквизитыНепустымиЗначениями(СтрокаНабора, МетаОбъект);
Для Каждого ЭлементОтбора Из Объект.Отбор Цикл
ЭлементОтбора.Установить(СтрокаНабора[ЭлементОтбора.Имя]);
КонецЦикла;
ирОбщий.ЗаполнитьНаборЗаписейПоОтборуЛкс(Объект);
Попытка
ирОбщий.ЗаписатьОбъектЛкс(Объект, ОбъектыНаСервере);
Исключение
ОтменитьТранзакцию();
Если Не ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки()) Тогда
ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке(), 1);
КонецЕсли;
НачатьТранзакцию();
КонецПопытки;
КонецЕсли;
Иначе
Если ПравоДоступа("Изменение", МетаОбъект) Тогда
Попытка
ирОбщий.ЗаписатьОбъектЛкс(Объект, ОбъектыНаСервере);
Исключение
ОтменитьТранзакцию();
Если Не ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки()) Тогда
ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке(), 1);
КонецЕсли;
НачатьТранзакцию();
КонецПопытки;
КонецЕсли;
КонецЕсли;
Исключение
// Сюда попадаем при ошибках не при записи
ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке());
КонецПопытки;
ОтменитьТранзакцию();
Если ЭтаФорма <> Неопределено Тогда
Если КоличествоОшибок <> Ошибки.Количество() Тогда
ЭтаФорма.ОбновитьОтображение();
КонецЕсли;
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецФункции
Функция ПроверитьСсылочныйОбъект(Знач Объект, ИмяОперации, ТипМетаданных, ЭтоКопия = Ложь, ОбъектыНаСервере = Ложь) Экспорт
Если ЭтоКопия Тогда
НовыйКод = 333333333333;
Попытка
Объект.Код = НовыйКод;
Исключение
КонецПопытки;
НоваяДата = ПолучитьНепустоеЗначениеПоОписаниюТипов(Новый ОписаниеТипов("Дата"));
Попытка
Объект.Дата = НоваяДата;
Исключение
КонецПопытки;
КонецЕсли;
Попытка
Объект.ПометкаУдаления = Ложь;
Исключение
// Предопределенный узел
КонецПопытки;
ОбразОбъекта = ирОбщий.СохранитьОбъектВВидеСтрокиXMLЛкс(Объект, Ложь);
Попытка
ирОбщий.ЗаписатьОбъектЛкс(Объект, ОбъектыНаСервере);
Исключение
ОтменитьТранзакцию();
Если Не ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки()) Тогда
ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке(), 1);
КонецЕсли;
КонецПопытки;
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
Объект = ирОбщий.ВосстановитьОбъектИзСтрокиXMLЛкс(ОбразОбъекта,, Ложь);
НачатьТранзакцию();
//ФормаОбъекта = Объект.ПолучитьФорму();
//ФормаОбъекта.ЗаписатьВФорме();
Если ТипМетаданных = "Документ" И Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить Тогда
Объект.Проведен = Ложь;
Попытка
ирОбщий.ЗаписатьОбъектЛкс(Объект, ОбъектыНаСервере, РежимЗаписиДокумента.Проведение);
Исключение
ОтменитьТранзакцию();
Если Не ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки()) Тогда
ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке(), 1);
КонецЕсли;
КонецПопытки;
Если ТранзакцияАктивна() Тогда
//Объект = ирОбщий.ВосстановитьОбъектИзСтрокиXMLЛкс(ОбразОбъекта,, Ложь);
//Объект.Проведен = Истина;
Попытка
ирОбщий.ЗаписатьОбъектЛкс(Объект, ОбъектыНаСервере, РежимЗаписиДокумента.ОтменаПроведения);
Исключение
ОтменитьТранзакцию();
Если Не ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки()) Тогда
ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке(), 1);
КонецЕсли;
КонецПопытки;
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
Объект = ирОбщий.ВосстановитьОбъектИзСтрокиXMLЛкс(ОбразОбъекта,, Ложь);
Объект.Проведен = Ложь;
НачатьТранзакцию();
КонецЕсли;
//Попытка
// Объект.ПометкаУдаления = Истина;
//Исключение
// Возврат Неопределено;
//КонецПопытки;
//Попытка
// ирОбщий.ЗаписатьОбъектЛкс(Объект, ОбъектыНаСервере);
//Исключение
// ОтменитьТранзакцию();
// ОписаниеОшибки = ОписаниеОшибки();
// Если Не ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки()) Тогда
// ДобавитьСтрокуОшибки(ИмяОперации, ИнформацияОбОшибке(), 1);
// КонецЕсли;
//КонецПопытки;
//Если ТранзакцияАктивна() Тогда
// ОтменитьТранзакцию();
//КонецЕсли;
//НачатьТранзакцию();
Возврат Неопределено;
КонецФункции
Функция ЗаполнитьРеквизитыНепустымиЗначениями(Объект, ОбъектМД, Назначение = "Основная", ОбъектВладелец = Неопределено) Экспорт
ПолноеИмяМД = ОбъектМД.ПолноеИмя();
ПоляТаблицыБД = ирОбщий.ПолучитьПоляТаблицыМДЛкс(ПолноеИмяМД,,,, Ложь);
#Если Сервер И Не Сервер Тогда
ПоляТаблицыБД = ПолучитьСтруктуруХраненияБазыДанных().Колонки;
#КонецЕсли
Для Каждого ПолеТаблицыБД Из ПоляТаблицыБД Цикл
ИмяПоля = ПолеТаблицыБД.Имя;
Если Истина
И ирОбщий.ЛиСсылочныйОбъектМетаданных(ОбъектМД)
И (Ложь
Или ИмяПоля = "Предопределенный"
Или ИмяПоля = "ИмяПредопределенныхДанных"
Или ИмяПоля = "Ссылка")
Тогда
Продолжить;
КонецЕсли;
Если ПолеТаблицыБД.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда
МетаТЧ = ОбъектМД.ТабличныеЧасти.Найти(ПолеТаблицыБД.Имя);
Если МетаТЧ <> Неопределено Тогда
Попытка
СтрокаТЧ = Объект[МетаТЧ.Имя].Добавить();
Исключение
СтрокаТЧ = Неопределено;
КонецПопытки;
Если СтрокаТЧ <> Неопределено Тогда
ЗаполнитьРеквизитыНепустымиЗначениями(СтрокаТЧ, МетаТЧ, "ТабличнаяЧасть", Объект);
КонецЕсли;
КонецЕсли;
Продолжить;
КонецЕсли;
НепустоеЗначение = Неопределено;
СтруктураОтбора = Неопределено;
//СтрокаСтрукутрыПоля = СтруктураХраненияПолей.Найти(ИмяПоля, "ИмяПоля");
//Если СтрокаСтрукутрыПоля <> Неопределено Тогда
// МетаданныеПоля = СтрокаСтрукутрыПоля.Метаданные;
// Если ЗначениеЗаполнено(МетаданныеПоля) Тогда
// МетаданныеПоля = Метаданные.НайтиПоПолномуИмени(МетаданныеПоля);
// Иначе
// МетаданныеПоля = Неопределено;
// КонецЕсли;
МетаданныеПоля = ПолеТаблицыБД.Метаданные;
Если МетаданныеПоля <> Неопределено Тогда
Попытка
НепустоеЗначение = МетаданныеПоля.ЗначениеЗаполнения; // У измерений и ресурсов нет такого свойства
ЗначениеЗаполнено(НепустоеЗначение); // Там бывает "НеизвестныйОбъект", тогда будет исключение
Исключение
НепустоеЗначение = Неопределено;
КонецПопытки;
КонецЕсли;
СтруктураОтбора = Новый Структура;
Если МетаданныеПоля <> Неопределено И Не ЗначениеЗаполнено(НепустоеЗначение) Тогда
СтруктураОтбора = ирОбщий.ПолучитьСтруктуруОтбораПоСвязямИПараметрамВыбораЛкс(Объект, МетаданныеПоля, ОбъектВладелец);
КонецЕсли;
Если Истина
И ИмяПоля = "Родитель"
И ирОбщий.ЛиМетаданныеОбъектаСГруппамиЛкс(ОбъектМД)
Тогда
СтруктураОтбора.Вставить("ЭтоГруппа", Истина);
КонецЕсли;
Если Истина
И ИмяПоля = "Родитель"
И Найти(ПолноеИмяМД, "Справочник.") = 1
И ОбъектМД.Владельцы.Количество() > 0
Тогда
СтруктураОтбора.Вставить("Владелец", Объект.Владелец);
КонецЕсли;
Если СтруктураОтбора.Количество() = 0 Тогда
СтруктураОтбора = Неопределено;
КонецЕсли;
//КонецЕсли;
Если Не ЗначениеЗаполнено(НепустоеЗначение) Или СтруктураОтбора <> Неопределено Тогда
НепустоеЗначение = ПолучитьНепустоеЗначениеПоОписаниюТипов(ПолеТаблицыБД.ТипЗначения, СтруктураОтбора);
КонецЕсли;
Попытка
Объект[ИмяПоля] = НепустоеЗначение;
Исключение
КонецПопытки;
КонецЦикла;
КонецФункции
Функция ПолучитьНепустоеЗначениеПоОписаниюТипов(ОписаниеТипов, СтруктураОтбора = Неопределено) Экспорт
#Если Сервер И Не Сервер Тогда
ОписаниеТипов = Новый ОписаниеТипов();
#КонецЕсли
Типы = ОписаниеТипов.Типы();
Если Типы.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
Для Каждого Тип Из ОписаниеТипов.Типы() Цикл
Если ирОбщий.ЛиТипСсылкиБДЛкс(Тип, Ложь) Тогда
ВыбранныйТипЗначения = Тип;
Прервать;
КонецЕсли;
КонецЦикла;
Если ВыбранныйТипЗначения = Неопределено Тогда
ВыбранныйТипЗначения = Типы[0];
КонецЕсли;
МетаданныеТипа = Метаданные.НайтиПоТипу(ВыбранныйТипЗначения);
Если МетаданныеТипа <> Неопределено Тогда
ИмяТаблицыБД = МетаданныеТипа.ПолноеИмя();
Если ирОбщий.ЛиТипСсылкиТочкиМаршрутаЛкс(ВыбранныйТипЗначения) Тогда
ИмяТаблицыБД = ИмяТаблицыБД + ".Точки";
КонецЕсли;
Если СтруктураОтбора <> Неопределено Или СтрЧислоВхождений(ИмяТаблицыБД, ".") > 1 Тогда
ПостроительЗапроса = Новый ПостроительЗапроса("ВЫБРАТЬ ПЕРВЫЕ 1 Т.* ИЗ " + ИмяТаблицыБД + " КАК Т");
ПостроительЗапроса.ЗаполнитьНастройки();
//Пока ПостроительЗапроса.Отбор.Количество() > 0 Цикл
// ПостроительЗапроса.Отбор.Удалить(0);
//КонецЦикла;
ПостроительЗапроса.ВыбранныеПоля.Очистить();
ПостроительЗапроса.ВыбранныеПоля.Добавить("Ссылка");
//ирОбщий.УстановитьОтборПоСтруктуреЛкс(ПостроительЗапроса.Отбор, СтруктураОтбора);
Если СтруктураОтбора <> Неопределено Тогда
Для Каждого КлючИЗначение Из СтруктураОтбора Цикл
Если ПостроительЗапроса.ДоступныеПоля.Найти(КлючИЗначение.Ключ) <> Неопределено Тогда
Попытка
ирОбщий.НайтиДобавитьЭлементОтбораЛкс(ПостроительЗапроса, КлючИЗначение.Ключ,, КлючИЗначение.Значение);
Исключение
ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Если ПостроительЗапроса.Отбор.Количество() > 0 Тогда
Выборка = ПостроительЗапроса.Результат.Выбрать();
Если Выборка.Следующий() Тогда
НепустоеЗначение = Выборка.Ссылка;
КонецЕсли;
//КонецЕсли;
Иначе // Эта ветка - для ускорения. Можно оставить только основную ветку, но учесть в ней ЭтоГруппа.
Если Перечисления.ТипВсеСсылки().СодержитТип(ВыбранныйТипЗначения) Тогда
ОбъектМДТипа = Метаданные.НайтиПоТипу(ВыбранныйТипЗначения);
НепустоеЗначение = Перечисления[ОбъектМДТипа.Имя][ОбъектМДТипа.ЗначенияПеречисления[0].Имя];
Иначе
МенеджерТипа = ирОбщий.ПолучитьМенеджерЛкс(МетаданныеТипа);
Выборка = МенеджерТипа.Выбрать();
Пока Выборка.Следующий() Цикл
Попытка
ЭтоГруппа = Выборка.ЭтоГруппа;
Исключение
ЭтоГруппа = Ложь;
КонецПопытки;
Если Не ЭтоГруппа Тогда
НепустоеЗначение = Выборка.Ссылка;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если НепустоеЗначение = Неопределено Тогда
КлючПоиска = Новый Структура("Метаданные, ПредставлениеСвойств", "", "");
КлючПоиска.Метаданные = МетаданныеТипа.ПолноеИмя();
Если СтруктураОтбора <> Неопределено Тогда
КлючПоиска.ПредставлениеСвойств = ирОбщий.ПолучитьПредставлениеСтруктурыЛкс(СтруктураОтбора);
КонецЕсли;
Если НедостающиеОбъекты.НайтиСтроки(КлючПоиска).Количество() = 0 Тогда
СтрокаНедостающегоОбъекта = НедостающиеОбъекты.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаНедостающегоОбъекта, КлючПоиска);
Иначе
СтрокаНедостающегоОбъекта = Неопределено;
КонецЕсли;
Если СтруктураОтбора <> Неопределено И СтруктураОтбора.Количество() > 0 Тогда
Если СтрокаНедостающегоОбъекта <> Неопределено Тогда
СтрокаНедостающегоОбъекта.Свойства = СтруктураОтбора;
КонецЕсли;
Иначе
Массив = Новый Массив();
Массив.Добавить(Новый УникальныйИдентификатор());
НепустоеЗначение = Новый (ВыбранныйТипЗначения, Массив);
КонецЕсли;
КонецЕсли;
Иначе
НепустоеЗначение = мНепустыеЗначения[ВыбранныйТипЗначения];
Если НепустоеЗначение = Неопределено Тогда
Попытка
НепустоеЗначение = Новый (ВыбранныйТипЗначения);
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(НепустоеЗначение) Тогда
мНепустыеЗначения[ВыбранныйТипЗначения] = НепустоеЗначение;
КонецЕсли;
Возврат НепустоеЗначение;
КонецФункции
Функция ЕстьИгнориуемыеСигнатуры(ОписаниеОшибки)
Для Каждого Сигнатура Из ИгнорируемыеСигнатуры Цикл
Если Сигнатура.Пометка И Найти(ОписаниеОшибки, Сигнатура.Строка) > 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ИнициализироватьНепустыеЗначения() Экспорт
мНепустыеЗначения = Новый Соответствие();
мНепустыеЗначения.Вставить(Тип("Дата"), НачалоМесяца(ТекущаяДата()) + 33);
мНепустыеЗначения.Вставить(Тип("Число"), 1);
мНепустыеЗначения.Вставить(Тип("Строка"), "а");
мНепустыеЗначения.Вставить(Тип("Булево"), Истина);
мНепустыеЗначения.Вставить(Тип("ХранилищеЗначения"), Новый ХранилищеЗначения(Неопределено));
мНепустыеЗначения.Вставить(Тип("ОписаниеТипов"), Новый ОписаниеТипов);
мНепустыеЗначения.Вставить(Тип("УникальныйИдентификатор"), Новый УникальныйИдентификатор());
КонецПроцедуры
Ошибки.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("Строка"));
Ошибки.Колонки.Добавить("Операция", Новый ОписаниеТипов("Строка"));
Ошибки.Колонки.Добавить("Контекст", Новый ОписаниеТипов("Строка"));
Ошибки.Колонки.Добавить("ОписаниеОшибки", Новый ОписаниеТипов("Строка"));
Ошибки.Колонки.Добавить("ПодробноеОписаниеОшибки", Новый ОписаниеТипов("Строка"));
Ошибки.Колонки.Добавить("ИнформацияОбОшибке");
НедостающиеОбъекты.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("Строка"));
НедостающиеОбъекты.Колонки.Добавить("ПредставлениеСвойств", Новый ОписаниеТипов("Строка"));
НедостающиеОбъекты.Колонки.Добавить("Свойства");
НедостающиеОбъекты.Индексы.Добавить("Метаданные, ПредставлениеСвойств");
ИнициализироватьНепустыеЗначения();
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");