RDT1C/DataProcessors/ирТестированиеМетаданных/Ext/ObjectModule.bsl
Администратор e2082add8d Консоль запросов
*Исправлена ошибка команды "Структура формы"
    Административная регистрация com-компонент
        +Добавлена кнопка "Запустить от имени администратора"
        *Исправлено выполнение административной регистрации под пользователем домена, являющимся локальным администратором
    Общее
        *Устранены проблемы с антивирусным ПО путем возврата к использованию старой версии утилиты hstart
    Подбор и обработка объектов
        +В схему компоновки добавлены поля-функции ТИПЗНАЧЕНИЯ() от полей составных типов

3.78
    Консоль запросов
        *Устранено ошибочное использование параметров в фигурных скобках при наличии параметра с типом "Выражение СКД"
        +В подменю "Вставка" для поля текста запроса добавлена команда "Ссылка из буфера"
        *Исправлено вычисление значений параметров для вложенных компоновок из макета компоновки
        *Исправлено некорректное извлечение вычисляемых параметров из макета компоновки
    Конструктор запроса
        +Добавлена поддержка типа запроса TRUNCATE TABLE
        +Для запроса типа WQL при двойном клике на доступном поле доступной таблицы поле теперь добавляется в выбранные поля
    Анализ журнала регистрации
        +Реализованы команды сортировки для списков значений отбора
        *Исправлено долгое обновление табличного поля отбора с большими списками
    Динамический список
        *В командую панель возвращены все стандартные кнопки
        *При открытии с установкой таблицы фокус ввода теперь устанавливается в табличное поле
    Редактор объекта БД
        *Инструмент "Поиск ссылок на объект" перенесен сюда в виде закладки
        +Добавлена поддержка перечислений и точек маршрута
    Интерфейсная панель
        *Исправлены ошибки при обработке веток не метаданных
    Общее
        +Обновлено внутренне описание платформы от версии 8.3.9
        *Исправлены ошибки при открытии ссылок в режиме совместимости 8.1
        *Обеспечена компипяция в режиме совместимости 8.3.9
        *Кнопка открытия настроек справочника Алгоритмы перенесена с общей панели инструментов в формы списка справочника
    Различные значения колонки
        *Исправлены ошибки при обработке булевых колонок
    Консоль кода
        +В подменю "Вставка" добавлена команда "Ссылка из буфера"
    Поиск дублей и замена ссылок
        *Исправлен учет равенства реквизитов при поиске по похожим словам
    Структура хранения БД
        *Исправлена ошибка при нажатии "Показать индекс" в контекстном меню таблицы "Наборы полей" на закладке "Индексы"
    Поиск ссылок на объект
        *Перенесен в инструмент "Редактор объекта БД" в виде закладки

3.77
    Общее
        *Элевация оставлена только в форме административной регистрации COM-компонент, в настройке техножурнала и при изменении параметров служб сервера 1С
        *Элевация теперь используется только если у учетной записи Windows есть административные права
        *Улучшены сообщения пользователю при проблемах регистрации COM компонент
        *Открытие формы объекта по двойному клику на ячейках табличных полей теперь выполняется без получения объекта
        *Улучшена установка ширины динамически добавляемых колонок табличных полей
    Административная регистрация COM компонент
        +Добавлены кнопки "Снять флажки" и "Установить флажки"
    Редактор объекта БД
        *Исправлено распознавание ссылки документа по представлению в поле выбора объекта
        *Исправлено переключение режима редактирования независимого регистра при изменении отбора командами "снять все" и "установить все"
    Динамический список
        *При открытии редактора объекта БД для добавления в независимый регистр сведений теперь включаются все элементы отбора
    Консоль запросов
        *Устранена ошибочная доступность для изменения флажков в коллекции результата запроса
        *Исправлена ошибка загрузки результата WQL запроса

3.76
    Управление службами сервера 1С
        *Улучшена диагностика ошибок
        +Добавлена элевация при изменении параметров служб
    Динамический список
        *Устранено свежее скрытие колонки со стандартной картинкой
    Интерфейсная панель
        +Добавлены перечисления
    Консоль запросов
        *Исправлена ошибка загрузки пустого результата запроса MSSQL
    Редактор констант
        +Включение функциональных опций теперь изменяет только булевы константы и не выполняет их запись
        *Реализован пропуск ошибок записи констант
    Конструктор запросов
        *Устранена ошибочная виртуальная таблица 1С ЗадачиПоИсполнителю  у задачи без адресации
    Редактор объекта БД
        *Флажок "Очищать по отбору чтения" теперь становится доступным только если в считанном наборе записей были строки
        +В режиме менеджера записи регистра сведений реализовано удаление
        *Исправлена свежая ошибка параметризованного открытия строки независимого регистра сведений
    Общее
        *Исправлена ошибка нажатия "Запустить обычное приложение" в тонком клиенте из формы "Невозможно выполнить действие"
2016-12-04 00:30:12 +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";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = ВосстановитьЗначение("ирПолноеИмяФайлаОсновногоМодуля");
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");