// =============================== Процедура УложитьТаблицуЗначений(ТаблицаЗначений,ИмяВиртТаблицы,Постоянная = 0) Экспорт //ТаблицаЗначений//:ТаблицаЗначений Если ТипЗначенияСтр(ТаблицаЗначений) <> "ТаблицаЗначений" Тогда Возврат; КонецЕсли; Если ТаблицаЗначений.КоличествоСтрок() = 0 Тогда ТаблицаЗначений.НоваяСтрока(); КонецЕсли; Если (РежимОтладки = 1) или (РежимОтладки = 3) Тогда РежимОтладкиЗапроса = 1; Иначе РежимОтладкиЗапроса = 0; КонецЕсли; Если ЭтоSQL = 1 Тогда Если Лев(ИмяВиртТаблицы, 1) = "#" Тогда ТекстЗапроса = " |IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb..%tmp')) | DROP TABLE %tmp |CREATE TABLE %tmp ("; Иначе ТекстЗапроса = " |IF EXISTS(SELECT * FROM sysobjects WHERE id = object_id('%tmp')) | DROP TABLE %tmp |CREATE TABLE %tmp ("; КонецЕсли; ИначеЕсли ЭтоSQL = 0 Тогда ТекстЗапроса = " |CREATE TABLE IF NOT EXISTS %tmp ("; КонецЕсли; Для НомерКолонки = 1 По ТаблицаЗначений.КоличествоКолонок() Цикл Тип = ""; Длина = 0; Заголовок = ""; Точность = 0; ИмяКолонки = ТаблицаЗначений.ПолучитьПараметрыКолонки(НомерКолонки,Тип,Длина,Точность,Заголовок); Если ПустоеЗначение(Тип) = 1 Тогда Модификатор = 0; Иначе Если (Врег(Тип) = "СПРАВОЧНИК") или (Врег(Тип) = "ДОКУМЕНТ") или (Врег(Тип) = "СЧЕТ") или (Врег(Тип) = "ПЕРЕЧИСЛЕНИЕ") Тогда Модификатор = 1; Иначе Модификатор = 0; КонецЕсли; КонецЕсли; Если Врег(Лев(СокрЛП(Заголовок),4)) = Врег("mod=") Тогда Модификатор = Число(Прав(СокрЛП(Заголовок),1)); КонецЕсли; Если Врег(Тип) = "СТРОКА" Тогда Длина = ?(Длина = 0, 1024, Длина); Модификатор = 0; ТипSQL = "VARCHAR("+Длина+")"; ИначеЕсли Врег(Тип) = "ЧИСЛО" Тогда Длина = ?(ПустоеЗначение(Длина) = 1,38,Длина); Точность = ?(ПустоеЗначение(Точность) = 1,0,Точность); Модификатор = 0; ТипSQL = "NUMERIC("+Длина+","+Точность+")"; ИначеЕсли Врег(Тип) = Врег("Дата") Тогда Длина = 8; Модификатор = 0; ТипSQL = ?(ЭтоSQL = 1,"DATETIME","DATE"); Иначе Если Модификатор = 0 Тогда Длина = 9; ТипSQL = "CHAR(9)" ИначеЕсли Модификатор = 1 Тогда Длина = 13; ТипSQL = "CHAR(13)" ИначеЕсли Модификатор = 2 Тогда Длина = 23; ТипSQL = "CHAR(23)" Иначе Модификатор = 0; Длина = 9; ТипSQL = "CHAR(9)" КонецЕсли; КонецЕсли; ТаблицаЗначений.УстановитьПараметрыКолонки(НомерКолонки,,,,,"mod="+Модификатор); Колонка = ИмяКолонки+" "+ТипSQL; ТекстЗапроса = ТекстЗапроса + ?(НомерКолонки = 1,"",", ") + Колонка; // + ?(НомерКолонки = 1," PRIMARY KEY CLUSTERED","") КонецЦикла; Если ЭтоSQL = 0 Тогда ИмяВиртТаблицы = СтрЗаменить(ИмяВиртТаблицы,"#","vt_"); КонецЕсли; ТекстЗапроса = ТекстЗапроса + ")"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"%tmp",ИмяВиртТаблицы); Если ЭтоSQL = 1 Тогда ЗапросODBC.Отладка(РежимОтладкиЗапроса); ЗапросODBC.ВыполнитьИнструкцию(ТекстЗапроса); ИначеЕсли ЭтоSQL = 0 Тогда ЗапросSQLite.Отладка(РежимОтладкиЗапроса); ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "INSERT INTO "+ИмяВиртТаблицы; ТаблицаЗначений.ВыбратьСтроки(); Пока ТаблицаЗначений.ПолучитьСтроку() = 1 Цикл ТекстЗапроса = ТекстЗапроса + " |"+?(СтрКоличествоСтрок(ТекстЗапроса) = 1,"","UNION ALL ")+"SELECT "; Для НомерКолонки = 1 По ТаблицаЗначений.КоличествоКолонок() Цикл Тип = ""; Длина = 0; Заголовок = ""; Точность = 0; ИмяКолонки = ТаблицаЗначений.ПолучитьПараметрыКолонки(НомерКолонки,Тип,Длина,Точность,Заголовок); ЗначениеКолонки = ТаблицаЗначений.ПолучитьЗначение(ТаблицаЗначений.НомерСтроки,НомерКолонки); Модификатор = ""; ТаблицаЗначений.ПолучитьПараметрыКолонки(НомерКолонки,,,,Модификатор); Модификатор = Число(Прав(СокрЛП(Модификатор),1)); Если Врег(Тип) = "ЧИСЛО" Тогда Значение = Формат(СокрЛП(ЗначениеКолонки),"Ч"+Длина+"."+Точность); ИначеЕсли ВРЕГ(Тип) = "СТРОКА" Тогда Значение = "'" + ЗначениеКолонки + "'"; ИначеЕсли ВРЕГ(Тип) = "ДАТА" Тогда Значение = "'" + МетаДата.ПолучитьСтрИзДаты(ЗначениеКолонки) + "'"; ИначеЕсли Модификатор = 0 Тогда Значение = "'" + МетаДата.ЗначениеВСтрокуБД(ЗначениеКолонки) + "'"; ИначеЕсли Модификатор = 1 Тогда Значение = "'" + МетаДата.ЗначениеВДлиннуюСтрокуБД(ЗначениеКолонки) + "'"; ИначеЕсли Модификатор = 2 Тогда Значение = "'" + МетаДата.ЗначениеВСамуюДлиннуюСтрокуБД(ЗначениеКолонки) + "'"; КонецЕсли; ТекстЗапроса = ТекстЗапроса + ?(НомерКолонки = 1,"",", ") + Значение; КонецЦикла; Если ТаблицаЗначений.НомерСтроки%100 = 1 Тогда Если ЭтоSQL = 1 Тогда ЗапросODBC.Отладка(РежимОтладкиЗапроса); ЗапросODBC.ВыполнитьИнструкцию(ТекстЗапроса); ИначеЕсли ЭтоSQL = 0 Тогда ЗапросSQLite.Отладка(РежимОтладкиЗапроса); ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса); КонецЕсли; ТекстЗапроса = "INSERT INTO "+ИмяВиртТаблицы; КонецЕсли; КонецЦикла; Если СтрКоличествоСтрок(ТекстЗапроса) > 1 Тогда Если ЭтоSQL = 1 Тогда ЗапросODBC.Отладка(РежимОтладкиЗапроса); ЗапросODBC.ВыполнитьИнструкцию(ТекстЗапроса); ИначеЕсли ЭтоSQL = 0 Тогда ЗапросSQLite.Отладка(РежимОтладкиЗапроса); ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса); КонецЕсли; КонецЕсли; КонецПроцедуры