Процедура СоздатьВременнуюТаблицуЗапросаИзТаблицыЗначенийЛкс(Запрос, ТаблицаЗначений, Знач ИмяТаблицы) Экспорт #Если Сервер И Не Сервер Тогда ТаблицаЗначений = Новый ТаблицаЗначений; #КонецЕсли ТаблицаЗначений = СузитьТипыКолонокТаблицыБезПотериДанныхЛкс(ТаблицаЗначений, Истина,,,,,,, Истина); #Если Сервер И Не Сервер Тогда ТаблицаЗначений = Новый ТаблицаЗначений; Запрос = Новый Запрос; #КонецЕсли ТекстВыбораПолей = ""; СуффиксВыборПодколонки = "_ВыборПодколонки" + СуффиксСлужебногоСвойстваЛкс(); СуффиксПодколонкиБезНеудобногоТипа = "_Значение" + СуффиксСлужебногоСвойстваЛкс(); СуффиксПодколонкиДляНеудобногоТипа = "_ЗначениеДляТипа" + СуффиксСлужебногоСвойстваЛкс(); ЕстьКолонкиСНеудобнымТипом = Ложь; НеподдерживаемыеКолонки = Новый Массив; ПоддерживаемыеКолонки = Новый Массив; НачальноеЧислоКолонок = ТаблицаЗначений.Колонки.Количество(); Для ИндексКолонки = 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: " + Причина,, ИмяТаблицы), СтатусСообщения.Внимание); КонецПопытки; КонецЕсли; Запрос.Параметры.Удалить(ИмяТаблицы); КонецПроцедуры