Процедура СоздатьВременнуюТаблицуЗапросаИзТаблицыЗначенийЛкс(Запрос, ТаблицаЗначений, Знач ИмяТаблицы) Экспорт 
    
    #Если Сервер И Не Сервер Тогда
        ТаблицаЗначений = Новый ТаблицаЗначений;
    #КонецЕсли
    ТаблицаЗначений = СузитьТипыКолонокТаблицыБезПотериДанныхЛкс(ТаблицаЗначений, Истина,,,,,,, Истина);
    #Если Сервер И Не Сервер Тогда
        ТаблицаЗначений = Новый ТаблицаЗначений;
        Запрос = Новый Запрос;
    #КонецЕсли
    ТекстВыбораПолей = "";
    СуффиксВыборПодколонки = "_ВыборПодколонки" + СуффиксСлужебногоСвойстваЛкс();
    СуффиксПодколонкиБезНеудобногоТипа = "_Значение" + СуффиксСлужебногоСвойстваЛкс();
    СуффиксПодколонкиДляНеудобногоТипа = "_ЗначениеДляТипа" + СуффиксСлужебногоСвойстваЛкс();
    ЕстьКолонкиСНеудобнымТипом = Ложь;
    НеподдерживаемыеКолонки = Новый Массив;
    ПоддерживаемыеКолонки = Новый Массив;
    НачальноеЧислоКолонок = ТаблицаЗначений.Колонки.Количество();
    Для ИндексКолонки = 0 По НачальноеЧислоКолонок - 1 Цикл
        Колонка = ТаблицаЗначений.Колонки[НачальноеЧислоКолонок - ИндексКолонки - 1]; // Состав коллекции расширяется, но нам нужно обойти только начальный состав
        Если Ложь
            //Или Колонка.ТипЗначения.СодержитТип(Тип("Тип"))
            //Или Колонка.ТипЗначения.СодержитТип(Тип("МоментВремени"))
            Или Колонка.ТипЗначения.СодержитТип(Тип("ОписаниеТипов"))
            Или (Истина
                И ирКэш.НомерРежимаСовместимостиЛкс() < 803012 
                И Колонка.ТипЗначения.СодержитТип(Тип("УникальныйИдентификатор")))
        Тогда
            НеподдерживаемыеКолонки.Добавить(Колонка.Имя);
            ТекстВыбораПолей = ТекстВыбораПолей + ",
            |    НЕОПРЕДЕЛЕНО КАК " + Колонка.Имя;
        Иначе
            ПоддерживаемыеКолонки.Добавить(Колонка.Имя);
            Если Колонка.ТипЗначения.Типы().Количество() = 0 Тогда
                ТекстВыбораПолей = ТекстВыбораПолей + ",
                |    НЕОПРЕДЕЛЕНО КАК " + Колонка.Имя;
                ЕстьКолонкиСНеудобнымТипом = Истина;
            ИначеЕсли Ложь
                Или Колонка.ТипЗначения.СодержитТип(Тип("Тип"))
                Или Колонка.ТипЗначения.СодержитТип(Тип("МоментВремени"))
                Или Колонка.ТипЗначения.СодержитТип(Тип("Null"))
            Тогда 
                ЕстьКолонкиСНеудобнымТипом = Истина;
                ОписаниеТиповДляНеудобногоТипа = Неопределено;
                Если Колонка.ТипЗначения.СодержитТип(Тип("МоментВремени")) Тогда
                    ИмяНеудобногоТипа = "МоментВремени";
                    ИмяКолонкиЗначениеДляНеудобногоТипа = Колонка.Имя + СуффиксПодколонкиДляНеудобногоТипа;
                    ИмяКолонкиЗначениеДляНеудобногоТипаДата = Колонка.Имя + "_Дата" + СуффиксПодколонкиДляНеудобногоТипа;
                    ВыражениеНеудобногоТипа = "
                    |    ВЫБОР КОГДА Т." + ИмяКолонкиЗначениеДляНеудобногоТипа + ".Дата <> Т." + ИмяКолонкиЗначениеДляНеудобногоТипаДата + " 
                    |        ТОГДА 1/0
                    |        ИНАЧЕ Т." + ИмяКолонкиЗначениеДляНеудобногоТипа + ".МоментВремени
                    |    КОНЕЦ";
                    ТаблицаЗначений.Колонки.Добавить(ИмяКолонкиЗначениеДляНеудобногоТипаДата, Новый ОписаниеТипов("Дата"));
                    Если ТаблицаЗначений.Количество() = 0 Тогда
                        ТипыДокументов = Новый Массив;
                        ТипыДокументов.Добавить(Документы.ТипВсеСсылки().Типы()[0]);
                        ОписаниеТиповДляНеудобногоТипа = Новый ОписаниеТипов(ТипыДокументов);
                    КонецЕсли; 
                ИначеЕсли Колонка.ТипЗначения.СодержитТип(Тип("Тип")) Тогда 
                    ИмяНеудобногоТипа = "Тип";
                    ИмяКолонкиЗначениеДляНеудобногоТипа = Колонка.Имя + СуффиксПодколонкиДляНеудобногоТипа;
                    ВыражениеНеудобногоТипа = "ТипЗначения(Т." + ИмяКолонкиЗначениеДляНеудобногоТипа + ")";
                ИначеЕсли Колонка.ТипЗначения.СодержитТип(Тип("Null")) Тогда 
                    ИмяНеудобногоТипа = "Null";
                    ИмяКолонкиЗначениеДляНеудобногоТипа = Колонка.Имя + СуффиксПодколонкиДляНеудобногоТипа;
                    ВыражениеНеудобногоТипа = "NULL";
                Иначе
                    ВызватьИсключение "Неподдерживаемый тип";
                КонецЕсли; 
                ИмяКолонкиВыбораПодколонки = Колонка.Имя + СуффиксВыборПодколонки;
                ИмяКолонкиБезНеудобногоТипа = Колонка.Имя + СуффиксПодколонкиБезНеудобногоТипа;
                ТаблицаЗначений.Колонки.Добавить(ИмяКолонкиВыбораПодколонки, Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(Макс(10, СтрДлина(ИмяНеудобногоТипа)))));
                ОписаниеТиповКолонкиБезТипов = Новый ОписаниеТипов(Колонка.ТипЗначения,, ИмяНеудобногоТипа + ", Null");
                Если ОписаниеТиповКолонкиБезТипов.Типы().Количество() > 0 Тогда
                    ТаблицаЗначений.Колонки.Добавить(ИмяКолонкиБезНеудобногоТипа, ОписаниеТиповКолонкиБезТипов);
                    ВыражениеБезНеудобногоТипа = "Т." + ИмяКолонкиБезНеудобногоТипа;
                Иначе
                    ВыражениеБезНеудобногоТипа = "НЕОПРЕДЕЛЕНО";
                КонецЕсли; 
                ТаблицаЗначений.Колонки.Добавить(ИмяКолонкиЗначениеДляНеудобногоТипа, ОписаниеТиповДляНеудобногоТипа);
                ТекстВыбораПолей = ТекстВыбораПолей + ",
                |    ВЫБОР КОГДА Т." + ИмяКолонкиВыбораПодколонки + " = """ + ИмяНеудобногоТипа + """
                |            ТОГДА " + ВыражениеНеудобногоТипа + "
                |        КОГДА Т." + ИмяКолонкиВыбораПодколонки + " = ""Null""
                |            ТОГДА NULL
                |        ИНАЧЕ " + ВыражениеБезНеудобногоТипа + "
                |    КОНЕЦ КАК " + Колонка.Имя;
                Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
                    ЗначениеКолонки = СтрокаТаблицы[Колонка.Имя];
                    Если ТипЗнч(ЗначениеКолонки) = Тип(ИмяНеудобногоТипа) Тогда
                        Если ТипЗнч(ЗначениеКолонки) = Тип("МоментВремени") Тогда
                            СтрокаТаблицы[ИмяКолонкиЗначениеДляНеудобногоТипаДата] = ЗначениеКолонки.Дата;
                            ЗначениеКолонки = ЗначениеКолонки.Ссылка;
                        ИначеЕсли ТипЗнч(ЗначениеКолонки) = Тип("Тип") Тогда
                            Типы = Новый Массив;
                            Типы.Добавить(ЗначениеКолонки);
                            ОписаниеТипов = Новый ОписаниеТипов(Типы);
                            ЗначениеКолонки = ОписаниеТипов.ПривестиЗначение();
                        ИначеЕсли ТипЗнч(ЗначениеКолонки) = Тип("NULL") Тогда
                            ЗначениеКолонки = Неопределено;
                        Иначе
                            ВызватьИсключение "Неподдерживаемый тип";
                        КонецЕсли; 
                        СтрокаТаблицы[ИмяКолонкиВыбораПодколонки] = ИмяНеудобногоТипа;
                        СтрокаТаблицы[ИмяКолонкиЗначениеДляНеудобногоТипа] = ЗначениеКолонки;
                    ИначеЕсли ЗначениеКолонки = Null Тогда 
                        // Моноколонку с типом NULL тоже невозможно поместить во временную таблицу из таблицы-параметра
                        СтрокаТаблицы[ИмяКолонкиВыбораПодколонки] = "Null";
                    Иначе
                        СтрокаТаблицы[ИмяКолонкиБезНеудобногоТипа] = ЗначениеКолонки;
                    КонецЕсли; 
                КонецЦикла;
                ТаблицаЗначений.Колонки.Удалить(Колонка.Имя);
            Иначе
                ТекстВыбораПолей = ТекстВыбораПолей + ",
                |    Т." + Колонка.Имя + " КАК " + Колонка.Имя;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    ПоддерживаемыеКолонки = ирОбщий.СтрСоединитьЛкс(ПоддерживаемыеКолонки);
    Если ЕстьКолонкиСНеудобнымТипом Тогда
        ТаблицаЗначений = СузитьТипыКолонокТаблицыБезПотериДанныхЛкс(ТаблицаЗначений, Истина);
        #Если Сервер И Не Сервер Тогда
            ТаблицаЗначений = Новый ТаблицаЗначений;
        #КонецЕсли
        ИмяСлужебнойТаблицы = "_Т" + СуффиксСлужебногоСвойстваЛкс();
        ТекстЗапросаПодготовки = "
        |ВЫБРАТЬ " + ПоддерживаемыеКолонки + " ПОМЕСТИТЬ " + ИмяСлужебнойТаблицы + " ИЗ &" + ИмяТаблицы + " КАК Т;
        |ВЫБРАТЬ " + Сред(ТекстВыбораПолей, 2) + "
        |ПОМЕСТИТЬ " + ИмяТаблицы + " ИЗ " + ИмяСлужебнойТаблицы + " КАК Т;
        |УНИЧТОЖИТЬ " + ИмяСлужебнойТаблицы + "";
    Иначе
        ТекстЗапросаПодготовки = "
        |ВЫБРАТЬ " + Сред(ТекстВыбораПолей, 2) + "
        |ПОМЕСТИТЬ " + ИмяТаблицы + " ИЗ &" + ИмяТаблицы + " КАК Т";
    КонецЕсли;  
    Если НеподдерживаемыеКолонки.Количество() > 0 Тогда
        ТаблицаЗначений = ТаблицаЗначений.Скопировать(, ПоддерживаемыеКолонки);
    КонецЕсли;
    Запрос.Параметры.Вставить(ИмяТаблицы, ТаблицаЗначений);
    Если НеподдерживаемыеКолонки.Количество() Тогда
        // https://partners.v8.1c.ru/forum/t/1570237/m/1570237
        СообщитьЛкс(СтрШаблонИменЛкс("Невозможно восстановить колонки таблицы %1 из-за недопустимых типов (МоментВремени, УникальныйИдентификатор, Тип, ОписаниеТипов): %2",,
            ИмяТаблицы, 2, ирОбщий.СтрСоединитьЛкс(НеподдерживаемыеКолонки)), СтатусСообщения.Внимание);
    КонецЕсли;
    Если ЗначениеЗаполнено(ТекстЗапросаПодготовки) Тогда
        Запрос.Текст = ТекстЗапросаПодготовки;
        Попытка
            Запрос.Выполнить();
        Исключение
            Причина = ОписаниеОшибки();
            Если Ложь
                Или СтрНайтиЛкс(Причина, "деление на ноль",,,, Ложь) 
                Или СтрНайтиЛкс(Причина, "division by zero",,,, Ложь)
            Тогда
                Причина = "Присутствует момент времени, дата в котором не совпадает с датой документа";
            КонецЕсли; 
            СообщитьЛкс(СтрШаблонИменЛкс("Ошибка восстановления временной таблицы %1: " + Причина,, ИмяТаблицы), СтатусСообщения.Внимание);
        КонецПопытки; 
    КонецЕсли; 
    Запрос.Параметры.Удалить(ИмяТаблицы);

КонецПроцедуры