// Возвращает результат запроса в таблице значений.
//
// Параметры:
// Connection - COMОбъект("ADODB.Connection"), коннект к бд (необязательный).
// SQLText - текст, текст запроса.
// ДанныеДляПодключения - структура, формируется в СоздатьДанныеДляПодключения() (необязательный).
//
Функция ПолучитьРезультатЗапроса(SQLText, ДанныеДляПодключения = Неопределено, Connection = Неопределено) Экспорт
Если Connection = Неопределено Тогда
Connection = НовоеСоединениеССУБД(ДанныеДляПодключения);
КонецЕсли;
RecordSet = Новый ComObject("ADODB.RecordSet");
RecordSet.CursorLocation = 3;
RecordSet.LockType = 3;
Попытка
RecordSet.Open(SQLText, Connection);
ТЗ = Новый ТаблицаЗначений;
КоличествоПолей = RecordSet.Fields.Count;
Для НомерСтолбца = 0 По КоличествоПолей - 1 Цикл // Создание и добавление колонок во временную таблицу
ИмяСтолбца = RecordSet.Fields.Item(НомерСтолбца).Name;
ТЗ.Колонки.Добавить(RecordSet.Fields.Item(НомерСтолбца).Name, SQLТипВ1СТип(RecordSet.Fields.Item(НомерСтолбца).Type, RecordSet.Fields.Item(НомерСтолбца).DefinedSize));
КонецЦикла;
Пока НЕ RecordSet.EOF Цикл // Заполнение созданной таблицы
НоваяСтрока = ТЗ.Добавить();
Для ПолеСч = 0 По КоличествоПолей - 1 Цикл
Поле = RecordSet.Fields.item(ПолеСч);
НоваяСтрока[Поле.name] = Поле.Value;
КонецЦикла;
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Запрос в SQL базу " + ДанныеДляПодключения.ИмяБД + "'"), УровеньЖурналаРегистрации.Ошибка, , , "Ошибка выполнения запроса: " + SQLText + Символы.ПС + ОписаниеОшибки());
ТЗ = Неопределено;
КонецПопытки;
Возврат ТЗ;
КонецФункции
Функция НовоеСоединениеССУБД(ДанныеДляПодключения) Экспорт
Con = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=SQLOLEDB; Data Source=" + ДанныеДляПодключения.АдресСервера + ";Initial Catalog="
+ ДанныеДляПодключения.ИмяБД + ";Persist Security Info=True;User ID=" + ДанныеДляПодключения.Логин + ";Password=" + ДанныеДляПодключения.Пароль;
Попытка
Con.ConnectionTimeOut = 15;
Con.CommandTimeout = 220;
Con.Open(СтрокаПодключения);
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Соединение с SQL базой " + ДанныеДляПодключения.ИмяБД + "'"), УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Con = Неопределено;
КонецПопытки;
Возврат Con;
КонецФункции
Функция SQLТипВ1СТип(Num, size)
ПараметрыСтроки = Новый КвалификаторыСтроки(size);
Если
Num = 20 Тогда
Возврат Новый ОписаниеТипов("Число");
ИначеЕсли
Num = 128 Тогда
Возврат Новый ОписаниеТипов("Булево");
ИначеЕсли
Num = 8 Тогда
Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
ИначеЕсли
Num = 136 Тогда
Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
ИначеЕсли
Num = 129 Тогда
Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
ИначеЕсли
Num = 7 Тогда
Возврат Новый ОписаниеТипов("Дата");
ИначеЕсли
Num = 133 Тогда
Возврат Новый ОписаниеТипов("Дата");
ИначеЕсли
Num = 134 Тогда
Возврат Новый ОписаниеТипов("Дата");
ИначеЕсли
Num = 135 Тогда
Возврат Новый ОписаниеТипов("Дата");
ИначеЕсли
Num = 14 Тогда
Возврат Новый ОписаниеТипов("Число");
ИначеЕсли
Num = 0 Тогда
Возврат Новый ОписаниеТипов("Строка, , , , ПараметрыСтроки"); // adEmpty 0 no value
ИначеЕсли
Num = 3 Тогда
Возврат Новый ОписаниеТипов("Число"); // adInteger 3 4 - byte signed integer
ИначеЕсли
Num = 205 Тогда
Возврат Новый ОписаниеТипов("Строка, , , , ПараметрыСтроки"); // adLongVarBinary 205 Long binary value
ИначеЕсли
Num = 201 Тогда
Возврат Новый ОписаниеТипов("Строка, , , , ПараметрыСтроки"); // adLongVarChar 201 Long string value
ИначеЕсли
Num = 203 Тогда
Возврат Новый ОписаниеТипов("Строка, , , , ПараметрыСтроки"); // adLongVarWChar 203 Long Null - terminates string value
ИначеЕсли
Num = 131 Тогда
Возврат Новый ОписаниеТипов("Число"); // adNumeric 131 Number with fixed precision and scale
ИначеЕсли
Num = 5 Тогда
Возврат Новый ОписаниеТипов("Число");
ИначеЕсли
Num = 4 Тогда
Возврат Новый ОписаниеТипов("Число"); // adSingle 4 Single - precision floating - point value
ИначеЕсли
Num = 2 Тогда
Возврат Новый ОписаниеТипов("Число"); // adSmallInt 2 2 - byte signed integer
ИначеЕсли
Num = 16 Тогда
Возврат Новый ОписаниеТипов("Число"); // adTinyInt 16 1 - byte signed integer
ИначеЕсли
Num = 21 Тогда
Возврат Новый ОписаниеТипов("Число"); // adUnsignedBigInt 21 8 - byte unsigned integer
ИначеЕсли
Num = 19 Тогда
Возврат Новый ОписаниеТипов("Число"); // adUnsignedInt 19 4 - byte unsigned integer
ИначеЕсли
Num = 18 Тогда
Возврат Новый ОписаниеТипов("Число"); // adUnsignedSmallInt 18 2 - byte unsigned integer
ИначеЕсли
Num = 17 Тогда
Возврат Новый ОписаниеТипов("Число"); // adUnsignedTinyInt 17 1 - byte unsigned integer
ИначеЕсли
Num = 132 Тогда
Возврат Новый ОписаниеТипов("Число"); // adUserDefined 132 User - defined variable
ИначеЕсли
Num = 204 Тогда
Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adVarBinary 204 Binary value
ИначеЕсли
Num = 12 Тогда
Возврат Новый ОписаниеТипов("Число"); // adVariant 12 Automation variant
ИначеЕсли
Num = 139 Тогда
Возврат Новый ОписаниеТипов("Число"); // adVarNumeric 139 Variable width exact numeric with signed scale
ИначеЕсли
Num = 202 Тогда
Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adVarWChar 202 Null - terminated Unicode character string
ИначеЕсли
Num = 130 Тогда
Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adWChar 130
ИначеЕсли
Num = 200 Тогда
Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
Иначе
Возврат Новый ОписаниеТипов("Строка");
КонецЕсли;
КонецФункции
// Возвращает структуру с данными для НовоеСоединениеССУБД().
//
// Параметры:
// АдресСервера - текст, адрес сервера.
// ИмяБД - текст, текст имя базы данных.
// Логин - текст, логин.
// Пароль - текст, пароль.
//
Функция СоздатьДанныеДляПодключения(АдресСервера, ИмяБД, Логин, Пароль) Экспорт
ДанныеДляПодключения = Новый Структура("АдресСервера, ИмяБД, Логин, Пароль", АдресСервера, ИмяБД, Логин, Пароль);
Возврат ДанныеДляПодключения;
КонецФункции
Автор: ildarovich
СтрСоединить(СтрРазделить(СтрокаСЦифрами, СтрСоединить(СтрРазделить(СтрокаСЦифрами, "0123456789"))))
// Если список ненужных символов известен, например, "(", ")" и "-", то выражение может быть еще короче:
СтрСоединить(СтрРазделить(СтрокаСЦифрами, "()-"))
Функция УдалитьПространство(хмл) //хмл - полное имя файла
Х = Новый COMОбъект("Msxml2.DOMDocument.6.0");
х.async = 0;
х.validateOnParse = 0;
х.resolveExternals=0;
х.load(хмл);
xslDoc= Новый COMОбъект("MSXML2.DOMDocument.6.0");
xslDoc.async = 0;
xslDoc.loadXML("<?xml version=""1.0"" encoding=""utf-8""?>
|<xsl:stylesheet version=""1.0""
| xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
| <xsl:output method=""xml"" encoding=""UTF-8"" indent=""no""/>
| <xsl:template match=""/|comment()|processing-instruction()"">
| <xsl:copy>
|<!-- go process children (applies to root node only) -->
| <xsl:apply-templates/>
| </xsl:copy>
| </xsl:template>
| <xsl:template match=""*"">
| <xsl:element name=""{local-name()}"">
| <!-- go process attributes and children -->
| <xsl:apply-templates select=""@*[name(.)!='type']|node()""/>
| </xsl:element>
|<xsl:text>
|</xsl:text>
| </xsl:template>
|
| <xsl:template match=""@*"">
| <xsl:attribute name=""{local-name()}"">
| <xsl:value-of select="".""/>
| </xsl:attribute>
| </xsl:template>
|</xsl:stylesheet>
|");
xmlDoc= Новый COMОбъект("MSXML2.DOMDocument.6.0");
// XML = xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""");
х.transformNodeToObject(xslDoc, xmlDoc);
//xmlDoc.insertBefore(XML,);
xslDoc=0;
х=0;
xmlDoc.save(хмл);
xmlDoc=0;
Возврат 1;
КонецФункции // УдалитьПространство()
DECLARE @SqlText VARCHAR(max) = ''
SELECT @SqlText += 'alter database ['+name+'] set recovery simple' + ';' + CHAR(10) + CHAR(13)
from master.sys.databases
where database_id > 4 and state_desc = 'online' AND recovery_model_desc <> 'SIMPLE'
PRINT @SqlText
EXEC (@SqlText)
Процедура ДобавитьКнопкуНаФормуВПанель(Форма) Экспорт
НоваяКоманда =Форма.Команды.Добавить("ФормаКоманднаяПанель_КомандаМояКоманда");
НоваяКоманда.Действие="Подключаемый_ВыполнитьКоманду";
Кнопка =Форма.Элементы.Добавить("МояКнопка", Тип("КнопкаФормы"), Форма.Элементы.ФормаКоманднаяПанель);
Кнопка.Заголовок ="Заголовок кнопки";
Кнопка.ИмяКоманды ="ФормаКоманднаяПанель_КомандаМояКоманда";
КонецПроцедуры
&НаСервереБезКонтекста
Функция ТаблицуЗначенийВМассив(ТаблЗнач)
Результат=Новый Массив;
Для Каждого ТекСтр Из ТаблЗнач Цикл
СтруктураСтроки=Новый Структура;
Для Каждого ТекКол Из ТаблЗнач.Колонки Цикл
СтруктураСтроки.Вставить(ТекКол.Имя,ТекСтр[ТекКол.Имя])
КонецЦикла;
Результат.Добавить(СтруктураСтроки)
КонецЦикла;
Возврат Результат
КонецФункции
&НаСервере
Процедура ВывестиДзНаФорму(ДеревоОбъект)
// Создание Реквизита формы типа ДанныеФормыДерево
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево",
Новый ОписаниеТипов("ДеревоЗначений")));
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
МассивДобавляемыхРеквизитов.Добавить(
Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево"));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Преобразование объекта прикладного типа ДеревоЗначений
// в реквизит управляемой формы (данные формы)
ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");
// Создание элемента формы типа ТаблицаФормы для отображения дерева
ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
ЭлементДерево.ПутьКДанным = "Дерево";
ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;
Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"),
ЭлементДерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
КонецЦикла;
КонецПроцедуры
Процедура СоздатьНовогоПользователя(Имя, Пароль)
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы.НайтиПоИмени(Имя);
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
//В списке выбора не показываем
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Имя = Имя;
ОписаниеПользователяИБ.Пароль = Пароль;
НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
НовыйПользователь.Имя = Имя;
НовыйПользователь.Код = Имя;
НовыйПользователь.Недействителен = ложь;
НовыйПользователь.ДополнительныеСвойства.Вставить(
"ОписаниеПользователяИБ", ОписаниеПользователяИБ);
Попытка
НовыйПользователь.Записать();
ДобавитьРолиНовомуПользователю(НовыйПользователь.Имя);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка создания нового пользователя" + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьРолиНовомуПользователю(Имя);
Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(Имя);
Пользователь.Роли.Добавить(Метаданные.Роли.АдминистраторСистемы);
Пользователь.Роли.Добавить(Метаданные.Роли.ПолныеПрава);
Пользователь.Записать();
КонецПроцедуры
//На клиенте
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = "Выберите файл";
Если ДиалогВыбора.Выбрать() Тогда
ИмяФайла = ДиалогВыбора.ПолноеИмяФайла;
Команда1НаСервере(ИмяФайла);
КонецЕсли;
//На сервере
//Вывод в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
//вывод в таблицу значений
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТаблицаЗначений = ПЗ.Результат.Выгрузить();
&НаСервере
Процедура КомандаВыполнитьНаСервере()
ИмяФайла = "d:\test.xml";
Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ");
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла,"UTF-8");
ВыборкаРезультата = Запрос.Выполнить().Выгрузить();
ЗаписьXML.ЗаписатьНачалоЭлемента("Номенклатура");
Для каждого Выборка Из ВыборкаРезультата Цикл
ЗаписатьXML(ЗаписьXML, Выборка.Номенклатура.ПолучитьОбъект());
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
КонецПроцедуры
Функция СодержитДанные(ЗначениеДляПроверки) Экспорт
Результат = Ложь;
Если ЗначениеДляПроверки <> Неопределено Тогда
Если ТипЗнч(ЗначениеДляПроверки) = Тип("ТаблицаЗначений")
Или ТипЗнч(ЗначениеДляПроверки) = Тип("Массив")
Или ТипЗнч(ЗначениеДляПроверки) = Тип("СписокЗначений")
Тогда
Если ЗначениеДляПроверки.Количество() > 0 Тогда
Результат = Истина;
КонецЕсли;
Иначе
Результат = ЗначениеЗаполнено(ЗначениеДляПроверки);
КонецЕсли
КонецЕсли;
Возврат Результат;
КонецФункции
НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаДата", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.Дата));
НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаЧисло", ОбщегоНазначения.ОписаниеТипаЧисло(12));
НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаСтрока", ОбщегоНазначения.ОписаниеТипаСтрока(100));
НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаСсылка", ОбщегоНазначения.ОписаниеТипаВсеСсылки());