From a89c3603aded829c75c793d83983f39c4fa72a80 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Wed, 18 May 2022 15:15:31 +0300 Subject: [PATCH 01/38] =?UTF-8?q?feat:=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D1=82=D1=80=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=B0=20=D0=BA=20=D0=A1=D0=A3=D0=91=D0=94;=20=D0=94=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0=20=D0=BA=20=D0=A1?= =?UTF-8?q?=D0=A3=D0=91=D0=94=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=B2=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\232\320\241\320\243\320\221\320\224.os" | 21 ++++++++---- ...20\241\320\241\320\243\320\221\320\224.os" | 34 +++++++++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" index bb1aa29..5c8fbf5 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" @@ -880,10 +880,6 @@ КонецФункции // ДоступностьФункционалаСУБД() -#КонецОбласти // ПрограммныйИнтерфейс - -#Область СлужебныеПроцедурыИФункции - // Функция выполняет запрос к СУБД (используется консольная утилита sqlcmd) // // Параметры: @@ -891,11 +887,12 @@ // ОписаниеРезультата - Строка - результат выполнения команду // Разделитель - Строка - символ - разделитель колонок результата // УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата +// РезультатИзФайла - Булево - Истина - использовать вывод в файл для получения результата // // Возвращаемое значение: // Булево - Истина - команда выполнена успешно // -Функция ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата = "", Разделитель = "", УбратьПробелы = Ложь) +Функция ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата = "", Разделитель = "", УбратьПробелы = Ложь) Экспорт Лог.Отладка("Текст запроса: %1", ТекстЗапроса); @@ -920,12 +917,20 @@ КомандаРК.ДобавитьПараметр("-W"); КонецЕсли; + КомандаРК.ДобавитьПараметр("-y 0"); + + ПутьКФайлуРезультата = ПолучитьИмяВременногоФайла(); + КомандаРК.ДобавитьПараметр(СтрШаблон("-o ""%1""", ПутьКФайлуРезультата)); + КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы( Ложь ); КомандаРК.ПоказыватьВыводНемедленно( Ложь ); КодВозврата = КомандаРК.Исполнить(); - ОписаниеРезультата = КомандаРК.ПолучитьВывод(); + ТекстРезультата = Новый ТекстовыйДокумент(); + ТекстРезультата.Прочитать(ПутьКФайлуРезультата); + ОписаниеРезультата = ТекстРезультата.ПолучитьТекст(); + УдалитьФайлы(ПутьКФайлуРезультата); Возврат КодВозврата; @@ -981,6 +986,10 @@ КонецФункции // ВыполнитьСкриптыЗапросСУБД() +#КонецОбласти // ПрограммныйИнтерфейс + +#Область СлужебныеПроцедурыИФункции + // Функция возвращает список полей таблицы информации о резервной копии // // Возвращаемое значение: diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" index 15cffd2..4241f69 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" @@ -617,6 +617,40 @@ КонецФункции // ВыполнитьСкрипты() +// Функция выполняет запрос к СУБД +// +// Параметры: +// ТекстЗапроса - Строка - текст исполняемого запроса +// РезультатИзФайла - Булево - Истина - использовать вывод в файл для получения результата +// УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата +// РезультатИзФайла - Булево - Истина - использовать вывод в файл для получения результата +// +// Возвращаемое значение: +// Строка - результат выполнения запроса +// +Функция ВыполнитьЗапрос(ТекстЗапроса, Разделитель = "", УбратьПробелы = Ложь) Экспорт + + ОписаниеРезультата = ""; + + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата, Разделитель, УбратьПробелы); + Если КодВозврата = 0 Тогда + Если ЗначениеЗаполнено(ОписаниеРезультата) Тогда + Лог.Отладка("Результат выполнения:%1%2", Символы.ПС, ОписаниеРезультата); + КонецЕсли; + Иначе + ТекстОшибки = СтрШаблон("Ошибка выполнения запроса ""%1"" на сервере ""%2"", код возврата %3: %4%5", + ТекстЗапроса, + ТекущийСервер, + КодВозврата, + Символы.ПС, + ОписаниеРезультата); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Возврат ОписаниеРезультата; + +КонецФункции // ВыполнитьЗапрос() + #КонецОбласти // ПрограммныйИнтерфейс #Область ОбработчикиСобытий From c22e950386c063d0f80529fd465b9a24072d5f00 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Wed, 18 May 2022 15:16:41 +0300 Subject: [PATCH 02/38] =?UTF-8?q?fix:=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=BA=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B5=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B8,=20=D0=B2=20lib.config=20=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=BE=20=D1=82=D0=B5=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D1=8B/=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8,=20=D0=BA?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B5=20=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=B7=20"=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D1=85"=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9/=D0=B1?= =?UTF-8?q?=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib.config | 42 ++---------------------------------------- src/lib.config | 42 ++---------------------------------------- 2 files changed, 4 insertions(+), 80 deletions(-) diff --git a/lib.config b/lib.config index c2af88c..6106faa 100644 --- a/lib.config +++ b/lib.config @@ -1,4 +1,5 @@ - + + @@ -7,43 +8,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/lib.config b/src/lib.config index a639a52..fc2e2d5 100644 --- a/src/lib.config +++ b/src/lib.config @@ -1,4 +1,5 @@ - + + @@ -7,43 +8,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 8ea1be3006083e2e741b9c53f722471d4c4e4d88 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 20 May 2022 10:28:39 +0300 Subject: [PATCH 03/38] =?UTF-8?q?refact:=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=81=D0=BB?= =?UTF-8?q?=D1=83=D0=B6=D0=B5=D0=B1=D0=BD=D0=B0=D1=8F=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=8F;=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2?= =?UTF-8?q?,=20=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20=D0=BD=D0=B5=20"=D1=81?= =?UTF-8?q?=D1=8A=D0=B5=D0=B7=D0=B6=D0=B0=D0=BB=D0=B0"=20=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=B0=D1=81=D0=BA=D0=B0;=20=D0=9F=D0=BE?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BA?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\232\320\241\320\243\320\221\320\224.os" | 37 +++++++++---------- ...20\241\320\241\320\243\320\221\320\224.os" | 3 +- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" index 5c8fbf5..78fa6be 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" @@ -69,7 +69,7 @@ |WHERE | name = '%1'; | - |SET NOCOUNT OFF""", + |SET NOCOUNT OFF"" ", База); РезультатЗапроса = ""; @@ -143,7 +143,7 @@ | FILENAME = '%2\%1_log.ldf'); | |ALTER DATABASE [%1] - |SET RECOVERY %3""", + |SET RECOVERY %3"" ", База, ПутьККаталогу, МодельВосстановления); @@ -153,7 +153,7 @@ |CREATE DATABASE [%1]; | |ALTER DATABASE [%1] - |SET RECOVERY %2""", + |SET RECOVERY %2"" ", База, МодельВосстановления); КонецЕсли; @@ -181,7 +181,7 @@ ТекстЗапроса = СтрШаблон("""USE [master]; | - |DROP DATABASE [%1]""", + |DROP DATABASE [%1]"" ", База); КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); @@ -212,7 +212,7 @@ | |WHERE name = '%1'; | - |SET NOCOUNT OFF;""", + |SET NOCOUNT OFF;"" ", База); РезультатЗапроса = ""; @@ -257,7 +257,7 @@ ТекстЗапроса = СтрШаблон("""USE [master]; | |ALTER DATABASE %1 - |SET RECOVERY %2""", + |SET RECOVERY %2"" ", База, ВРег(МодельВосстановления)); @@ -292,7 +292,7 @@ | |WHERE databases.name = '%1' | - |SET NOCOUNT OFF;""", + |SET NOCOUNT OFF;"" ", База); РезультатЗапроса = ""; @@ -377,7 +377,7 @@ ТекстЗапроса = СтрШаблон("""USE [%1]; | - |DBCC SHRINKFILE(N'%2', 0, TRUNCATEONLY); """, + |DBCC SHRINKFILE(N'%2', 0, TRUNCATEONLY); "" ", База, ЛогическоеИмяФайлаЖурнала); @@ -467,7 +467,7 @@ |NOREWIND, |NOUNLOAD, |COMPRESSION, - |STATS = 10""", + |STATS = 10"" ", База, ПутьКРезервнойКопии); @@ -533,7 +533,7 @@ |MOVE N'%5' TO N'%6\%1_log.ldf', |NOUNLOAD, REPLACE, STATS = 10; | - |ALTER DATABASE [%1] SET MULTI_USER""", + |ALTER DATABASE [%1] SET MULTI_USER"" ", База, ПутьКРезервнойКопии, ЛогическоеИмяФайлаДанных, @@ -588,8 +588,8 @@ |WHERE | [Type] = '%3'; | - |SET NOCOUNT OFF;""", - ПолучитьСписокПолейТаблицыФайловРезервнойКопии(), + |SET NOCOUNT OFF;"" ", + ПоляТаблицыФайловРезервнойКопии(), ПутьКРезервнойКопии, ВРег(ТипФайла)); @@ -646,7 +646,7 @@ | [database_id]=db_id('%1') | AND type_desc='%2'; | - |SET NOCOUNT OFF;""", + |SET NOCOUNT OFF;"" ", База, ТипФайла); @@ -690,7 +690,7 @@ ТекстЗапроса = СтрШаблон("""USE [master]; | |ALTER DATABASE [%1] - |MODIFY FILE (NAME = N'%2', NEWNAME = N'%3');""", + |MODIFY FILE (NAME = N'%2', NEWNAME = N'%3');"" ", База, Имя, НовоеИмя); @@ -737,7 +737,7 @@ | [database_id]=4 | AND type_desc='%1'; | - |SET NOCOUNT OFF;""", + |SET NOCOUNT OFF;"" ", ТипФайла); РезультатЗапроса = ""; @@ -782,7 +782,7 @@ | SERVERPROPERTY('Edition') AS Edition, | SERVERPROPERTY('ProductVersion') AS ProductVersion, | SERVERPROPERTY('ProductLevel') AS ProductLevel, - | @@VERSION AS FullVersion"""; + | @@VERSION AS FullVersion"" "; ОписаниеРезультата = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата, "|", Истина); @@ -887,7 +887,6 @@ // ОписаниеРезультата - Строка - результат выполнения команду // Разделитель - Строка - символ - разделитель колонок результата // УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата -// РезультатИзФайла - Булево - Истина - использовать вывод в файл для получения результата // // Возвращаемое значение: // Булево - Истина - команда выполнена успешно @@ -995,7 +994,7 @@ // Возвращаемое значение: // Строка - список полей таблицы с информацией о резервной копии (разделенный ",") // -Функция ПолучитьСписокПолейТаблицыФайловРезервнойКопии() +Функция ПоляТаблицыФайловРезервнойКопии() ОписаниеПолей = "[LogicalName] nvarchar(128), |[PhysicalName] nvarchar(260), @@ -1031,7 +1030,7 @@ Возврат ОписаниеПолей; -КонецФункции // ПолучитьСписокПолейТаблицыФайловРезервнойКопии() +КонецФункции // ПоляТаблицыФайловРезервнойКопии() // Функция возвращает список возможных типов файлов базы данных или таблиц резервной копии // diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" index 4241f69..f893284 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" @@ -621,9 +621,8 @@ // // Параметры: // ТекстЗапроса - Строка - текст исполняемого запроса -// РезультатИзФайла - Булево - Истина - использовать вывод в файл для получения результата +// Разделитель - Строка - символ - разделитель колонок результата // УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата -// РезультатИзФайла - Булево - Истина - использовать вывод в файл для получения результата // // Возвращаемое значение: // Строка - результат выполнения запроса From c1093f6fdba8221a721f91a6ba4d87b536054d26 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 20 May 2022 10:44:03 +0300 Subject: [PATCH 04/38] =?UTF-8?q?fix:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BD=D0=B0=D0=BB=D0=B8=D1=87=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=82=D0=B8=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B2=20=D1=80=D0=B5=D0=B7=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\232\320\241\320\243\320\221\320\224.os" | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" index 78fa6be..d8684a7 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" @@ -222,7 +222,9 @@ Если КодВозврата = 0 Тогда Разделитель = "---"; Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - РезультатЗапроса = ВРег(СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)))); + Если Поз > 0 Тогда + РезультатЗапроса = ВРег(СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)))); + КонецЕсли; Иначе РезультатЗапроса = Неопределено; КонецЕсли; @@ -302,7 +304,9 @@ Если КодВозврата = 0 Тогда Разделитель = "---"; Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; Иначе РезультатЗапроса = Неопределено; КонецЕсли; @@ -599,7 +603,9 @@ Если КодВозврата = 0 Тогда Разделитель = "---"; Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; КонецЕсли; Возврат РезультатЗапроса; @@ -656,7 +662,9 @@ Если КодВозврата = 0 Тогда Разделитель = "---"; Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; Иначе РезультатЗапроса = Неопределено; КонецЕсли; @@ -746,7 +754,9 @@ Если КодВозврата = 0 Тогда Разделитель = "---"; Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; ФайлБазы = Новый Файл(РезультатЗапроса); РезультатЗапроса = Сред(ФайлБазы.Путь, 1, СтрДлина(ФайлБазы.Путь) - 1); From 831a7fdc9918862613ccb1d3cc23d8149a5d0b4e Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 20 May 2022 11:45:01 +0300 Subject: [PATCH 05/38] =?UTF-8?q?fix:=20=D0=92=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8E=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BE=D0=BA=20sqlcmd.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...320\232\320\241\320\243\320\221\320\224.os" | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" index d8684a7..0a69e0c 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" @@ -829,7 +829,7 @@ Текст = Новый ТекстовыйДокумент(); Текст.УстановитьТекст(ОписаниеРезультата); - МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(СтрокаОписанияВерсии), "|"); + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(СтрокаОписанияВерсии), "|", Ложь); СтруктураРезультата.Вставить("ИмяСервера" , МассивЗначений[ИмяСервера]); СтруктураРезультата.Вставить("ИмяЭкземпляраСУБД", МассивЗначений[ИмяЭкземпляраСУБД]); @@ -924,10 +924,10 @@ Если УбратьПробелы Тогда КомандаРК.ДобавитьПараметр("-W"); + Иначе + КомандаРК.ДобавитьПараметр("-y 0"); КонецЕсли; - КомандаРК.ДобавитьПараметр("-y 0"); - ПутьКФайлуРезультата = ПолучитьИмяВременногоФайла(); КомандаРК.ДобавитьПараметр(СтрШаблон("-o ""%1""", ПутьКФайлуРезультата)); @@ -936,10 +936,14 @@ КодВозврата = КомандаРК.Исполнить(); - ТекстРезультата = Новый ТекстовыйДокумент(); - ТекстРезультата.Прочитать(ПутьКФайлуРезультата); - ОписаниеРезультата = ТекстРезультата.ПолучитьТекст(); - УдалитьФайлы(ПутьКФайлуРезультата); + Если ФС.Существует(ПутьКФайлуРезультата) Тогда + ТекстРезультата = Новый ТекстовыйДокумент(); + ТекстРезультата.Прочитать(ПутьКФайлуРезультата); + ОписаниеРезультата = ТекстРезультата.ПолучитьТекст(); + УдалитьФайлы(ПутьКФайлуРезультата); + Иначе + ОписаниеРезультата = КомандаРК.ПолучитьВывод(); + КонецЕсли; Возврат КодВозврата; From bb668e9c7862f4c6209a57185ac9f5d869da480e Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sat, 21 May 2022 13:47:07 +0300 Subject: [PATCH 06/38] =?UTF-8?q?fix:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=B5=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D0=BC?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D1=8B=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB?= =?UTF-8?q?=D1=8C=D1=82=D0=B0=D1=82=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=20=D0=BA=20=D0=A1=D0=A3=D0=91=D0=94.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" index 0a69e0c..9140c11 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" @@ -939,7 +939,7 @@ Если ФС.Существует(ПутьКФайлуРезультата) Тогда ТекстРезультата = Новый ТекстовыйДокумент(); ТекстРезультата.Прочитать(ПутьКФайлуРезультата); - ОписаниеРезультата = ТекстРезультата.ПолучитьТекст(); + ОписаниеРезультата = СокрЛП(ТекстРезультата.ПолучитьТекст()); УдалитьФайлы(ПутьКФайлуРезультата); Иначе ОписаниеРезультата = КомандаРК.ПолучитьВывод(); From d3f930e32d61d55e25c4c0b8398e472ec37083a3 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Wed, 25 May 2022 09:43:26 +0300 Subject: [PATCH 07/38] =?UTF-8?q?feat:=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BE=D0=BE=D1=82?= =?UTF-8?q?=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=91=D0=94=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=D0=BC=201=D0=A1=20(=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80?= =?UTF-8?q?=D1=8B=20=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=98=D0=91=201=D0=A1).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib.config | 1 + ...20\275\320\270\321\217\320\230\320\221.os" | 1089 +++++++++++++++++ ...276\320\262\320\221\320\2241\320\241.json" | 453 +++++++ src/lib.config | 1 + tests/ib-structure-tests.os | 359 ++++++ 5 files changed, 1903 insertions(+) create mode 100644 "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" create mode 100644 "src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" create mode 100644 tests/ib-structure-tests.os diff --git a/lib.config b/lib.config index 6106faa..a4c8b5a 100644 --- a/lib.config +++ b/lib.config @@ -2,6 +2,7 @@ + diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" new file mode 100644 index 0000000..d27e6eb --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -0,0 +1,1089 @@ +// ---------------------------------------------------------- +// This Source Code Form is subject to the terms of the +// Mozilla Public License, v.2.0. If a copy of the MPL +// was not distributed with this file, You can obtain one +// at http://mozilla.org/MPL/2.0/. +// ---------------------------------------------------------- +// Codebase: https://github.com/ArKuznetsov/cpdb/ +// ---------------------------------------------------------- + +#Использовать deflator + +Перем ПодключениеКСУБД; // - ПодключениеКСУБД - объект подключения к СУБД +Перем ТекущийСервер; // - Строка - адрес сервера СУБД +Перем База; // - Строка - адрес сервера СУБД + +Перем Лог; // - Объект - объект записи лога приложения + +#Область ПрограммныйИнтерфейс + +// Функция - возвращает версию формата конфигурации +// +// Возвращаемое значение: +// Структура - описание версии формата конфигурации +// *Версия - Число - номер версии формата конфигурации +// *ТребуемаяВерсияПлатформы - Строка - минимальная версия платформы 1С +// +Функция ВерсияФорматаКонфигурации() Экспорт + + Лог.Отладка("Получение версии формата конфигурации 1С базы ""%1\%2""", + ТекущийСервер, + База); + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | SELECT + | [IBVersion], + | [PlatformVersionReq] + | FROM %1.[dbo].[IBVersion]; + |SET NOCOUNT OFF;"" ", + База); + + РезультатЗапроса = ""; + + Попытка + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + Если КодВозврата = 0 Тогда + Лог.Отладка("Получена версия формата конфигурации 1С базы ""%1\%2""", + ТекущийСервер, + База); + Иначе + ТекстОшибки = СтрШаблон("Ошибка получения версия формата конфигурации 1С базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения версия формата конфигурации 1С базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + + СтруктураРезультата = Новый Структура(); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(1), "|", Ложь); + + СтруктураРезультата.Вставить("Версия", Число(МассивЗначений[0])); + СтруктураРезультата.Вставить("ТребуемаяВерсияПлатформы", МассивЗначений[1]); + + Возврат СтруктураРезультата; + +КонецФункции // ВерсияФорматаКонфигурации() + +// Функция - возвращает описание метаданных 1С для объекта СУБД по его имени +// +// Параметры: +// ИмяОбъекта - Строка - Имя таблицы или поля таблицы СУБД +// +// Возвращаемое значение: +// Структура - описание метаданных 1С по имени объекта СУБД +// +Функция ОписаниеМетаданныхОбъектаБД1С(Знач ИмяОбъекта) Экспорт + + УбратьЛидирующееПодчеркивание(ИмяОбъекта); + + ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(ИмяОбъекта); + + ДобавлятьКолонки = Ложь; + + Если ВРег(ОписаниеОбъектаБазы.Префикс) = "FLD" Тогда + КолонкиБазыДанных = КолонкиБазыДанных(, СтрШаблон("%%%1%%", ИмяОбъекта)); + Если КолонкиБазыДанных.Количество() > 0 Тогда + ОписаниеОбъектаБазы = КолонкиБазыДанных[ИмяОбъекта]; + Иначе + Возврат Неопределено; + КонецЕсли; + ДобавлятьКолонки = Истина; + КонецЕсли; + + СоответствиеИдМетаданныхИменамТаблиц = СоответствиеИдМетаданныхИменамТаблиц(ДобавлятьКолонки); + + ОписаниеВладельца = ОписаниеОбъектаБазы; + Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл + ОписаниеВладельца.Вставить("Ид", СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид); + ОписаниеВладельца = ОписаниеВладельца.Владелец; + КонецЦикла; + ОписаниеВладельца.Вставить("Ид", СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид); + + СоответствиеИменМетаданных = СоответствиеИменМетаданных(ОписаниеВладельца.Ид); + + ОписаниеВладельца.Вставить("ИмяМетаданных", СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных); + + ТекОписание = ОписаниеОбъектаБазы; + Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл + ИмяМетаданных = ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Содержимое, ТекОписание.Ид); + ТекОписание.Вставить("ИмяМетаданных", ИмяМетаданных); + ТекОписание = ТекОписание.Владелец; + КонецЦикла; + + Возврат ОписаниеОбъектаБазы; + +КонецФункции // ОписаниеМетаданныхОбъектаБД1С() + +// Функция - возвращает описание метаданных 1С для таблиц СУБД +// +// Параметры: +// ИмяОбъекта - Строка - Имя таблицы СУБД +// ДобавлятьКолонки - Строка - Истина - будет добавлена информация для колонок таблиц +// +// Возвращаемое значение: +// Соответствие - соответствия имен таблиц СУБД и описаний метаданных +// +Функция ОписаниеМетаданныхОбъектовБД1С(ДобавлятьКолонки = Ложь) Экспорт + + ОписанияМетаданных = Новый Соответствие(); + + СоответствиеИдМетаданныхИменамТаблиц = СоответствиеИдМетаданныхИменамТаблиц(ДобавлятьКолонки); + + ТабличныеЧасти = ТабличныеЧастиИВладельцы(); + + СоответствиеИменМетаданных = СоответствиеИменМетаданных(); + + КолонкиБазыДанных = Новый Соответствие(); + Если ДобавлятьКолонки Тогда + КолонкиБазыДанных = КолонкиБазыДанных(); + КонецЕсли; + + Для Каждого ТекЭлемент Из СоответствиеИдМетаданныхИменамТаблиц Цикл + + Имя = СтрШаблон("%1%2", ТекЭлемент.Значение.Префикс, Формат(ТекЭлемент.Значение.Индекс, "ЧРГ=; ЧГ=")); + + Если НЕ ОписанияМетаданных[Имя] = Неопределено Тогда + Продолжить; + КонецЕсли; + Если ВРег(ТекЭлемент.Значение.Префикс) = "FLD" Тогда + ОписаниеОбъектаБазы = КолонкиБазыДанных[Имя]; + Если ОписаниеОбъектаБазы = Неопределено Тогда + Продолжить; + КонецЕсли; + ИначеЕсли ТабличныеЧасти[Имя] = Неопределено Тогда + ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(Имя); + Иначе + ОписаниеОбъектаБазы = ТабличныеЧасти[Имя]; + КонецЕсли; + + ОписаниеОбъектаБазы.Ид = ТекЭлемент.Значение.Ид; + + ОписаниеВладельца = ОписаниеОбъектаБазы; + Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл + ОписаниеВладельца.Ид = СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид; + ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); + Если ОписаниеВладельца.Префикс = "VT" Тогда + ОписанияМетаданных.Вставить(СтрШаблон("%1_%2", ОписаниеВладельца.Владелец.Имя, ОписаниеВладельца.Имя), + ОписаниеВладельца); + КонецЕсли; + ОписаниеВладельца = ОписаниеВладельца.Владелец; + КонецЦикла; + + Если СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя] = Неопределено Тогда + Продолжить; + КонецЕсли; + ОписаниеВладельца.Ид = СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид; + + Если НЕ СоответствиеИменМетаданных[ОписаниеВладельца.Ид] = Неопределено Тогда + ОписаниеВладельца.ИмяМетаданных = СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных; + КонецЕсли; + ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); + + ТекОписание = ОписаниеОбъектаБазы; + Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл + ТекОписание.ИмяМетаданных = + ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Содержимое, ТекОписание.Ид); + ТекОписание = ТекОписание.Владелец; + КонецЦикла; + + КонецЦикла; + + Возврат ОписанияМетаданных; + +КонецФункции // ОписаниеМетаданныхОбъектовБД1С() + +#КонецОбласти // ПрограммныйИнтерфейс + +#Область СлужебныеПроцедурыИФункции + +// Функция - возвращает количество записей в таблице конфигурации информационной базы 1С +// +// Параметры: +// Ид - Число - идентификатор объекта метаданных, +// если не указан, считываются все записи +// +// Возвращаемое значение: +// Число - Истина - количество записей в таблице конфигурации информационной базы 1С +// +Функция КоличествоЗаписейВТаблицеКонфигурации(Ид = "") + + Лог.Отладка("Получение количества записей в таблице ""Config"" базы ""%1\%2""", + ТекущийСервер, + База); + + ОтборПоИд = ""; + Если ЗначениеЗаполнено(Ид) Тогда + ОтборПоИд = СтрШаблон("AND [FileName] = '%1'", Ид); + КонецЕсли; + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | SELECT + | COUNT([FileName]) + | FROM %1.[dbo].[Config] + | WHERE CHARINDEX('.', [FileName]) = 0 %2 + | SET NOCOUNT OFF;"" ", + База, + ОтборПоИд); + + РезультатЗапроса = ""; + + Попытка + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + Если КодВозврата = 0 Тогда + Лог.Отладка("Получено количество записей в таблице ""Config"" базы ""%1\%2"": %3", + ТекущийСервер, + РезультатЗапроса, + База); + Иначе + ТекстОшибки = СтрШаблон("Ошибка получения количества записей в таблице ""Config"" базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения количества записей в таблице ""Config"" базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Возврат Число(РезультатЗапроса); + +КонецФункции // КоличествоЗаписейВТаблицеКонфигурации() + +// Функция - читает соответствия UUID объектов метаданных конфигурации 1С именам объектов базы +// из таблицы Params из записи где "[FileName] = 'DBNames'" +// +// Параметры: +// ДобавлятьКолонки - Строка - Истина - будет добавлена информация для колонок таблиц +// +// Возвращаемое значение: +// Соответствие - соответствия UUID объектов метаданных конфигурации 1С именам объектов СУБД +// +Функция СоответствиеИдМетаданныхИменамТаблиц(ДобавлятьКолонки = Ложь) + + Лог.Отладка("Получение соответствия UUID объектов метаданных конфигурации 1С именам объектов базы ""%1\%2""", + ТекущийСервер, + База); + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | SELECT + | [BinaryData] + | FROM %1.[dbo].[Params] + | WHERE [FileName] = 'DBNames' + | FOR XML RAW, BINARY BASE64 + | SET NOCOUNT OFF;"" ", + База); + + РезультатЗапроса = ""; + + Попытка + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + Если КодВозврата = 0 Тогда + Лог.Отладка("Получено соответствия UUID объектов метаданных конфигурации 1С именам объектов базы ""%1\%2""", + ТекущийСервер, + База); + Иначе + ТекстОшибки = СтрШаблон("Ошибка получения соответствия UUID объектов метаданных конфигурации 1С + | именам объектов базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения соответствия UUID объектов метаданных конфигурации 1С + | именам объектов базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + НормализоватьXML(РезультатЗапроса); + + ЗначенияАтрибутов = Новый Соответствие(); + + Парсер = Новый ЧтениеXML; + Парсер.УстановитьСтроку(РезультатЗапроса); + + Пока Парсер.Прочитать() Цикл + Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И ВРег(Парсер.Имя) = "ROW" Тогда + ЗначенияАтрибутов = ЗначенияАтрибутов(Парсер); + Прервать; + КонецЕсли; + КонецЦикла; + + Парсер.Закрыть(); + + Данные = ЗначенияАтрибутов["BINARYDATA"]; + + Если НЕ ЗначениеЗаполнено(Данные) Тогда + Данные = ""; + КонецЕсли; + + Данные = ПрочитатьУпакованныеДанные(Данные); + + Чтение = Новый ЧтениеТекста(Данные.ОткрытьПотокДляЧтения(), КодировкаТекста.UTF8, Символы.ПС, Символы.ПС + Символы.ВК); + + СоответствиеИменБД = Новый Соответствие(); + + ТекСтрока = Чтение.ПрочитатьСтроку(); + + Пока НЕ ТекСтрока = Неопределено Цикл + + ТекСтрока = СтрЗаменить(ТекСтрока, "{", ""); + ТекСтрока = СтрЗаменить(ТекСтрока, "}", ""); + + ЧастиСтроки = СтрРазделить(ТекСтрока, ",", Ложь); + + Если ЧастиСтроки.Количество() < 3 Тогда + ТекСтрока = Чтение.ПрочитатьСтроку(); + Продолжить; + КонецЕсли; + + СтрокаСоответствия = Новый Структура(); + СтрокаСоответствия.Вставить("Ид" , ПривестиСтроку(ЧастиСтроки[0])); + СтрокаСоответствия.Вставить("Префикс", ПривестиСтроку(ЧастиСтроки[1])); + СтрокаСоответствия.Вставить("Индекс" , ПривестиСтроку(ЧастиСтроки[2])); + + Если НЕ ДобавлятьКолонки И ВРег(СтрокаСоответствия.Префикс) = "FLD" Тогда + ТекСтрока = Чтение.ПрочитатьСтроку(); + Продолжить; + КонецЕсли; + + СоответствиеИменБД.Вставить(СтрШаблон("%1%2", СтрокаСоответствия.Префикс, ЧастиСтроки[2]), СтрокаСоответствия); + + ТекСтрока = Чтение.ПрочитатьСтроку(); + КонецЦикла; + + Возврат СоответствиеИменБД; + +КонецФункции // СоответствиеИдМетаданныхИменамТаблиц() + +// Процедура - читает атрибуты узлов ROW из переданной XML-строки +// и добавляет соответствия UUID метаданных и имен метаданных +// +// Параметры: +// СоответствиеИменМетаданных - Соответствие - соответствия UUID метаданных и имен метаданных +// ТекстXML - Строка - XML-строка для чтения +// +Процедура ДополнитьСоответствиеИменМетаданных(СоответствиеИменМетаданных, ТекстXML) + + Если НЕ ТипЗнч(СоответствиеИменМетаданных) = Тип("Соответствие") Тогда + СоответствиеИменМетаданных = Новый Соответствие(); + КонецЕсли; + + Парсер = Новый ЧтениеXML; + Парсер.УстановитьСтроку(ТекстXML); + + Пока Парсер.Прочитать() Цикл + + ЗначенияАтрибутов = Новый Соответствие(); + + Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И ВРег(Парсер.Имя) = "ROW" Тогда + ЗначенияАтрибутов = ЗначенияАтрибутов(Парсер); + Иначе + Продолжить; + КонецЕсли; + + Ид = ЗначенияАтрибутов["FILENAME"]; + Данные = ЗначенияАтрибутов["BINARYDATA"]; + + Если ЗначенияАтрибутов.Количество() = 0 ИЛИ Ид = Неопределено + ИЛИ Данные = Неопределено ИЛИ СтрДлина(Ид) <> 36 Тогда + Продолжить; + КонецЕсли; + + Данные = ПрочитатьУпакованныеДанные(Данные, Истина); + + ОписаниеФайла = Новый Структура(); + ОписаниеФайла.Вставить("Ид" , Ид); + ОписаниеФайла.Вставить("Содержимое" , Данные); + ОписаниеФайла.Вставить("ИмяМетаданных", ИмяМетаданных(Данные, ОписаниеФайла.Ид)); + + СоответствиеИменМетаданных.Вставить(ОписаниеФайла.Ид, ОписаниеФайла); + + КонецЦикла; + + Парсер.Закрыть(); + +КонецПроцедуры // ДополнитьСоответствиеИменМетаданных() + +// Функция - читает таблицу Config базы 1С и возвращает соответствия UUID метаданных и имен метаданных +// +// Параметры: +// Ид - Число - идентификатор объекта метаданных, +// если не указан, считываются все записи +// ПорцияЧтения - Число - количество строк таблицы Config читаемое за 1 запрос +// +// Возвращаемое значение: +// Соответствие - соответствия UUID метаданных и имен метаданных +// +Функция СоответствиеИменМетаданных(Ид = "", ПорцияЧтения = 1000) + + Лог.Отладка("Получение соответствия имен метаданных базы ""%1\%2"": %3", + ТекущийСервер, + База); + + СоответствиеИменМетаданных = Новый Соответствие(); + + ВсегоЗаписей = КоличествоЗаписейВТаблицеКонфигурации(Ид); + Прочитано = 0; + + ОтборПоИд = ""; + Если ЗначениеЗаполнено(Ид) Тогда + ОтборПоИд = СтрШаблон("AND [FileName] = '%1'", Ид); + КонецЕсли; + + Пока Прочитано < ВсегоЗаписей Цикл + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | SELECT + | [FileName], + | [BinaryData] + | FROM %1.[dbo].[Config] + | WHERE CHARINDEX('.', [FileName]) = 0 %2 + | ORDER BY [FileName] OFFSET %3 ROWS FETCH NEXT %4 ROWS ONLY + | FOR XML RAW, BINARY BASE64 + | SET NOCOUNT OFF;"" ", + База, + ОтборПоИд, + Прочитано, + ПорцияЧтения); + + РезультатЗапроса = ""; + + Попытка + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + Если КодВозврата = 0 Тогда + Лог.Отладка("Получено соответствие имен метаданных базы ""%1\%2"": %3", + ТекущийСервер, + РезультатЗапроса, + База); + Иначе + ТекстОшибки = СтрШаблон("Ошибка получения соответствия имен метаданных базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения соответствия имен метаданных базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + НормализоватьXML(РезультатЗапроса); + + ДополнитьСоответствиеИменМетаданных(СоответствиеИменМетаданных, РезультатЗапроса); + + Прочитано = Прочитано + ПорцияЧтения; + + КонецЦикла; + + Возврат СоответствиеИменМетаданных; + +КонецФункции // СоответствиеИменМетаданных() + +// Функция - возвращает соответствие имен объектов базы данных Типм и именам объектов 1С +// +// Возвращаемое значение: +// Соответствие - назначения объектов базы +// +Функция НазначенияОбъектовБазы() + + ИмяМакета = "НазначенияОбъектовБД1С.json"; + ПутьКМакету = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "Макеты", ИмяМакета); + ФайлМакета = Новый Файл(ПутьКМакету); + + Чтение = Новый ЧтениеJSON(); + Чтение.ОткрытьФайл(ФайлМакета.ПолноеИмя, КодировкаТекста.UTF8); + + Возврат ПрочитатьJSON(Чтение, Ложь); + +КонецФункции // НазначенияОбъектовБазы() + +// Функция - возвращает список таблиц базы, соответствующих фильтру +// +// Параметры: +// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" +// +// Возвращаемое значение: +// Соответствие - список таблиц базы +// +Функция ТаблицыБазыДанных(ФильтрТаблицПоИмени = "") + + Лог.Отладка("Получение списка таблиц базы ""%1\%2"": %3", ТекущийСервер, База); + + ШаблонЗапроса = """SET NOCOUNT ON; + | SELECT + | T.Name AS [Table] + | FROM %1.sys.tables T + | %2 + | SET NOCOUNT OFF;"" "; + + Условие = ""; + Если ЗначениеЗаполнено(ФильтрТаблицПоИмени) Тогда + Условие = СтрШаблон("WHERE T.Name LIKE '%1'", ФильтрТаблицПоИмени); + КонецЕсли; + + ТекстЗапроса = СтрШаблон(ШаблонЗапроса, База, Условие); + + РезультатЗапроса = ""; + + Попытка + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + Если КодВозврата = 0 Тогда + Лог.Отладка("Получен список таблиц базы ""%1\%2"": %3", + ТекущийСервер, + РезультатЗапроса, + База); + Иначе + ТекстОшибки = СтрШаблон("Ошибка получения списка таблиц базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения списка таблиц базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + + Результат = Новый Соответствие(); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + Для й = 1 По Текст.КоличествоСтрок() Цикл + ИмяТаблицы = СокрЛП(Текст.ПолучитьСтроку(й)); + УбратьЛидирующееПодчеркивание(ИмяТаблицы); + + Результат.Вставить(ИмяТаблицы, ИмяТаблицы); + КонецЦикла; + + Возврат Результат; + +КонецФункции // ТаблицыБазыДанных() + +// Функция - список таблиц, хранящих данные табличных частей объектов 1С +// с указанием таблиц объектов-владельцев +// +// Возвращаемое значение: +// Соответствие - список таблиц, хранящих данные табличных частей объектов 1С +// +Функция ТабличныеЧастиИВладельцы() + + ТаблицыБазы = ТаблицыБазыДанных("%_VT%"); + + ТабличныеЧастиИВладельцы = Новый Соответствие(); + + Для Каждого ТекЭлемент Из ТаблицыБазы Цикл + ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(ТекЭлемент.Значение); + + ТабличныеЧастиИВладельцы.Вставить(СтрШаблон("%1%2", ОписаниеОбъектаБазы.Префикс, ОписаниеОбъектаБазы.Индекс), ОписаниеОбъектаБазы); + КонецЦикла; + + Возврат ТабличныеЧастиИВладельцы; + +КонецФункции // ТабличныеЧастиИВладельцы() + +// Функция - возвращает структуру описания объекта базы данных 1С +// +// Возвращаемое значение: +// Структура - структура описания объекта базы +// *Владелец - Структура - структура описания объекта владельца +// *Тип - Строка - тип объекта или коллекция +// (например: Справочник, Документ, ТабличнаяЧасть, Поле) +// *ТипАнгл - Строка - тип объекта или коллекция на английском +// (например: Reference, Document, TabularSection, Field) +// *Назначение - Строка - назначение таблицы БД (например: Основная, Итоги, Обороты) +// *Имя - Строка - имя объекта в БД (Префикс + Индекс) +// *Префикс - Строка - префикс объекта (например: Reference, Document, VT, Fld)) +// *Индекс - Число - числовой индекс объекта +// *Суффикс - Строка - дополнительный суффикс имени объекта (например: "_RRef") +// *Ид - Строка - UUID объекта 1С +// *ИмяМетаданных - Строка - имя метаданных 1С +// +Функция СтруктураОписанияОбъектаБазы() + + СтруктураОписания = Новый Структура(); + СтруктураОписания.Вставить("Владелец"); + СтруктураОписания.Вставить("Тип" , ""); + СтруктураОписания.Вставить("ТипАнгл" , ""); + СтруктураОписания.Вставить("Назначение" , ""); + СтруктураОписания.Вставить("Имя" , ""); + СтруктураОписания.Вставить("Префикс" , ""); + СтруктураОписания.Вставить("Индекс"); + СтруктураОписания.Вставить("Суффикс" , ""); + СтруктураОписания.Вставить("Ид" , ""); + СтруктураОписания.Вставить("ИмяМетаданных", ""); + + Возврат СтруктураОписания; + +КонецФункции // СтруктураОписанияОбъектаБазы() + +// Функция - раскладывает имя объекта базы на префикс, индекс, владельца и суффикс +// +// Параметры: +// ИмяОбъектаБазы - Строка - имя объекта базы +// +// Возвращаемое значение: +// Структура - имя объекта базы, префикс, индекс, владелец и суффикс +// +Функция ОписаниеОбъектаБазыПоИмени(Знач ИмяОбъектаБазы) + + ОписаниеОбъектаБазы = СтруктураОписанияОбъектаБазы(); + + УбратьЛидирующееПодчеркивание(ИмяОбъектаБазы); + + Символ = Сред(ИмяОбъектаБазы, 1, 1); + + ПрефиксОбъекта = ""; + + Пока НЕ ЭтоЧисло(Символ) Цикл + ПрефиксОбъекта = ПрефиксОбъекта + Символ; + Если СтрДлина(ИмяОбъектаБазы) = 1 Тогда + ИмяОбъектаБазы = ""; + Символ = ""; + Прервать; + КонецЕсли; + ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, 2); + Символ = Сред(ИмяОбъектаБазы, 1, 1); + КонецЦикла; + + ПозицияИмениТЧ = СтрНайти(ИмяОбъектаБазы, "_VT"); + Если ПозицияИмениТЧ > 0 Тогда + ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(ПрефиксОбъекта + Лев(ИмяОбъектаБазы, ПозицияИмениТЧ - 1)); + ОписаниеОбъектаБазы.Владелец = ОписаниеОбъектаВладельца; + ОписаниеОбъектаБазы.Тип = "ТабличнаяЧасть"; + ОписаниеОбъектаБазы.ТипАнгл = "TabularSection"; + ОписаниеОбъектаБазы.Назначение = "ТабличнаяЧасть"; + ПрефиксОбъекта = "VT"; + ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, ПозицияИмениТЧ + 3); + Символ = Сред(ИмяОбъектаБазы, 1, 1); + ИначеЕсли ВРег(ПрефиксОбъекта) = "FLD" Тогда + ОписаниеОбъектаБазы.Тип = "Поле"; + ОписаниеОбъектаБазы.ТипАнгл = "Field"; + ОписаниеОбъектаБазы.Назначение = "Поле"; + Иначе + НазначенияОбъектовБазы = НазначенияОбъектовБазы(); + + Если НазначенияОбъектовБазы.Свойство(ВРег(ПрефиксОбъекта)) Тогда + ОписаниеКоллекции = НазначенияОбъектовБазы[ВРег(ПрефиксОбъекта)]; + ОписаниеОбъектаБазы.Тип = ОписаниеКоллекции.Тип; + ОписаниеОбъектаБазы.ТипАнгл = ОписаниеКоллекции.ТипАнгл; + ОписаниеОбъектаБазы.Назначение = ОписаниеКоллекции.Назначение; + КонецЕсли; + КонецЕсли; + + // состав и имена таблицы итогов по счету зависит от количества субконто, + // поэтому добавляем еще 1 цифру + Если ПрефиксОбъекта = "AccRgAT" Тогда + ПрефиксОбъекта = ПрефиксОбъекта + Символ; + ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, 2); + Символ = Сред(ИмяОбъектаБазы, 1, 1); + КонецЕсли; + + ОписаниеОбъектаБазы.Префикс = ПрефиксОбъекта; + + ИндексОбъекта = ""; + + Пока ЭтоЧисло(Символ) Цикл + ИндексОбъекта = ИндексОбъекта + Символ; + Если СтрДлина(ИмяОбъектаБазы) = 1 Тогда + ИмяОбъектаБазы = ""; + Символ = ""; + Прервать; + КонецЕсли; + ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, 2); + Символ = Сред(ИмяОбъектаБазы, 1, 1); + КонецЦикла; + + Если ЗначениеЗаполнено(ИндексОбъекта) Тогда + ОписаниеОбъектаБазы.Индекс = Число(ИндексОбъекта); + КонецЕсли; + + ОписаниеОбъектаБазы.Имя = СтрШаблон("%1%2", ОписаниеОбъектаБазы.Префикс, Формат(ОписаниеОбъектаБазы.Индекс, "ЧРГ=; ЧГ=")); + + Если ЗначениеЗаполнено(Символ) Тогда + ОписаниеОбъектаБазы.Суффикс = ИмяОбъектаБазы; + КонецЕсли; + + Возврат ОписаниеОбъектаБазы; + +КонецФункции // ОписаниеОбъектаБазыПоИмени() + +// Функция - возвращает список колонок базы, соответствующих фильтру +// +// Параметры: +// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" +// ФильтрКолонокПоИмени - Строка - фильтр имен колонок в формате для оператора "LIKE" +// +// Возвращаемое значение: +// Соответствие - список колонок базы +// +Функция КолонкиБазыДанных(ФильтрТаблицПоИмени = "", ФильтрКолонокПоИмени = "") + + Лог.Отладка("Получение списка колонок базы ""%1\%2"": %3", ТекущийСервер, База); + + ШаблонЗапроса = """SET NOCOUNT ON; + | SELECT + | T.Name AS [Table], + | C.name AS Field + | + | FROM %1.sys.tables T + | LEFT JOIN %1.sys.columns C + | ON T.object_id = C.object_id + | %2 + | SET NOCOUNT OFF;"" "; + + Условие = ""; + Если ЗначениеЗаполнено(ФильтрТаблицПоИмени) Тогда + Условие = СтрШаблон("WHERE T.Name LIKE '%1'", ФильтрТаблицПоИмени); + КонецЕсли; + + Если ЗначениеЗаполнено(ФильтрКолонокПоИмени) Тогда + Если ЗначениеЗаполнено(Условие) Тогда + Условие = СтрШаблон("%1 AND C.Name LIKE '%2'", Условие, ФильтрКолонокПоИмени); + Иначе + Условие = СтрШаблон("WHERE C.Name LIKE '%1'", ФильтрКолонокПоИмени); + КонецЕсли; + КонецЕсли; + + ТекстЗапроса = СтрШаблон(ШаблонЗапроса, База, Условие); + + РезультатЗапроса = ""; + + Попытка + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + Если КодВозврата = 0 Тогда + Лог.Отладка("Получен список колонок базы ""%1\%2"": %3", + ТекущийСервер, + РезультатЗапроса, + База); + Иначе + ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + + Результат = Новый Соответствие(); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + Для й = 1 По Текст.КоличествоСтрок() Цикл + Значения = СтрРазделить(Текст.ПолучитьСтроку(й), "|", Ложь); + + ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(Значения[0]); + ОписаниеОбъектаКолонки = ОписаниеОбъектаБазыПоИмени(Значения[1]); + ОписаниеОбъектаКолонки.Владелец = ОписаниеОбъектаВладельца; + + Результат.Вставить(ОписаниеОбъектаКолонки.Имя, ОписаниеОбъектаКолонки); + КонецЦикла; + + Возврат Результат; + +КонецФункции // КолонкиБазыДанных() + +// Функция - находит в тестовом описании объекта метаданных его имя +// +// Параметры: +// Описание - Строка - описание объекта метаданных (скобкотекст) +// Ид - Строка - UUID объекта метаданных +// +// Возвращаемое значение: +// Строка - имя объекта метаданных +// +Функция ИмяМетаданных(Описание, Ид) + + ИмяМетаданных = ""; + Позиция = СтрНайти(Описание, Ид); + Если Позиция = 0 Тогда + Возврат ""; + КонецЕсли; + Позиция = Позиция + СтрДлина(Ид) + 3; + + Символ = Сред(Описание, Позиция, 1); + Пока НЕ Символ = """" Цикл + ИмяМетаданных = ИмяМетаданных + Символ; + Позиция = Позиция + 1; + Символ = Сред(Описание, Позиция, 1); + КонецЦикла; + + Возврат ИмяМетаданных; + +КонецФункции // ИмяМетаданных() + +// Функция - распаковыает переданные данные, упакованные по алгоритму deflate +// +// Параметры: +// УпакованныеДанные - Строка, ДвоичныеДАнные - данные для распаковки +// КакТекст - Булево - Истина - результат будет возвращет в виде строки +// Ложь - результат будет возвращет в виде двоичных данных +// +// Возвращаемое значение: +// Строка, ДвоичныеДанные - распакованные данные +// +Функция ПрочитатьУпакованныеДанные(УпакованныеДанные, КакТекст = Ложь) + + Если ТипЗнч(УпакованныеДанные) = Тип("ДвоичныеДанные") Тогда + Данные = УпакованныеДанные; + ИначеЕсли ТипЗнч(УпакованныеДанные) = Тип("Строка") Тогда + Данные = Base64Значение(УпакованныеДанные); + Иначе + ВызватьИсключение СтрШаблон("Некорректный тип параметра ""УпакованныеДанные"" ""%1"", + | ожидается ""ДвоичныеДанные"" или ""Строка""", + ТипЗнч(УпакованныеДанные)); + КонецЕсли; + + Если ДанныеУпакованы(Данные) Тогда + Упаковщик = Новый УпаковщикDeflate(); + Данные = Упаковщик.РаспаковатьДанные(Данные); + Иначе + Лог.Отладка("Данные ""%1"" не упакованы", УпакованныеДанные); + КонецЕсли; + + Если КакТекст Тогда + Чтение = Новый ЧтениеТекста(Данные.ОткрытьПотокДляЧтения(), КодировкаТекста.UTF8); + Данные = Чтение.Прочитать(); + КонецЕсли; + + Возврат Данные; + +КонецФункции // ПрочитатьУпакованныеДанные() + +// Функция - читает атрибуты узла XML +// +// Параметры: +// Парсер - ЧтениеXML - парсер, спозиционированный на начало элемента XML +// +// Возвращаемое значение: +// Соответствие - прочитанные значения атрибутов узла XML +// +Функция ЗначенияАтрибутов(Парсер) + + Результат = Новый Соответствие(); + + КоличествоАтрибутов = Парсер.КоличествоАтрибутов(); + + Для й = 0 По КоличествоАтрибутов -1 Цикл + Результат.Вставить(ВРег(Парсер.ИмяАтрибута(й)), Парсер.ЗначениеАтрибута(й)) + КонецЦикла; + + Возврат Результат; + +КонецФункции // ЗначенияАтрибутов() + +// Процедура - добавляет стандартный заголовок XML и корневой элемент +// +// Параметры: +// ТекстXML - Строка - дополняемый техт XML +// +Процедура НормализоватьXML(ТекстXML) + + ТекстXML = СтрЗаменить(ТекстXML, Символы.ПС, ""); + ТекстXML = СтрЗаменить(ТекстXML, Символы.ВК, ""); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(ТекстXML); + Текст.ВставитьСтроку(1, ""); + Текст.ВставитьСтроку(2, ""); + Текст.ДобавитьСтроку(""); + + ТекстXML = Текст.ПолучитьТекст(); + +КонецПроцедуры // НормализоватьXML() + +// Функция - проверяет, что данные упакованы по алгоритму deflate +// если в начале данных расположен BOM (0xEF (239), 0xBB (187), 0xBF (191)) - данные не упакованы +// +// Параметры: +// Данные - Строка, ДвоичныеДанные - проверяемые данные +// +// Возвращаемое значение: +// Булево - Истина - данные упакованы по алгоритму deflate +// +Функция ДанныеУпакованы(Знач Данные) + + Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда + Поток = Данные.ОткрытьПотокДляЧтения(); + ИначеЕсли ТипЗнч(Данные) = Тип("Строка") Тогда + Данные = Base64Значение(Данные); + Поток = Данные.ОткрытьПотокДляЧтения(); + ИначеЕсли ТипЗнч(Данные) = Тип("Поток") + ИЛИ ТипЗнч(Данные) = Тип("ФайловыйПоток") + ИЛИ ТипЗнч(Данные) = Тип("ПотокВПамяти") Тогда + Данные.СкопироватьВ(Поток); + Иначе + ВызватьИсключение СтрШаблон("Некоректный тип ""%1"" параметра ""Данные"", + | ожидается ""Base64Строка, Поток, ДвоичныеДанные""", + ТипЗнч(Данные)); + КонецЕсли; + + Поток.Перейти(0, ПозицияВПотоке.Начало); + + Буфер = Новый БуферДвоичныхДанных(3); + + Поток.Прочитать(Буфер, 0, 3); + + Возврат НЕ (Буфер[0] = 239 И Буфер[1] = 187 И Буфер[2] = 191); + +КонецФункции // ДанныеУпакованы() + +// Функция - убирает из строки начальные и конечные кавычки +// если строка содержит только цифры, то преобразует в число +// +// Параметры: +// Строка - Строка - исходная строка +// +// Возвращаемое значение: +// Строка, Число - результат приведения +// +Функция ПривестиСтроку(Знач Строка) + + Результат = СокрЛП(Строка); + + Если Лев(Результат, 1) = """" И Прав(Результат, 1) = """" Тогда + Результат = Сред(Результат, 2, СтрДлина(Результат) - 2); + КонецЕсли; + + Если ПустаяСтрока(Результат) Тогда + Возврат Результат; + КонецЕсли; + + Если ЭтоЧисло(Результат) Тогда + Результат = Число(Результат); + КонецЕсли; + + Возврат Результат; + +КонецФункции // ПривестиСтроку() + +// Процедура - удаляет лидирующий символ "_" из имени объекта +// +// Параметры: +// Имя - Строка - имя объекта +// +Процедура УбратьЛидирующееПодчеркивание(Имя) + + Если Лев(Имя, 1) = "_" Тогда + Имя = Сред(Имя, 2); + КонецЕсли; + +КонецПроцедуры // УбратьЛидирующееПодчеркивание() + +// Функция - проверяет, что строка не пустая и содержит только цифры +// +// Параметры: +// Строка - Строка - исходная строка +// +// Возвращаемое значение: +// Булево - Истина - строка не пустая и содержит только цифры +// +Функция ЭтоЧисло(Строка) + + Если НЕ ЗначениеЗаполнено(Строка) Тогда + Возврат Ложь; + КонецЕсли; + + Цифры = "0123456789"; + + Для й = 1 По СтрДлина(Строка) Цикл + Если СтрНайти(Цифры, Сред(Строка, й, 1)) = 0 Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции // ЭтоЧисло() + +#КонецОбласти // СлужебныеПроцедурыИФункции + +#Область ОбработчикиСобытий + +// Процедура - обработчик события "ПриСозданииОбъекта" +// +// Параметры: +// _ПодключениеКСУБД - ПодключениеКСУБД - объект подключения к СУБД +// _База - Строка - имя базы данных +// +// BSLLS:UnusedLocalMethod-off +Процедура ПриСозданииОбъекта(Знач _ПодключениеКСУБД, _База) + + ПодключениеКСУБД = _ПодключениеКСУБД; + ТекущийСервер = ПодключениеКСУБД.Сервер(); + База = _База; + + Лог = ПараметрыСистемы.Лог(); + +КонецПроцедуры // ПриСозданииОбъекта() +// BSLLS:UnusedLocalMethod-on + +#КонецОбласти // ОбработчикиСобытий diff --git "a/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" "b/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" new file mode 100644 index 0000000..4d6a595 --- /dev/null +++ "b/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" @@ -0,0 +1,453 @@ +{ + "ACC": { + "ПрефиксВБазе": "Acc", + "Тип": "ПланСчетов", + "ТипАнгл": "ChartOfAccounts", + "Назначение": "Основная" + }, + "ACCCHNGR": { + "ПрефиксВБазе": "AccChngR", + "Тип": "ПланСчетов", + "ТипАнгл": "ChartOfAccounts", + "Назначение": "Изменения" + }, + "ACCOPT": { + "ПрефиксВБазе": "AccOpt", + "Тип": "РегистрБухгалтерии", + "ТипАнгл": "AccountingRegister", + "Назначение": "Опции" + }, + "ACCRG": { + "ПрефиксВБазе": "AccRg", + "Тип": "РегистрБухгалтерии", + "ТипАнгл": "AccountingRegister", + "Назначение": "Основная" + }, + "ACCRGAT": { + "ПрефиксВБазе": "AccRgAT", + "Тип": "РегистрБухгалтерии", + "ТипАнгл": "AccountingRegister", + "Назначение": "ИтогиПоСчету" + }, + "ACCRGCHNGR": { + "ПрефиксВБазе": "AccRgChngR", + "Тип": "РегистрБухгалтерии", + "ТипАнгл": "AccountingRegister", + "Назначение": "Изменения" + }, + "ACCRGCT": { + "ПрефиксВБазе": "AccRgCT", + "Тип": "РегистрБухгалтерии", + "ТипАнгл": "AccountingRegister", + "Назначение": "ОборотыМеждуСчетами" + }, + "ACCRGED": { + "ПрефиксВБазе": "AccRgED", + "Тип": "РегистрБухгалтерии", + "ТипАнгл": "AccountingRegister", + "Назначение": "ЗначенияСубконто" + }, + "ACCRGOPT": { + "ПрефиксВБазе": "AccRgOpt", + "Тип": "РегистрБухгалтерии", + "ТипАнгл": "AccountingRegister", + "Назначение": "НастройкиХраненияИтогов" + }, + "ACCSINF": { + "ПрефиксВБазе": "AccSInf", + "Тип": "РегистрБухгалтерии", + "ТипАнгл": "AccountingRegister", + "Назначение": "ИнициализированныеОбласти" + }, + "ACCUMRG": { + "ПрефиксВБазе": "AccumRg", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "Основная" + }, + "ACCUMRGAGGGRIDK": { + "ПрефиксВБазе": "AccumRgAggGridK", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "СетьАгрегатов" + }, + "ACCUMRGAGGOPTK": { + "ПрефиксВБазе": "AccumRgAggOptK", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "ОпцииСетиАгрегатов" + }, + "ACCUMRGBFK": { + "ПрефиксВБазе": "AccumRgBfK", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "БуферНовыхОборотов" + }, + "ACCUMRGCHNGR": { + "ПрефиксВБазе": "AccumRgChngR", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "Изменения" + }, + "ACCUMRGDLK": { + "ПрефиксВБазе": "AccumRgDlK", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "НовыеОбороты" + }, + "ACCUMRGOPT": { + "ПрефиксВБазе": "AccumRgOpt", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "Опции" + }, + "ACCUMRGST": { + "ПрефиксВБазе": "AccumRgSt", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "Стаистика" + }, + "ACCUMRGT": { + "ПрефиксВБазе": "AccumRgT", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "Остатки" + }, + "ACCUMRGTN": { + "ПрефиксВБазе": "AccumRgTn", + "Тип": "РегистрНакопления", + "ТипАнгл": "AccumulationRegister", + "Назначение": "Обороты" + }, + "BPR": { + "ПрефиксВБазе": "BPr", + "Тип": "БизнесПроцесс", + "ТипАнгл": "BusinessProcess", + "Назначение": "Основная" + }, + "BPRCHNGR": { + "ПрефиксВБазе": "BPrChngR", + "Тип": "БизнесПроцесс", + "ТипАнгл": "BusinessProcess", + "Назначение": "Изменения" + }, + "BPRPOINTS": { + "ПрефиксВБазе": "BPrPoints", + "Тип": "БизнесПроцесс", + "ТипАнгл": "BusinessProcess", + "Назначение": "ТочкиМаршрута" + }, + "CHRC": { + "ПрефиксВБазе": "Chrc", + "Тип": "ПланВидовХарактеристик", + "ТипАнгл": "ChartOfCharacteristicTypes", + "Назначение": "Основная" + }, + "CHRCCHNGR": { + "ПрефиксВБазе": "ChrcChngR", + "Тип": "ПланВидовХарактеристик", + "ТипАнгл": "ChartOfCharacteristicTypes", + "Назначение": "Изменения" + }, + "CHRCOPT": { + "ПрефиксВБазе": "ChrcOpt", + "Тип": "ПланВидовХарактеристик", + "ТипАнгл": "ChartOfCharacteristicTypes", + "Назначение": "Опции" + }, + "CHRCSINF": { + "ПрефиксВБазе": "ChrcSInf", + "Тип": "ПланВидовХарактеристик", + "ТипАнгл": "ChartOfCharacteristicTypes", + "Назначение": "ИнициализированныеОбласти" + }, + "CKINDS": { + "ПрефиксВБазе": "CKinds", + "Тип": "ПланВидовРасчета", + "ТипАнгл": "ChartOfCalculationTypes", + "Назначение": "Основная" + }, + "CKINDSCHNGR": { + "ПрефиксВБазе": "CKindsChngR", + "Тип": "ПланВидовРасчета", + "ТипАнгл": "ChartOfCalculationTypes", + "Назначение": "Изменения" + }, + "CKINDSOPT": { + "ПрефиксВБазе": "CKindsOpt", + "Тип": "ПланВидовРасчета", + "ТипАнгл": "ChartOfCalculationTypes", + "Назначение": "Опции" + }, + "CKINDSSINF": { + "ПрефиксВБазе": "CKindsSInf", + "Тип": "ПланВидовРасчета", + "ТипАнгл": "ChartOfCalculationTypes", + "Назначение": "ИнициализированныеОбласти" + }, + "CONST": { + "ПрефиксВБазе": "Const", + "Тип": "Константы", + "ТипАнгл": "Constants", + "Назначение": "Основная" + }, + "CONSTCHNGR": { + "ПрефиксВБазе": "ConstChngR", + "Тип": "Константы", + "ТипАнгл": "Constants", + "Назначение": "Изменения" + }, + "CONSTS": { + "ПрефиксВБазе": "Consts", + "Тип": "Константа", + "ТипАнгл": "Constant", + "Назначение": "Основная" + }, + "CONSTSCHNGR": { + "ПрефиксВБазе": "ConstsChngR", + "Тип": "Константа", + "ТипАнгл": "Constant", + "Назначение": "Изменения" + }, + "CRG": { + "ПрефиксВБазе": "CRg", + "Тип": "РегистрРасчета", + "ТипАнгл": "CalculationRegister", + "Назначение": "Основная" + }, + "CRGCHNGR": { + "ПрефиксВБазе": "CRgChngR", + "Тип": "РегистрРасчета", + "ТипАнгл": "CalculationRegister", + "Назначение": "Изменения" + }, + "CRGACTPER": { + "ПрефиксВБазе": "CRgActPer", + "Тип": "РегистрРасчета", + "ТипАнгл": "CalculationRegister", + "Назначение": "ФактическиеПериодыДействия" + }, + "CRGRECALC": { + "ПрефиксВБазе": "CRgRecalc", + "Тип": "РегистрРасчета", + "ТипАнгл": "CalculationRegister", + "Назначение": "Перерасчеты" + }, + "CRGRECALCCHNGR": { + "ПрефиксВБазе": "CRgRecalcChngR", + "Тип": "РегистрРасчета", + "ТипАнгл": "CalculationRegister", + "Назначение": "ПерерасчетыИзменения" + }, + "DOCUMENT": { + "ПрефиксВБазе": "Document", + "Тип": "Документ", + "ТипАнгл": "Document", + "Назначение": "Основная" + }, + "DOCUMENTCHNGR": { + "ПрефиксВБазе": "DocumentChngR", + "Тип": "Документ", + "ТипАнгл": "Document", + "Назначение": "Изменения" + }, + "DOCUMENTJOURNAL": { + "ПрефиксВБазе": "DocumentJournal", + "Тип": "ЖурналДокументов", + "ТипАнгл": "DocumentJournal", + "Назначение": "Основная" + }, + "ENUM": { + "ПрефиксВБазе": "Enum", + "Тип": "Перечисление", + "ТипАнгл": "Enum", + "Назначение": "Основная" + }, + "INFORG": { + "ПрефиксВБазе": "InfoRg", + "Тип": "РегистрСведений", + "ТипАнгл": "InformationRegister", + "Назначение": "Основная" + }, + "INFORGCHNGR": { + "ПрефиксВБазе": "InfoRgChngR", + "Тип": "РегистрСведений", + "ТипАнгл": "InformationRegister", + "Назначение": "Изменения" + }, + "INFORGOPT": { + "ПрефиксВБазе": "InfoRgOpt", + "Тип": "РегистрСведений", + "ТипАнгл": "InformationRegister", + "Назначение": "Опции" + }, + "INFORGSF": { + "ПрефиксВБазе": "InfoRgSF", + "Тип": "РегистрСведений", + "ТипАнгл": "InformationRegister", + "Назначение": "СрезПервых" + }, + "INFORGSL": { + "ПрефиксВБазе": "InfoRgSL", + "Тип": "РегистрСведений", + "ТипАнгл": "InformationRegister", + "Назначение": "СрезПоследних" + }, + "INTEGSERVICESETTINGS": { + "ПрефиксВБазе": "IntegServiceSettings", + "Тип": "СервисИнтеграции", + "ТипАнгл": "InterationService", + "Назначение": "Основная" + }, + "NODE": { + "ПрефиксВБазе": "Node", + "Тип": "ПланОбмена", + "ТипАнгл": "ExchangePlan", + "Назначение": "Основная" + }, + "REFERENCE": { + "ПрефиксВБазе": "Reference", + "Тип": "Справочник", + "ТипАнгл": "Catalog", + "Назначение": "Основная" + }, + "REFERENCECHNGR": { + "ПрефиксВБазе": "ReferenceChngR", + "Тип": "Справочник", + "ТипАнгл": "Catalog", + "Назначение": "Изменения" + }, + "REFOPT": { + "ПрефиксВБазе": "RefOpt", + "Тип": "Справочник", + "ТипАнгл": "Catalog", + "Назначение": "Опции" + }, + "REFSINF": { + "ПрефиксВБазе": "RefSInf", + "Тип": "Справочник", + "ТипАнгл": "Catalog", + "Назначение": "ИнициализированныеОбласти" + }, + "SCHEDULEDJOBS": { + "ПрефиксВБазе": "ScheduledJobs", + "Тип": "РегламентноеЗадание", + "ТипАнгл": "ScheduledJob", + "Назначение": "Основная" + }, + "SEQ": { + "ПрефиксВБазе": "Seq", + "Тип": "Последовательность", + "ТипАнгл": "Sequence", + "Назначение": "Основная" + }, + "SEQCHNGR": { + "ПрефиксВБазе": "SeqChngR", + "Тип": "Последовательность", + "ТипАнгл": "Sequence", + "Назначение": "Изменения" + }, + "TASK": { + "ПрефиксВБазе": "Task", + "Тип": "Задача", + "ТипАнгл": "Task", + "Назначение": "Основная" + }, + "TASKCHNGR": { + "ПрефиксВБазе": "TaskChngR", + "Тип": "Задача", + "ТипАнгл": "Task", + "Назначение": "Изменения" + }, + "VT": { + "ПрефиксВБазе": "VT", + "Тип": "", + "ТипАнгл": "", + "Назначение": "ТабличнаяЧасть" + }, + "FLD": { + "ПрефиксВБазе": "Fld", + "Тип": "", + "ТипАнгл": "", + "Назначение": "Поле" + } +} + + // "AccumRgAggDict10h" + // "AccumRgAggDict11h" + // "AccumRgAggDict12h" + // "AccumRgAggDict13h" + // "AccumRgAggDict14h" + // "AccumRgAggDict15h" + // "AccumRgAggDict16h" + // "AccumRgAggDict17h" + // "AccumRgAggDict18h" + // "AccumRgAggDict19h" + // "AccumRgAggDict1h" + // "AccumRgAggDict2h" + // "AccumRgAggDict3h" + // "AccumRgAggDict4h" + // "AccumRgAggDict5h" + // "AccumRgAggDict6h" + // "AccumRgAggDict7h" + // "AccumRgAggDict8h" + // "AccumRgAggDict9h" + // "AccumRgAggDictah" + // "AccumRgAggDictbh" + // "AccumRgAggDictch" + // "AccumRgAggDictdh" + // "AccumRgAggDicteh" + // "AccumRgAggDictfh" + // "AccumRgAggDims" + // "Bots" + // "ByDim" + // "ByDims" + // "ByField" + // "ByOwnerField" + // "ByParentField" + // "ByProperty" + // "ByResource" + // "CommonSettings" + // "ConfigChngR" + // "DataHistoryAfterWriteQueue" + // "DataHistoryLatestVersions" + // "DataHistoryLatestVersions1" + // "DataHistoryLatestVersions2" + // "DataHistoryMetadata" + // "DataHistoryQueue0" + // "DataHistorySettings" + // "DataHistoryVersions" + // "DataSeparationUse" + // "DbCopies" + // "DbCopiesInitialLast" + // "DbCopiesSettings" + // "DbCopiesTablesStates" + // "DbCopiesTrChanges" + // "DbCopiesTrChObj" + // "DbCopiesTrLogs" + // "DbCopiesTrTables" + // "DbCopiesUpdates" + // "DynListSettings" + // "Ecs" + // "ErrorProcessingSettings" + // "ExtDataSrcPrms" + // "ExtDim" + // "ExtensionsInfo" + // "ExtensionsInfoNGS" + // "ExtensionsRestruct" + // "ExtensionsRestructNGS" + // "ExtsChngR" + // "FilesStruDmm" + // "FrmDtSettings" + // "IBVersionStruDmm" + // "LineNo" + // "ODataSettings" + // "RepSettings" + // "RepVarSettings" + // "SeqB" + // "SystemSettings" + // "Turnover" + // "TurnoverCt" + // "TurnoverDt" + // "UsersDmm" + // "UsersWorkHistory" diff --git a/src/lib.config b/src/lib.config index fc2e2d5..47c9baf 100644 --- a/src/lib.config +++ b/src/lib.config @@ -2,6 +2,7 @@ + diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os new file mode 100644 index 0000000..0e8d830 --- /dev/null +++ b/tests/ib-structure-tests.os @@ -0,0 +1,359 @@ +#Использовать fs +#Использовать deflator +#Использовать "../src/core" + +Перем ПодключениеКСУБД; // - объект подключения к СУБД +Перем РаботаССУБД; // - объект работы с СУБД +Перем ИмяСервера; // - имя сервера MS SQL +Перем ПрефиксИмениБД; // - префикс имен тестовых баз +Перем ФайлКопииБазы; // - путь к файлу копии базы для тестов +Перем КаталогВременныхДанных; // - путь к каталогу временных данных +Перем Лог; // - логгер + +// Процедура выполняется после запуска теста +// +Процедура ПередЗапускомТеста() Экспорт + + КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "tmpdata"); + КаталогВременныхДанных = ФС.ПолныйПуть(КаталогВременныхДанных); + + ФС.ОбеспечитьКаталог(КаталогВременныхДанных); + + ИмяСервера = ПолучитьПеременнуюСреды("CPDB_SQL_SRVR"); + ИмяПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_USER"); + ПарольПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_PWD"); + + ПрефиксИмениБД = "cpdb_test_db"; + ФайлКопииБазы = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "cpdb_test_db.bak"); + + ПодключениеКСУБД = Новый ПодключениеКСУБД(ИмяСервера, ИмяПользователя, ПарольПользователя); + + РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); + + Лог = ПараметрыСистемы.Лог(); + Лог.УстановитьУровень(УровниЛога.Информация); + + Для й = 1 По 3 Цикл + ИмяБазы = СтрШаблон("%1_%2", ПрефиксИмениБД, й); + + Если НЕ РаботаССУБД.БазаСуществует(ИмяБазы) Тогда + Продолжить; + КонецЕсли; + + РаботаССУБД.УдалитьБазуДанных(ИмяБазы); + КонецЦикла; + +КонецПроцедуры // ПередЗапускомТеста() + +// Процедура выполняется после запуска теста +// +Процедура ПослеЗапускаТеста() Экспорт + +КонецПроцедуры // ПослеЗапускаТеста() + +// &Тест +// Процедура ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() Экспорт + +// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + +// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + +// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, +// ФайлКопииБазы, +// КаталогВременныхДанных, +// КаталогВременныхДанных, +// Истина); + +// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + +// ОписаниеВерсии = СтруктураХраненияИБ.ВерсияФорматаКонфигурации(); + +// ТекстОшибки = СтрШаблон("Ошибка получения версии формата базы ""%1""", ИмяБД); + +// Утверждения.ПроверитьРавенство(ОписаниеВерсии.ТребуемаяВерсияПлатформы, "80313", ТекстОшибки); + +// КонецПроцедуры // ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() + +// &Тест +// Процедура ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() Экспорт + +// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + +// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + +// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, +// ФайлКопииБазы, +// КаталогВременныхДанных, +// КаталогВременныхДанных, +// Истина); + +// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + +// ИмяОбъектаБД = "Reference34"; +// ИмяОбъектаМетаданных = "Справочник1"; + +// ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); + +// ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С для объекта БД ""%1""", ИмяОбъектаБД); + +// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); + +// КонецПроцедуры // ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() + +// &Тест +// Процедура ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() Экспорт + +// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + +// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + +// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, +// ФайлКопииБазы, +// КаталогВременныхДанных, +// КаталогВременныхДанных, +// Истина); + +// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + +// ИмяОбъектаБД = "_Reference34_VT36"; +// ИмяОбъектаМетаданных = "Справочник1"; +// ИмяТабличнойЧасти = "ТабличнаяЧасть1"; + +// ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); + +// ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С табличной части, +// | для объекта БД ""%1""", +// ИмяОбъектаБД); + +// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); + +// ТекстОшибки = СтрШаблон("Ошибка получения описания табличной части +// | объекта метаданных ""%1"" 1С для объекта БД ""%2""", +// ИмяОбъектаМетаданных, +// ИмяОбъектаБД); + +// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); + +// КонецПроцедуры // ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() + +// &Тест +// Процедура ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() Экспорт + +// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + +// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + +// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, +// ФайлКопииБазы, +// КаталогВременныхДанных, +// КаталогВременныхДанных, +// Истина); + +// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + +// ИмяОбъектаБД = "_Fld35"; +// ИмяОбъектаМетаданных = "Справочник1"; +// ИмяРеквизита = "Реквизит1"; + +// ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); + +// ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С реквизита, +// | для объекта БД ""%1""", +// ИмяОбъектаБД); + +// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); + +// ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита +// | объекта метаданных ""%1"" 1С для объекта БД ""%2""", +// ИмяОбъектаМетаданных, +// ИмяОбъектаБД); + +// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяРеквизита, ТекстОшибки); + +// КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() + +// &Тест +// Процедура ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() Экспорт + +// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + +// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + +// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, +// ФайлКопииБазы, +// КаталогВременныхДанных, +// КаталогВременныхДанных, +// Истина); + +// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + +// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + +// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + +// ИмяОбъектаБД = "_Fld38"; +// ИмяТабличнойЧасти = "ТабличнаяЧасть1"; +// ИмяОбъектаМетаданных = "Справочник1"; +// ИмяРеквизита = "Реквизит1"; + +// ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); + +// ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С реквизита, +// | для объекта БД ""%1""", +// ИмяОбъектаБД); + +// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.Владелец.ИмяМетаданных, +// ИмяОбъектаМетаданных, +// ТекстОшибки); + +// ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части +// | объекта метаданных ""%1"" 1С для объекта БД ""%2""", +// ИмяОбъектаМетаданных, +// ИмяОбъектаБД); + +// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); + +// ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части ""%1"" +// | объекта метаданных ""%2"" 1С для объекта БД ""%3""", +// ИмяТабличнойЧасти, +// ИмяОбъектаМетаданных, +// ИмяОбъектаБД); + +// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяРеквизита, ТекстОшибки); + +// КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() + +&Тест +Процедура ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1С() Экспорт + + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); + + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + ИмяОбъектаБДСправочника = "Reference34"; + ИмяОбъектаБДТабличнойЧасти = "Reference34_VT36"; + ИмяОбъектаБДТабличнойЧастиСокр = "VT36"; + ИмяОбъектаБДПоля = "Fld35"; + + ИмяСправочника = "Справочник1"; + ИмяТабличнойЧасти = "ТабличнаяЧасть1"; + ИмяРеквизита = "Реквизит1"; + + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + + ОписаниеОбъектовМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектовБД1С(); + + ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, + | не найдено имя для объекта БД ""%1"" справочника", + ИмяОбъектаБДСправочника); + + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДСправочника].ИмяМетаданных, + ИмяСправочника, + ТекстОшибки); + + ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, + | не найдено имя для объекта БД ""%1"" табличной части по полному имени", + ИмяОбъектаБДТабличнойЧасти); + + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧасти].ИмяМетаданных, + ИмяТабличнойЧасти, + ТекстОшибки); + + ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, + | не найдено имя для объекта БД ""%1"" табличной части по сокращенному имени", + ИмяОбъектаБДТабличнойЧастиСокр); + + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧастиСокр].ИмяМетаданных, + ИмяТабличнойЧасти, + ТекстОшибки); + +КонецПроцедуры // ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1С() + +&Тест +Процедура ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1ССПолями() Экспорт + + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); + + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + ИмяОбъектаБДПоля = "Fld35"; + + ИмяРеквизита = "Реквизит1"; + + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + + ОписаниеОбъектовМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектовБД1С(Истина); + + ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, + | не найдено имя для объекта БД ""%1"" реквизита", + ИмяОбъектаБДПоля); + + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДПоля].ИмяМетаданных, + ИмяРеквизита, + ТекстОшибки); + +КонецПроцедуры // ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1ССПолями() From 26d10c4319a84ac01acd5b0d39c37ebd7135ca52 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Wed, 25 May 2022 09:49:47 +0300 Subject: [PATCH 08/38] =?UTF-8?q?fix:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D1=8C=20=D0=BE=D1=82=20deflator.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 1 + 1 file changed, 1 insertion(+) diff --git a/packagedef b/packagedef index d3b9fd6..febbdd6 100644 --- a/packagedef +++ b/packagedef @@ -11,6 +11,7 @@ .ЗависитОт("yadisk") .ЗависитОт("nextcloud-lib") .ЗависитОт("ClientSSH", "0.5.0") + .ЗависитОт("deflator") .РазработкаЗависитОт("1testrunner") .РазработкаЗависитОт("asserts") .ВключитьФайл("src") From 80ed0d601888d7d61dee20dda528e5583d288930 Mon Sep 17 00:00:00 2001 From: ArKuznetsov Date: Wed, 25 May 2022 13:20:56 +0300 Subject: [PATCH 09/38] =?UTF-8?q?test:=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D1=83=D1=82=D1=8C=20=D0=BA=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=BC=D1=83=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D1=83=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B9=201=D0=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/ib-tests.os | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ib-tests.os b/tests/ib-tests.os index 0b82a03..e78db94 100644 --- a/tests/ib-tests.os +++ b/tests/ib-tests.os @@ -10,7 +10,7 @@ // Процедура ПередЗапускомТеста() Экспорт - КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "tmpdata"); + КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "ibtmpdata"); КаталогВременныхДанных = ФС.ПолныйПуть(КаталогВременныхДанных); ПрефиксИмениИБ = "cpdb_test_db"; From 0109aa3b59973cc66212e1eab4ed10e084120cc4 Mon Sep 17 00:00:00 2001 From: ArKuznetsov Date: Wed, 25 May 2022 13:21:16 +0300 Subject: [PATCH 10/38] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packagedef b/packagedef index febbdd6..afa45af 100644 --- a/packagedef +++ b/packagedef @@ -10,8 +10,8 @@ .ЗависитОт("fs") .ЗависитОт("yadisk") .ЗависитОт("nextcloud-lib") - .ЗависитОт("ClientSSH", "0.5.0") - .ЗависитОт("deflator") + .ЗависитОт("ClientSSH", "0.5.1") + .ЗависитОт("deflator", "0.2.1") .РазработкаЗависитОт("1testrunner") .РазработкаЗависитОт("asserts") .ВключитьФайл("src") From d87bfc4fc047150da22daa2ff4c36c8b2fcf1673 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Wed, 25 May 2022 13:31:37 +0300 Subject: [PATCH 11/38] =?UTF-8?q?test:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=D0=BE=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=BE=D0=B9=20=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=201=D0=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/ib-structure-tests.os | 262 ++++++++++++++++++------------------ 1 file changed, 131 insertions(+), 131 deletions(-) diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index 0e8d830..8a194cd 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -51,213 +51,213 @@ КонецПроцедуры // ПослеЗапускаТеста() -// &Тест -// Процедура ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() Экспорт +&Тест +Процедура ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() Экспорт -// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); -// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); -// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, -// ФайлКопииБазы, -// КаталогВременныхДанных, -// КаталогВременныхДанных, -// Истина); + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); -// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); -// ОписаниеВерсии = СтруктураХраненияИБ.ВерсияФорматаКонфигурации(); + ОписаниеВерсии = СтруктураХраненияИБ.ВерсияФорматаКонфигурации(); -// ТекстОшибки = СтрШаблон("Ошибка получения версии формата базы ""%1""", ИмяБД); + ТекстОшибки = СтрШаблон("Ошибка получения версии формата базы ""%1""", ИмяБД); -// Утверждения.ПроверитьРавенство(ОписаниеВерсии.ТребуемаяВерсияПлатформы, "80313", ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеВерсии.ТребуемаяВерсияПлатформы, "80313", ТекстОшибки); -// КонецПроцедуры // ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() +КонецПроцедуры // ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() -// &Тест -// Процедура ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() Экспорт +&Тест +Процедура ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() Экспорт -// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); -// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); -// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, -// ФайлКопииБазы, -// КаталогВременныхДанных, -// КаталогВременныхДанных, -// Истина); + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); -// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); -// ИмяОбъектаБД = "Reference34"; -// ИмяОбъектаМетаданных = "Справочник1"; + ИмяОбъектаБД = "Reference34"; + ИмяОбъектаМетаданных = "Справочник1"; -// ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); + ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); -// ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С для объекта БД ""%1""", ИмяОбъектаБД); + ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С для объекта БД ""%1""", ИмяОбъектаБД); -// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); -// КонецПроцедуры // ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() +КонецПроцедуры // ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() -// &Тест -// Процедура ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() Экспорт +&Тест +Процедура ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() Экспорт -// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); -// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); -// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, -// ФайлКопииБазы, -// КаталогВременныхДанных, -// КаталогВременныхДанных, -// Истина); + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); -// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); -// ИмяОбъектаБД = "_Reference34_VT36"; -// ИмяОбъектаМетаданных = "Справочник1"; -// ИмяТабличнойЧасти = "ТабличнаяЧасть1"; + ИмяОбъектаБД = "_Reference34_VT36"; + ИмяОбъектаМетаданных = "Справочник1"; + ИмяТабличнойЧасти = "ТабличнаяЧасть1"; -// ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); + ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); -// ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С табличной части, -// | для объекта БД ""%1""", -// ИмяОбъектаБД); + ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С табличной части, + | для объекта БД ""%1""", + ИмяОбъектаБД); -// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); -// ТекстОшибки = СтрШаблон("Ошибка получения описания табличной части -// | объекта метаданных ""%1"" 1С для объекта БД ""%2""", -// ИмяОбъектаМетаданных, -// ИмяОбъектаБД); + ТекстОшибки = СтрШаблон("Ошибка получения описания табличной части + | объекта метаданных ""%1"" 1С для объекта БД ""%2""", + ИмяОбъектаМетаданных, + ИмяОбъектаБД); -// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); -// КонецПроцедуры // ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() +КонецПроцедуры // ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() -// &Тест -// Процедура ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() Экспорт +&Тест +Процедура ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() Экспорт -// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); -// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); -// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, -// ФайлКопииБазы, -// КаталогВременныхДанных, -// КаталогВременныхДанных, -// Истина); + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); -// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); -// ИмяОбъектаБД = "_Fld35"; -// ИмяОбъектаМетаданных = "Справочник1"; -// ИмяРеквизита = "Реквизит1"; + ИмяОбъектаБД = "_Fld35"; + ИмяОбъектаМетаданных = "Справочник1"; + ИмяРеквизита = "Реквизит1"; -// ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); + ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); -// ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С реквизита, -// | для объекта БД ""%1""", -// ИмяОбъектаБД); + ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С реквизита, + | для объекта БД ""%1""", + ИмяОбъектаБД); -// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); -// ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита -// | объекта метаданных ""%1"" 1С для объекта БД ""%2""", -// ИмяОбъектаМетаданных, -// ИмяОбъектаБД); + ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита + | объекта метаданных ""%1"" 1С для объекта БД ""%2""", + ИмяОбъектаМетаданных, + ИмяОбъектаБД); -// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяРеквизита, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяРеквизита, ТекстОшибки); -// КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() +КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() -// &Тест -// Процедура ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() Экспорт +&Тест +Процедура ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() Экспорт -// ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); -// РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); -// ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// РаботаССУБД.ВыполнитьВосстановление(ИмяБД, -// ФайлКопииБазы, -// КаталогВременныхДанных, -// КаталогВременныхДанных, -// Истина); + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); -// ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); -// Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); -// СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); -// ИмяОбъектаБД = "_Fld38"; -// ИмяТабличнойЧасти = "ТабличнаяЧасть1"; -// ИмяОбъектаМетаданных = "Справочник1"; -// ИмяРеквизита = "Реквизит1"; + ИмяОбъектаБД = "_Fld38"; + ИмяТабличнойЧасти = "ТабличнаяЧасть1"; + ИмяОбъектаМетаданных = "Справочник1"; + ИмяРеквизита = "Реквизит1"; -// ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); + ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); -// ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С реквизита, -// | для объекта БД ""%1""", -// ИмяОбъектаБД); + ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С реквизита, + | для объекта БД ""%1""", + ИмяОбъектаБД); -// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.Владелец.ИмяМетаданных, -// ИмяОбъектаМетаданных, -// ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.Владелец.ИмяМетаданных, + ИмяОбъектаМетаданных, + ТекстОшибки); -// ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части -// | объекта метаданных ""%1"" 1С для объекта БД ""%2""", -// ИмяОбъектаМетаданных, -// ИмяОбъектаБД); + ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части + | объекта метаданных ""%1"" 1С для объекта БД ""%2""", + ИмяОбъектаМетаданных, + ИмяОбъектаБД); -// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); -// ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части ""%1"" -// | объекта метаданных ""%2"" 1С для объекта БД ""%3""", -// ИмяТабличнойЧасти, -// ИмяОбъектаМетаданных, -// ИмяОбъектаБД); + ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части ""%1"" + | объекта метаданных ""%2"" 1С для объекта БД ""%3""", + ИмяТабличнойЧасти, + ИмяОбъектаМетаданных, + ИмяОбъектаБД); -// Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяРеквизита, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяРеквизита, ТекстОшибки); -// КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() +КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() &Тест Процедура ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1С() Экспорт From 10473355209122d7a045a48bd23c07584a58f774 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Thu, 26 May 2022 17:01:46 +0300 Subject: [PATCH 12/38] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D0=B3=D0=BE=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D0=BE=D0=B9=20=D0=BC=D0=B5=D1=81=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=20=D0=B1=D0=B0=D0=B7?= =?UTF-8?q?=D1=8B;=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=D0=BB=D1=83=D0=B6=D0=B5=D0=B1=D0=BD=D1=8B=D1=85=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=87=D0=BD=D1=8B=D1=85=20=D1=87=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=B9,=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=D0=B9=20=D0=9D=D0=BE=D0=BC=D0=B5=D1=80=D0=A1=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B8=20=D0=A1=D1=81=D1=8B=D0=BB=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\275\320\270\321\217\320\230\320\221.os" | 292 ++++++++++++++++-- ...276\320\262\320\221\320\2241\320\241.json" | 44 ++- tests/ib-structure-tests.os | 83 +++++ 3 files changed, 383 insertions(+), 36 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index d27e6eb..791b46d 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -212,6 +212,195 @@ КонецФункции // ОписаниеМетаданныхОбъектовБД1С() +// Функция - возвращает описание занимаеиого места в базе MS SQL Server +// +// Возвращаемое значение: +// Структура - описание занимаего места +// * РазмерБазы - Число - размер текущей базы данных в байтах, включает файлы данных и журналов +// * Свободно - Число - место в базе данных, не зарезервированное для объектов базы данных +// * Зарезервировано - Число - общий объем, выделенный объектам в базе данных +// * Данные - Число - общий объем, используемый данными +// * Индексы - Число - общий объем, используемый индексами +// * НеИспользуется - Число - общий объем, зарезервированный для объектов в базе данных, +// но пока не используемый +// +Функция ЗанимаемоеМесто() Экспорт + + ТекстЗапроса = СтрШаблон("""USE [%1]; + | + |SET NOCOUNT ON; + | + |exec sp_spaceused @oneresultset=1; + | + |SET NOCOUNT OFF"" ", + База); + + СтруктураРезультата = Новый Структура(); + СтруктураРезультата.Вставить("РазмерБазы" , 1); + СтруктураРезультата.Вставить("Свободно" , 2); + СтруктураРезультата.Вставить("Зарезервировано", 3); + СтруктураРезультата.Вставить("Данные" , 4); + СтруктураРезультата.Вставить("Индексы" , 5); + СтруктураРезультата.Вставить("НеИспользуется" , 6); + + РезультатЗапроса = ""; + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + + Если КодВозврата = 0 Тогда + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(Текст.КоличествоСтрок()), "|"); + + Для Каждого ТекЭлемент Из СтруктураРезультата Цикл + Ключ = ТекЭлемент.Ключ; + Индекс = ТекЭлемент.Значение; + + Если Индекс >= МассивЗначений.Количество() Тогда + СтруктураРезультата[Ключ] = 0; + Продолжить; + КонецЕсли; + + Размерность = ВРег(Прав(СокрЛП(МассивЗначений[Индекс]), 2)); + РазмерСтрокой = СокрЛП(Лев(МассивЗначений[Индекс], СтрДлина(МассивЗначений[Индекс]) - СтрДлина(Размерность))); + + Если ЭтоЧисло(РазмерСтрокой) Тогда + СтруктураРезультата[Ключ] = Число(РазмерСтрокой); + Множитель = 1024; + Если ВРег(Размерность) = "KB" Тогда + СтруктураРезультата[Ключ] = СтруктураРезультата[Ключ] * Множитель; + ИначеЕсли ВРег(Размерность) = "MB" Тогда + СтруктураРезультата[Ключ] = СтруктураРезультата[Ключ] * Множитель * Множитель; + КонецЕсли; + Иначе + СтруктураРезультата[Ключ] = 0; + КонецЕсли; + КонецЦикла; + Иначе + + Для Каждого ТекЭлемент Из СтруктураРезультата Цикл + СтруктураРезультата[ТекЭлемент.Ключ] = -1; + КонецЦикла; + + КонецЕсли; + + Возврат СтруктураРезультата; + +КонецФункции // ЗанимаемоеМесто() + +// Функция - возвращает список таблиц в базе MS SQL Server +// +// Возвращаемое значение: +// Структура - описание занимаего места +// * РазмерБазы - Число - размер текущей базы данных в байтах, включает файлы данных и журналов +// * Свободно - Число - место в базе данных, не зарезервированное для объектов базы данных +// * Зарезервировано - Число - общий объем, выделенный объектам в базе данных +// * Данные - Число - общий объем, используемый данными +// * Индексы - Число - общий объем, используемый индексами +// * НеИспользуется - Число - общий объем, зарезервированный для объектов в базе данных, +// но пока не используемый +// +Функция РазмерыИПараметрыИспользованияТаблицБазы() Экспорт + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | + | SELECT + | Tables.Name AS TableName, + | Partitions.Rows AS RowCounts, + | SUM(AllocationUnits.total_pages) * 8192 AS TotalSpace, + | SUM(AllocationUnits.used_pages) * 8192 AS UsedSpace, + | (SUM(AllocationUnits.total_pages) - SUM(AllocationUnits.used_pages)) * 8192 AS UnusedSpace, + | SUM(Stats.user_seeks + Stats.user_scans + Stats.user_lookups) AS Reads, + | SUM(Stats.user_seeks) AS Seeks, + | SUM(Stats.user_scans) AS Scans, + | SUM(Stats.user_lookups) AS Lookups, + | SUM(Stats.user_updates) AS Writes + | FROM + | [%1].sys.tables AS Tables + | INNER JOIN [%1].sys.indexes AS Indexes + | ON Tables.object_id = Indexes.object_id + | INNER JOIN [%1].sys.partitions AS Partitions + | ON Indexes.object_id = Partitions.object_id + | AND Indexes.index_id = Partitions.index_id + | INNER JOIN [%1].sys.allocation_units AS AllocationUnits + | ON Partitions.partition_id = AllocationUnits.container_id + | LEFT OUTER JOIN [%1].sys.dm_db_index_usage_stats AS Stats + | ON Tables.object_id = Stats.object_id + | WHERE + | Tables.Name NOT LIKE 'dt%%' + | AND Tables.is_ms_shipped = 0 + | AND Indexes.object_id > 255 + | GROUP BY + | Tables.Name, + | Partitions.Rows + | ORDER BY + | Tables.Name; + | + | SET NOCOUNT OFF;"" ", + База); + + МассивРезультатов = Новый Массив(); + + РезультатЗапроса = ""; + КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + + Если КодВозврата = 0 Тогда + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + ПерваяСтрока = 1; + Для й = 1 По Текст.КоличествоСтрок() Цикл + Если Лев(Текст.ПолучитьСтроку(й), 5) = "-----" Тогда + ПерваяСтрока = й + 1; + Прервать; + КонецЕсли; + КонецЦикла; + + Для й = ПерваяСтрока По Текст.КоличествоСтрок() Цикл + + СтруктураРезультата = Новый Структура(); + СтруктураРезультата.Вставить("Таблица" , 0); + СтруктураРезультата.Вставить("Схема" , 1); + СтруктураРезультата.Вставить("КоличествоСтрок" , 2); + СтруктураРезультата.Вставить("ВсегоЗанято" , 3); + СтруктураРезультата.Вставить("Используется" , 4); + СтруктураРезультата.Вставить("НеИспользуется" , 5); + СтруктураРезультата.Вставить("ОперацийЧтения" , 6); + СтруктураРезультата.Вставить("ОперацийВыборки" , 7); + СтруктураРезультата.Вставить("ОперацийСканирования", 8); + СтруктураРезультата.Вставить("ОперацийПоиска" , 9); + СтруктураРезультата.Вставить("ОперацийЗаписи" , 10); + + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(й), "|"); + + Для Каждого ТекЭлемент Из СтруктураРезультата Цикл + Ключ = ТекЭлемент.Ключ; + Индекс = ТекЭлемент.Значение; + + Если Индекс >= МассивЗначений.Количество() Тогда + СтруктураРезультата[Ключ] = 0; + Продолжить; + КонецЕсли; + + Если ВРег(Ключ) = "ТАБЛИЦА" + ИЛИ ВРег(Ключ) = "СХЕМА" Тогда + СтруктураРезультата[Ключ] = СокрЛП(МассивЗначений[Индекс]); + ИначеЕсли ЭтоЧисло(СокрЛП(МассивЗначений[Индекс])) Тогда + СтруктураРезультата[Ключ] = Число(СокрЛП(МассивЗначений[Индекс])); + Иначе + СтруктураРезультата[Ключ] = 0; + КонецЕсли; + КонецЦикла; + + МассивРезультатов.Добавить(СтруктураРезультата); + + КонецЦикла; + КонецЕсли; + + Возврат МассивРезультатов; + +КонецФункции // РазмерыИПараметрыИспользованияТаблицБазы() + #КонецОбласти // ПрограммныйИнтерфейс #Область СлужебныеПроцедурыИФункции @@ -533,7 +722,15 @@ Чтение = Новый ЧтениеJSON(); Чтение.ОткрытьФайл(ФайлМакета.ПолноеИмя, КодировкаТекста.UTF8); - Возврат ПрочитатьJSON(Чтение, Ложь); + Результат = ПрочитатьJSON(Чтение, Ложь); + + Для Каждого ТекЭлемент Из Результат Цикл + Если НЕ ТекЭлемент.Значение.Свойство("Подчиненный") Тогда + ТекЭлемент.Значение.Вставить("Подчиненный", Ложь); + КонецЕсли; + КонецЦикла; + + Возврат Результат; КонецФункции // НазначенияОбъектовБазы() @@ -552,7 +749,7 @@ ШаблонЗапроса = """SET NOCOUNT ON; | SELECT | T.Name AS [Table] - | FROM %1.sys.tables T + | FROM [%1].sys.tables T | %2 | SET NOCOUNT OFF;"" "; @@ -603,6 +800,10 @@ Для й = 1 По Текст.КоличествоСтрок() Цикл ИмяТаблицы = СокрЛП(Текст.ПолучитьСтроку(й)); + Если НЕ ЗначениеЗаполнено(ИмяТаблицы) Тогда + Продолжить; + КонецЕсли; + УбратьЛидирующееПодчеркивание(ИмяТаблицы); Результат.Вставить(ИмяТаблицы, ИмяТаблицы); @@ -620,14 +821,25 @@ // Функция ТабличныеЧастиИВладельцы() - ТаблицыБазы = ТаблицыБазыДанных("%_VT%"); - ТабличныеЧастиИВладельцы = Новый Соответствие(); - Для Каждого ТекЭлемент Из ТаблицыБазы Цикл - ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(ТекЭлемент.Значение); + НазначенияОбъектовБазы = НазначенияОбъектовБазы(); + + Для Каждого ТекНазначение Из НазначенияОбъектовБазы Цикл + + Если НЕ ТекНазначение.Значение.Подчиненный Тогда + Продолжить; + КонецЕсли; + + ТаблицыБазы = ТаблицыБазыДанных(СтрШаблон("%%_%1%%", ТекНазначение.Значение.ПрефиксВБазе)); + + Для Каждого ТекТаблица Из ТаблицыБазы Цикл + ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(ТекТаблица.Значение); + + ИмяОбъектаБазы = СтрШаблон("%1%2", ОписаниеОбъектаБазы.Префикс, ОписаниеОбъектаБазы.Индекс); + ТабличныеЧастиИВладельцы.Вставить(ИмяОбъектаБазы, ОписаниеОбъектаБазы); + КонецЦикла; - ТабличныеЧастиИВладельцы.Вставить(СтрШаблон("%1%2", ОписаниеОбъектаБазы.Префикс, ОписаниеОбъектаБазы.Индекс), ОписаниеОбъектаБазы); КонецЦикла; Возврат ТабличныеЧастиИВладельцы; @@ -681,6 +893,8 @@ ОписаниеОбъектаБазы = СтруктураОписанияОбъектаБазы(); + НазначенияОбъектовБазы = НазначенияОбъектовБазы(); + УбратьЛидирующееПодчеркивание(ИмяОбъектаБазы); Символ = Сред(ИмяОбъектаБазы, 1, 1); @@ -698,29 +912,29 @@ Символ = Сред(ИмяОбъектаБазы, 1, 1); КонецЦикла; - ПозицияИмениТЧ = СтрНайти(ИмяОбъектаБазы, "_VT"); + ПозицияИмениТЧ = 0; + ПрефиксИмениТЧ = ""; + Для Каждого ТекЭлемент Из НазначенияОбъектовБазы Цикл + Если ТекЭлемент.Значение.Подчиненный Тогда + ПозицияИмениТЧ = СтрНайти(ИмяОбъектаБазы, СтрШаблон("_%1", ТекЭлемент.Значение.ПрефиксВБазе)); + Если ПозицияИмениТЧ > 0 Тогда + ПрефиксИмениТЧ = ТекЭлемент.Значение.ПрефиксВБазе; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + Если ПозицияИмениТЧ > 0 Тогда - ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(ПрефиксОбъекта + Лев(ИмяОбъектаБазы, ПозицияИмениТЧ - 1)); - ОписаниеОбъектаБазы.Владелец = ОписаниеОбъектаВладельца; - ОписаниеОбъектаБазы.Тип = "ТабличнаяЧасть"; - ОписаниеОбъектаБазы.ТипАнгл = "TabularSection"; - ОписаниеОбъектаБазы.Назначение = "ТабличнаяЧасть"; - ПрефиксОбъекта = "VT"; - ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, ПозицияИмениТЧ + 3); + ОписаниеОбъектаБазы.Владелец = + ОписаниеОбъектаБазыПоИмени(ПрефиксОбъекта + Лев(ИмяОбъектаБазы, ПозицияИмениТЧ - 1)); + ПрефиксОбъекта = ПрефиксИмениТЧ; + ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, ПозицияИмениТЧ + СтрДлина(ПрефиксИмениТЧ) + 1); Символ = Сред(ИмяОбъектаБазы, 1, 1); - ИначеЕсли ВРег(ПрефиксОбъекта) = "FLD" Тогда - ОписаниеОбъектаБазы.Тип = "Поле"; - ОписаниеОбъектаБазы.ТипАнгл = "Field"; - ОписаниеОбъектаБазы.Назначение = "Поле"; - Иначе - НазначенияОбъектовБазы = НазначенияОбъектовБазы(); + КонецЕсли; - Если НазначенияОбъектовБазы.Свойство(ВРег(ПрефиксОбъекта)) Тогда - ОписаниеКоллекции = НазначенияОбъектовБазы[ВРег(ПрефиксОбъекта)]; - ОписаниеОбъектаБазы.Тип = ОписаниеКоллекции.Тип; - ОписаниеОбъектаБазы.ТипАнгл = ОписаниеКоллекции.ТипАнгл; - ОписаниеОбъектаБазы.Назначение = ОписаниеКоллекции.Назначение; - КонецЕсли; + Если НазначенияОбъектовБазы.Свойство(ВРег(ПрефиксОбъекта)) Тогда + НазначениеОбъекта = НазначенияОбъектовБазы[ВРег(ПрефиксОбъекта)]; + ЗаполнитьЗначенияСвойств(ОписаниеОбъектаБазы, НазначениеОбъекта); КонецЕсли; // состав и имена таблицы итогов по счету зависит от количества субконто, @@ -832,6 +1046,8 @@ РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); КонецЕсли; + КэшВладельцев = Новый Соответствие(); + Результат = Новый Соответствие(); Текст = Новый ТекстовыйДокумент(); @@ -840,9 +1056,20 @@ Для й = 1 По Текст.КоличествоСтрок() Цикл Значения = СтрРазделить(Текст.ПолучитьСтроку(й), "|", Ложь); - ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(Значения[0]); + Если КэшВладельцев[Значения[0]] = Неопределено Тогда + ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(Значения[0]); + КэшВладельцев.Вставить(Значения[0], ОписаниеОбъектаВладельца); + КонецЕсли; + ОписаниеОбъектаКолонки = ОписаниеОбъектаБазыПоИмени(Значения[1]); - ОписаниеОбъектаКолонки.Владелец = ОписаниеОбъектаВладельца; + ОписаниеОбъектаКолонки.Владелец = КэшВладельцев[Значения[0]]; + // Проверка, что поле является ссылкой из табличной части + Если ЗначениеЗаполнено(ОписаниеОбъектаКолонки.Владелец.Владелец) + И ОписаниеОбъектаКолонки.Имя = ОписаниеОбъектаКолонки.Владелец.Владелец.Имя Тогда + ОписаниеОбъектаКолонки.Тип = "Ссылка"; + ОписаниеОбъектаКолонки.ТипАнгл = "Ref"; + ОписаниеОбъектаКолонки.Назначение = "Поле"; + КонецЕсли; Результат.Вставить(ОписаниеОбъектаКолонки.Имя, ОписаниеОбъектаКолонки); КонецЦикла; @@ -1053,14 +1280,17 @@ КонецЕсли; Цифры = "0123456789"; + КоличествоТочек = 0; Для й = 1 По СтрДлина(Строка) Цикл - Если СтрНайти(Цифры, Сред(Строка, й, 1)) = 0 Тогда + Если Сред(Строка, й, 1) = "." Тогда + КоличествоТочек = КоличествоТочек + 1; + ИначеЕсли СтрНайти(Цифры, Сред(Строка, й, 1)) = 0 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; - Возврат Истина; + Возврат НЕ (КоличествоТочек > 1); КонецФункции // ЭтоЧисло() diff --git "a/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" "b/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" index 4d6a595..5a2ced8 100644 --- "a/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" +++ "b/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" @@ -361,14 +361,49 @@ }, "VT": { "ПрефиксВБазе": "VT", - "Тип": "", - "ТипАнгл": "", + "Подчиненный" : true, + "Тип": "ТабличнаяЧасть", + "ТипАнгл": "TabularSection", "Назначение": "ТабличнаяЧасть" }, + "EXTDIM": { + "ПрефиксВБазе": "ExtDim", + "Подчиненный" : true, + "Тип": "ВидыСубконто", + "ТипАнгл": "ExtDimensionTypes", + "Назначение": "ТабличнаяЧасть" + }, + "LEADINGCK": { + "ПрефиксВБазе": "LeadingCK", + "Подчиненный" : true, + "Тип": "ВедущиеВидыРасчета", + "ТипАнгл": "LeadingCalculationTypes", + "Назначение": "ТабличнаяЧасть" + }, + "BASECK": { + "ПрефиксВБазе": "BaseCK", + "Подчиненный" : true, + "Тип": "БазовыеВидыРасчета", + "ТипАнгл": "BaseCalculationTypes", + "Назначение": "ТабличнаяЧасть" + }, + "DISPLACEDCK": { + "ПрефиксВБазе": "DisplacedCK", + "Подчиненный" : true, + "Тип": "ВытесняющиеВидыРасчета ", + "ТипАнгл": "DisplacingCalculationTypes", + "Назначение": "ТабличнаяЧасть " + }, "FLD": { "ПрефиксВБазе": "Fld", - "Тип": "", - "ТипАнгл": "", + "Тип": "Поле", + "ТипАнгл": "Field", + "Назначение": "Поле" + }, + "LINENO": { + "ПрефиксВБазе": "LineNo", + "Тип": "НомерСтроки", + "ТипАнгл": "LineNumber", "Назначение": "Поле" } } @@ -431,7 +466,6 @@ // "Ecs" // "ErrorProcessingSettings" // "ExtDataSrcPrms" - // "ExtDim" // "ExtensionsInfo" // "ExtensionsInfoNGS" // "ExtensionsRestruct" diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index 8a194cd..d1e583f 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -357,3 +357,86 @@ ТекстОшибки); КонецПроцедуры // ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1ССПолями() + +&Тест +Процедура ТестДолжен_ПолучитьЗанимаемоеБазойМесто() Экспорт + + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); + + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + + ЗанимаемоеМесто = СтруктураХраненияИБ.ЗанимаемоеМесто(); + + ТекстОшибки = СтрШаблон("Ошибка получения занимаемое базой ""%1"" место", ИмяБД); + + Утверждения.ПроверитьБольше(ЗанимаемоеМесто.РазмерБазы, 0, ТекстОшибки); + +КонецПроцедуры // ТестДолжен_ПолучитьЗанимаемоеБазойМесто() + +&Тест +Процедура ТестДолжен_ПолучитьРазмерыИПараметрыИспользованияТаблицБазы() Экспорт + + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + + РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); + + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + РаботаССУБД.ВыполнитьВосстановление(ИмяБД, + ФайлКопииБазы, + КаталогВременныхДанных, + КаталогВременныхДанных, + Истина); + + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + + ТаблицыБазы = СтруктураХраненияИБ.РазмерыИПараметрыИспользованияТаблицБазы(); + + ТестоваяТаблица = "Config"; + + ТекстОшибки = СтрШаблон("Ошибка получения таблиц базы ""%1""", ИмяБД); + + Утверждения.ПроверитьБольше(ТаблицыБазы.Количество(), 0, ТекстОшибки); + + ТекстОшибки = СтрШаблон("Ошибка получения таблиц базы ""%1"", не найдена таблица ""%2""", ИмяБД, ТестоваяТаблица); + + ЕстьТаблица = Ложь; + Для Каждого ТекТаблица Из ТаблицыБазы Цикл + Если ТекТаблица.Таблица = ТестоваяТаблица Тогда + ЕстьТаблица = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Утверждения.ПроверитьИстину(ЕстьТаблица, ТекстОшибки); + + ТекстОшибки = СтрШаблон("Ошибка получения таблиц базы ""%1"", + | не удалось получить размер таблицы ""%2""", + ИмяБД, + ТестоваяТаблица); + + Утверждения.ПроверитьБольше(ТекТаблица.ВсегоЗанято, 0, ТекстОшибки); + +КонецПроцедуры // ТестДолжен_ПолучитьРазмерыИПараметрыИспользованияТаблицБазы() From b466bf671218b189cd8a267d2fd092fcad664ec3 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Thu, 26 May 2022 23:24:49 +0300 Subject: [PATCH 13/38] =?UTF-8?q?fix:=20=D0=A7=D1=82=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D1=8B=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D0=BE=D1=80;=20=D0=A7=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B8=D0=BA=D1=81=D0=B0=20=D0=BE=D1=82=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D0=B0=20=D0=B2=D1=8B=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D0=BE=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8E;=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2;=20=D0=9F=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D1=8B=D0=B5=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8=20=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BA=D0=B8;=20=D0=98=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D0=B9=20SonarQube.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cmd/cpdb.os | 2 +- ...44\320\260\320\271\320\273\320\241SFTP.os" | 6 +- ...60\320\271\320\273\320\235\320\260SFTP.os" | 7 +- ...21\201\320\224\320\270\321\201\320\272.os" | 0 ...21\201\320\224\320\270\321\201\320\272.os" | 4 +- ...20\275\320\270\321\217\320\230\320\221.os" | 161 +++++++++++------- 6 files changed, 112 insertions(+), 68 deletions(-) rename "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\321\213\320\240\320\260\320\261\320\276\321\202\321\213\320\241\320\257\320\275\320\264\320\265\321\205\320\224\320\270\321\201\320\272.os" => "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\321\213\320\240\320\260\320\261\320\276\321\202\321\213\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" (100%) diff --git a/src/cmd/cpdb.os b/src/cmd/cpdb.os index ec3274b..6f0f431 100644 --- a/src/cmd/cpdb.os +++ b/src/cmd/cpdb.os @@ -36,7 +36,7 @@ Приложение.ДобавитьКоманду("yadisk y", "команды обмена файлами с Yandex-диском", - Новый КомандыРаботыСЯндехДиск()); + Новый КомандыРаботыСЯндексДиск()); Приложение.ДобавитьКоманду("nextcloud n", "команды обмена файлами с сервисом NextCloud", diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\241SFTP.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\241SFTP.os" index e9223b7..24ce618 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\241SFTP.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\273\321\203\321\207\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\241SFTP.os" @@ -30,11 +30,11 @@ .Обязательный() .ВОкружении("CPDB_SFTP_GET_PATH"); - Команда.Опция("f file", "", "путь к файлу на NextCloud для загрузки") + Команда.Опция("f file", "", "путь к файлу на сервере SFTP для загрузки") .ТСтрока() .ВОкружении("CPDB_SFTP_GET_FILE"); - Команда.Опция("l list", "", "путь к файлу на NextCloud со списком файлов, + Команда.Опция("l list", "", "путь к файлу на сервере SFTP со списком файлов, |которые будут загружены (параметр -file игнорируется)") .ТСтрока() .ВОкружении("CPDB_SFTP_GET_LIST"); @@ -75,7 +75,7 @@ УдалитьИсточник = ЧтениеОпций.ЗначениеОпции("delsrc"); Если ПустаяСтрока(ПутьНаДиске) Тогда - ВызватьИсключение "Не задан путь к файлу для получения из NextCloud"; + ВызватьИсключение "Не задан путь к файлу для получения c сервера SFTP"; КонецЕсли; Клиент = Новый РаботаССерверомSSH(АдресСервера, Пользователь, Пароль, ПутьККлючу); diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\274\320\265\321\201\321\202\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\235\320\260SFTP.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\274\320\265\321\201\321\202\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\235\320\260SFTP.os" index a731233..0aa3e5b 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\274\320\265\321\201\321\202\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\235\320\260SFTP.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\274\320\265\321\201\321\202\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\235\320\260SFTP.os" @@ -25,18 +25,18 @@ .ТСтрока() .ВОкружении("CPDB_PARAMS"); - Команда.Опция("f file", "", "путь к локальному файлу для помещения на NextCloud") + Команда.Опция("f file", "", "путь к локальному файлу для помещения на сервер SFTP") .ТСтрока() .Обязательный() .ВОкружении("CPDB_SFTP_PUT_FILE"); Команда.Опция("l list", "", "путь к локальному файлу со списком файлов, - |которые будут помещены на NextCloud + |которые будут помещены на сервер SFTP |(параметр -file игнорируется)") .ТСтрока() .ВОкружении("CPDB_SFTP_PUT_LIST"); - Команда.Опция("p path", "", "путь к файлу на NextCloud") + Команда.Опция("p path", "", "путь к файлу сервере SFTP") .ТСтрока() .Обязательный() .ВОкружении("CPDB_SFTP_PUT_PATH"); @@ -72,7 +72,6 @@ ЭтоСписокФайлов = Ложь; КонецЕсли; АдресСервера = ЧтениеОпций.ЗначениеОпции("srvr"); - ПортСервера = ЧтениеОпций.ЗначениеОпции("port"); Пользователь = ЧтениеОпций.ЗначениеОпции("user"); Пароль = ЧтениеОпций.ЗначениеОпции("pwd"); ПутьККлючу = ЧтениеОпций.ЗначениеОпции("key-file"); diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\321\213\320\240\320\260\320\261\320\276\321\202\321\213\320\241\320\257\320\275\320\264\320\265\321\205\320\224\320\270\321\201\320\272.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\321\213\320\240\320\260\320\261\320\276\321\202\321\213\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" similarity index 100% rename from "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\321\213\320\240\320\260\320\261\320\276\321\202\321\213\320\241\320\257\320\275\320\264\320\265\321\205\320\224\320\270\321\201\320\272.os" rename to "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\321\213\320\240\320\260\320\261\320\276\321\202\321\213\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" index 5f1512a..caedc4b 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" @@ -193,10 +193,8 @@ // Булево - Истина - Файл / каталг существует // Функция Существует(Знач ПутьНаДиске) Экспорт - - ВызватьИсключение "Метод не реализован!"; - Возврат Ложь; + Возврат Неопределено; КонецФункции // Существует() diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index 791b46d..60246a7 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -12,6 +12,7 @@ Перем ПодключениеКСУБД; // - ПодключениеКСУБД - объект подключения к СУБД Перем ТекущийСервер; // - Строка - адрес сервера СУБД Перем База; // - Строка - адрес сервера СУБД +Перем НазначенияОбъектовБазы; // - Структура - соответствие назначений объектов префиксам имен объектов БД Перем Лог; // - Объект - объект записи лога приложения @@ -100,7 +101,12 @@ ДобавлятьКолонки = Ложь; - Если ВРег(ОписаниеОбъектаБазы.Префикс) = "FLD" Тогда + НазначениеОбъекта = ""; + Если НазначенияОбъектовБазы.Свойство(ОписаниеОбъектаБазы.Префикс) Тогда + НазначениеОбъекта = НазначенияОбъектовБазы[ОписаниеОбъектаБазы.Префикс].Назначение; + КонецЕсли; + + Если НазначениеОбъекта = "Поле" Тогда КолонкиБазыДанных = КолонкиБазыДанных(, СтрШаблон("%%%1%%", ИмяОбъекта)); Если КолонкиБазыДанных.Количество() > 0 Тогда ОписаниеОбъектаБазы = КолонкиБазыДанных[ИмяОбъекта]; @@ -165,7 +171,13 @@ Если НЕ ОписанияМетаданных[Имя] = Неопределено Тогда Продолжить; КонецЕсли; - Если ВРег(ТекЭлемент.Значение.Префикс) = "FLD" Тогда + + НазначениеОбъекта = ""; + Если НазначенияОбъектовБазы.Свойство(ТекЭлемент.Значение.Префикс) Тогда + НазначениеОбъекта = НазначенияОбъектовБазы[ТекЭлемент.Значение.Префикс].Назначение; + КонецЕсли; + + Если НазначениеОбъекта = "Поле" Тогда ОписаниеОбъектаБазы = КолонкиБазыДанных[Имя]; Если ОписаниеОбъектаБазы = Неопределено Тогда Продолжить; @@ -182,7 +194,8 @@ Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл ОписаниеВладельца.Ид = СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид; ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); - Если ОписаниеВладельца.Префикс = "VT" Тогда + Если НазначенияОбъектовБазы.Свойство(ОписаниеВладельца.Префикс) + И НазначенияОбъектовБазы[ОписаниеВладельца.Префикс].Подчиненный Тогда ОписанияМетаданных.Вставить(СтрШаблон("%1_%2", ОписаниеВладельца.Владелец.Имя, ОписаниеВладельца.Имя), ОписаниеВладельца); КонецЕсли; @@ -250,6 +263,8 @@ Текст = Новый ТекстовыйДокумент(); Текст.УстановитьТекст(РезультатЗапроса); + СимволовРазмерности = 2; + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(Текст.КоличествоСтрок()), "|"); Для Каждого ТекЭлемент Из СтруктураРезультата Цикл @@ -261,7 +276,7 @@ Продолжить; КонецЕсли; - Размерность = ВРег(Прав(СокрЛП(МассивЗначений[Индекс]), 2)); + Размерность = ВРег(Прав(СокрЛП(МассивЗначений[Индекс]), СимволовРазмерности)); РазмерСтрокой = СокрЛП(Лев(МассивЗначений[Индекс], СтрДлина(МассивЗначений[Индекс]) - СтрДлина(Размерность))); Если ЭтоЧисло(РазмерСтрокой) Тогда @@ -344,19 +359,17 @@ РезультатЗапроса = ""; КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + Если КодВозврата = 0 Тогда Текст = Новый ТекстовыйДокумент(); Текст.УстановитьТекст(РезультатЗапроса); - ПерваяСтрока = 1; Для й = 1 По Текст.КоличествоСтрок() Цикл - Если Лев(Текст.ПолучитьСтроку(й), 5) = "-----" Тогда - ПерваяСтрока = й + 1; - Прервать; - КонецЕсли; - КонецЦикла; - - Для й = ПерваяСтрока По Текст.КоличествоСтрок() Цикл СтруктураРезультата = Новый Структура(); СтруктураРезультата.Вставить("Таблица" , 0); @@ -370,7 +383,11 @@ СтруктураРезультата.Вставить("ОперацийСканирования", 8); СтруктураРезультата.Вставить("ОперацийПоиска" , 9); СтруктураРезультата.Вставить("ОперацийЗаписи" , 10); - + + Если НЕ ЗначениеЗаполнено(Текст.ПолучитьСтроку(й)) Тогда + Продолжить; + КонецЕсли; + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(й), "|"); Для Каждого ТекЭлемент Из СтруктураРезультата Цикл @@ -545,6 +562,8 @@ СоответствиеИменБД = Новый Соответствие(); + КоличествоПолей = 3; + ТекСтрока = Чтение.ПрочитатьСтроку(); Пока НЕ ТекСтрока = Неопределено Цикл @@ -554,22 +573,29 @@ ЧастиСтроки = СтрРазделить(ТекСтрока, ",", Ложь); - Если ЧастиСтроки.Количество() < 3 Тогда + Если ЧастиСтроки.Количество() < КоличествоПолей Тогда ТекСтрока = Чтение.ПрочитатьСтроку(); Продолжить; КонецЕсли; + ИндексСтрокой = ЧастиСтроки[2]; + СтрокаСоответствия = Новый Структура(); СтрокаСоответствия.Вставить("Ид" , ПривестиСтроку(ЧастиСтроки[0])); СтрокаСоответствия.Вставить("Префикс", ПривестиСтроку(ЧастиСтроки[1])); - СтрокаСоответствия.Вставить("Индекс" , ПривестиСтроку(ЧастиСтроки[2])); + СтрокаСоответствия.Вставить("Индекс" , ПривестиСтроку(ИндексСтрокой)); + + НазначениеОбъекта = ""; + Если НазначенияОбъектовБазы.Свойство(СтрокаСоответствия.Префикс) Тогда + НазначениеОбъекта = НазначенияОбъектовБазы[СтрокаСоответствия.Префикс].Назначение; + КонецЕсли; - Если НЕ ДобавлятьКолонки И ВРег(СтрокаСоответствия.Префикс) = "FLD" Тогда + Если НЕ ДобавлятьКолонки И НазначениеОбъекта = "Поле" Тогда ТекСтрока = Чтение.ПрочитатьСтроку(); Продолжить; КонецЕсли; - СоответствиеИменБД.Вставить(СтрШаблон("%1%2", СтрокаСоответствия.Префикс, ЧастиСтроки[2]), СтрокаСоответствия); + СоответствиеИменБД.Вставить(СтрШаблон("%1%2", СтрокаСоответствия.Префикс, ИндексСтрокой), СтрокаСоответствия); ТекСтрока = Чтение.ПрочитатьСтроку(); КонецЦикла; @@ -591,6 +617,8 @@ СоответствиеИменМетаданных = Новый Соответствие(); КонецЕсли; + ДлинаИд = 36; + Парсер = Новый ЧтениеXML; Парсер.УстановитьСтроку(ТекстXML); @@ -608,7 +636,7 @@ Данные = ЗначенияАтрибутов["BINARYDATA"]; Если ЗначенияАтрибутов.Количество() = 0 ИЛИ Ид = Неопределено - ИЛИ Данные = Неопределено ИЛИ СтрДлина(Ид) <> 36 Тогда + ИЛИ Данные = Неопределено ИЛИ СтрДлина(Ид) <> ДлинаИд Тогда Продолжить; КонецЕсли; @@ -823,8 +851,6 @@ ТабличныеЧастиИВладельцы = Новый Соответствие(); - НазначенияОбъектовБазы = НазначенияОбъектовБазы(); - Для Каждого ТекНазначение Из НазначенияОбъектовБазы Цикл Если НЕ ТекНазначение.Значение.Подчиненный Тогда @@ -881,6 +907,34 @@ КонецФункции // СтруктураОписанияОбъектаБазы() +Функция ПрочитатьСимволы(Знач ИсходнаяСтрока, ЧитатьЧисла = Ложь) + + НачалоСледующегоСимвола = 2; + + ПрочитанныеСимволы = ""; + + Символ = Сред(ИсходнаяСтрока, 1, 1); + + Пока НЕ (ЭтоЧисло(Символ) ИЛИ ЧитатьЧисла) + ИЛИ (ЭтоЧисло(Символ) И ЧитатьЧисла) Цикл + + ПрочитанныеСимволы = ПрочитанныеСимволы + Символ; + + Если СтрДлина(ИсходнаяСтрока) = 1 Тогда + ИсходнаяСтрока = ""; + Символ = ""; + Прервать; + КонецЕсли; + + ИсходнаяСтрока = Сред(ИсходнаяСтрока, НачалоСледующегоСимвола); + Символ = Сред(ИсходнаяСтрока, 1, 1); + + КонецЦикла; + + Возврат ПрочитанныеСимволы; + +КонецФункции // ПрочитатьСимволы() + // Функция - раскладывает имя объекта базы на префикс, индекс, владельца и суффикс // // Параметры: @@ -893,25 +947,12 @@ ОписаниеОбъектаБазы = СтруктураОписанияОбъектаБазы(); - НазначенияОбъектовБазы = НазначенияОбъектовБазы(); - УбратьЛидирующееПодчеркивание(ИмяОбъектаБазы); + ПрефиксОбъекта = ПрочитатьСимволы(ИмяОбъектаБазы); + ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, СтрДлина(ПрефиксОбъекта) + 1); Символ = Сред(ИмяОбъектаБазы, 1, 1); - ПрефиксОбъекта = ""; - - Пока НЕ ЭтоЧисло(Символ) Цикл - ПрефиксОбъекта = ПрефиксОбъекта + Символ; - Если СтрДлина(ИмяОбъектаБазы) = 1 Тогда - ИмяОбъектаБазы = ""; - Символ = ""; - Прервать; - КонецЕсли; - ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, 2); - Символ = Сред(ИмяОбъектаБазы, 1, 1); - КонецЦикла; - ПозицияИмениТЧ = 0; ПрефиксИмениТЧ = ""; Для Каждого ТекЭлемент Из НазначенияОбъектовБазы Цикл @@ -932,8 +973,8 @@ Символ = Сред(ИмяОбъектаБазы, 1, 1); КонецЕсли; - Если НазначенияОбъектовБазы.Свойство(ВРег(ПрефиксОбъекта)) Тогда - НазначениеОбъекта = НазначенияОбъектовБазы[ВРег(ПрефиксОбъекта)]; + Если НазначенияОбъектовБазы.Свойство(ПрефиксОбъекта) Тогда + НазначениеОбъекта = НазначенияОбъектовБазы[ПрефиксОбъекта]; ЗаполнитьЗначенияСвойств(ОписаниеОбъектаБазы, НазначениеОбъекта); КонецЕсли; @@ -947,24 +988,17 @@ ОписаниеОбъектаБазы.Префикс = ПрефиксОбъекта; - ИндексОбъекта = ""; - - Пока ЭтоЧисло(Символ) Цикл - ИндексОбъекта = ИндексОбъекта + Символ; - Если СтрДлина(ИмяОбъектаБазы) = 1 Тогда - ИмяОбъектаБазы = ""; - Символ = ""; - Прервать; - КонецЕсли; - ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, 2); - Символ = Сред(ИмяОбъектаБазы, 1, 1); - КонецЦикла; + ИндексОбъекта = ПрочитатьСимволы(ИмяОбъектаБазы, Истина); + ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, СтрДлина(ИндексОбъекта) + 1); + Символ = Сред(ИмяОбъектаБазы, 1, 1); Если ЗначениеЗаполнено(ИндексОбъекта) Тогда ОписаниеОбъектаБазы.Индекс = Число(ИндексОбъекта); КонецЕсли; - ОписаниеОбъектаБазы.Имя = СтрШаблон("%1%2", ОписаниеОбъектаБазы.Префикс, Формат(ОписаниеОбъектаБазы.Индекс, "ЧРГ=; ЧГ=")); + ОписаниеОбъектаБазы.Имя = СтрШаблон("%1%2", + ОписаниеОбъектаБазы.Префикс, + Формат(ОписаниеОбъектаБазы.Индекс, "ЧРГ=; ЧГ=")); Если ЗначениеЗаполнено(Символ) Тогда ОписаниеОбъектаБазы.Суффикс = ИмяОбъектаБазы; @@ -1089,12 +1123,14 @@ // Функция ИмяМетаданных(Описание, Ид) + СмещениеОтИд = 3; + ИмяМетаданных = ""; Позиция = СтрНайти(Описание, Ид); Если Позиция = 0 Тогда Возврат ""; КонецЕсли; - Позиция = Позиция + СтрДлина(Ид) + 3; + Позиция = Позиция + СтрДлина(Ид) + СмещениеОтИд; Символ = Сред(Описание, Позиция, 1); Пока НЕ Символ = """" Цикл @@ -1179,8 +1215,8 @@ Текст = Новый ТекстовыйДокумент(); Текст.УстановитьТекст(ТекстXML); + Текст.ВставитьСтроку(1, ""); Текст.ВставитьСтроку(1, ""); - Текст.ВставитьСтроку(2, ""); Текст.ДобавитьСтроку(""); ТекстXML = Текст.ПолучитьТекст(); @@ -1213,13 +1249,18 @@ ТипЗнч(Данные)); КонецЕсли; + ДлинаБОМ = 3; + КодСимволаБОМ1 = 239; // 0xEF + КодСимволаБОМ2 = 187; // 0xBB + КодСимволаБОМ3 = 191; // 0xBF + Поток.Перейти(0, ПозицияВПотоке.Начало); - Буфер = Новый БуферДвоичныхДанных(3); + Буфер = Новый БуферДвоичныхДанных(ДлинаБОМ); - Поток.Прочитать(Буфер, 0, 3); + Поток.Прочитать(Буфер, 0, ДлинаБОМ); - Возврат НЕ (Буфер[0] = 239 И Буфер[1] = 187 И Буфер[2] = 191); + Возврат НЕ (Буфер[0] = КодСимволаБОМ1 И Буфер[1] = КодСимволаБОМ2 И Буфер[2] = КодСимволаБОМ3); КонецФункции // ДанныеУпакованы() @@ -1236,8 +1277,10 @@ Результат = СокрЛП(Строка); + УдалитьСимволов = 2; + Если Лев(Результат, 1) = """" И Прав(Результат, 1) = """" Тогда - Результат = Сред(Результат, 2, СтрДлина(Результат) - 2); + Результат = Сред(Результат, УдалитьСимволов, СтрДлина(Результат) - УдалитьСимволов); КонецЕсли; Если ПустаяСтрока(Результат) Тогда @@ -1259,8 +1302,10 @@ // Процедура УбратьЛидирующееПодчеркивание(Имя) + НачальнаяПозиция = 2; + Если Лев(Имя, 1) = "_" Тогда - Имя = Сред(Имя, 2); + Имя = Сред(Имя, НачальнаяПозиция); КонецЕсли; КонецПроцедуры // УбратьЛидирующееПодчеркивание() @@ -1311,6 +1356,8 @@ ТекущийСервер = ПодключениеКСУБД.Сервер(); База = _База; + НазначенияОбъектовБазы = НазначенияОбъектовБазы(); + Лог = ПараметрыСистемы.Лог(); КонецПроцедуры // ПриСозданииОбъекта() From 54b5d4cb82464a5a61b9391835d24ffe66fa0d73 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Thu, 26 May 2022 23:26:33 +0300 Subject: [PATCH 14/38] =?UTF-8?q?test:=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D1=87?= =?UTF-8?q?=D1=82=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=20=D0=B1=D0=B0=D0=B7=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/ib-structure-tests.os | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index d1e583f..e2c0593 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -418,7 +418,7 @@ ТекстОшибки = СтрШаблон("Ошибка получения таблиц базы ""%1""", ИмяБД); - Утверждения.ПроверитьБольше(ТаблицыБазы.Количество(), 0, ТекстОшибки); + Утверждения.ПроверитьРавенство(ТаблицыБазы.Количество(), 48, ТекстОшибки); ТекстОшибки = СтрШаблон("Ошибка получения таблиц базы ""%1"", не найдена таблица ""%2""", ИмяБД, ТестоваяТаблица); From 90b6a1c2b94b738a1c2fff9667635c510d9bcb38 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 27 May 2022 08:29:26 +0300 Subject: [PATCH 15/38] =?UTF-8?q?refactor:=20=D0=9F=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D1=81=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20MS=20SQL=20(=D0=9F=D0=BE?= =?UTF-8?q?=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=D0=9A?= =?UTF-8?q?=D0=A1=D0=A3=D0=91=D0=94=20->=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5MSSQL);?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 92 ---------- lib.config | 2 +- ...20\232\320\276\320\277\320\270\320\270.os" | 2 +- ...21\200\320\260\320\275\320\270\321\206.os" | 2 +- ...21\200\320\270\320\277\321\202\321\213.os" | 2 +- ...20\260\320\275\320\275\321\213\321\205.os" | 2 +- ...20\232\320\276\320\277\320\270\321\216.os" | 2 +- ...20\260\320\275\320\275\321\213\321\205.os" | 2 +- ...7\320\265\320\275\320\270\320\265MSSQL.os" | 0 src/lib.config | 2 +- tests/ib-structure-tests.os | 162 +++++------------- tests/sql-tests.os | 2 +- 12 files changed, 55 insertions(+), 217 deletions(-) delete mode 100644 Jenkinsfile rename "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" => "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" (100%) diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index fd22ed7..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,92 +0,0 @@ - -pipeline { - agent none - options { - buildDiscarder(logRotator(numToKeepStr: '7')) - skipDefaultCheckout() - } - - stages { - stage('Тестирование кода пакета WIN') { - - agent { label 'windows' } - - steps { - checkout scm - - script { - if( fileExists ('tasks/test.os') ){ - bat 'chcp 65001 > nul && oscript tasks/test.os' - junit junit 'junit-*.xml' - } - else - echo 'no testing task' - } - - } - - } - - stage('Тестирование кода пакета LINUX') { - - agent { label 'master' } - - steps { - echo 'under development' - } - - } - - stage('Сборка пакета') { - - agent { label 'windows' } - - steps { - checkout scm - - bat 'erase /Q *.ospx' - bat 'chcp 65001 > nul && call opm build .' - - stash includes: '*.ospx', name: 'package' - archiveArtifacts '*.ospx' - } - - } - - stage('Публикация в хабе') { - when { - branch 'master' - } - agent { label 'master' } - steps { - sh 'rm -f *.ospx' - unstash 'package' - - sh ''' - artifact=`ls -1 *.ospx` - basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'` - cp $artifact $basename.ospx - sudo rsync -rv *.ospx /var/www/hub.oscript.io/download/$basename/ - '''.stripIndent() - } - } - - stage('Публикация в нестабильном хабе') { - when { - branch 'develop' - } - agent { label 'master' } - steps { - sh 'rm -f *.ospx' - unstash 'package' - - sh ''' - artifact=`ls -1 *.ospx` - basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'` - cp $artifact $basename.ospx - sudo rsync -rv *.ospx /var/www/hub.oscript.io/dev-channel/$basename/ - '''.stripIndent() - } - } - } -} diff --git a/lib.config b/lib.config index a4c8b5a..a4d1a82 100644 --- a/lib.config +++ b/lib.config @@ -1,6 +1,6 @@  - + diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214\320\230\320\267\320\240\320\265\320\267\320\265\321\200\320\262\320\275\320\276\320\271\320\232\320\276\320\277\320\270\320\270.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214\320\230\320\267\320\240\320\265\320\267\320\265\321\200\320\262\320\275\320\276\320\271\320\232\320\276\320\277\320\270\320\270.os" index a3ee62a..5ba9493 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214\320\230\320\267\320\240\320\265\320\267\320\265\321\200\320\262\320\275\320\276\320\271\320\232\320\276\320\277\320\270\320\270.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214\320\230\320\267\320\240\320\265\320\267\320\265\321\200\320\262\320\275\320\276\320\271\320\232\320\276\320\277\320\270\320\270.os" @@ -109,7 +109,7 @@ ИзменитьЛИФ = ЧтениеОпций.ЗначениеОпции("db-changelfn"); УдалитьИсточник = ЧтениеОпций.ЗначениеОпции("delsrc"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(ПараметрыПодключения.Сервер, + ПодключениеКСУБД = Новый ПодключениеMSSQL(ПараметрыПодключения.Сервер, ПараметрыПодключения.Пользователь, ПараметрыПодключения.ПарольПользователя); diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\232\320\276\320\274\320\277\321\200\320\265\321\201\321\201\320\270\321\216\320\241\321\202\321\200\320\260\320\275\320\270\321\206.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\232\320\276\320\274\320\277\321\200\320\265\321\201\321\201\320\270\321\216\320\241\321\202\321\200\320\260\320\275\320\270\321\206.os" index 9b15661..4c28b38 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\232\320\276\320\274\320\277\321\200\320\265\321\201\321\201\320\270\321\216\320\241\321\202\321\200\320\260\320\275\320\270\321\206.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\232\320\276\320\274\320\277\321\200\320\265\321\201\321\201\320\270\321\216\320\241\321\202\321\200\320\260\320\275\320\270\321\206.os" @@ -60,7 +60,7 @@ СжатьБазу = ЧтениеОпций.ЗначениеОпции("shrink-db"); СжатьФайлЛог = ЧтениеОпций.ЗначениеОпции("shrink-log"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(Сервер, Пользователь, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(Сервер, Пользователь, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\241\320\272\321\200\320\270\320\277\321\202\321\213.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\241\320\272\321\200\320\270\320\277\321\202\321\213.os" index 7d0e35b..e1479f0 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\241\320\272\321\200\320\270\320\277\321\202\321\213.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\241\320\272\321\200\320\270\320\277\321\202\321\213.os" @@ -57,7 +57,7 @@ СкриптыВыполнения = ЧтениеОпций.ЗначениеОпции("files"); СтрокаПеременных = ЧтениеОпций.ЗначениеОпции("vars"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(Сервер, Пользователь, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(Сервер, Пользователь, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\221\320\260\320\267\321\203\320\224\320\260\320\275\320\275\321\213\321\205.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\221\320\260\320\267\321\203\320\224\320\260\320\275\320\275\321\213\321\205.os" index 36e71b1..4f75bb7 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\221\320\260\320\267\321\203\320\224\320\260\320\275\320\275\321\213\321\205.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\221\320\260\320\267\321\203\320\224\320\260\320\275\320\275\321\213\321\205.os" @@ -59,7 +59,7 @@ МодельВосстановления = ЧтениеОпций.ЗначениеОпции("db-recovery"); ПутьККаталогу = ЧтениеОпций.ЗначениеОпции("db-datapath"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(Сервер, Пользователь, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(Сервер, Пользователь, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\240\320\265\320\267\320\265\321\200\320\262\320\275\321\203\321\216\320\232\320\276\320\277\320\270\321\216.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\240\320\265\320\267\320\265\321\200\320\262\320\275\321\203\321\216\320\232\320\276\320\277\320\270\321\216.os" index 8efb888..74f0572 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\240\320\265\320\267\320\265\321\200\320\262\320\275\321\203\321\216\320\232\320\276\320\277\320\270\321\216.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\240\320\265\320\267\320\265\321\200\320\262\320\275\321\203\321\216\320\232\320\276\320\277\320\270\321\216.os" @@ -56,7 +56,7 @@ База = ЧтениеОпций.ЗначениеОпции("db"); ПутьКРезервнойКопии = ЧтениеОпций.ЗначениеОпции("bak-path"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(Сервер, Пользователь, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(Сервер, Пользователь, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\264\320\260\320\273\320\270\321\202\321\214\320\221\320\260\320\267\321\203\320\224\320\260\320\275\320\275\321\213\321\205.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\264\320\260\320\273\320\270\321\202\321\214\320\221\320\260\320\267\321\203\320\224\320\260\320\275\320\275\321\213\321\205.os" index c1813db..25f2254 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\264\320\260\320\273\320\270\321\202\321\214\320\221\320\260\320\267\321\203\320\224\320\260\320\275\320\275\321\213\321\205.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\264\320\260\320\273\320\270\321\202\321\214\320\221\320\260\320\267\321\203\320\224\320\260\320\275\320\275\321\213\321\205.os" @@ -48,7 +48,7 @@ ПарольПользователя = ЧтениеОпций.ЗначениеОпции("pwd", Истина); База = ЧтениеОпций.ЗначениеОпции("db"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(Сервер, Пользователь, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(Сервер, Пользователь, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" similarity index 100% rename from "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\232\320\241\320\243\320\221\320\224.os" rename to "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" diff --git a/src/lib.config b/src/lib.config index 47c9baf..e790616 100644 --- a/src/lib.config +++ b/src/lib.config @@ -1,6 +1,6 @@  - + diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index e2c0593..a81714c 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -26,23 +26,13 @@ ПрефиксИмениБД = "cpdb_test_db"; ФайлКопииБазы = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "cpdb_test_db.bak"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(ИмяСервера, ИмяПользователя, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(ИмяСервера, ИмяПользователя, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); Лог = ПараметрыСистемы.Лог(); Лог.УстановитьУровень(УровниЛога.Информация); - Для й = 1 По 3 Цикл - ИмяБазы = СтрШаблон("%1_%2", ПрефиксИмениБД, й); - - Если НЕ РаботаССУБД.БазаСуществует(ИмяБазы) Тогда - Продолжить; - КонецЕсли; - - РаботаССУБД.УдалитьБазуДанных(ИмяБазы); - КонецЦикла; - КонецПроцедуры // ПередЗапускомТеста() // Процедура выполняется после запуска теста @@ -52,7 +42,17 @@ КонецПроцедуры // ПослеЗапускаТеста() &Тест -Процедура ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() Экспорт +Процедура ТестДолжен_ПодготовитьТестовуюБазу() Экспорт + + Для й = 1 По 3 Цикл + ИмяБазы = СтрШаблон("%1_%2", ПрефиксИмениБД, й); + + Если НЕ РаботаССУБД.БазаСуществует(ИмяБазы) Тогда + Продолжить; + КонецЕсли; + + РаботаССУБД.УдалитьБазуДанных(ИмяБазы); + КонецЦикла; ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); @@ -72,6 +72,17 @@ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); +КонецПроцедуры // ТестДолжен_ПодготовитьТестовуюБазу() + +&Тест +Процедура ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() Экспорт + + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); ОписаниеВерсии = СтруктураХраненияИБ.ВерсияФорматаКонфигурации(); @@ -87,19 +98,7 @@ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); - РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); - - Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); - - РаботаССУБД.ВыполнитьВосстановление(ИмяБД, - ФайлКопииБазы, - КаталогВременныхДанных, - КаталогВременныхДанных, - Истина); - - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); @@ -121,19 +120,7 @@ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); - РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); - - Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); - - РаботаССУБД.ВыполнитьВосстановление(ИмяБД, - ФайлКопииБазы, - КаталогВременныхДанных, - КаталогВременныхДанных, - Истина); - - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); @@ -165,19 +152,7 @@ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); - РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); - - Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); - - РаботаССУБД.ВыполнитьВосстановление(ИмяБД, - ФайлКопииБазы, - КаталогВременныхДанных, - КаталогВременныхДанных, - Истина); - - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); @@ -209,19 +184,7 @@ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); - РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); - - Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); - - РаботаССУБД.ВыполнитьВосстановление(ИмяБД, - ФайлКопииБазы, - КаталогВременныхДанных, - КаталогВременныхДанных, - Истина); - - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); @@ -264,19 +227,7 @@ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); - РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); - - Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); - - РаботаССУБД.ВыполнитьВосстановление(ИмяБД, - ФайлКопииБазы, - КаталогВременныхДанных, - КаталогВременныхДанных, - Истина); - - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); @@ -324,19 +275,7 @@ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); - РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); - - Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); - - РаботаССУБД.ВыполнитьВосстановление(ИмяБД, - ФайлКопииБазы, - КаталогВременныхДанных, - КаталогВременныхДанных, - Истина); - - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); @@ -363,19 +302,7 @@ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); - РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); - - Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); - - РаботаССУБД.ВыполнитьВосстановление(ИмяБД, - ФайлКопииБазы, - КаталогВременныхДанных, - КаталогВременныхДанных, - Истина); - - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); @@ -394,19 +321,7 @@ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); - РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД); - - Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); - - РаботаССУБД.ВыполнитьВосстановление(ИмяБД, - ФайлКопииБазы, - КаталогВременныхДанных, - КаталогВременныхДанных, - Истина); - - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы); + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); @@ -440,3 +355,18 @@ Утверждения.ПроверитьБольше(ТекТаблица.ВсегоЗанято, 0, ТекстОшибки); КонецПроцедуры // ТестДолжен_ПолучитьРазмерыИПараметрыИспользованияТаблицБазы() + +&Тест +Процедура ТестДолжен_УдалитьТестовуюБазу() Экспорт + + Для й = 1 По 3 Цикл + ИмяБазы = СтрШаблон("%1_%2", ПрефиксИмениБД, й); + + Если НЕ РаботаССУБД.БазаСуществует(ИмяБазы) Тогда + Продолжить; + КонецЕсли; + + РаботаССУБД.УдалитьБазуДанных(ИмяБазы); + КонецЦикла; + +КонецПроцедуры // ТестДолжен_УдалитьТестовуюБазу() diff --git a/tests/sql-tests.os b/tests/sql-tests.os index 265c078..9cd784e 100644 --- a/tests/sql-tests.os +++ b/tests/sql-tests.os @@ -22,7 +22,7 @@ ПрефиксИмениБД = "cpdb_test_db_"; ФайлКопииБазы = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "cpdb_test_db.bak"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(ИмяСервера, ИмяПользователя, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(ИмяСервера, ИмяПользователя, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); From f5b8e8c3952105408656a156ff6da3b43c61569b Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 27 May 2022 08:30:22 +0300 Subject: [PATCH 16/38] =?UTF-8?q?refactor:=20=D0=A2=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20NextCl?= =?UTF-8?q?oud=20=D0=B8=20SFTP=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/file-tests.os | 223 --------------------------------------- tests/nextcloud-tests.os | 215 +++++++++++++++++++++++++++++++++++++ tests/ssh-tests.os | 218 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 433 insertions(+), 223 deletions(-) create mode 100644 tests/nextcloud-tests.os create mode 100644 tests/ssh-tests.os diff --git a/tests/file-tests.os b/tests/file-tests.os index fb6fe0f..58d7c4e 100644 --- a/tests/file-tests.os +++ b/tests/file-tests.os @@ -47,229 +47,6 @@ КонецПроцедуры // ТестДолжен_СоздатьФайл() -&Тест -Процедура ТестДолжен_СоздатьПапкуВNextCloud() Экспорт - - АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); - АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); - АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); - - Клиент = Новый РаботаСNextCloud(АдресСервиса, АдминИмя, АдминПароль); - - ИмяКаталога = "testFolder1"; - - Клиент.СоздатьКаталог(ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" в сервисе ""%2"", для пользователя ""%3""", - ИмяКаталога, - АдресСервиса, - АдминИмя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); - - Клиент.Удалить(ИмяКаталога); - -КонецПроцедуры // ТестДолжен_СоздатьПапкуВNextCloud() - -&Тест -Процедура ТестДолжен_ОтправитьФайлВNextCloud() Экспорт - - АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); - АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); - АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); - - Клиент = Новый РаботаСNextCloud(АдресСервиса, АдминИмя, АдминПароль); - - ИмяКаталога = "testFolder1"; - - ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); - - Клиент.СоздатьКаталог(ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" в сервисе ""%2"", для пользователя ""%3""", - ИмяКаталога, - АдресСервиса, - АдминИмя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); - - Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" в сервис ""%2"", для пользователя ""%3""", - ТестовыйФайл.ПолноеИмя, - АдресСервиса, - АдминИмя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)), ТекстОшибки); - - Клиент.Удалить(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)); - - Клиент.Удалить(ИмяКаталога); - -КонецПроцедуры // ТестДолжен_ОтправитьФайлВNextCloud() - -&Тест -Процедура ТестДолжен_ПолучитьФайлИзNextCloud() Экспорт - - АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); - АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); - АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); - - Клиент = Новый РаботаСNextCloud(АдресСервиса, АдминИмя, АдминПароль); - - ИмяКаталога = "testFolder1"; - - ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); - - Клиент.СоздатьКаталог(ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" в сервисе ""%2"", для пользователя ""%3""", - ИмяКаталога, - АдресСервиса, - АдминИмя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); - - Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" в сервис ""%2"", для пользователя ""%3""", - ТестовыйФайл.ПолноеИмя, - АдресСервиса, - АдминИмя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)), ТекстОшибки); - - ФС.ОбеспечитьКаталог(КаталогВременныхДанных); - - Клиент.ПолучитьФайл(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя), - КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка получения файла ""%1"" из сервиса ""%2"", для пользователя ""%3""", - ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя), - АдресСервиса, - АдминИмя); - - Утверждения.ПроверитьИстину(ТестовыйФайл.Существует(), ТекстОшибки); - - Клиент.Удалить(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)); - - Клиент.Удалить(ИмяКаталога); - -КонецПроцедуры // ТестДолжен_ПолучитьФайлИзNextCloud() - -&Тест -Процедура ТестДолжен_СоздатьПапкуНаSFTP() Экспорт - - АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); - ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); - ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); - - Клиент = Новый РаботаССерверомSSH(АдресСервера, ПользовательИмя, ПользовательПароль); - - ИмяКаталога = "testFolder1"; - - Клиент.СоздатьКаталог(ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" на сервере ""%2"", для пользователя ""%3""", - ИмяКаталога, - АдресСервера, - ПользовательИмя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); - - Клиент.УдалитьКаталог(ИмяКаталога); - -КонецПроцедуры // ТестДолжен_СоздатьПапкуНаSFTP() - -&Тест -Процедура ТестДолжен_ОтправитьФайлНаSFTP() Экспорт - - АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); - ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); - ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); - - Клиент = Новый РаботаССерверомSSH(АдресСервера, ПользовательИмя, ПользовательПароль); - - ИмяКаталога = "testFolder1"; - - ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); - - Клиент.СоздатьКаталог(ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" на сервере ""%2"", для пользователя ""%3""", - ИмяКаталога, - АдресСервера, - ПользовательИмя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); - - Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" на сервер ""%2"", для пользователя ""%3""", - ТестовыйФайл.ПолноеИмя, - АдресСервера, - ПользовательИмя); - - ПутьКФайлу = СтрШаблон("%1/%2", ИмяКаталога, ТестовыйФайл.Имя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ПутьКФайлу), ТекстОшибки); - - Клиент.УдалитьФайл(ПутьКФайлу); - - Клиент.УдалитьКаталог(ИмяКаталога); - -КонецПроцедуры // ТестДолжен_ОтправитьФайлНаSFTP() - -&Тест -Процедура ТестДолжен_ПолучитьФайлСSFTP() Экспорт - - АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); - ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); - ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); - - Клиент = Новый РаботаССерверомSSH(АдресСервера, ПользовательИмя, ПользовательПароль); - - ИмяКаталога = "testFolder1"; - - ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); - - Клиент.СоздатьКаталог(ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" на сервере ""%2"", для пользователя ""%3""", - ИмяКаталога, - АдресСервера, - ПользовательИмя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); - - Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога); - - ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" на сервер ""%2"", для пользователя ""%3""", - ТестовыйФайл.ПолноеИмя, - АдресСервера, - ПользовательИмя); - - ПутьКФайлу = СтрШаблон("%1/%2", ИмяКаталога, ТестовыйФайл.Имя); - - Утверждения.ПроверитьИстину(Клиент.Существует(ПутьКФайлу), ТекстОшибки); - - ФС.ОбеспечитьКаталог(КаталогВременныхДанных); - - Клиент.ПолучитьФайл(ПутьКФайлу, КаталогВременныхДанных); - - ТекстОшибки = СтрШаблон("Ошибка получения файла ""%1"" с сервера ""%2"", для пользователя ""%3""", - ПутьКФайлу, - АдресСервера, - ПользовательИмя); - - Утверждения.ПроверитьИстину(ТестовыйФайл.Существует(), ТекстОшибки); - - Клиент.УдалитьФайл(ПутьКФайлу); - - Клиент.УдалитьКаталог(ИмяКаталога); - -КонецПроцедуры // ТестДолжен_ПолучитьФайлСSFTP() - &Тест Процедура ТестДолжен_ПроверитьКопированиеФайла() Экспорт diff --git a/tests/nextcloud-tests.os b/tests/nextcloud-tests.os new file mode 100644 index 0000000..cc01e87 --- /dev/null +++ b/tests/nextcloud-tests.os @@ -0,0 +1,215 @@ +#Использовать fs +#Использовать "../src/core" +#Использовать "../src/cmd" + +Перем ПутьКТестовомуФайлу; // - путь к файлу для тестов +Перем КаталогВременныхДанных; // - путь к каталогу временных данных +Перем Лог; // - логгер + +#Область ОбработчикиСобытий + +// Процедура выполняется после запуска теста +// +Процедура ПередЗапускомТеста() Экспорт + + КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "tmpdata"); + КаталогВременныхДанных = ФС.ПолныйПуть(КаталогВременныхДанных); + + ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst"); + + Лог = ПараметрыСистемы.Лог(); + Лог.УстановитьУровень(УровниЛога.Информация); + +КонецПроцедуры // ПередЗапускомТеста() + +// Процедура выполняется после запуска теста +// +Процедура ПослеЗапускаТеста() Экспорт + +КонецПроцедуры // ПослеЗапускаТеста() + +#КонецОбласти // ОбработчикиСобытий + +#Область Тесты + +&Тест +Процедура ТестДолжен_СоздатьФайл() Экспорт + + ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных); + + РазмерФайла = 31457280; + + СоздатьСлучайныйФайл(ПутьКТестовомуФайлу, РазмерФайла); + + ТекстОшибки = СтрШаблон("Ошибка создания файла ""%1""", ПутьКТестовомуФайлу); + + Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКТестовомуФайлу), ТекстОшибки); + +КонецПроцедуры // ТестДолжен_СоздатьФайл() + +&Тест +Процедура ТестДолжен_СоздатьПапкуВNextCloud() Экспорт + + АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); + АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); + АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); + + Клиент = Новый РаботаСNextCloud(АдресСервиса, АдминИмя, АдминПароль); + + ИмяКаталога = "testFolder1"; + + Клиент.СоздатьКаталог(ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" в сервисе ""%2"", для пользователя ""%3""", + ИмяКаталога, + АдресСервиса, + АдминИмя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); + + Клиент.Удалить(ИмяКаталога); + +КонецПроцедуры // ТестДолжен_СоздатьПапкуВNextCloud() + +&Тест +Процедура ТестДолжен_ОтправитьФайлВNextCloud() Экспорт + + АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); + АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); + АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); + + Клиент = Новый РаботаСNextCloud(АдресСервиса, АдминИмя, АдминПароль); + + ИмяКаталога = "testFolder1"; + + ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); + + Клиент.СоздатьКаталог(ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" в сервисе ""%2"", для пользователя ""%3""", + ИмяКаталога, + АдресСервиса, + АдминИмя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); + + Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" в сервис ""%2"", для пользователя ""%3""", + ТестовыйФайл.ПолноеИмя, + АдресСервиса, + АдминИмя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)), ТекстОшибки); + + Клиент.Удалить(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)); + + Клиент.Удалить(ИмяКаталога); + +КонецПроцедуры // ТестДолжен_ОтправитьФайлВNextCloud() + +&Тест +Процедура ТестДолжен_ПолучитьФайлИзNextCloud() Экспорт + + АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); + АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); + АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); + + Клиент = Новый РаботаСNextCloud(АдресСервиса, АдминИмя, АдминПароль); + + ИмяКаталога = "testFolder1"; + + ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); + + Клиент.СоздатьКаталог(ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" в сервисе ""%2"", для пользователя ""%3""", + ИмяКаталога, + АдресСервиса, + АдминИмя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); + + Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" в сервис ""%2"", для пользователя ""%3""", + ТестовыйФайл.ПолноеИмя, + АдресСервиса, + АдминИмя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)), ТекстОшибки); + + ФС.ОбеспечитьКаталог(КаталогВременныхДанных); + + Клиент.ПолучитьФайл(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя), + КаталогВременныхДанных); + + ТекстОшибки = СтрШаблон("Ошибка получения файла ""%1"" из сервиса ""%2"", для пользователя ""%3""", + ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя), + АдресСервиса, + АдминИмя); + + Утверждения.ПроверитьИстину(ТестовыйФайл.Существует(), ТекстОшибки); + + Клиент.Удалить(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)); + + Клиент.Удалить(ИмяКаталога); + +КонецПроцедуры // ТестДолжен_ПолучитьФайлИзNextCloud() + +&Тест +Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт + + УдалитьФайлы(КаталогВременныхДанных); + + ТекстОшибки = СтрШаблон("Ошибка удаления каталога временных файлов ""%1""", КаталогВременныхДанных); + + Утверждения.ПроверитьЛожь(ФС.ФайлСуществует(КаталогВременныхДанных), ТекстОшибки); + +КонецПроцедуры // ТестДолжен_УдалитьТестовыйКаталог() + +#КонецОбласти // Тесты + +#Область СлужебныеПроцедурыИФункции + +Процедура СоздатьСлучайныйФайл(ПутьКФайлу, РазмерФайла) + + Если ФС.ФайлСуществует(ПутьКФайлу) Тогда + УдалитьФайлы(ПутьКФайлу); + КонецЕсли; + + НачальноеЧисло = 1113; + ДлинаЧисла = 8; + ГраницаГСЧ = 4294836225; + + ЧастейЗаписи = 100; + МаксПорцияЗаписи = 10485760; + ПорцияЗаписи = 1024; + Если Цел(РазмерФайла / ЧастейЗаписи) <= МаксПорцияЗаписи Тогда + ПорцияЗаписи = Цел(РазмерФайла / ЧастейЗаписи); + Иначе + ПорцияЗаписи = МаксПорцияЗаписи; + КонецЕсли; + + ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло); + + ЗаписьДанных = Новый ЗаписьДанных(ПутьКФайлу); + + Записано = 0; + + Пока Записано < РазмерФайла Цикл + Число = ГСЧ.СлучайноеЧисло(0, ГраницаГСЧ); + + ЗаписьДанных.ЗаписатьЦелое64(Число); + + Записано = Записано + ДлинаЧисла; + Если Записано % ПорцияЗаписи = 0 Тогда + ЗаписьДанных.СброситьБуферы(); + КонецЕсли; + КонецЦикла; + + ЗаписьДанных.Закрыть(); + +КонецПроцедуры // СоздатьФайл() + +#КонецОбласти // СлужебныеПроцедурыИФункции diff --git a/tests/ssh-tests.os b/tests/ssh-tests.os new file mode 100644 index 0000000..0ec124b --- /dev/null +++ b/tests/ssh-tests.os @@ -0,0 +1,218 @@ +#Использовать fs +#Использовать "../src/core" +#Использовать "../src/cmd" + +Перем ПутьКТестовомуФайлу; // - путь к файлу для тестов +Перем КаталогВременныхДанных; // - путь к каталогу временных данных +Перем Лог; // - логгер + +#Область ОбработчикиСобытий + +// Процедура выполняется после запуска теста +// +Процедура ПередЗапускомТеста() Экспорт + + КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "tmpdata"); + КаталогВременныхДанных = ФС.ПолныйПуть(КаталогВременныхДанных); + + ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst"); + + Лог = ПараметрыСистемы.Лог(); + Лог.УстановитьУровень(УровниЛога.Информация); + +КонецПроцедуры // ПередЗапускомТеста() + +// Процедура выполняется после запуска теста +// +Процедура ПослеЗапускаТеста() Экспорт + +КонецПроцедуры // ПослеЗапускаТеста() + +#КонецОбласти // ОбработчикиСобытий + +#Область Тесты + +&Тест +Процедура ТестДолжен_СоздатьФайл() Экспорт + + ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных); + + РазмерФайла = 31457280; + + СоздатьСлучайныйФайл(ПутьКТестовомуФайлу, РазмерФайла); + + ТекстОшибки = СтрШаблон("Ошибка создания файла ""%1""", ПутьКТестовомуФайлу); + + Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКТестовомуФайлу), ТекстОшибки); + +КонецПроцедуры // ТестДолжен_СоздатьФайл() + +&Тест +Процедура ТестДолжен_СоздатьПапкуНаSFTP() Экспорт + + АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); + ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); + ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); + + Клиент = Новый РаботаССерверомSSH(АдресСервера, ПользовательИмя, ПользовательПароль); + + ИмяКаталога = "testFolder1"; + + Клиент.СоздатьКаталог(ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" на сервере ""%2"", для пользователя ""%3""", + ИмяКаталога, + АдресСервера, + ПользовательИмя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); + + Клиент.УдалитьКаталог(ИмяКаталога); + +КонецПроцедуры // ТестДолжен_СоздатьПапкуНаSFTP() + +&Тест +Процедура ТестДолжен_ОтправитьФайлНаSFTP() Экспорт + + АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); + ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); + ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); + + Клиент = Новый РаботаССерверомSSH(АдресСервера, ПользовательИмя, ПользовательПароль); + + ИмяКаталога = "testFolder1"; + + ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); + + Клиент.СоздатьКаталог(ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" на сервере ""%2"", для пользователя ""%3""", + ИмяКаталога, + АдресСервера, + ПользовательИмя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); + + Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" на сервер ""%2"", для пользователя ""%3""", + ТестовыйФайл.ПолноеИмя, + АдресСервера, + ПользовательИмя); + + ПутьКФайлу = СтрШаблон("%1/%2", ИмяКаталога, ТестовыйФайл.Имя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ПутьКФайлу), ТекстОшибки); + + Клиент.УдалитьФайл(ПутьКФайлу); + + Клиент.УдалитьКаталог(ИмяКаталога); + +КонецПроцедуры // ТестДолжен_ОтправитьФайлНаSFTP() + +&Тест +Процедура ТестДолжен_ПолучитьФайлСSFTP() Экспорт + + АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); + ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); + ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); + + Клиент = Новый РаботаССерверомSSH(АдресСервера, ПользовательИмя, ПользовательПароль); + + ИмяКаталога = "testFolder1"; + + ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); + + Клиент.СоздатьКаталог(ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" на сервере ""%2"", для пользователя ""%3""", + ИмяКаталога, + АдресСервера, + ПользовательИмя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки); + + Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога); + + ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" на сервер ""%2"", для пользователя ""%3""", + ТестовыйФайл.ПолноеИмя, + АдресСервера, + ПользовательИмя); + + ПутьКФайлу = СтрШаблон("%1/%2", ИмяКаталога, ТестовыйФайл.Имя); + + Утверждения.ПроверитьИстину(Клиент.Существует(ПутьКФайлу), ТекстОшибки); + + ФС.ОбеспечитьКаталог(КаталогВременныхДанных); + + Клиент.ПолучитьФайл(ПутьКФайлу, КаталогВременныхДанных); + + ТекстОшибки = СтрШаблон("Ошибка получения файла ""%1"" с сервера ""%2"", для пользователя ""%3""", + ПутьКФайлу, + АдресСервера, + ПользовательИмя); + + Утверждения.ПроверитьИстину(ТестовыйФайл.Существует(), ТекстОшибки); + + Клиент.УдалитьФайл(ПутьКФайлу); + + Клиент.УдалитьКаталог(ИмяКаталога); + +КонецПроцедуры // ТестДолжен_ПолучитьФайлСSFTP() + +&Тест +Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт + + УдалитьФайлы(КаталогВременныхДанных); + + ТекстОшибки = СтрШаблон("Ошибка удаления каталога временных файлов ""%1""", КаталогВременныхДанных); + + Утверждения.ПроверитьЛожь(ФС.ФайлСуществует(КаталогВременныхДанных), ТекстОшибки); + +КонецПроцедуры // ТестДолжен_УдалитьТестовыйКаталог() + +#КонецОбласти // Тесты + +#Область СлужебныеПроцедурыИФункции + +Процедура СоздатьСлучайныйФайл(ПутьКФайлу, РазмерФайла) + + Если ФС.ФайлСуществует(ПутьКФайлу) Тогда + УдалитьФайлы(ПутьКФайлу); + КонецЕсли; + + НачальноеЧисло = 1113; + ДлинаЧисла = 8; + ГраницаГСЧ = 4294836225; + + ЧастейЗаписи = 100; + МаксПорцияЗаписи = 10485760; + ПорцияЗаписи = 1024; + Если Цел(РазмерФайла / ЧастейЗаписи) <= МаксПорцияЗаписи Тогда + ПорцияЗаписи = Цел(РазмерФайла / ЧастейЗаписи); + Иначе + ПорцияЗаписи = МаксПорцияЗаписи; + КонецЕсли; + + ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло); + + ЗаписьДанных = Новый ЗаписьДанных(ПутьКФайлу); + + Записано = 0; + + Пока Записано < РазмерФайла Цикл + Число = ГСЧ.СлучайноеЧисло(0, ГраницаГСЧ); + + ЗаписьДанных.ЗаписатьЦелое64(Число); + + Записано = Записано + ДлинаЧисла; + Если Записано % ПорцияЗаписи = 0 Тогда + ЗаписьДанных.СброситьБуферы(); + КонецЕсли; + КонецЦикла; + + ЗаписьДанных.Закрыть(); + +КонецПроцедуры // СоздатьФайл() + +#КонецОбласти // СлужебныеПроцедурыИФункции From 60c10cc040638586b342c188b666e081c0d3681a Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 27 May 2022 09:00:17 +0300 Subject: [PATCH 17/38] =?UTF-8?q?fix:=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=20=D0=A1=D0=A3=D0=91=D0=94=20=D0=B2=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B0=D1=85=20=D0=BF=D0=B0=D0=BA=D0=B5?= =?UTF-8?q?=D1=82=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/batch-tests.os | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/batch-tests.os b/tests/batch-tests.os index 559b6f1..6d47ca2 100644 --- a/tests/batch-tests.os +++ b/tests/batch-tests.os @@ -26,7 +26,7 @@ ИмяПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_USER"); ПарольПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_PWD"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(ИмяСервера, ИмяПользователя, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(ИмяСервера, ИмяПользователя, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); @@ -61,7 +61,7 @@ ИмяПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_USER"); ПарольПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_PWD"); - ПодключениеКСУБД = Новый ПодключениеКСУБД(ИмяСервера, ИмяПользователя, ПарольПользователя); + ПодключениеКСУБД = Новый ПодключениеMSSQL(ИмяСервера, ИмяПользователя, ПарольПользователя); РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); From 92ddfca3d5d11b2e630e866ee526c2a1a0e32886 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 27 May 2022 10:27:19 +0300 Subject: [PATCH 18/38] =?UTF-8?q?refactor:=20=D0=9F=D0=BE=D0=BD=D0=B8?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=20=D1=83=D1=80=D0=BE=D0=B2=D0=B5=D0=BD=D1=8C?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9;=20?= =?UTF-8?q?=D0=92=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D1=8B=D1=85=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BA=20=D0=B5=D0=B4=D0=B8=D0=BD=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B7=D0=BD=D0=BE=D0=BC=D1=83=20=D0=B2=D0=B8?= =?UTF-8?q?=D0=B4=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\241\320\241\320\243\320\221\320\224.os" | 453 +++++++++--------- 1 file changed, 238 insertions(+), 215 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" index f893284..a7e5bf6 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" @@ -48,29 +48,13 @@ // Процедура СоздатьБазуДанных(База, МодельВосстановления = "FULL", ПутьККаталогу = "") Экспорт - Лог.Информация("Начало создания базы ""%1\%2""", - ТекущийСервер, - База); + Лог.Отладка("Начало создания базы ""%1\%2""", ТекущийСервер, База); + + Результат = Ложь; + РезультатЗапроса = ""; - ОписаниеРезультата = ""; - Попытка - Результат = ПодключениеКСУБД.СоздатьБазу(База, МодельВосстановления, ПутьККаталогу, ОписаниеРезультата); - - Если Результат Тогда - Лог.Информация("Создана база данных ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - ОписаниеРезультата); - Иначе - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - ОписаниеРезультата); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = ПодключениеКСУБД.СоздатьБазу(База, МодельВосстановления, ПутьККаталогу, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1\%2"":%3%4", @@ -81,6 +65,17 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Создана база данных ""%1\%2""", ТекущийСервер, База); + КонецПроцедуры // СоздатьБазуДанных() // Удаляет базу данных @@ -90,29 +85,13 @@ // Процедура УдалитьБазуДанных(База) Экспорт - Лог.Информация("Начало удаления базы ""%1\%2""", - ТекущийСервер, - База); + Лог.Отладка("Начало удаления базы ""%1\%2""", ТекущийСервер, База); + + Результат = Ложь; + РезультатЗапроса = ""; - ОписаниеРезультата = ""; - Попытка - Результат = ПодключениеКСУБД.УдалитьБазу(База, ОписаниеРезультата); - - Если Результат Тогда - Лог.Информация("Удалена база данных ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - ОписаниеРезультата); - Иначе - ТекстОшибки = СтрШаблон("Ошибка удаления базы данных ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - ОписаниеРезультата); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = ПодключениеКСУБД.УдалитьБазу(База, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка удаления базы данных ""%1\%2"":%3%4", @@ -123,6 +102,17 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка удаления базы данных ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Удалена база данных ""%1\%2""", ТекущийСервер, База); + КонецПроцедуры // УдалитьБазуДанных() // Выполняет резервное копирование базы @@ -133,32 +123,16 @@ // Процедура ВыполнитьРезервноеКопирование(База, ПутьКРезервнойКопии) Экспорт - Лог.Информация("Начало создания резервной копии ""%1"" базы ""%2\%3""", - ПутьКРезервнойКопии, - ТекущийСервер, - База); + Лог.Отладка("Начало создания резервной копии ""%1"" базы ""%2\%3""", + ПутьКРезервнойКопии, + ТекущийСервер, + База); + + Результат = Ложь; + РезультатЗапроса = ""; - ОписаниеРезультата = ""; - Попытка - Результат = ПодключениеКСУБД.СоздатьРезервнуюКопию(База, ПутьКРезервнойКопии, ОписаниеРезультата); - - Если Результат Тогда - Лог.Информация("Создана резервная копия ""%1"" базы ""%2\%3"": %4%5", - ПутьКРезервнойКопии, - ТекущийСервер, - База, - Символы.ПС, - ОписаниеРезультата); - Иначе - ТекстОшибки = СтрШаблон("Ошибка создания резервной копии ""%1"" базы ""%2\%3"": %4%5", - ПутьКРезервнойКопии, - ТекущийСервер, - База, - Символы.ПС, - ОписаниеРезультата); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = ПодключениеКСУБД.СоздатьРезервнуюКопию(База, ПутьКРезервнойКопии, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка создания резервной копии ""%1"" базы ""%2\%3"": %4%5", @@ -170,6 +144,21 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка создания резервной копии ""%1"" базы ""%2\%3"": %4%5", + ПутьКРезервнойКопии, + ТекущийСервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Создана резервная копия ""%1"" базы ""%2\%3""", + ПутьКРезервнойКопии, + ТекущийСервер, + База); + КонецПроцедуры // ВыполнитьРезервноеКопирование() // Выполняет восстановление базы из резервной копии @@ -187,12 +176,13 @@ ПутьКФайлуЖурнала, СоздаватьБазу) Экспорт - Лог.Информация("Начало восстановления базы ""%1\%2"" из резервной копии ""%3""", - ТекущийСервер, - База, - ПутьКРезервнойКопии); + Лог.Отладка("Начало восстановления базы ""%1\%2"" из резервной копии ""%3""", + ТекущийСервер, + База, + ПутьКРезервнойКопии); - ОписаниеРезультата = ""; + Результат = Ложь; + РезультатЗапроса = ""; Попытка Результат = ПодключениеКСУБД.ВосстановитьИзРезервнойКопии(База, @@ -200,22 +190,7 @@ ПутьКФайлуДанных, ПутьКФайлуЖурнала, СоздаватьБазу, - ОписаниеРезультата); - - Если Результат Тогда - Лог.Информация("Выполнено восстановление базы ""%1"" из резервной копии ""%2"": %3", - База, - ПутьКРезервнойКопии, - ОписаниеРезультата); - Иначе - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4", - База, - ПутьКРезервнойКопии, - Символы.ПС, - ОписаниеРезультата); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - + РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4", @@ -226,6 +201,19 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4", + База, + ПутьКРезервнойКопии, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Выполнено восстановление базы ""%1"" из резервной копии ""%2""", + База, + ПутьКРезервнойКопии); + КонецПроцедуры // ВыполнитьВосстановление() // Получает текущего владельца базы @@ -238,6 +226,8 @@ // Функция ПолучитьВладельца(База) Экспорт + Лог.Отладка("Начало получения владельца базы ""%1"":%2%3", База); + Попытка Результат = ПодключениеКСУБД.ПолучитьВладельцаБазы(База); Исключение @@ -249,6 +239,8 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Лог.Отладка("Получен владелец ""%1"" базы ""%2""", Результат, База); + Возврат Результат; КонецФункции // ПолучитьВладельца() @@ -261,19 +253,15 @@ // Процедура ИзменитьВладельца(База, ВладелецБазы) Экспорт - Попытка - Результат = ПодключениеКСУБД.УстановитьВладельцаБазы(База, ВладелецБазы); + Лог.Отладка("Начало установки владельца ""%1"" лля базы ""%2""", + ВладелецБазы, + База); - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка смены владельца базы ""%1"" на ""%2""", - База, - ВладелецБазы); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = Ложь; + РезультатЗапроса = ""; - Лог.Информация("Для базы ""%1"" установлен новый владелец ""%2""", - База, - ВладелецБазы); + Попытка + Результат = ПодключениеКСУБД.УстановитьВладельцаБазы(База, ВладелецБазы, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка смены владельца базы ""%1"" на ""%2"":%3%4", @@ -284,6 +272,19 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка смены владельца базы ""%1"" на ""%2"": %3%4", + База, + ВладелецБазы, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Для базы ""%1"" установлен новый владелец ""%2""", + База, + ВладелецБазы); + КонецПроцедуры // ИзменитьВладельца() // Получает модель восстановления базы (FULL, SIMPLE, BULK_LOGGED) @@ -296,6 +297,8 @@ // Функция ПолучитьМодельВосстановления(База) Экспорт + Лог.Отладка("Начало получения модели восстановления базы ""%1""", База); + Попытка Результат = ПодключениеКСУБД.ПолучитьМодельВосстановления(База); Исключение @@ -307,6 +310,8 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Лог.Отладка("Получена модель восстановления ""%1"" для базы ""%2""", Результат, База); + Возврат Результат; КонецФункции // ПолучитьМодельВосстановления() @@ -319,19 +324,15 @@ // Процедура ИзменитьМодельВосстановления(База, МодельВосстановления) Экспорт - Попытка - Результат = ПодключениеКСУБД.УстановитьМодельВосстановления(База, МодельВосстановления); + Лог.Отладка("Начало установки модели восстановления ""%1"" для базы ""%2""", + МодельВосстановления, + База); - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка смены модели восстановления базы ""%1"" на ""%2""", - База, - МодельВосстановления); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = Ложь; + РезультатЗапроса = ""; - Лог.Информация("Для базы ""%1"" установлена модель восстановления ""%2""", - База, - МодельВосстановления); + Попытка + Результат = ПодключениеКСУБД.УстановитьМодельВосстановления(База, МодельВосстановления, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка смены модели восстановления базы ""%1"" на ""%2"":%3%4", @@ -342,6 +343,19 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка смены модели восстановления базы ""%1"" на ""%2"": %3%4", + База, + МодельВосстановления, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Для базы ""%1"" установлена модель восстановления ""%2""", + База, + МодельВосстановления); + КонецПроцедуры // ИзменитьМодельВосстановления() // Получает логическое имя файла в базе @@ -365,16 +379,14 @@ Возврат Неопределено; КонецЕсли; - Попытка - Результат = ПодключениеКСУБД.ПолучитьЛогическоеИмяФайлаВБазе(База, ТипФайла); + Лог.Отладка("Начало получения логического имени файла %1 для базы ""%2""", + ТипФайлаПредставление, + База); - Если Результат = Неопределено Тогда - ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2""", - ТипФайлаПредставление, - База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = Неопределено; + Попытка + Результат = ПодключениеКСУБД.ПолучитьЛогическоеИмяФайлаВБазе(База, ТипФайла); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2"":%3%4", @@ -384,7 +396,19 @@ ТекстОшибки); ВызватьИсключение ТекстОшибки; КонецПопытки; - + + Если Результат = Неопределено Тогда + ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2""", + ТипФайлаПредставление, + База); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Получено логическое имя ""%1"" файла %2 для базы ""%3""", + Результат, + ТипФайлаПредставление, + База); + Возврат Результат; КонецФункции // ПолучитьЛогическоеИмяФайла() @@ -398,25 +422,20 @@ // Процедура ИзменитьЛогическоеИмяФайла(База, Имя, НовоеИмя) Экспорт + Лог.Отладка("Начало изменения логического имени файла ""%1"" на ""%2"" в базе ""%3""", + Имя, + НовоеИмя, + База); + Если Имя = НовоеИмя Тогда Возврат; КонецЕсли; - Попытка - Результат = ПодключениеКСУБД.ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя); - - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" на ""%2"" в базе ""%3""", - Имя, - НовоеИмя, - База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = Ложь; + РезультатЗапроса = ""; - Лог.Информация("Изменено логическое имя файла ""%1"" на ""%2"" в базе ""%3""", - Имя, - НовоеИмя, - База); + Попытка + Результат = ПодключениеКСУБД.ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" на ""%2"" в базе ""%3"":%4%5", @@ -427,7 +446,22 @@ ТекстОшибки); ВызватьИсключение ТекстОшибки; КонецПопытки; - + + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" на ""%2"" в базе ""%3"": %4%5", + Имя, + НовоеИмя, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Изменено логическое имя файла ""%1"" на ""%2"" в базе ""%3""", + Имя, + НовоеИмя, + База); + КонецПроцедуры // ИзменитьЛогическоеИмяФайла() // Устанавливает логические имена файлов в формате: @@ -444,48 +478,15 @@ НовоеИмя = База; КонецЕсли; - Попытка - ЛИФ = ПолучитьЛогическоеИмяФайла(База, "ROWS"); - НовоеЛИФ = НовоеИмя; + ЛИФДанных = ПолучитьЛогическоеИмяФайла(База, "ROWS"); + НовоеЛИФДанных = НовоеИмя; - ИзменитьЛогическоеИмяФайла(База, ЛИФ, НовоеЛИФ); - - Лог.Информация("Изменено логическое имя файла данных с ""%1"" на ""%2"" в базе ""%3""", - База, - ЛИФ, - НовоеЛИФ); - Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла данных с ""%1"" на ""%2"" в базе ""%3"":%4%5", - ЛИФ, - НовоеЛИФ, - База, - Символы.ПС, - ТекстОшибки); - ВызватьИсключение ТекстОшибки; - КонецПопытки; + ИзменитьЛогическоеИмяФайла(База, ЛИФДанных, НовоеЛИФДанных); - Попытка - ЛИФ = ПолучитьЛогическоеИмяФайла(База, "LOG"); - НовоеЛИФ = СтрШаблон("%1_log", НовоеИмя); + ЛИФЖурнала = ПолучитьЛогическоеИмяФайла(База, "LOG"); + НовоеЛИФЖурнала = СтрШаблон("%1_log", НовоеИмя); - ИзменитьЛогическоеИмяФайла(База, ЛИФ, НовоеЛИФ); - - Лог.Информация("Изменено логическое имя файла журнала транзакций с ""%1"" на ""%2"" в базе ""%3""", - База, - ЛИФ, - НовоеЛИФ); - Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла журнала транзакций - |с ""%1"" на ""%2"" в базе ""%3"":%4%5", - ЛИФ, - НовоеЛИФ, - База, - Символы.ПС, - ТекстОшибки); - ВызватьИсключение ТекстОшибки; - КонецПопытки; + ИзменитьЛогическоеИмяФайла(База, ЛИФЖурнала, НовоеЛИФЖурнала); КонецПроцедуры // УстановитьЛогическиеИменаФайлов() @@ -496,17 +497,13 @@ // Процедура ВключитьКомпрессию(База) Экспорт - Лог.Информация("Начало компрессии страниц базы ""%1""", База); - - Попытка - Результат = ПодключениеКСУБД.ВключитьКомпрессиюСтраниц(База); + Лог.Отладка("Начало компрессии страниц базы ""%1""", База); - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка включения компрессии страниц в базе ""%1""", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = Ложь; + РезультатЗапроса = ""; - Лог.Информация("Включена компрессия страниц в базе ""%1""", База); + Попытка + Результат = ПодключениеКСУБД.ВключитьКомпрессиюСтраниц(База, Истина, Истина, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка включения компрессии страниц в базе ""%1"": ""%2""", @@ -515,6 +512,16 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка включения компрессии страниц в базе ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Включена компрессия страниц в базе ""%1""", База); + КонецПроцедуры // ВключитьКомпрессию() // Выполняет сжатие базы (shrink) @@ -524,17 +531,13 @@ // Процедура СжатьБазу(База) Экспорт - Лог.Информация("Начало сжатия (shrink) файла данных базы ""%1""", База); - - Попытка - Результат = ПодключениеКСУБД.СжатьБазу(База); + Лог.Отладка("Начало сжатия (shrink) файла данных базы ""%1""", База); - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка сжатия файла данных базы ""%1""", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = Ложь; + РезультатЗапроса = ""; - Лог.Информация("Выполнено сжатие файла данных базы ""%1""", База); + Попытка + Результат = ПодключениеКСУБД.СжатьБазу(База, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка сжатия файла данных базы ""%1"":%2%3", @@ -544,6 +547,13 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка сжатия файла данных базы ""%1"": %2%3", База, Символы.ПС, РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Выполнено сжатие файла данных базы ""%1""", База); + КонецПроцедуры // СжатьБазу() // Выполняет сжатие файла лога (shrink) @@ -553,22 +563,13 @@ // Процедура СжатьФайлЖурналаТранзакций(База) Экспорт - Лог.Информация("Начало сжатия (shrink) файла журнала транзакций базы ""%1""", База); - - Попытка - ОписаниеРезультата = ""; - - Результат = ПодключениеКСУБД.СжатьФайлЖурналаТранзакций(База, ОписаниеРезультата); - - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка сжатия файла журнала транзакций базы ""%1"":%2%3", - База, - Символы.ПС, - ОписаниеРезультата); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Лог.Отладка("Начало сжатия (shrink) файла журнала транзакций базы ""%1""", База); + + Результат = Ложь; + РезультатЗапроса = ""; - Лог.Информация("Выполнено сжатие файла журнала транзакций базы ""%1""", База); + Попытка + Результат = ПодключениеКСУБД.СжатьФайлЖурналаТранзакций(База, РезультатЗапроса); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка сжатия файла журнала транзакций базы ""%1"":%2%3", @@ -578,6 +579,16 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; + Если НЕ Результат Тогда + ТекстОшибки = СтрШаблон("Ошибка сжатия файла журнала транзакций базы ""%1"":%2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Лог.Отладка("Выполнено сжатие файла журнала транзакций базы ""%1""", База); + КонецПроцедуры // СжатьФайлЖурналаТранзакций() // Функция выполняет указанные скрипты @@ -594,26 +605,38 @@ МассивСкриптов = СтрРазделить(СкриптыВыполнения, ";", Ложь); МассивПеременных = СтрРазделить(СтрокаПеременных, ";", Ложь); - ОписаниеРезультата = ""; + Лог.Отладка("Начало выполнения скриптов ""%1"", со значениями переменных ""%2""", + СкриптыВыполнения, + СтрокаПеременных); + + РезультатЗапроса = ""; - КодВозврата = ПодключениеКСУБД.ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных, ОписаниеРезультата); - Если КодВозврата = 0 Тогда - Если ЗначениеЗаполнено(ОписаниеРезультата) Тогда - Лог.Отладка("Результат выполнения:%1%2", Символы.ПС, ОписаниеРезультата); - КонецЕсли; - Иначе - ТекстОшибки = СтрШаблон("Ошибка выполнения скриптов ""%1"" для значений переменных ""%2"" + КодВозврата = ПодключениеКСУБД.ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных, РезультатЗапроса); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка выполнения скриптов ""%1"" со значениями переменных ""%2"" |на сервере ""%3"", код возврата %4: %5%6", СкриптыВыполнения, СтрокаПеременных, ТекущийСервер, КодВозврата, Символы.ПС, - ОписаниеРезультата); + РезультатЗапроса); ВызватьИсключение ТекстОшибки; КонецЕсли; - Возврат ОписаниеРезультата; + СтрокаРезультата = ""; + + Если ЗначениеЗаполнено(РезультатЗапроса) Тогда + СтрокаРезультата = СтрШаблон(", результатЖ %1%2", Символы.ПС, РезультатЗапроса); + КонецЕсли; + + Лог.Отладка("Выполнены скрипты ""%1"" со значениями переменных ""%2""%3", + СкриптыВыполнения, + СтрокаПеременных, + СтрокаРезультата); + + Возврат РезультатЗапроса; КонецФункции // ВыполнитьСкрипты() From c95570f0392c6e9b4b42cbb61d6202ae2bbfb4b4 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 27 May 2022 11:08:09 +0300 Subject: [PATCH 19/38] =?UTF-8?q?test:=20=D0=A3=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=83=D1=80=D0=BE=D0=B2=D0=BD?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=83=D1=8E=20=D1=81=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D1=8B=20LOGOS=5FCONFIG.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/qa.yml | 3 ++- ...320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" | 2 +- tests/batch-tests.os | 1 - tests/file-tests.os | 1 - tests/ib-structure-tests.os | 1 - tests/ib-tests.os | 1 - tests/nextcloud-tests.os | 1 - tests/sql-tests.os | 1 - tests/ssh-tests.os | 1 - 9 files changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 9653bfe..8bfcefc 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -5,7 +5,7 @@ on: [push, pull_request] env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true - BRANCH_NAME: ${{ github.head_ref || github.ref_name }} + BRANCH_NAME: ${{ github.head_ref || github.ref_name }} jobs: build: @@ -62,6 +62,7 @@ jobs: SFTP_TEST_ADDRESS: ${{ secrets.SFTP_TEST_ADDRESS }} SFTP_TEST_USER: ${{ secrets.SFTP_TEST_USER }} SFTP_TEST_PWD: ${{ secrets.SFTP_TEST_PWD }} + LOGOS_CONFIG : "logger.oscript.app.cpdb=DEBUG" run: oscript ./tasks/coverage.os # Остановка и удаление контейнеров NextCloud и OpenSSH diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" index b3ca8ed..fb02b55 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" @@ -110,7 +110,7 @@ ОписаниеРезультата = КомандаРК.ПолучитьВывод(); Если Не ПустаяСтрока(ОписаниеРезультата) Тогда - Лог.Информация("Вывод команды удаления: " + ОписаниеРезультата); + Лог.Отладка("Вывод команды удаления: " + ОписаниеРезультата); КонецЕсли; Если КодВозврата = 0 Тогда diff --git a/tests/batch-tests.os b/tests/batch-tests.os index 6d47ca2..4ec09a6 100644 --- a/tests/batch-tests.os +++ b/tests/batch-tests.os @@ -9,7 +9,6 @@ Процедура ПередЗапускомТеста() Экспорт Лог = ПараметрыСистемы.Лог(); - Лог.УстановитьУровень(УровниЛога.Информация); КонецПроцедуры // ПередЗапускомТеста() diff --git a/tests/file-tests.os b/tests/file-tests.os index 58d7c4e..9e9e0fc 100644 --- a/tests/file-tests.os +++ b/tests/file-tests.os @@ -18,7 +18,6 @@ ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst"); Лог = ПараметрыСистемы.Лог(); - Лог.УстановитьУровень(УровниЛога.Информация); КонецПроцедуры // ПередЗапускомТеста() diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index a81714c..36d45db 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -31,7 +31,6 @@ РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); Лог = ПараметрыСистемы.Лог(); - Лог.УстановитьУровень(УровниЛога.Информация); КонецПроцедуры // ПередЗапускомТеста() diff --git a/tests/ib-tests.os b/tests/ib-tests.os index e78db94..4b7de3b 100644 --- a/tests/ib-tests.os +++ b/tests/ib-tests.os @@ -18,7 +18,6 @@ ШаблонБазы = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "cpdb_test_db.dt"); Лог = ПараметрыСистемы.Лог(); - Лог.УстановитьУровень(УровниЛога.Информация); КонецПроцедуры // ПередЗапускомТеста() diff --git a/tests/nextcloud-tests.os b/tests/nextcloud-tests.os index cc01e87..b7a798e 100644 --- a/tests/nextcloud-tests.os +++ b/tests/nextcloud-tests.os @@ -18,7 +18,6 @@ ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst"); Лог = ПараметрыСистемы.Лог(); - Лог.УстановитьУровень(УровниЛога.Информация); КонецПроцедуры // ПередЗапускомТеста() diff --git a/tests/sql-tests.os b/tests/sql-tests.os index 9cd784e..e7da83c 100644 --- a/tests/sql-tests.os +++ b/tests/sql-tests.os @@ -27,7 +27,6 @@ РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД); Лог = ПараметрыСистемы.Лог(); - Лог.УстановитьУровень(УровниЛога.Информация); Для й = 1 По 3 Цикл ИмяБазы = СтрШаблон("%1%2", ПрефиксИмениБД, й); diff --git a/tests/ssh-tests.os b/tests/ssh-tests.os index 0ec124b..9190f75 100644 --- a/tests/ssh-tests.os +++ b/tests/ssh-tests.os @@ -18,7 +18,6 @@ ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst"); Лог = ПараметрыСистемы.Лог(); - Лог.УстановитьУровень(УровниЛога.Информация); КонецПроцедуры // ПередЗапускомТеста() From 55f05de1fac6034dad8526814748bad5492242d9 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 27 May 2022 12:15:03 +0300 Subject: [PATCH 20/38] =?UTF-8?q?refactor:=20=D0=9E=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B0=20=D0=BA?= =?UTF-8?q?=20=D0=B5=D0=B4=D0=B8=D0=BD=D0=BE=D0=BC=D1=83=20=D0=B2=D0=B8?= =?UTF-8?q?=D0=B4=D1=83;=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B5=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\320\265\320\275\320\270\320\265MSSQL.os" | 304 ++++++++++-------- ...20\275\320\270\321\217\320\230\320\221.os" | 7 +- 2 files changed, 177 insertions(+), 134 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" index 9140c11..28b3339 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" @@ -111,7 +111,7 @@ // МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED) // ПутьККаталогу - Строка - путь к каталогу для размещения файлов базы данных // если не указан, то файлы размещаются в каталоге по умолчанию SQL Server -// ОписаниеРезультата - Строка - результат выполнения команды +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: // Булево - Истина - команда выполнена успешно @@ -119,7 +119,7 @@ Функция СоздатьБазу(База, Знач МодельВосстановления = Неопределено, Знач ПутьККаталогу = "", - ОписаниеРезультата = "") Экспорт + РезультатЗапроса = "") Экспорт Если БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОСуществовании) Тогда Возврат Ложь; @@ -158,7 +158,7 @@ МодельВосстановления); КонецЕсли; - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -167,13 +167,13 @@ // Функция выполняет команду удаления базы на сервере СУБД // // Параметры: -// База - Строка - имя базы данных -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - имя базы данных +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // -Функция УдалитьБазу(База, ОписаниеРезультата = "") Экспорт +Функция УдалитьБазу(База, РезультатЗапроса = "") Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда Возврат Ложь; @@ -184,7 +184,7 @@ |DROP DATABASE [%1]"" ", База); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -226,7 +226,11 @@ РезультатЗапроса = ВРег(СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)))); КонецЕсли; Иначе - РезультатЗапроса = Неопределено; + ТекстОшибки = СтрШаблон("Ошибка получения модели восстановления базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; КонецЕсли; Возврат РезультатЗапроса; @@ -236,14 +240,14 @@ // Функция устанавливает модель восстановления базы // // Параметры: -// База - Строка - имя базы данных -// МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED) -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - имя базы данных +// МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED) +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // -Функция УстановитьМодельВосстановления(База, МодельВосстановления = Неопределено, ОписаниеРезультата = "") Экспорт +Функция УстановитьМодельВосстановления(База, МодельВосстановления = Неопределено, РезультатЗапроса = "") Экспорт Если Найти("FULL,SIMPLE,BULK_LOGGED", ВРег(МодельВосстановления)) = 0 Тогда Лог.Предупреждение("Указана некорректная модель восстановления ""%1"" @@ -263,7 +267,7 @@ База, ВРег(МодельВосстановления)); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -308,7 +312,11 @@ РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); КонецЕсли; Иначе - РезультатЗапроса = Неопределено; + ТекстОшибки = СтрШаблон("Ошибка получения владельца базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; КонецЕсли; Возврат РезультатЗапроса; @@ -318,14 +326,14 @@ // Функция изменяет владельца базы // // Параметры: -// База - Строка - имя базы данных -// НовыйВладелец - Строка - новый владелец базы -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - имя базы данных +// НовыйВладелец - Строка - новый владелец базы +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // -Функция УстановитьВладельцаБазы(База, НовыйВладелец, ОписаниеРезультата = "") Экспорт +Функция УстановитьВладельцаБазы(База, НовыйВладелец, РезультатЗапроса = "") Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда Возврат Ложь; @@ -333,7 +341,7 @@ ТекстЗапроса = СтрШаблон("""ALTER AUTHORIZATION ON DATABASE::%1 TO %2""", База, НовыйВладелец); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -342,13 +350,13 @@ // Функция выполняет сжатие базы (shrink) // // Параметры: -// База - Строка - имя базы данных -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - имя базы данных +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // -Функция СжатьБазу(База, ОписаниеРезультата = "") Экспорт +Функция СжатьБазу(База, РезультатЗапроса = "") Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда Возврат Ложь; @@ -356,7 +364,7 @@ ТекстЗапроса = СтрШаблон("""DBCC SHRINKDATABASE(N'%1', 0)""", База); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -365,13 +373,13 @@ // Функция выполняет сжатие файла лог (shrink) // // Параметры: -// База - Строка - Имя базы данных -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - Имя базы данных +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // -Функция СжатьФайлЖурналаТранзакций(База, ОписаниеРезультата = "") Экспорт +Функция СжатьФайлЖурналаТранзакций(База, РезультатЗапроса = "") Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда Возврат Ложь; @@ -385,7 +393,7 @@ База, ЛогическоеИмяФайлаЖурнала); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -394,18 +402,18 @@ // Функция выполняет выполняет компрессию базы и индексов на уровне страниц (DATA_COMPRESSION = PAGE) // // Параметры: -// База - Строка - имя базы данных -// КомпрессияТаблиц - Булево - Истина - будет выполнена компрессия таблиц базы -// КомпрессияИндексов - Булево - Истина - будет выполнена компрессия индексов базы -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - имя базы данных +// КомпрессияТаблиц - Булево - Истина - будет выполнена компрессия таблиц базы +// КомпрессияИндексов - Булево - Истина - будет выполнена компрессия индексов базы +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // Функция ВключитьКомпрессиюСтраниц(База, КомпрессияТаблиц = Истина, КомпрессияИндексов = Истина, - ОписаниеРезультата = "") Экспорт + РезультатЗапроса = "") Экспорт ОписаниеВерсии = ПолучитьВерсиюСУБД(); @@ -441,7 +449,7 @@ ТекстЗапроса = СтрШаблон("%1""", ТекстЗапроса); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -450,14 +458,14 @@ // Функция создает файл резервной копии базы // // Параметры: -// База - Строка - имя базы данных -// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - имя базы данных +// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // -Функция СоздатьРезервнуюКопию(База, Знач ПутьКРезервнойКопии, ОписаниеРезультата = "") Экспорт +Функция СоздатьРезервнуюКопию(База, Знач ПутьКРезервнойКопии, РезультатЗапроса = "") Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда Возврат Ложь; @@ -475,7 +483,7 @@ База, ПутьКРезервнойКопии); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -484,28 +492,28 @@ // Функция выполняет восстановление базы из файла с резервной копией // // Параметры: -// База - Строка - имя базы данных -// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии -// ПутьКФайлуДанных - Строка - путь к файлу базы -// ПутьКФайлуЖурнала - Строка - путь к файлу журнала (transaction log) базы -// СоздаватьБазу - Булево - Истина - будет создана новая база в случае отсутствия -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - имя базы данных +// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии +// ПутьКФайлуДанных - Строка - путь к файлу базы +// ПутьКФайлуЖурнала - Строка - путь к файлу журнала (transaction log) базы +// СоздаватьБазу - Булево - Истина - будет создана новая база в случае отсутствия +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // Функция ВосстановитьИзРезервнойКопии(База, Знач ПутьКРезервнойКопии, Знач ПутьКФайлуДанных = "", Знач ПутьКФайлуЖурнала = "", СоздаватьБазу = Ложь, - ОписаниеРезультата = "") Экспорт + РезультатЗапроса = "") Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда Если НЕ СоздаватьБазу Тогда Возврат Ложь; Иначе - Если НЕ СоздатьБазу(База, МоделиВосстановленияБД().Простая, ОписаниеРезультата) Тогда + Если НЕ СоздатьБазу(База, МоделиВосстановленияБД().Простая, РезультатЗапроса) Тогда Возврат Ложь; КонецЕсли; КонецЕсли; @@ -545,7 +553,7 @@ ЛогическоеИмяФайлаЖурнала, ПутьКФайлуЖурнала); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -554,11 +562,11 @@ // Функция возвращает логическое имя файла в резервной копии // // Параметры: -// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии -// ТипФайла - Строка - D - файл данных; L - файл журнала транзакций +// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии +// ТипФайла - Строка - D - файл данных; L - файл журнала транзакций // // Возвращаемое значение: -// Строка - логическое имя файла базы в файле резервной копии +// Строка - логическое имя файла базы в файле резервной копии // Функция ПолучитьЛогическоеИмяФайлаВРезервнойКопии(Знач ПутьКРезервнойКопии, Знач ТипФайла = Неопределено) Экспорт @@ -571,8 +579,10 @@ Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда ТипФайла = ТипыФайловСокр.Данные; + ТипФайлаПредставление = "данных"; ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда ТипФайла = ТипыФайловСокр.Журнал; + ТипФайлаПредставление = "журнала"; Иначе Возврат Неопределено; КонецЕсли; @@ -606,6 +616,13 @@ Если Поз > 0 Тогда РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); КонецЕсли; + Иначе + ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в резервной копии ""%2"": %3%4", + ТипФайлаПредставление, + ПутьКРезервнойКопии, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; КонецЕсли; Возврат РезультатЗапроса; @@ -632,8 +649,10 @@ Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда ТипФайла = ТипыФайлов.Данные; + ТипФайлаПредставление = "данных"; ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда ТипФайла = ТипыФайлов.Журнал; + ТипФайлаПредставление = "журнала"; Иначе Возврат Неопределено; КонецЕсли; @@ -666,7 +685,12 @@ РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); КонецЕсли; Иначе - РезультатЗапроса = Неопределено; + ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2"": %3%4", + ТипФайлаПредставление, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; КонецЕсли; Возврат РезультатЗапроса; @@ -676,15 +700,15 @@ // Функция изменяет логическое имя файла базы // // Параметры: -// База - Строка - имя базы данных -// Имя - Строка - логическое имя изменяемого файла -// НовоеИмя - Строка - новое логическое имя -// ОписаниеРезультата - Строка - результат выполнения команды +// База - Строка - имя базы данных +// Имя - Строка - логическое имя изменяемого файла +// НовоеИмя - Строка - новое логическое имя +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: // Булево - Истина - команда выполнена успешно // -Функция ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя, ОписаниеРезультата = "") Экспорт +Функция ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя, РезультатЗапроса = "") Экспорт Если Имя = НовоеИмя Тогда Лог.Предупреждение("Новое логическое имя ""%1"" совпадает со старым ""%2""!", Имя, НовоеИмя); @@ -703,7 +727,7 @@ Имя, НовоеИмя); - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата); + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Возврат КодВозврата = 0; @@ -715,7 +739,7 @@ // ТипФайла - Строка - ROWS - файл базы; LOG - файл журнала транзакций // // Возвращаемое значение: -// Строка - логическое имя файла базы +// Строка - логическое имя файла базы // Функция РасположениеФайловБазПоУмолчанию(Знач ТипФайла = Неопределено) Экспорт @@ -728,8 +752,10 @@ Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда ТипФайла = ТипыФайлов.Данные; + ТипФайлаПредставление = "данных"; ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда ТипФайла = ТипыФайлов.Журнал; + ТипФайлаПредставление = "журналов"; Иначе Возврат Неопределено; КонецЕсли; @@ -762,7 +788,11 @@ РезультатЗапроса = Сред(ФайлБазы.Путь, 1, СтрДлина(ФайлБазы.Путь) - 1); Иначе - РезультатЗапроса = Неопределено; + ТекстОшибки = СтрШаблон("Ошибка получения расположения по умолчанию файлов %1: %2%3", + ТипФайлаПредставление, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; КонецЕсли; Возврат РезультатЗапроса; @@ -772,30 +802,43 @@ // Функция возвращает описание установленной версии SQL Server // // Возвращаемое значение: -// Структура - описание версии SQL Server -// ИмяСервера - имя сервера -// ИмяЭкземпляраСУБД - имя экземпляра СУБД на сервере -// Редакция - номер редакции -// Версия - номер версии -// Уровень - уровень продукта -// ВерсияМакс - старший номер версии (2000 - 2000 (8)), 2005 - 9, -// 2008 - 10, 2012 - 11, 2014 - 12, 2016 - 13) -// Корп - признак Enterprise версии +// Структура - описание версии SQL Server +// *ИмяСервера - Строка - имя сервера +// *ИмяЭкземпляраСУБД - Строка - имя экземпляра СУБД на сервере +// *Редакция - Строка - номер редакции +// *Версия - Строка - номер версии +// *Уровень - Строка - уровень продукта +// *ВерсияМакс - Строка - старший номер версии (2000 - 2000 (8)), 2005 - 9, +// 2008 - 10, 2012 - 11, 2014 - 12, 2016 - 13) +// *Корп - Строка - признак Enterprise версии // Функция ПолучитьВерсиюСУБД() Экспорт ТекстЗапроса = """SET NOCOUNT ON; - | |SELECT | SERVERPROPERTY('MachineName') AS ComputerName, | SERVERPROPERTY('ServerName') AS InstanceName, | SERVERPROPERTY('Edition') AS Edition, | SERVERPROPERTY('ProductVersion') AS ProductVersion, | SERVERPROPERTY('ProductLevel') AS ProductLevel, - | @@VERSION AS FullVersion"" "; + | @@VERSION AS FullVersion; + |SET NOCOUNT OFF;"" "; + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); - ОписаниеРезультата = ""; - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата, "|", Истина); + Если КодВозврата = 0 Тогда + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + Иначе + ТекстОшибки = СтрШаблон("Ошибка получения версии СУБД: %1%2", + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; СтрокаОписанияВерсии = 3; ИмяСервера = 0; @@ -823,41 +866,42 @@ КонецЕсли; КонецЦикла; - Если КодВозврата = 0 Тогда - СтруктураРезультата = Новый Структура(); - - Текст = Новый ТекстовыйДокумент(); - Текст.УстановитьТекст(ОписаниеРезультата); - - МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(СтрокаОписанияВерсии), "|", Ложь); - - СтруктураРезультата.Вставить("ИмяСервера" , МассивЗначений[ИмяСервера]); - СтруктураРезультата.Вставить("ИмяЭкземпляраСУБД", МассивЗначений[ИмяЭкземпляраСУБД]); - СтруктураРезультата.Вставить("Редакция" , МассивЗначений[Редакция]); - СтруктураРезультата.Вставить("Версия" , МассивЗначений[Версия]); - СтруктураРезультата.Вставить("Уровень" , МассивЗначений[Уровень]); - СтруктураРезультата.Вставить("Представление" , МассивЗначений[Представление]); - - МассивВерсии = СтрРазделить(СтруктураРезультата["Версия"], "."); - СтруктураРезультата.Вставить("ВерсияМакс" , СоответствиеВерсий[МассивВерсии[0]]); - - СтруктураРезультата.Вставить("Корп" , СтрНайти(ВРег(СтруктураРезультата["Редакция"]), "ENTERPRISE") > 0); - - Возврат СтруктураРезультата; - Иначе - Возврат Неопределено; - КонецЕсли; + СтруктураРезультата = Новый Структура(); + + МассивЗначений = СтрРазделить(РезультатЗапроса, "|", Ложь); + + СтруктураРезультата.Вставить("ИмяСервера" , МассивЗначений[ИмяСервера]); + СтруктураРезультата.Вставить("ИмяЭкземпляраСУБД", МассивЗначений[ИмяЭкземпляраСУБД]); + СтруктураРезультата.Вставить("Редакция" , МассивЗначений[Редакция]); + СтруктураРезультата.Вставить("Версия" , МассивЗначений[Версия]); + СтруктураРезультата.Вставить("Уровень" , МассивЗначений[Уровень]); + СтруктураРезультата.Вставить("Представление" , МассивЗначений[Представление]); + + МассивВерсии = СтрРазделить(СтруктураРезультата["Версия"], "."); + СтруктураРезультата.Вставить("ВерсияМакс" , СоответствиеВерсий[МассивВерсии[0]]); + + СтруктураРезультата.Вставить("Корп" , СтрНайти(ВРег(СтруктураРезультата["Редакция"]), "ENTERPRISE") > 0); + + Возврат СтруктураРезультата; КонецФункции // ПолучитьВерсиюСУБД() // Функция возвращает признак доступности функционала SQL Server // // Параметры: -// Функционал - Строка - наименование проверяемого функционала -// ОписаниеВерсии - Соответствие - наименование проверяемого функционала +// Функционал - Строка - наименование проверяемого функционала +// ОписаниеВерсии - Соответствие - описание версии SQL Server +// *ИмяСервера - Строка - имя сервера +// *ИмяЭкземпляраСУБД - Строка - имя экземпляра СУБД на сервере +// *Редакция - Строка - номер редакции +// *Версия - Строка - номер версии +// *Уровень - Строка - уровень продукта +// *ВерсияМакс - Строка - старший номер версии (2000 - 2000 (8)), 2005 - 9, +// 2008 - 10, 2012 - 11, 2014 - 12, 2016 - 13) +// *Корп - Строка - признак Enterprise версии // // Возвращаемое значение: -// Булево - Истина - функционал доступен +// Булево - Истина - функционал доступен // Функция ДоступностьФункционалаСУБД(Знач Функционал, ОписаниеВерсии = Неопределено) Экспорт @@ -893,15 +937,15 @@ // Функция выполняет запрос к СУБД (используется консольная утилита sqlcmd) // // Параметры: -// ТекстЗапроса - Строка - текст исполняемого запроса -// ОписаниеРезультата - Строка - результат выполнения команду -// Разделитель - Строка - символ - разделитель колонок результата -// УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата +// ТекстЗапроса - Строка - текст исполняемого запроса +// РезультатЗапроса - Строка - результат выполнения команду +// Разделитель - Строка - символ - разделитель колонок результата +// УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // -Функция ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата = "", Разделитель = "", УбратьПробелы = Ложь) Экспорт +Функция ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса = "", Разделитель = "", УбратьПробелы = Ложь) Экспорт Лог.Отладка("Текст запроса: %1", ТекстЗапроса); @@ -939,10 +983,10 @@ Если ФС.Существует(ПутьКФайлуРезультата) Тогда ТекстРезультата = Новый ТекстовыйДокумент(); ТекстРезультата.Прочитать(ПутьКФайлуРезультата); - ОписаниеРезультата = СокрЛП(ТекстРезультата.ПолучитьТекст()); + РезультатЗапроса = СокрЛП(ТекстРезультата.ПолучитьТекст()); УдалитьФайлы(ПутьКФайлуРезультата); Иначе - ОписаниеРезультата = КомандаРК.ПолучитьВывод(); + РезультатЗапроса = КомандаРК.ПолучитьВывод(); КонецЕсли; Возврат КодВозврата; @@ -952,14 +996,14 @@ // Функция выполняет запрос к СУБД, выполняя текст из файлов скриптов (используется консольная утилита sqlcmd) // // Параметры: -// МассивСкриптов - Массив из Строка - массив с путями к файлам скриптов -// МассивПеременных - Массив из Строка - массив со значениями переменных вида "<Имя>=<Значение>" -// ОписаниеРезультата - Строка - результат выполнения команды +// МассивСкриптов - Массив из Строка - массив с путями к файлам скриптов +// МассивПеременных - Массив из Строка - массив со значениями переменных вида "<Имя>=<Значение>" +// РезультатЗапроса - Строка - результат выполнения команды // // Возвращаемое значение: -// Булево - Истина - команда выполнена успешно +// Булево - Истина - команда выполнена успешно // -Функция ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных = Неопределено, ОписаниеРезультата = "") Экспорт +Функция ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных = Неопределено, РезультатЗапроса = "") Экспорт КомандаРК = Новый Команда; @@ -993,7 +1037,7 @@ КодВозврата = КомандаРК.Исполнить(); - ОписаниеРезультата = КомандаРК.ПолучитьВывод(); + РезультатЗапроса = КомандаРК.ПолучитьВывод(); Возврат КодВозврата; @@ -1006,7 +1050,7 @@ // Функция возвращает список полей таблицы информации о резервной копии // // Возвращаемое значение: -// Строка - список полей таблицы с информацией о резервной копии (разделенный ",") +// Строка - список полей таблицы с информацией о резервной копии (разделенный ",") // Функция ПоляТаблицыФайловРезервнойКопии() @@ -1049,12 +1093,12 @@ // Функция возвращает список возможных типов файлов базы данных или таблиц резервной копии // // Параметры: -// Сокращенные - Булево - Истина - возвращать список сокращенных обозначений -// типов баз (для файлов в файлах резервных копий); -// Ложь - список полных обозначений (для файлов баз данных) +// Сокращенные - Булево - Истина - возвращать список сокращенных обозначений +// типов баз (для файлов в файлах резервных копий); +// Ложь - список полных обозначений (для файлов баз данных) // // Возвращаемое значение: -// ФиксированнаяСтруктура - список возможных типов файлов базы данных или таблиц резервной копии +// ФиксированнаяСтруктура - список возможных типов файлов базы данных или таблиц резервной копии // Функция ТипыФайловБД(Сокращенные = Ложь) @@ -1073,7 +1117,7 @@ // Функция возвращает список вариантов сообщения о существовании базы данных при проверке // // Возвращаемое значение: -// ФиксированнаяСтруктура - варианты сообщения о существовании базы данных при проверке +// ФиксированнаяСтруктура - варианты сообщения о существовании базы данных при проверке // Функция ВариантыСообщенияОСуществованииБД() @@ -1109,9 +1153,9 @@ // Процедура - обработчик события "ПриСозданииОбъекта" // // Параметры: -// _Сервер - Строка - адрес сервера СУБД -// _Пользователь - Строка - пользователь сервера СУБД -// _Пароль - Строка - пароль пользователя сервера СУБД +// _Сервер - Строка - адрес сервера СУБД +// _Пользователь - Строка - пользователь сервера СУБД +// _Пароль - Строка - пароль пользователя сервера СУБД // Процедура ПриСозданииОбъекта(Знач _Сервер, Знач _Пользователь, Знач _Пароль) Экспорт diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index 60246a7..556a4f2 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -1019,7 +1019,7 @@ // Функция КолонкиБазыДанных(ФильтрТаблицПоИмени = "", ФильтрКолонокПоИмени = "") - Лог.Отладка("Получение списка колонок базы ""%1\%2"": %3", ТекущийСервер, База); + Лог.Отладка("Получение списка колонок базы ""%1\%2""", ТекущийСервер, База); ШаблонЗапроса = """SET NOCOUNT ON; | SELECT @@ -1052,16 +1052,15 @@ Попытка КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); Если КодВозврата = 0 Тогда - Лог.Отладка("Получен список колонок базы ""%1\%2"": %3", + Лог.Отладка("Получен список колонок базы ""%1\%2""", ТекущийСервер, - РезультатЗапроса, База); Иначе ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4", ТекущийСервер, База, Символы.ПС, - РезультатЗапроса); + РезультатЗапроса); ВызватьИсключение ТекстОшибки; КонецЕсли; Исключение From e24722a373e8e9f4ea3f011f32db5192404c397e Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 27 May 2022 14:20:27 +0300 Subject: [PATCH 21/38] =?UTF-8?q?refactor:=20=D0=A4=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B8=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B2=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4?= =?UTF-8?q?=D1=83=D1=80=D1=8B=20=D0=B8=20=D0=B2=20=D1=81=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D0=B0=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0=20=D0=B2=D1=8B=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=20=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\320\265\320\275\320\270\320\265MSSQL.os" | 336 ++++++++++-------- ...20\241\320\241\320\243\320\221\320\224.os" | 153 +------- 2 files changed, 213 insertions(+), 276 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" index 28b3339..c8c596a 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" @@ -47,9 +47,6 @@ КонецПроцедуры // УстановитьПароль() -//////////////////////////////////////////////////////////////////////////////// -// Работа с СУБД - // Функция проверяет существование базу на сервере СУБД // // Параметры: @@ -79,7 +76,11 @@ РезультатЗапроса = СокрЛП(СтрЗаменить(РезультатЗапроса, "-", "")); Результат = РезультатЗапроса = "1"; Иначе - Результат = Ложь; + ТекстОшибки = СтрШаблон("Ошибка проверки существования базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; КонецЕсли; ВариантыСообщения = ВариантыСообщенияОСуществованииБД(); @@ -104,25 +105,27 @@ КонецФункции // БазаСуществует() -// Функция выполняет команду создания базы на сервере СУБД +// Процедура выполняет команду создания базы на сервере СУБД // // Параметры: // База - Строка - имя базы данных // МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED) // ПутьККаталогу - Строка - путь к каталогу для размещения файлов базы данных // если не указан, то файлы размещаются в каталоге по умолчанию SQL Server -// РезультатЗапроса - Строка - результат выполнения команды +// ОшибкаЕслиСуществует - Строка - Истина - вызвать исключение если база существует // -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно -// -Функция СоздатьБазу(База, - Знач МодельВосстановления = Неопределено, - Знач ПутьККаталогу = "", - РезультатЗапроса = "") Экспорт +Процедура СоздатьБазу(База, + Знач МодельВосстановления = Неопределено, + Знач ПутьККаталогу = "", + Знач ОшибкаЕслиСуществует = Ложь) Экспорт Если БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОСуществовании) Тогда - Возврат Ложь; + Если ОшибкаЕслиСуществует Тогда + ТекстОшибки = СтрШаблон("База ""%1"" уже существует", База); + ВызватьИсключение ТекстОшибки; + Иначе + Возврат; + КонецЕсли; КонецЕсли; Если НЕ ЗначениеЗаполнено(МодельВосстановления) Тогда @@ -158,25 +161,34 @@ МодельВосстановления); КонецЕсли; + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - - Возврат КодВозврата = 0; - -КонецФункции // СоздатьБазу() -// Функция выполняет команду удаления базы на сервере СУБД + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка создания базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры // СоздатьБазу() + +// Процедура выполняет команду удаления базы на сервере СУБД // // Параметры: -// База - Строка - имя базы данных -// РезультатЗапроса - Строка - результат выполнения команды +// База - Строка - имя базы данных +// ОшибкаЕслиНеСуществует - Строка - Истина - вызвать исключение если база не существует // -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно -// -Функция УдалитьБазу(База, РезультатЗапроса = "") Экспорт +Процедура УдалитьБазу(База, ОшибкаЕслиНеСуществует = Ложь) Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + Если ОшибкаЕслиНеСуществует Тогда + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; + Иначе + Возврат; + КонецЕсли; КонецЕсли; ТекстЗапроса = СтрШаблон("""USE [master]; @@ -184,24 +196,32 @@ |DROP DATABASE [%1]"" ", База); + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - - Возврат КодВозврата = 0; - -КонецФункции // УдалитьБазу() + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка удаления базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры // УдалитьБазу() // Функция получает модель восстановления базы // // Параметры: -// База - Строка - имя базы данных +// База - Строка - имя базы данных // // Возвращаемое значение: -// Строка - модель восстановления (FULL, SIMPLE, BULK_LOGGED) +// Строка - модель восстановления (FULL, SIMPLE, BULK_LOGGED) // Функция ПолучитьМодельВосстановления(База) Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Неопределено; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; @@ -216,7 +236,6 @@ База); РезультатЗапроса = ""; - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Если КодВозврата = 0 Тогда @@ -237,27 +256,24 @@ КонецФункции // ПолучитьМодельВосстановления() -// Функция устанавливает модель восстановления базы +// Процедура устанавливает модель восстановления базы // // Параметры: // База - Строка - имя базы данных // МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED) -// РезультатЗапроса - Строка - результат выполнения команды -// -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно // -Функция УстановитьМодельВосстановления(База, МодельВосстановления = Неопределено, РезультатЗапроса = "") Экспорт +Процедура УстановитьМодельВосстановления(База, МодельВосстановления = Неопределено) Экспорт Если Найти("FULL,SIMPLE,BULK_LOGGED", ВРег(МодельВосстановления)) = 0 Тогда - Лог.Предупреждение("Указана некорректная модель восстановления ""%1"" - | (возможные значения: ""FULL"", ""SIMPLE"", ""BULK_LOGGED"")!", - МодельВосстановления); - Возврат Ложь; + ТекстОшибки = СтрШаблон("Указана некорректная модель восстановления ""%1"" + | (возможные значения: ""FULL"", ""SIMPLE"", ""BULK_LOGGED"")!", + МодельВосстановления); + ВызватьИсключение ТекстОшибки; КонецЕсли; Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ТекстЗапроса = СтрШаблон("""USE [master]; @@ -266,12 +282,19 @@ |SET RECOVERY %2"" ", База, ВРег(МодельВосстановления)); - + + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - Возврат КодВозврата = 0; - -КонецФункции // УстановитьМодельВосстановления() + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения модели восстановления базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры // УстановитьМодельВосстановления() // Функция изменяет владельца базы // @@ -284,7 +307,8 @@ Функция ПолучитьВладельцаБазы(База) Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; @@ -302,7 +326,6 @@ База); РезультатЗапроса = ""; - КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); Если КодВозврата = 0 Тогда @@ -323,66 +346,71 @@ КонецФункции // ПолучитьВладельцаБазы() -// Функция изменяет владельца базы +// Процедура изменяет владельца базы // // Параметры: // База - Строка - имя базы данных // НовыйВладелец - Строка - новый владелец базы -// РезультатЗапроса - Строка - результат выполнения команды // -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно -// -Функция УстановитьВладельцаБазы(База, НовыйВладелец, РезультатЗапроса = "") Экспорт +Процедура УстановитьВладельцаБазы(База, НовыйВладелец) Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; + РезультатЗапроса = ""; ТекстЗапроса = СтрШаблон("""ALTER AUTHORIZATION ON DATABASE::%1 TO %2""", База, НовыйВладелец); - + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - - Возврат КодВозврата = 0; - -КонецФункции // УстановитьВладельцаБазы() -// Функция выполняет сжатие базы (shrink) + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка изменения владельца базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры // УстановитьВладельцаБазы() + +// Процедура выполняет сжатие базы (shrink) // // Параметры: // База - Строка - имя базы данных -// РезультатЗапроса - Строка - результат выполнения команды // -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно -// -Функция СжатьБазу(База, РезультатЗапроса = "") Экспорт +Процедура СжатьБазу(База) Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ТекстЗапроса = СтрШаблон("""DBCC SHRINKDATABASE(N'%1', 0)""", База); + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - - Возврат КодВозврата = 0; - -КонецФункции // СжатьБазу() -// Функция выполняет сжатие файла лог (shrink) + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла данных базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры // СжатьБазу() + +// Процедура выполняет сжатие файла лог (shrink) // // Параметры: // База - Строка - Имя базы данных -// РезультатЗапроса - Строка - результат выполнения команды // -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно -// -Функция СжатьФайлЖурналаТранзакций(База, РезультатЗапроса = "") Экспорт +Процедура СжатьФайлЖурналаТранзакций(База) Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ЛогическоеИмяФайлаЖурнала = ПолучитьЛогическоеИмяФайлаВБазе(База, "L"); @@ -392,28 +420,30 @@ |DBCC SHRINKFILE(N'%2', 0, TRUNCATEONLY); "" ", База, ЛогическоеИмяФайлаЖурнала); - + + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - - Возврат КодВозврата = 0; - -КонецФункции // СжатьФайлЖурналаТранзакций() -// Функция выполняет выполняет компрессию базы и индексов на уровне страниц (DATA_COMPRESSION = PAGE) + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла журнала базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры // СжатьФайлЖурналаТранзакций() + +// Процедура выполняет выполняет компрессию базы и индексов на уровне страниц (DATA_COMPRESSION = PAGE) // // Параметры: // База - Строка - имя базы данных // КомпрессияТаблиц - Булево - Истина - будет выполнена компрессия таблиц базы // КомпрессияИндексов - Булево - Истина - будет выполнена компрессия индексов базы -// РезультатЗапроса - Строка - результат выполнения команды // -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно -// -Функция ВключитьКомпрессиюСтраниц(База, - КомпрессияТаблиц = Истина, - КомпрессияИндексов = Истина, - РезультатЗапроса = "") Экспорт +Процедура ВключитьКомпрессиюСтраниц(База, + КомпрессияТаблиц = Истина, + КомпрессияИндексов = Истина) Экспорт ОписаниеВерсии = ПолучитьВерсиюСУБД(); @@ -422,16 +452,17 @@ |не доступна функциональность компресии страниц!", ОписаниеВерсии.Версия, ОписаниеВерсии.Редакция); - Возврат Истина; + Возврат; КонецЕсли; Если НЕ (КомпрессияТаблиц ИЛИ КомпрессияИндексов) Тогда Лог.Предупреждение("Не указан флаг включения компрессии страниц для индексов или таблиц!"); - Возврат Истина; + Возврат; КонецЕсли; Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ТекстЗапроса = СтрШаблон("""USE [%1];", База); @@ -448,27 +479,31 @@ КонецЕсли; ТекстЗапроса = СтрШаблон("%1""", ТекстЗапроса); - + + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - - Возврат КодВозврата = 0; - -КонецФункции // ВключитьКомпрессиюСтраниц() -// Функция создает файл резервной копии базы + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка компресии базы ""%1"": %2%3", + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры // ВключитьКомпрессиюСтраниц() + +// Процедура создает файл резервной копии базы // // Параметры: // База - Строка - имя базы данных // ПутьКРезервнойКопии - Строка - путь к файлу резервной копии -// РезультатЗапроса - Строка - результат выполнения команды -// -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно // -Функция СоздатьРезервнуюКопию(База, Знач ПутьКРезервнойКопии, РезультатЗапроса = "") Экспорт +Процедура СоздатьРезервнуюКопию(База, Знач ПутьКРезервнойКопии) Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии); @@ -482,14 +517,22 @@ |STATS = 10"" ", База, ПутьКРезервнойКопии); - + + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - Возврат КодВозврата = 0; - -КонецФункции // СоздатьРезервнуюКопию() + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка резервного копирования базы ""%1"" в файл ""%2"": %3%4", + База, + ПутьКРезервнойКопии, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + +КонецПроцедуры // СоздатьРезервнуюКопию() -// Функция выполняет восстановление базы из файла с резервной копией +// Процедура выполняет восстановление базы из файла с резервной копией // // Параметры: // База - Строка - имя базы данных @@ -497,25 +540,19 @@ // ПутьКФайлуДанных - Строка - путь к файлу базы // ПутьКФайлуЖурнала - Строка - путь к файлу журнала (transaction log) базы // СоздаватьБазу - Булево - Истина - будет создана новая база в случае отсутствия -// РезультатЗапроса - Строка - результат выполнения команды -// -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно // -Функция ВосстановитьИзРезервнойКопии(База, +Процедура ВосстановитьИзРезервнойКопии(База, Знач ПутьКРезервнойКопии, Знач ПутьКФайлуДанных = "", Знач ПутьКФайлуЖурнала = "", - СоздаватьБазу = Ложь, - РезультатЗапроса = "") Экспорт + СоздаватьБазу = Ложь) Экспорт Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда Если НЕ СоздаватьБазу Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; Иначе - Если НЕ СоздатьБазу(База, МоделиВосстановленияБД().Простая, РезультатЗапроса) Тогда - Возврат Ложь; - КонецЕсли; + СоздатьБазу(База, МоделиВосстановленияБД().Простая); КонецЕсли; КонецЕсли; @@ -553,11 +590,19 @@ ЛогическоеИмяФайлаЖурнала, ПутьКФайлуЖурнала); + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - Возврат КодВозврата = 0; + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4", + ПутьКРезервнойКопии, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; -КонецФункции // ВосстановитьИзРезервнойКопии() +КонецПроцедуры // ВосстановитьИзРезервнойКопии() // Функция возвращает логическое имя файла в резервной копии // @@ -654,11 +699,15 @@ ТипФайла = ТипыФайлов.Журнал; ТипФайлаПредставление = "журнала"; Иначе - Возврат Неопределено; + ТекстОшибки = СтрШаблон("Некорректно указан тип файла ""%1"" для получения логического имени, + | ожидается ""ROWS (D) ИЛИ LOG (L).", + ТипФайла); + ВызватьИсключение ТекстОшибки; КонецЕсли; Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Неопределено; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; @@ -697,26 +746,23 @@ КонецФункции // ПолучитьЛогическоеИмяФайлаВБазе() -// Функция изменяет логическое имя файла базы +// Процедура изменяет логическое имя файла базы // // Параметры: // База - Строка - имя базы данных // Имя - Строка - логическое имя изменяемого файла // НовоеИмя - Строка - новое логическое имя -// РезультатЗапроса - Строка - результат выполнения команды // -// Возвращаемое значение: -// Булево - Истина - команда выполнена успешно -// -Функция ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя, РезультатЗапроса = "") Экспорт +Процедура ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя) Экспорт Если Имя = НовоеИмя Тогда Лог.Предупреждение("Новое логическое имя ""%1"" совпадает со старым ""%2""!", Имя, НовоеИмя); - Возврат Истина; + Возврат; КонецЕсли; Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - Возврат Ложь; + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; КонецЕсли; ТекстЗапроса = СтрШаблон("""USE [master]; @@ -727,11 +773,20 @@ Имя, НовоеИмя); + РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - Возврат КодВозврата = 0; + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" базы ""%2"" на ""%3"": %4%5", + Имя, + База, + НовоеИмя, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; -КонецФункции // ИзменитьЛогическоеИмяФайлаВБазе() +КонецПроцедуры // ИзменитьЛогическоеИмяФайлаВБазе() // Функция возвращает логическое имя файла в базе // @@ -840,7 +895,6 @@ ВызватьИсключение ТекстОшибки; КонецЕсли; - СтрокаОписанияВерсии = 3; ИмяСервера = 0; ИмяЭкземпляраСУБД = 1; Редакция = 2; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" index a7e5bf6..2603bbe 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" @@ -50,11 +50,8 @@ Лог.Отладка("Начало создания базы ""%1\%2""", ТекущийСервер, База); - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.СоздатьБазу(База, МодельВосстановления, ПутьККаталогу, РезультатЗапроса); + ПодключениеКСУБД.СоздатьБазу(База, МодельВосстановления, ПутьККаталогу); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1\%2"":%3%4", @@ -65,15 +62,6 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Лог.Отладка("Создана база данных ""%1\%2""", ТекущийСервер, База); КонецПроцедуры // СоздатьБазуДанных() @@ -87,11 +75,8 @@ Лог.Отладка("Начало удаления базы ""%1\%2""", ТекущийСервер, База); - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.УдалитьБазу(База, РезультатЗапроса); + ПодключениеКСУБД.УдалитьБазу(База); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка удаления базы данных ""%1\%2"":%3%4", @@ -102,15 +87,6 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка удаления базы данных ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Лог.Отладка("Удалена база данных ""%1\%2""", ТекущийСервер, База); КонецПроцедуры // УдалитьБазуДанных() @@ -128,11 +104,8 @@ ТекущийСервер, База); - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.СоздатьРезервнуюКопию(База, ПутьКРезервнойКопии, РезультатЗапроса); + ПодключениеКСУБД.СоздатьРезервнуюКопию(База, ПутьКРезервнойКопии); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка создания резервной копии ""%1"" базы ""%2\%3"": %4%5", @@ -144,16 +117,6 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка создания резервной копии ""%1"" базы ""%2\%3"": %4%5", - ПутьКРезервнойКопии, - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Лог.Отладка("Создана резервная копия ""%1"" базы ""%2\%3""", ПутьКРезервнойКопии, ТекущийСервер, @@ -181,16 +144,12 @@ База, ПутьКРезервнойКопии); - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.ВосстановитьИзРезервнойКопии(База, - ПутьКРезервнойКопии, - ПутьКФайлуДанных, - ПутьКФайлуЖурнала, - СоздаватьБазу, - РезультатЗапроса); + ПодключениеКСУБД.ВосстановитьИзРезервнойКопии(База, + ПутьКРезервнойКопии, + ПутьКФайлуДанных, + ПутьКФайлуЖурнала, + СоздаватьБазу); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4", @@ -201,15 +160,6 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4", - База, - ПутьКРезервнойКопии, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Лог.Отладка("Выполнено восстановление базы ""%1"" из резервной копии ""%2""", База, ПутьКРезервнойКопии); @@ -257,11 +207,8 @@ ВладелецБазы, База); - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.УстановитьВладельцаБазы(База, ВладелецБазы, РезультатЗапроса); + ПодключениеКСУБД.УстановитьВладельцаБазы(База, ВладелецБазы); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка смены владельца базы ""%1"" на ""%2"":%3%4", @@ -272,15 +219,6 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка смены владельца базы ""%1"" на ""%2"": %3%4", - База, - ВладелецБазы, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Лог.Отладка("Для базы ""%1"" установлен новый владелец ""%2""", База, ВладелецБазы); @@ -328,11 +266,8 @@ МодельВосстановления, База); - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.УстановитьМодельВосстановления(База, МодельВосстановления, РезультатЗапроса); + ПодключениеКСУБД.УстановитьМодельВосстановления(База, МодельВосстановления); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка смены модели восстановления базы ""%1"" на ""%2"":%3%4", @@ -343,15 +278,6 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка смены модели восстановления базы ""%1"" на ""%2"": %3%4", - База, - МодельВосстановления, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Лог.Отладка("Для базы ""%1"" установлена модель восстановления ""%2""", База, МодельВосстановления); @@ -431,11 +357,8 @@ Возврат; КонецЕсли; - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя, РезультатЗапроса); + ПодключениеКСУБД.ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" на ""%2"" в базе ""%3"":%4%5", @@ -447,16 +370,6 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" на ""%2"" в базе ""%3"": %4%5", - Имя, - НовоеИмя, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Лог.Отладка("Изменено логическое имя файла ""%1"" на ""%2"" в базе ""%3""", Имя, НовоеИмя, @@ -499,11 +412,8 @@ Лог.Отладка("Начало компрессии страниц базы ""%1""", База); - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.ВключитьКомпрессиюСтраниц(База, Истина, Истина, РезультатЗапроса); + ПодключениеКСУБД.ВключитьКомпрессиюСтраниц(База, Истина, Истина); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка включения компрессии страниц в базе ""%1"": ""%2""", @@ -512,14 +422,6 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка включения компрессии страниц в базе ""%1"": %2%3", - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - Лог.Отладка("Включена компрессия страниц в базе ""%1""", База); КонецПроцедуры // ВключитьКомпрессию() @@ -533,26 +435,18 @@ Лог.Отладка("Начало сжатия (shrink) файла данных базы ""%1""", База); - Результат = Ложь; - РезультатЗапроса = ""; - Попытка - Результат = ПодключениеКСУБД.СжатьБазу(База, РезультатЗапроса); + ПодключениеКСУБД.СжатьБазу(База); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстОшибки = СтрШаблон("Ошибка сжатия файла данных базы ""%1"":%2%3", + ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла данных базы ""%1"":%2%3", База, Символы.ПС, ТекстОшибки); ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка сжатия файла данных базы ""%1"": %2%3", База, Символы.ПС, РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - - Лог.Отладка("Выполнено сжатие файла данных базы ""%1""", База); + Лог.Отладка("Выполнено сжатие (shrink) файла данных базы ""%1""", База); КонецПроцедуры // СжатьБазу() @@ -564,30 +458,19 @@ Процедура СжатьФайлЖурналаТранзакций(База) Экспорт Лог.Отладка("Начало сжатия (shrink) файла журнала транзакций базы ""%1""", База); - - Результат = Ложь; - РезультатЗапроса = ""; Попытка - Результат = ПодключениеКСУБД.СжатьФайлЖурналаТранзакций(База, РезультатЗапроса); + ПодключениеКСУБД.СжатьФайлЖурналаТранзакций(База); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстОшибки = СтрШаблон("Ошибка сжатия файла журнала транзакций базы ""%1"":%2%3", + ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла журнала транзакций базы ""%1"":%2%3", База, Символы.ПС, ТекстОшибки); ВызватьИсключение ТекстОшибки; КонецПопытки; - Если НЕ Результат Тогда - ТекстОшибки = СтрШаблон("Ошибка сжатия файла журнала транзакций базы ""%1"":%2%3", - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; - - Лог.Отладка("Выполнено сжатие файла журнала транзакций базы ""%1""", База); + Лог.Отладка("Выполнено сжатие (shrink) файла журнала транзакций базы ""%1""", База); КонецПроцедуры // СжатьФайлЖурналаТранзакций() From 1d7e38404922f440312f36ff4041a4722bad0a17 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Fri, 27 May 2022 20:51:30 +0300 Subject: [PATCH 22/38] =?UTF-8?q?refactor:=20=D0=A0=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B2=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BE=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B1=D0=B0=D0=B7?= =?UTF-8?q?=D1=8B=201=D0=A1;=20=D0=92=D1=81=D0=B5=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F?= =?UTF-8?q?=D1=8E=D1=89=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D1=8B=20=D0=A1=D0=A3=D0=91=D0=94=20=D0=BB=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=B2=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20=D0=A1?= =?UTF-8?q?=D0=A3=D0=91=D0=94;=20=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BA=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=D0=BC=20=D0=B8=20=D0=BE=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\320\265\320\275\320\270\320\265MSSQL.os" | 699 ++++++++++++++++- ...20\275\320\270\321\217\320\230\320\221.os" | 723 ++++-------------- tests/ib-structure-tests.os | 8 +- 3 files changed, 845 insertions(+), 585 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" index c8c596a..a8d50b3 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" @@ -262,9 +262,11 @@ // База - Строка - имя базы данных // МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED) // -Процедура УстановитьМодельВосстановления(База, МодельВосстановления = Неопределено) Экспорт +Процедура УстановитьМодельВосстановления(База, Знач МодельВосстановления = Неопределено) Экспорт - Если Найти("FULL,SIMPLE,BULK_LOGGED", ВРег(МодельВосстановления)) = 0 Тогда + МодельВосстановления = ВРег(МодельВосстановления); + + Если Найти("FULL,SIMPLE,BULK_LOGGED", МодельВосстановления) = 0 Тогда ТекстОшибки = СтрШаблон("Указана некорректная модель восстановления ""%1"" | (возможные значения: ""FULL"", ""SIMPLE"", ""BULK_LOGGED"")!", МодельВосстановления); @@ -281,7 +283,7 @@ |ALTER DATABASE %1 |SET RECOVERY %2"" ", База, - ВРег(МодельВосстановления)); + МодельВосстановления); РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); @@ -622,6 +624,8 @@ ТипФайла = ТипыФайловСокр.Данные; КонецЕсли; + ТипФайла = ВРег(ТипФайла); + Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда ТипФайла = ТипыФайловСокр.Данные; ТипФайлаПредставление = "данных"; @@ -634,6 +638,8 @@ ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии); + ПоляТаблицыФайловРезервнойКопии = ПоляТаблицыФайловРезервнойКопии(); + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; | |DECLARE @T1CTmp TABLE (%1); @@ -648,9 +654,9 @@ | [Type] = '%3'; | |SET NOCOUNT OFF;"" ", - ПоляТаблицыФайловРезервнойКопии(), + ПоляТаблицыФайловРезервнойКопии, ПутьКРезервнойКопии, - ВРег(ТипФайла)); + ТипФайла); РезультатЗапроса = ""; КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); @@ -749,9 +755,9 @@ // Процедура изменяет логическое имя файла базы // // Параметры: -// База - Строка - имя базы данных -// Имя - Строка - логическое имя изменяемого файла -// НовоеИмя - Строка - новое логическое имя +// База - Строка - имя базы данных +// Имя - Строка - логическое имя изменяемого файла +// НовоеИмя - Строка - новое логическое имя // Процедура ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя) Экспорт @@ -788,13 +794,13 @@ КонецПроцедуры // ИзменитьЛогическоеИмяФайлаВБазе() -// Функция возвращает логическое имя файла в базе +// Функция возвращает путь к расположению по умолчанию для указанного типа файлов базы // // Параметры: // ТипФайла - Строка - ROWS - файл базы; LOG - файл журнала транзакций // // Возвращаемое значение: -// Строка - логическое имя файла базы +// Строка - путь к расположению по умолчанию // Функция РасположениеФайловБазПоУмолчанию(Знач ТипФайла = Неопределено) Экспорт @@ -940,6 +946,597 @@ КонецФункции // ПолучитьВерсиюСУБД() +// Функция - возвращает описание занимаемого места в базе MS SQL Server +// +// Параметры: +// База - Строка - имя базы данных +// +// Возвращаемое значение: +// Структура - описание занимаего места +// *РазмерБазы - Число - размер текущей базы данных в байтах, включает файлы данных и журналов +// *Свободно - Число - место в базе данных, не зарезервированное для объектов базы данных +// *Зарезервировано - Число - общий объем, выделенный объектам в базе данных +// *Данные - Число - общий объем, используемый данными +// *Индексы - Число - общий объем, используемый индексами +// *НеИспользуется - Число - общий объем, зарезервированный для объектов в базе данных, +// но пока не используемый +// +Функция ЗанимаемоеБазойМесто(База) Экспорт + + ТекстЗапроса = СтрШаблон("""USE [%1]; + | + |SET NOCOUNT ON; + | + |exec sp_spaceused @oneresultset=1; + | + |SET NOCOUNT OFF"" ", + База); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения информации о занимаемом месте для базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + + Результат = Новый Структура(); + Результат.Вставить("РазмерБазы" , 1); + Результат.Вставить("Свободно" , 2); + Результат.Вставить("Зарезервировано", 3); + Результат.Вставить("Данные" , 4); + Результат.Вставить("Индексы" , 5); + Результат.Вставить("НеИспользуется" , 6); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(Текст.КоличествоСтрок()), "|"); + + Для Каждого ТекЭлемент Из Результат Цикл + Ключ = ТекЭлемент.Ключ; + Индекс = ТекЭлемент.Значение; + + Если Индекс >= МассивЗначений.Количество() Тогда + Результат[Ключ] = Неопределено; + Продолжить; + КонецЕсли; + + Результат[Ключ] = СокрЛП(МассивЗначений[Индекс]); + КонецЦикла; + + Возврат Результат; + +КонецФункции // ЗанимаемоеБазойМесто() + +// Функция - возвращает список таблиц базы, соответствующих фильтру +// +// Параметры: +// База - Строка - имя базы данных +// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" +// +// Возвращаемое значение: +// Соответствие - список таблиц базы +// +Функция ТаблицыБазы(База, ФильтрТаблицПоИмени = "") Экспорт + + Лог.Отладка("Получение списка таблиц базы ""%1\%2"": %3", Сервер, База); + + ШаблонЗапроса = """SET NOCOUNT ON; + | SELECT + | T.Name AS [Table] + | FROM [%1].sys.tables T + | %2 + | SET NOCOUNT OFF;"" "; + + Условие = ""; + Если ЗначениеЗаполнено(ФильтрТаблицПоИмени) Тогда + Условие = СтрШаблон("WHERE T.Name LIKE '%1'", ФильтрТаблицПоИмени); + КонецЕсли; + + ТекстЗапроса = СтрШаблон(ШаблонЗапроса, База, Условие); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения списка таблиц базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + + Таблицы = Новый Массив(); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + Для й = 1 По Текст.КоличествоСтрок() Цикл + ИмяТаблицы = СокрЛП(Текст.ПолучитьСтроку(й)); + Если НЕ ЗначениеЗаполнено(ИмяТаблицы) Тогда + Продолжить; + КонецЕсли; + + Таблицы.Добавить(ИмяТаблицы); + КонецЦикла; + + Возврат Таблицы; + +КонецФункции // ТаблицыБазы() + +// Функция - возвращает список таблиц в базе MS SQL Server и их показатели использования +// +// Параметры: +// База - Строка - имя базы данных +// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" +// +// Возвращаемое значение: +// Массив из Структура - таблицы и показатели использования +// *Таблица - Строка - имя таблицы +// *КоличествоСтрок - Число - количество строк в таблице +// *ВсегоЗанято - Число - общий объем заниаемого места (байт) +// *Используется - Число - объем, используемый данными (байт) +// *НеИспользуется - Число - не используемый объем (байт) +// *ОперацийЧтения - Число - количество операций чтения (read) +// *ОперацийВыборки - Число - количество операций выборки (select) +// *ОперацийСканирования - Число - количество операций сканирования (scan) +// *ОперацийПоиска - Число - количество операций поиска (seek) +// *ОперацийЗаписи - Число - количество операций записи (write) +// +Функция ПоказателиИспользованияТаблицБазы(База, ФильтрТаблицПоИмени = "") Экспорт + + ШаблонЗапроса = """SET NOCOUNT ON; + | + | SELECT + | Tables.Name AS TableName, + | Partitions.Rows AS RowCounts, + | SUM(AllocationUnits.total_pages) * 8192 AS TotalSpace, + | SUM(AllocationUnits.used_pages) * 8192 AS UsedSpace, + | (SUM(AllocationUnits.total_pages) - SUM(AllocationUnits.used_pages)) * 8192 AS UnusedSpace, + | SUM(Stats.user_seeks + Stats.user_scans + Stats.user_lookups) AS Reads, + | SUM(Stats.user_seeks) AS Seeks, + | SUM(Stats.user_scans) AS Scans, + | SUM(Stats.user_lookups) AS Lookups, + | SUM(Stats.user_updates) AS Writes + | FROM + | [%1].sys.tables AS Tables + | INNER JOIN [%1].sys.indexes AS Indexes + | ON Tables.object_id = Indexes.object_id + | INNER JOIN [%1].sys.partitions AS Partitions + | ON Indexes.object_id = Partitions.object_id + | AND Indexes.index_id = Partitions.index_id + | INNER JOIN [%1].sys.allocation_units AS AllocationUnits + | ON Partitions.partition_id = AllocationUnits.container_id + | LEFT OUTER JOIN [%1].sys.dm_db_index_usage_stats AS Stats + | ON Tables.object_id = Stats.object_id + | WHERE + | Tables.Name NOT LIKE 'dt%%' + | AND Tables.is_ms_shipped = 0 + | AND Indexes.object_id > 255 + |%2 + | GROUP BY + | Tables.Name, + | Partitions.Rows + | ORDER BY + | Tables.Name; + | + | SET NOCOUNT OFF;"" "; + + Условие = ""; + Если ЗначениеЗаполнено(ФильтрТаблицПоИмени) Тогда + Условие = СтрШаблон(" AND Tables.Name LIKE '%1'", ФильтрТаблицПоИмени); + КонецЕсли; + + ТекстЗапроса = СтрШаблон(ШаблонЗапроса, База, Условие); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения информации о показателях использования таблиц + | для базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + + ПоказателиТаблиц = Новый Массив(); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + Для й = 1 По Текст.КоличествоСтрок() Цикл + + Если НЕ ЗначениеЗаполнено(Текст.ПолучитьСтроку(й)) Тогда + Продолжить; + КонецЕсли; + + ПоказателиТаблицы = Новый Структура(); + ПоказателиТаблицы.Вставить("Таблица" , 0); + ПоказателиТаблицы.Вставить("КоличествоСтрок" , 1); + ПоказателиТаблицы.Вставить("ВсегоЗанято" , 2); + ПоказателиТаблицы.Вставить("Используется" , 3); + ПоказателиТаблицы.Вставить("НеИспользуется" , 4); + ПоказателиТаблицы.Вставить("ОперацийЧтения" , 5); + ПоказателиТаблицы.Вставить("ОперацийВыборки" , 6); + ПоказателиТаблицы.Вставить("ОперацийСканирования", 7); + ПоказателиТаблицы.Вставить("ОперацийПоиска" , 8); + ПоказателиТаблицы.Вставить("ОперацийЗаписи" , 9); + + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(й), "|"); + + Для Каждого ТекЭлемент Из ПоказателиТаблицы Цикл + Ключ = ТекЭлемент.Ключ; + Индекс = ТекЭлемент.Значение; + + Если Индекс >= МассивЗначений.Количество() Тогда + ПоказателиТаблицы[Ключ] = Неопределено; + Продолжить; + КонецЕсли; + + ПоказателиТаблицы[Ключ] = СокрЛП(МассивЗначений[Индекс]); + + КонецЦикла; + + ПоказателиТаблиц.Добавить(ПоказателиТаблицы); + + КонецЦикла; + + Возврат ПоказателиТаблиц; + +КонецФункции // ПоказателиИспользованияТаблицБазы() + +// Функция - возвращает список колонок базы, соответствующих фильтру +// +// Параметры: +// База - Строка - имя базы данных +// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" +// ФильтрКолонокПоИмени - Строка - фильтр имен колонок в формате для оператора "LIKE" +// +// Возвращаемое значение: +// Соответствие - список колонок базы +// +Функция КолонкиБазы(База, ФильтрТаблицПоИмени = "", ФильтрКолонокПоИмени = "") Экспорт + + ШаблонЗапроса = """SET NOCOUNT ON; + | SELECT + | T.Name AS [Table], + | C.name AS [Field] + | FROM [%1].sys.tables T + | LEFT JOIN [%1].sys.columns C + | ON T.object_id = C.object_id + | %2 + | SET NOCOUNT OFF;"" "; + + Условие = ""; + Если ЗначениеЗаполнено(ФильтрТаблицПоИмени) Тогда + Условие = СтрШаблон("WHERE T.Name LIKE '%1'", ФильтрТаблицПоИмени); + КонецЕсли; + + Если ЗначениеЗаполнено(ФильтрКолонокПоИмени) Тогда + Если ЗначениеЗаполнено(Условие) Тогда + Условие = СтрШаблон("%1 AND C.Name LIKE '%2'", Условие, ФильтрКолонокПоИмени); + Иначе + Условие = СтрШаблон("WHERE C.Name LIKE '%1'", ФильтрКолонокПоИмени); + КонецЕсли; + КонецЕсли; + + ТекстЗапроса = СтрШаблон(ШаблонЗапроса, База, Условие); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + + Колонки = Новый Массив(); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + Для й = 1 По Текст.КоличествоСтрок() Цикл + Значения = СтрРазделить(Текст.ПолучитьСтроку(й), "|", Ложь); + + ОписаниеКолонки = Новый Структура(); + ОписаниеКолонки.Вставить("Таблица", СокрЛП(Значения[0])); + ОписаниеКолонки.Вставить("Колонка", СокрЛП(Значения[1])); + + Колонки.Добавить(ОписаниеКолонки); + КонецЦикла; + + Возврат Колонки; + +КонецФункции // КолонкиБазы() + +// Функция - возвращает версию формата конфигурации 1С +// +// Параметры: +// База - Строка - имя базы данных +// +// Возвращаемое значение: +// Структура - описание версии формата конфигурации +// *Версия - Число - номер версии формата конфигурации +// *ТребуемаяВерсияПлатформы - Строка - минимальная версия платформы 1С +// +Функция ВерсияФорматаКонфигурации1С(База) Экспорт + + Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда + ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | SELECT + | [IBVersion], + | [PlatformVersionReq] + | FROM %1.[dbo].[IBVersion]; + |SET NOCOUNT OFF;"" ", + База); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения версия формата конфигурации 1С базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Разделитель = "---"; + Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); + Если Поз > 0 Тогда + РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); + КонецЕсли; + + Результат = Новый Структура(); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(РезультатЗапроса); + + МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(1), "|", Ложь); + + Результат.Вставить("Версия", Число(МассивЗначений[0])); + Результат.Вставить("ТребуемаяВерсияПлатформы", МассивЗначений[1]); + + Возврат Результат; + +КонецФункции // ВерсияФорматаКонфигурации1С() + +// Функция - возвращает количество записей в таблице конфигурации информационной базы 1С +// +// Параметры: +// База - Строка - имя базы данных +// ИдОбъектов - Число - массив идентификаторов объектов метаданных, +// если не указан, считываются все записи +// +// Возвращаемое значение: +// Число - количество записей в таблице конфигурации информационной базы 1С +// +Функция КоличествоОбъектовКонфигурацииБазы1С(База, ИдОбъектов = "") Экспорт + + ОтборПоИд = ОтборОбъектовКонфигурации1СПоИд(ИдОбъектов); + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | %1 + | SELECT + | COUNT(Config.[FileName]) + | FROM %2.[dbo].[Config] AS Config + | %3 + | WHERE CHARINDEX('.', Config.[FileName]) = 0 + | SET NOCOUNT OFF;"" ", + ОтборПоИд.ТаблицаОтбора, + База, + ОтборПоИд.Отбор); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения количества записей в таблице ""Config"" базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Возврат Число(РезультатЗапроса); + +КонецФункции // КоличествоОбъектовКонфигурацииБазы1С() + +// Функция - читает таблицу Config базы 1С +// +// Параметры: +// База - Строка - имя базы данных +// ИдОбъектов - Число - массив идентификаторов объектов метаданных, +// если не указан, считываются все записи +// Смещение - Число - смещение от начала результата в количестве строк +// если не указан, то с начала результата +// ПорцияЧтения - Число - количество строк таблицы Config читаемое за 1 запрос +// если не указан, считываются все записи начиная со смещения +// +// Возвращаемое значение: +// Соответствие - соответствия UUID метаданных и имен метаданных +// +Функция ОбъектыКонфигурацииБазы1С(База, ИдОбъектов = Неопределено, Смещение = 0, ПорцияЧтения = 0) Экспорт + + ОтборПоИд = ОтборОбъектовКонфигурации1СПоИд(ИдОбъектов); + + ОтборПервых = СтрШаблон("FETCH NEXT %1 ROWS ONLY", ПорцияЧтения); + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | %1 + | SELECT + | Config.[FileName] AS FileName, + | Config.[BinaryData] AS BinaryData + | FROM %2.[dbo].[Config] AS Config + | %3 + | WHERE CHARINDEX('.', Config.[FileName]) = 0 + | ORDER BY Config.[FileName] OFFSET %4 ROWS %5 + | FOR XML RAW, BINARY BASE64 + | SET NOCOUNT OFF;"" ", + ОтборПоИд.ТаблицаОтбора, + База, + ОтборПоИд.Отбор, + Смещение, + ОтборПервых); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения объектов конфигурации 1С базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + НормализоватьXML(РезультатЗапроса); + + ОбъектыКонфигурации = Новый Соответствие(); + + ДлинаИд = 36; + + Парсер = Новый ЧтениеXML; + Парсер.УстановитьСтроку(РезультатЗапроса); + + Пока Парсер.Прочитать() Цикл + + ЗначенияАтрибутов = Новый Соответствие(); + + Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И ВРег(Парсер.Имя) = "ROW" Тогда + ЗначенияАтрибутов = ЗначенияАтрибутов(Парсер); + Иначе + Продолжить; + КонецЕсли; + + Ид = ЗначенияАтрибутов["FILENAME"]; + Данные = ЗначенияАтрибутов["BINARYDATA"]; + + Если ЗначенияАтрибутов.Количество() = 0 ИЛИ Ид = Неопределено + ИЛИ Данные = Неопределено ИЛИ СтрДлина(Ид) <> ДлинаИд Тогда + Продолжить; + КонецЕсли; + + Данные = Base64Значение(Данные); + + ОписаниеОбъекта = Новый Структура(); + ОписаниеОбъекта.Вставить("Ид" , Ид); + ОписаниеОбъекта.Вставить("Данные", Данные); + + ОбъектыКонфигурации.Вставить(ОписаниеОбъекта.Ид, ОписаниеОбъекта); + + КонецЦикла; + + Парсер.Закрыть(); + + Возврат ОбъектыКонфигурации; + +КонецФункции // ОбъектыКонфигурацииБазы1С() + +// Функция - читает соответствия UUID объектов метаданных конфигурации 1С именам объектов базы +// из таблицы Params из записи где "[FileName] = 'DBNames'" +// +// Параметры: +// База - Строка - имя базы данных +// +// Возвращаемое значение: +// ДвоичныеДанные - соответствия UUID объектов метаданных конфигурации 1С именам объектов СУБД +// упакованные в формате deflate +// +Функция ИменаТаблицОбъектовКонфигурации1С(База) Экспорт + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | SELECT + | [BinaryData] + | FROM %1.[dbo].[Params] + | WHERE [FileName] = 'DBNames' + | FOR XML RAW, BINARY BASE64 + | SET NOCOUNT OFF;"" ", + База); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения соответствия UUID объектов метаданных конфигурации 1С + | именам объектов базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + НормализоватьXML(РезультатЗапроса); + + ЗначенияАтрибутов = Новый Соответствие(); + + Парсер = Новый ЧтениеXML; + Парсер.УстановитьСтроку(РезультатЗапроса); + + Пока Парсер.Прочитать() Цикл + Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И ВРег(Парсер.Имя) = "ROW" Тогда + ЗначенияАтрибутов = ЗначенияАтрибутов(Парсер); + Прервать; + КонецЕсли; + КонецЦикла; + + Парсер.Закрыть(); + + Данные = ЗначенияАтрибутов["BINARYDATA"]; + + Если НЕ ЗначениеЗаполнено(Данные) Тогда + Данные = ""; + КонецЕсли; + + Возврат Base64Значение(Данные); + +КонецФункции // ИменаТаблицОбъектовКонфигурации1С() + // Функция возвращает признак доступности функционала SQL Server // // Параметры: @@ -1200,6 +1797,88 @@ КонецФункции // ВариантыСообщенияОСуществованииБД() +// Функция - читает атрибуты узла XML +// +// Параметры: +// Парсер - ЧтениеXML - парсер, спозиционированный на начало элемента XML +// +// Возвращаемое значение: +// Соответствие - прочитанные значения атрибутов узла XML +// +Функция ЗначенияАтрибутов(Парсер) + + Результат = Новый Соответствие(); + + КоличествоАтрибутов = Парсер.КоличествоАтрибутов(); + + Для й = 0 По КоличествоАтрибутов -1 Цикл + Результат.Вставить(ВРег(Парсер.ИмяАтрибута(й)), Парсер.ЗначениеАтрибута(й)); + КонецЦикла; + + Возврат Результат; + +КонецФункции // ЗначенияАтрибутов() + +// Процедура - добавляет стандартный заголовок XML и корневой элемент +// +// Параметры: +// ТекстXML - Строка - дополняемый техт XML +// +Процедура НормализоватьXML(ТекстXML) + + ТекстXML = СтрЗаменить(ТекстXML, Символы.ПС, ""); + ТекстXML = СтрЗаменить(ТекстXML, Символы.ВК, ""); + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(ТекстXML); + Текст.ВставитьСтроку(1, ""); + Текст.ВставитьСтроку(1, ""); + Текст.ДобавитьСтроку(""); + + ТекстXML = Текст.ПолучитьТекст(); + +КонецПроцедуры // НормализоватьXML() + +// Функция - возвращает части запроса SQL для отбора данных из таблицы Config +// по списку идентификаторов (FileName) +// +// Параметры: +// ИдОбъектов - Число - массив идентификаторов объектов метаданных, +// если не указан, считываются все записи +// +// Возвращаемое значение: +// Число - количество записей в таблице конфигурации информационной базы 1С +// +Функция ОтборОбъектовКонфигурации1СПоИд(ИдОбъектов = "") + + МассивИд = Новый Массив(); + Если ТипЗнч(ИдОбъектов) = Тип("Строка") Тогда + МассивИд = СтрРазделить(ИдОбъектов, ",", Ложь); + Иначе + Для Каждого ТекИд Из ИдОбъектов Цикл + МассивИд.Добавить(ТекИд); + КонецЦикла; + КонецЕсли; + + ТаблицаОтбора = ""; + Отбор = ""; + Если МассивИд.Количество() > 0 Тогда + Для й = 0 По МассивИд.ВГраница() Цикл + МассивИд[й] = СтрШаблон("('%1')", СокрЛП(МассивИд[й])); + КонецЦикла; + + ЗначенияИд = СтрСоединить(МассивИд, ","); + + ТаблицаОтбора = СтрШаблон("DECLARE @IDFilter TABLE (FileName NVARCHAR(128)) + | INSERT INTO @IDFilter ([FileName]) VALUES %1", ЗначенияИд); + Отбор = " INNER JOIN @IDFilter AS IDFilter + | ON Config.[FileName] = IDFilter.[FileName]"; + КонецЕсли; + + Возврат Новый Структура("ТаблицаОтбора, Отбор", ТаблицаОтбора, Отбор); + +КонецФункции // ОтборОбъектовКонфигурации1СПоИд() + #КонецОбласти // СлужебныеПроцедурыИФункции #Область ОбработчикиСобытий diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index 556a4f2..5989fd5 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -27,34 +27,12 @@ // Функция ВерсияФорматаКонфигурации() Экспорт - Лог.Отладка("Получение версии формата конфигурации 1С базы ""%1\%2""", + Лог.Отладка("Начало получения версии формата конфигурации 1С базы ""%1\%2""", ТекущийСервер, База); - ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; - | SELECT - | [IBVersion], - | [PlatformVersionReq] - | FROM %1.[dbo].[IBVersion]; - |SET NOCOUNT OFF;"" ", - База); - - РезультатЗапроса = ""; - Попытка - КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); - Если КодВозврата = 0 Тогда - Лог.Отладка("Получена версия формата конфигурации 1С базы ""%1\%2""", - ТекущийСервер, - База); - Иначе - ТекстОшибки = СтрШаблон("Ошибка получения версия формата конфигурации 1С базы ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Результат = ПодключениеКСУБД.ВерсияФорматаКонфигурации1С(База); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка получения версия формата конфигурации 1С базы ""%1\%2"":%3%4", @@ -65,23 +43,12 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Разделитель = "---"; - Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - Если Поз > 0 Тогда - РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); - КонецЕсли; - - СтруктураРезультата = Новый Структура(); - - Текст = Новый ТекстовыйДокумент(); - Текст.УстановитьТекст(РезультатЗапроса); - - МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(1), "|", Ложь); - - СтруктураРезультата.Вставить("Версия", Число(МассивЗначений[0])); - СтруктураРезультата.Вставить("ТребуемаяВерсияПлатформы", МассивЗначений[1]); + Лог.Отладка("Получена версии формата конфигурации 1С базы ""%1\%2"": %3", + ТекущийСервер, + База, + Результат.Версия); - Возврат СтруктураРезультата; + Возврат Результат; КонецФункции // ВерсияФорматаКонфигурации() @@ -107,23 +74,23 @@ КонецЕсли; Если НазначениеОбъекта = "Поле" Тогда - КолонкиБазыДанных = КолонкиБазыДанных(, СтрШаблон("%%%1%%", ИмяОбъекта)); - Если КолонкиБазыДанных.Количество() > 0 Тогда - ОписаниеОбъектаБазы = КолонкиБазыДанных[ИмяОбъекта]; + КолонкиБазы = КолонкиБазы(, СтрШаблон("%%%1%%", ИмяОбъекта)); + Если КолонкиБазы.Количество() > 0 Тогда + ОписаниеОбъектаБазы = КолонкиБазы[ИмяОбъекта]; Иначе Возврат Неопределено; КонецЕсли; ДобавлятьКолонки = Истина; КонецЕсли; - СоответствиеИдМетаданныхИменамТаблиц = СоответствиеИдМетаданныхИменамТаблиц(ДобавлятьКолонки); + ИменаТаблицОбъектовКонфигурации1С = ИменаТаблицОбъектовКонфигурации1С(ДобавлятьКолонки); ОписаниеВладельца = ОписаниеОбъектаБазы; Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл - ОписаниеВладельца.Вставить("Ид", СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид); + ОписаниеВладельца.Вставить("Ид", ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид); ОписаниеВладельца = ОписаниеВладельца.Владелец; КонецЦикла; - ОписаниеВладельца.Вставить("Ид", СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид); + ОписаниеВладельца.Вставить("Ид", ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид); СоответствиеИменМетаданных = СоответствиеИменМетаданных(ОписаниеВладельца.Ид); @@ -131,7 +98,7 @@ ТекОписание = ОписаниеОбъектаБазы; Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл - ИмяМетаданных = ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Содержимое, ТекОписание.Ид); + ИмяМетаданных = ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание.Ид); ТекОписание.Вставить("ИмяМетаданных", ИмяМетаданных); ТекОписание = ТекОписание.Владелец; КонецЦикла; @@ -143,7 +110,6 @@ // Функция - возвращает описание метаданных 1С для таблиц СУБД // // Параметры: -// ИмяОбъекта - Строка - Имя таблицы СУБД // ДобавлятьКолонки - Строка - Истина - будет добавлена информация для колонок таблиц // // Возвращаемое значение: @@ -153,18 +119,18 @@ ОписанияМетаданных = Новый Соответствие(); - СоответствиеИдМетаданныхИменамТаблиц = СоответствиеИдМетаданныхИменамТаблиц(ДобавлятьКолонки); + ИменаТаблицОбъектовКонфигурации1С = ИменаТаблицОбъектовКонфигурации1С(ДобавлятьКолонки); ТабличныеЧасти = ТабличныеЧастиИВладельцы(); СоответствиеИменМетаданных = СоответствиеИменМетаданных(); - КолонкиБазыДанных = Новый Соответствие(); + КолонкиБазы = Новый Соответствие(); Если ДобавлятьКолонки Тогда - КолонкиБазыДанных = КолонкиБазыДанных(); + КолонкиБазы = КолонкиБазы(); КонецЕсли; - Для Каждого ТекЭлемент Из СоответствиеИдМетаданныхИменамТаблиц Цикл + Для Каждого ТекЭлемент Из ИменаТаблицОбъектовКонфигурации1С Цикл Имя = СтрШаблон("%1%2", ТекЭлемент.Значение.Префикс, Формат(ТекЭлемент.Значение.Индекс, "ЧРГ=; ЧГ=")); @@ -178,7 +144,7 @@ КонецЕсли; Если НазначениеОбъекта = "Поле" Тогда - ОписаниеОбъектаБазы = КолонкиБазыДанных[Имя]; + ОписаниеОбъектаБазы = КолонкиБазы[Имя]; Если ОписаниеОбъектаБазы = Неопределено Тогда Продолжить; КонецЕсли; @@ -192,7 +158,7 @@ ОписаниеВладельца = ОписаниеОбъектаБазы; Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл - ОписаниеВладельца.Ид = СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид; + ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); Если НазначенияОбъектовБазы.Свойство(ОписаниеВладельца.Префикс) И НазначенияОбъектовБазы[ОписаниеВладельца.Префикс].Подчиненный Тогда @@ -202,10 +168,10 @@ ОписаниеВладельца = ОписаниеВладельца.Владелец; КонецЦикла; - Если СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя] = Неопределено Тогда + Если ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя] = Неопределено Тогда Продолжить; КонецЕсли; - ОписаниеВладельца.Ид = СоответствиеИдМетаданныхИменамТаблиц[ОписаниеВладельца.Имя].Ид; + ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; Если НЕ СоответствиеИменМетаданных[ОписаниеВладельца.Ид] = Неопределено Тогда ОписаниеВладельца.ИмяМетаданных = СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных; @@ -215,7 +181,7 @@ ТекОписание = ОписаниеОбъектаБазы; Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл ТекОписание.ИмяМетаданных = - ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Содержимое, ТекОписание.Ид); + ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание.Ид); ТекОписание = ТекОписание.Владелец; КонецЦикла; @@ -239,238 +205,86 @@ // Функция ЗанимаемоеМесто() Экспорт - ТекстЗапроса = СтрШаблон("""USE [%1]; - | - |SET NOCOUNT ON; - | - |exec sp_spaceused @oneresultset=1; - | - |SET NOCOUNT OFF"" ", - База); - - СтруктураРезультата = Новый Структура(); - СтруктураРезультата.Вставить("РазмерБазы" , 1); - СтруктураРезультата.Вставить("Свободно" , 2); - СтруктураРезультата.Вставить("Зарезервировано", 3); - СтруктураРезультата.Вставить("Данные" , 4); - СтруктураРезультата.Вставить("Индексы" , 5); - СтруктураРезультата.Вставить("НеИспользуется" , 6); - - РезультатЗапроса = ""; - КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); - - Если КодВозврата = 0 Тогда - Текст = Новый ТекстовыйДокумент(); - Текст.УстановитьТекст(РезультатЗапроса); - - СимволовРазмерности = 2; - - МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(Текст.КоличествоСтрок()), "|"); - - Для Каждого ТекЭлемент Из СтруктураРезультата Цикл - Ключ = ТекЭлемент.Ключ; - Индекс = ТекЭлемент.Значение; - - Если Индекс >= МассивЗначений.Количество() Тогда - СтруктураРезультата[Ключ] = 0; - Продолжить; - КонецЕсли; + Результат = Новый Структура(); + Результат.Вставить("РазмерБазы"); + Результат.Вставить("Свободно"); + Результат.Вставить("Зарезервировано"); + Результат.Вставить("Данные"); + Результат.Вставить("Индексы"); + Результат.Вставить("НеИспользуется"); - Размерность = ВРег(Прав(СокрЛП(МассивЗначений[Индекс]), СимволовРазмерности)); - РазмерСтрокой = СокрЛП(Лев(МассивЗначений[Индекс], СтрДлина(МассивЗначений[Индекс]) - СтрДлина(Размерность))); - - Если ЭтоЧисло(РазмерСтрокой) Тогда - СтруктураРезультата[Ключ] = Число(РазмерСтрокой); - Множитель = 1024; - Если ВРег(Размерность) = "KB" Тогда - СтруктураРезультата[Ключ] = СтруктураРезультата[Ключ] * Множитель; - ИначеЕсли ВРег(Размерность) = "MB" Тогда - СтруктураРезультата[Ключ] = СтруктураРезультата[Ключ] * Множитель * Множитель; - КонецЕсли; - Иначе - СтруктураРезультата[Ключ] = 0; - КонецЕсли; - КонецЦикла; - Иначе - - Для Каждого ТекЭлемент Из СтруктураРезультата Цикл - СтруктураРезультата[ТекЭлемент.Ключ] = -1; - КонецЦикла; + Лог.Отладка("Начало получения информации о занимаемом месте для базы ""%1\%2""", + ТекущийСервер, + База); - КонецЕсли; + Попытка + Результат = ПодключениеКСУБД.ЗанимаемоеБазойМесто(База); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения информации о занимаемом месте для базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; - Возврат СтруктураРезультата; + Лог.Отладка("Получена информация о занимаемом месте для базы ""%1\%2""", ТекущийСервер, База); -КонецФункции // ЗанимаемоеМесто() + СимволовРазмерности = 2; -// Функция - возвращает список таблиц в базе MS SQL Server -// -// Возвращаемое значение: -// Структура - описание занимаего места -// * РазмерБазы - Число - размер текущей базы данных в байтах, включает файлы данных и журналов -// * Свободно - Число - место в базе данных, не зарезервированное для объектов базы данных -// * Зарезервировано - Число - общий объем, выделенный объектам в базе данных -// * Данные - Число - общий объем, используемый данными -// * Индексы - Число - общий объем, используемый индексами -// * НеИспользуется - Число - общий объем, зарезервированный для объектов в базе данных, -// но пока не используемый -// -Функция РазмерыИПараметрыИспользованияТаблицБазы() Экспорт - - ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; - | - | SELECT - | Tables.Name AS TableName, - | Partitions.Rows AS RowCounts, - | SUM(AllocationUnits.total_pages) * 8192 AS TotalSpace, - | SUM(AllocationUnits.used_pages) * 8192 AS UsedSpace, - | (SUM(AllocationUnits.total_pages) - SUM(AllocationUnits.used_pages)) * 8192 AS UnusedSpace, - | SUM(Stats.user_seeks + Stats.user_scans + Stats.user_lookups) AS Reads, - | SUM(Stats.user_seeks) AS Seeks, - | SUM(Stats.user_scans) AS Scans, - | SUM(Stats.user_lookups) AS Lookups, - | SUM(Stats.user_updates) AS Writes - | FROM - | [%1].sys.tables AS Tables - | INNER JOIN [%1].sys.indexes AS Indexes - | ON Tables.object_id = Indexes.object_id - | INNER JOIN [%1].sys.partitions AS Partitions - | ON Indexes.object_id = Partitions.object_id - | AND Indexes.index_id = Partitions.index_id - | INNER JOIN [%1].sys.allocation_units AS AllocationUnits - | ON Partitions.partition_id = AllocationUnits.container_id - | LEFT OUTER JOIN [%1].sys.dm_db_index_usage_stats AS Stats - | ON Tables.object_id = Stats.object_id - | WHERE - | Tables.Name NOT LIKE 'dt%%' - | AND Tables.is_ms_shipped = 0 - | AND Indexes.object_id > 255 - | GROUP BY - | Tables.Name, - | Partitions.Rows - | ORDER BY - | Tables.Name; - | - | SET NOCOUNT OFF;"" ", - База); - - МассивРезультатов = Новый Массив(); - - РезультатЗапроса = ""; - КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); + Для Каждого ТекЭлемент Из Результат Цикл - Разделитель = "---"; - Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - Если Поз > 0 Тогда - РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); - КонецЕсли; + Размерность = ВРег(Прав(ТекЭлемент.Значение, СимволовРазмерности)); + РазмерСтрокой = СокрЛП(Лев(ТекЭлемент.Значение, СтрДлина(ТекЭлемент.Значение) - СтрДлина(Размерность))); - Если КодВозврата = 0 Тогда - Текст = Новый ТекстовыйДокумент(); - Текст.УстановитьТекст(РезультатЗапроса); - - Для й = 1 По Текст.КоличествоСтрок() Цикл - - СтруктураРезультата = Новый Структура(); - СтруктураРезультата.Вставить("Таблица" , 0); - СтруктураРезультата.Вставить("Схема" , 1); - СтруктураРезультата.Вставить("КоличествоСтрок" , 2); - СтруктураРезультата.Вставить("ВсегоЗанято" , 3); - СтруктураРезультата.Вставить("Используется" , 4); - СтруктураРезультата.Вставить("НеИспользуется" , 5); - СтруктураРезультата.Вставить("ОперацийЧтения" , 6); - СтруктураРезультата.Вставить("ОперацийВыборки" , 7); - СтруктураРезультата.Вставить("ОперацийСканирования", 8); - СтруктураРезультата.Вставить("ОперацийПоиска" , 9); - СтруктураРезультата.Вставить("ОперацийЗаписи" , 10); - - Если НЕ ЗначениеЗаполнено(Текст.ПолучитьСтроку(й)) Тогда - Продолжить; + Если ЭтоЧисло(РазмерСтрокой) Тогда + Результат[ТекЭлемент.Ключ] = Число(РазмерСтрокой); + Множитель = 1024; + Если ВРег(Размерность) = "KB" Тогда + Результат[ТекЭлемент.Ключ] = Результат[ТекЭлемент.Ключ] * Множитель; + ИначеЕсли ВРег(Размерность) = "MB" Тогда + Результат[ТекЭлемент.Ключ] = Результат[ТекЭлемент.Ключ] * Множитель * Множитель; КонецЕсли; + Иначе + Результат[ТекЭлемент.Ключ] = Неопределено; + КонецЕсли; + КонецЦикла; - МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(й), "|"); - - Для Каждого ТекЭлемент Из СтруктураРезультата Цикл - Ключ = ТекЭлемент.Ключ; - Индекс = ТекЭлемент.Значение; - - Если Индекс >= МассивЗначений.Количество() Тогда - СтруктураРезультата[Ключ] = 0; - Продолжить; - КонецЕсли; - - Если ВРег(Ключ) = "ТАБЛИЦА" - ИЛИ ВРег(Ключ) = "СХЕМА" Тогда - СтруктураРезультата[Ключ] = СокрЛП(МассивЗначений[Индекс]); - ИначеЕсли ЭтоЧисло(СокрЛП(МассивЗначений[Индекс])) Тогда - СтруктураРезультата[Ключ] = Число(СокрЛП(МассивЗначений[Индекс])); - Иначе - СтруктураРезультата[Ключ] = 0; - КонецЕсли; - КонецЦикла; - - МассивРезультатов.Добавить(СтруктураРезультата); - - КонецЦикла; - КонецЕсли; - - Возврат МассивРезультатов; - -КонецФункции // РазмерыИПараметрыИспользованияТаблицБазы() - -#КонецОбласти // ПрограммныйИнтерфейс + Возврат Результат; -#Область СлужебныеПроцедурыИФункции +КонецФункции // ЗанимаемоеМесто() -// Функция - возвращает количество записей в таблице конфигурации информационной базы 1С +// Функция - возвращает список таблиц в базе MS SQL Server и их показатели использования // // Параметры: -// Ид - Число - идентификатор объекта метаданных, -// если не указан, считываются все записи +// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" // // Возвращаемое значение: -// Число - Истина - количество записей в таблице конфигурации информационной базы 1С -// -Функция КоличествоЗаписейВТаблицеКонфигурации(Ид = "") - - Лог.Отладка("Получение количества записей в таблице ""Config"" базы ""%1\%2""", +// Массив из Структура - таблицы и показатели использования +// *Таблица - Строка - имя таблицы +// *КоличествоСтрок - Число - количество строк в таблице +// *ВсегоЗанято - Число - общий объем заниаемого места (байт) +// *Используется - Число - объем, используемый данными (байт) +// *НеИспользуется - Число - не используемый объем (байт) +// *ОперацийЧтения - Число - количество операций чтения (read) +// *ОперацийВыборки - Число - количество операций выборки (select) +// *ОперацийСканирования - Число - количество операций сканирования (scan) +// *ОперацийПоиска - Число - количество операций поиска (seek) +// *ОперацийЗаписи - Число - количество операций записи (write) +// +Функция ПоказателиИспользованияТаблицБазы(ФильтрТаблицПоИмени = "") Экспорт + + Лог.Отладка("Начало получения информации о показателях использования таблиц для базы ""%1\%2""", ТекущийСервер, База); - ОтборПоИд = ""; - Если ЗначениеЗаполнено(Ид) Тогда - ОтборПоИд = СтрШаблон("AND [FileName] = '%1'", Ид); - КонецЕсли; - - ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; - | SELECT - | COUNT([FileName]) - | FROM %1.[dbo].[Config] - | WHERE CHARINDEX('.', [FileName]) = 0 %2 - | SET NOCOUNT OFF;"" ", - База, - ОтборПоИд); - - РезультатЗапроса = ""; - Попытка - КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - Если КодВозврата = 0 Тогда - Лог.Отладка("Получено количество записей в таблице ""Config"" базы ""%1\%2"": %3", - ТекущийСервер, - РезультатЗапроса, - База); - Иначе - ТекстОшибки = СтрШаблон("Ошибка получения количества записей в таблице ""Config"" базы ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + ПоказателиТаблиц = ПодключениеКСУБД.ПоказателиИспользованияТаблицБазы(База, ФильтрТаблицПоИмени); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстОшибки = СтрШаблон("Ошибка получения количества записей в таблице ""Config"" базы ""%1\%2"":%3%4", + ТекстОшибки = СтрШаблон("Ошибка получения информации о показателях использования таблиц + | для базы ""%1\%2"":%3%4", ТекущийСервер, База, Символы.ПС, @@ -478,9 +292,32 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Возврат Число(РезультатЗапроса); + Лог.Отладка("Получена информация о показателях использования таблиц для базы ""%1\%2""", ТекущийСервер, База); + + Для Каждого ТекТаблица Из ПоказателиТаблиц Цикл + + Для Каждого ТекПоказатель Из ТекТаблица Цикл + + Если ВРег(ТекПоказатель.Ключ) = "ТАБЛИЦА" Тогда + Продолжить; + КонецЕсли; + + Если ЭтоЧисло(ТекПоказатель.Значение) Тогда + ТекТаблица[ТекПоказатель.Ключ] = Число(ТекПоказатель.Значение); + Иначе + ТекТаблица[ТекПоказатель.Ключ] = Неопределено; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + + Возврат ПоказателиТаблиц; -КонецФункции // КоличествоЗаписейВТаблицеКонфигурации() +КонецФункции // ПоказателиИспользованияТаблицБазы() + +#КонецОбласти // ПрограммныйИнтерфейс + +#Область СлужебныеПроцедурыИФункции // Функция - читает соответствия UUID объектов метаданных конфигурации 1С именам объектов базы // из таблицы Params из записи где "[FileName] = 'DBNames'" @@ -491,38 +328,15 @@ // Возвращаемое значение: // Соответствие - соответствия UUID объектов метаданных конфигурации 1С именам объектов СУБД // -Функция СоответствиеИдМетаданныхИменамТаблиц(ДобавлятьКолонки = Ложь) +Функция ИменаТаблицОбъектовКонфигурации1С(ДобавлятьКолонки = Ложь) - Лог.Отладка("Получение соответствия UUID объектов метаданных конфигурации 1С именам объектов базы ""%1\%2""", + Лог.Отладка("Начало получения соответствия UUID объектов метаданных конфигурации 1С + | именам объектов базы ""%1\%2""", ТекущийСервер, База); - ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; - | SELECT - | [BinaryData] - | FROM %1.[dbo].[Params] - | WHERE [FileName] = 'DBNames' - | FOR XML RAW, BINARY BASE64 - | SET NOCOUNT OFF;"" ", - База); - - РезультатЗапроса = ""; - Попытка - КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - Если КодВозврата = 0 Тогда - Лог.Отладка("Получено соответствия UUID объектов метаданных конфигурации 1С именам объектов базы ""%1\%2""", - ТекущийСервер, - База); - Иначе - ТекстОшибки = СтрШаблон("Ошибка получения соответствия UUID объектов метаданных конфигурации 1С - | именам объектов базы ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Данные = ПодключениеКСУБД.ИменаТаблицОбъектовКонфигурации1С(База); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка получения соответствия UUID объектов метаданных конфигурации 1С @@ -534,33 +348,11 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - НормализоватьXML(РезультатЗапроса); - - ЗначенияАтрибутов = Новый Соответствие(); - - Парсер = Новый ЧтениеXML; - Парсер.УстановитьСтроку(РезультатЗапроса); - - Пока Парсер.Прочитать() Цикл - Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И ВРег(Парсер.Имя) = "ROW" Тогда - ЗначенияАтрибутов = ЗначенияАтрибутов(Парсер); - Прервать; - КонецЕсли; - КонецЦикла; - - Парсер.Закрыть(); - - Данные = ЗначенияАтрибутов["BINARYDATA"]; - - Если НЕ ЗначениеЗаполнено(Данные) Тогда - Данные = ""; - КонецЕсли; - Данные = ПрочитатьУпакованныеДанные(Данные); Чтение = Новый ЧтениеТекста(Данные.ОткрытьПотокДляЧтения(), КодировкаТекста.UTF8, Символы.ПС, Символы.ПС + Символы.ВК); - СоответствиеИменБД = Новый Соответствие(); + ИменаТаблицОбъектовКонфигурации1С = Новый Соответствие(); КоличествоПолей = 3; @@ -595,65 +387,15 @@ Продолжить; КонецЕсли; - СоответствиеИменБД.Вставить(СтрШаблон("%1%2", СтрокаСоответствия.Префикс, ИндексСтрокой), СтрокаСоответствия); + ИмяТаблицы = СтрШаблон("%1%2", СтрокаСоответствия.Префикс, ИндексСтрокой); + ИменаТаблицОбъектовКонфигурации1С.Вставить(ИмяТаблицы, СтрокаСоответствия); ТекСтрока = Чтение.ПрочитатьСтроку(); КонецЦикла; - Возврат СоответствиеИменБД; - -КонецФункции // СоответствиеИдМетаданныхИменамТаблиц() - -// Процедура - читает атрибуты узлов ROW из переданной XML-строки -// и добавляет соответствия UUID метаданных и имен метаданных -// -// Параметры: -// СоответствиеИменМетаданных - Соответствие - соответствия UUID метаданных и имен метаданных -// ТекстXML - Строка - XML-строка для чтения -// -Процедура ДополнитьСоответствиеИменМетаданных(СоответствиеИменМетаданных, ТекстXML) - - Если НЕ ТипЗнч(СоответствиеИменМетаданных) = Тип("Соответствие") Тогда - СоответствиеИменМетаданных = Новый Соответствие(); - КонецЕсли; - - ДлинаИд = 36; - - Парсер = Новый ЧтениеXML; - Парсер.УстановитьСтроку(ТекстXML); - - Пока Парсер.Прочитать() Цикл - - ЗначенияАтрибутов = Новый Соответствие(); - - Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И ВРег(Парсер.Имя) = "ROW" Тогда - ЗначенияАтрибутов = ЗначенияАтрибутов(Парсер); - Иначе - Продолжить; - КонецЕсли; - - Ид = ЗначенияАтрибутов["FILENAME"]; - Данные = ЗначенияАтрибутов["BINARYDATA"]; - - Если ЗначенияАтрибутов.Количество() = 0 ИЛИ Ид = Неопределено - ИЛИ Данные = Неопределено ИЛИ СтрДлина(Ид) <> ДлинаИд Тогда - Продолжить; - КонецЕсли; + Возврат ИменаТаблицОбъектовКонфигурации1С; - Данные = ПрочитатьУпакованныеДанные(Данные, Истина); - - ОписаниеФайла = Новый Структура(); - ОписаниеФайла.Вставить("Ид" , Ид); - ОписаниеФайла.Вставить("Содержимое" , Данные); - ОписаниеФайла.Вставить("ИмяМетаданных", ИмяМетаданных(Данные, ОписаниеФайла.Ид)); - - СоответствиеИменМетаданных.Вставить(ОписаниеФайла.Ид, ОписаниеФайла); - - КонецЦикла; - - Парсер.Закрыть(); - -КонецПроцедуры // ДополнитьСоответствиеИменМетаданных() +КонецФункции // ИменаТаблицОбъектовКонфигурации1С() // Функция - читает таблицу Config базы 1С и возвращает соответствия UUID метаданных и имен метаданных // @@ -673,47 +415,13 @@ СоответствиеИменМетаданных = Новый Соответствие(); - ВсегоЗаписей = КоличествоЗаписейВТаблицеКонфигурации(Ид); + ВсегоЗаписей = ПодключениеКСУБД.КоличествоОбъектовКонфигурацииБазы1С(База, Ид); Прочитано = 0; - ОтборПоИд = ""; - Если ЗначениеЗаполнено(Ид) Тогда - ОтборПоИд = СтрШаблон("AND [FileName] = '%1'", Ид); - КонецЕсли; - Пока Прочитано < ВсегоЗаписей Цикл - ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; - | SELECT - | [FileName], - | [BinaryData] - | FROM %1.[dbo].[Config] - | WHERE CHARINDEX('.', [FileName]) = 0 %2 - | ORDER BY [FileName] OFFSET %3 ROWS FETCH NEXT %4 ROWS ONLY - | FOR XML RAW, BINARY BASE64 - | SET NOCOUNT OFF;"" ", - База, - ОтборПоИд, - Прочитано, - ПорцияЧтения); - - РезультатЗапроса = ""; - Попытка - КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - Если КодВозврата = 0 Тогда - Лог.Отладка("Получено соответствие имен метаданных базы ""%1\%2"": %3", - ТекущийСервер, - РезультатЗапроса, - База); - Иначе - ТекстОшибки = СтрШаблон("Ошибка получения соответствия имен метаданных базы ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + ОбъектыКонфигурации = ПодключениеКСУБД.ОбъектыКонфигурацииБазы1С(База, Ид, Прочитано, ПорцияЧтения); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка получения соответствия имен метаданных базы ""%1\%2"":%3%4", @@ -724,10 +432,13 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - НормализоватьXML(РезультатЗапроса); - - ДополнитьСоответствиеИменМетаданных(СоответствиеИменМетаданных, РезультатЗапроса); - + Для Каждого ТекЭлемент Из ОбъектыКонфигурации Цикл + Данные = ПрочитатьУпакованныеДанные(ТекЭлемент.Значение.Данные, Истина); + ТекЭлемент.Значение.Вставить("Данные", Данные); + ТекЭлемент.Значение.Вставить("ИмяМетаданных", ИмяМетаданных(Данные, ТекЭлемент.Значение.Ид)); + СоответствиеИменМетаданных.Вставить(ТекЭлемент.Ключ, ТекЭлемент.Значение); + КонецЦикла; + Прочитано = Прочитано + ПорцияЧтения; КонецЦикла; @@ -766,45 +477,16 @@ // // Параметры: // ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" -// +// // Возвращаемое значение: // Соответствие - список таблиц базы // -Функция ТаблицыБазыДанных(ФильтрТаблицПоИмени = "") +Функция ТаблицыБазы(ФильтрТаблицПоИмени = "") Лог.Отладка("Получение списка таблиц базы ""%1\%2"": %3", ТекущийСервер, База); - ШаблонЗапроса = """SET NOCOUNT ON; - | SELECT - | T.Name AS [Table] - | FROM [%1].sys.tables T - | %2 - | SET NOCOUNT OFF;"" "; - - Условие = ""; - Если ЗначениеЗаполнено(ФильтрТаблицПоИмени) Тогда - Условие = СтрШаблон("WHERE T.Name LIKE '%1'", ФильтрТаблицПоИмени); - КонецЕсли; - - ТекстЗапроса = СтрШаблон(ШаблонЗапроса, База, Условие); - - РезультатЗапроса = ""; - Попытка - КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); - Если КодВозврата = 0 Тогда - Лог.Отладка("Получен список таблиц базы ""%1\%2"": %3", - ТекущийСервер, - РезультатЗапроса, - База); - Иначе - ТекстОшибки = СтрШаблон("Ошибка получения списка таблиц базы ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Таблицы = ПодключениеКСУБД.ТаблицыБазы(База, ФильтрТаблицПоИмени); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка получения списка таблиц базы ""%1\%2"":%3%4", @@ -815,31 +497,18 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Разделитель = "---"; - Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - Если Поз > 0 Тогда - РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); - КонецЕсли; + Лог.Отладка("Получен список таблиц базы ""%1\%2""", ТекущийСервер, База); Результат = Новый Соответствие(); - Текст = Новый ТекстовыйДокумент(); - Текст.УстановитьТекст(РезультатЗапроса); - - Для й = 1 По Текст.КоличествоСтрок() Цикл - ИмяТаблицы = СокрЛП(Текст.ПолучитьСтроку(й)); - Если НЕ ЗначениеЗаполнено(ИмяТаблицы) Тогда - Продолжить; - КонецЕсли; - - УбратьЛидирующееПодчеркивание(ИмяТаблицы); - - Результат.Вставить(ИмяТаблицы, ИмяТаблицы); + Для Каждого ТекТаблица Из Таблицы Цикл + УбратьЛидирующееПодчеркивание(ТекТаблица); + Результат.Вставить(ТекТаблица, ТекТаблица); КонецЦикла; Возврат Результат; -КонецФункции // ТаблицыБазыДанных() +КонецФункции // ТаблицыБазы() // Функция - список таблиц, хранящих данные табличных частей объектов 1С // с указанием таблиц объектов-владельцев @@ -857,11 +526,11 @@ Продолжить; КонецЕсли; - ТаблицыБазы = ТаблицыБазыДанных(СтрШаблон("%%_%1%%", ТекНазначение.Значение.ПрефиксВБазе)); + ТаблицыБазы = ТаблицыБазы(СтрШаблон("%%_%1%%", ТекНазначение.Значение.ПрефиксВБазе)); Для Каждого ТекТаблица Из ТаблицыБазы Цикл ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(ТекТаблица.Значение); - + ИмяОбъектаБазы = СтрШаблон("%1%2", ОписаниеОбъектаБазы.Префикс, ОписаниеОбъектаБазы.Индекс); ТабличныеЧастиИВладельцы.Вставить(ИмяОбъектаБазы, ОписаниеОбъектаБазы); КонецЦикла; @@ -1017,52 +686,12 @@ // Возвращаемое значение: // Соответствие - список колонок базы // -Функция КолонкиБазыДанных(ФильтрТаблицПоИмени = "", ФильтрКолонокПоИмени = "") - - Лог.Отладка("Получение списка колонок базы ""%1\%2""", ТекущийСервер, База); - - ШаблонЗапроса = """SET NOCOUNT ON; - | SELECT - | T.Name AS [Table], - | C.name AS Field - | - | FROM %1.sys.tables T - | LEFT JOIN %1.sys.columns C - | ON T.object_id = C.object_id - | %2 - | SET NOCOUNT OFF;"" "; - - Условие = ""; - Если ЗначениеЗаполнено(ФильтрТаблицПоИмени) Тогда - Условие = СтрШаблон("WHERE T.Name LIKE '%1'", ФильтрТаблицПоИмени); - КонецЕсли; - - Если ЗначениеЗаполнено(ФильтрКолонокПоИмени) Тогда - Если ЗначениеЗаполнено(Условие) Тогда - Условие = СтрШаблон("%1 AND C.Name LIKE '%2'", Условие, ФильтрКолонокПоИмени); - Иначе - Условие = СтрШаблон("WHERE C.Name LIKE '%1'", ФильтрКолонокПоИмени); - КонецЕсли; - КонецЕсли; - - ТекстЗапроса = СтрШаблон(ШаблонЗапроса, База, Условие); +Функция КолонкиБазы(ФильтрТаблицПоИмени = "", ФильтрКолонокПоИмени = "") - РезультатЗапроса = ""; + Лог.Отладка("Получение списка колонок базы ""%1\%2"": %3", ТекущийСервер, База); Попытка - КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина); - Если КодВозврата = 0 Тогда - Лог.Отладка("Получен список колонок базы ""%1\%2""", - ТекущийСервер, - База); - Иначе - ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - РезультатЗапроса); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + Колонки = ПодключениеКСУБД.КолонкиБазы(База, ФильтрТаблицПоИмени, ФильтрКолонокПоИмени); Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4", @@ -1073,29 +702,22 @@ ВызватьИсключение ТекстОшибки; КонецПопытки; - Разделитель = "---"; - Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd); - Если Поз > 0 Тогда - РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))); - КонецЕсли; + Лог.Отладка("Получен список колонок базы ""%1\%2""", ТекущийСервер, База); КэшВладельцев = Новый Соответствие(); Результат = Новый Соответствие(); - Текст = Новый ТекстовыйДокумент(); - Текст.УстановитьТекст(РезультатЗапроса); - - Для й = 1 По Текст.КоличествоСтрок() Цикл - Значения = СтрРазделить(Текст.ПолучитьСтроку(й), "|", Ложь); + Для Каждого ТекКолонка Из Колонки Цикл - Если КэшВладельцев[Значения[0]] = Неопределено Тогда - ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(Значения[0]); - КэшВладельцев.Вставить(Значения[0], ОписаниеОбъектаВладельца); + Если КэшВладельцев[ТекКолонка.Таблица] = Неопределено Тогда + ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(ТекКолонка.Таблица); + КэшВладельцев.Вставить(ТекКолонка.Таблица, ОписаниеОбъектаВладельца); КонецЕсли; - ОписаниеОбъектаКолонки = ОписаниеОбъектаБазыПоИмени(Значения[1]); - ОписаниеОбъектаКолонки.Владелец = КэшВладельцев[Значения[0]]; + ОписаниеОбъектаКолонки = ОписаниеОбъектаБазыПоИмени(ТекКолонка.Колонка); + ОписаниеОбъектаКолонки.Владелец = КэшВладельцев[ТекКолонка.Таблица]; + // Проверка, что поле является ссылкой из табличной части Если ЗначениеЗаполнено(ОписаниеОбъектаКолонки.Владелец.Владелец) И ОписаниеОбъектаКолонки.Имя = ОписаниеОбъектаКолонки.Владелец.Владелец.Имя Тогда @@ -1105,11 +727,12 @@ КонецЕсли; Результат.Вставить(ОписаниеОбъектаКолонки.Имя, ОписаниеОбъектаКолонки); + КонецЦикла; Возврат Результат; -КонецФункции // КолонкиБазыДанных() +КонецФункции // КолонкиБазы() // Функция - находит в тестовом описании объекта метаданных его имя // @@ -1159,9 +782,10 @@ ИначеЕсли ТипЗнч(УпакованныеДанные) = Тип("Строка") Тогда Данные = Base64Значение(УпакованныеДанные); Иначе + НекорректныйТип = ТипЗнч(УпакованныеДанные); ВызватьИсключение СтрШаблон("Некорректный тип параметра ""УпакованныеДанные"" ""%1"", | ожидается ""ДвоичныеДанные"" или ""Строка""", - ТипЗнч(УпакованныеДанные)); + НекорректныйТип); КонецЕсли; Если ДанныеУпакованы(Данные) Тогда @@ -1180,48 +804,6 @@ КонецФункции // ПрочитатьУпакованныеДанные() -// Функция - читает атрибуты узла XML -// -// Параметры: -// Парсер - ЧтениеXML - парсер, спозиционированный на начало элемента XML -// -// Возвращаемое значение: -// Соответствие - прочитанные значения атрибутов узла XML -// -Функция ЗначенияАтрибутов(Парсер) - - Результат = Новый Соответствие(); - - КоличествоАтрибутов = Парсер.КоличествоАтрибутов(); - - Для й = 0 По КоличествоАтрибутов -1 Цикл - Результат.Вставить(ВРег(Парсер.ИмяАтрибута(й)), Парсер.ЗначениеАтрибута(й)) - КонецЦикла; - - Возврат Результат; - -КонецФункции // ЗначенияАтрибутов() - -// Процедура - добавляет стандартный заголовок XML и корневой элемент -// -// Параметры: -// ТекстXML - Строка - дополняемый техт XML -// -Процедура НормализоватьXML(ТекстXML) - - ТекстXML = СтрЗаменить(ТекстXML, Символы.ПС, ""); - ТекстXML = СтрЗаменить(ТекстXML, Символы.ВК, ""); - - Текст = Новый ТекстовыйДокумент(); - Текст.УстановитьТекст(ТекстXML); - Текст.ВставитьСтроку(1, ""); - Текст.ВставитьСтроку(1, ""); - Текст.ДобавитьСтроку(""); - - ТекстXML = Текст.ПолучитьТекст(); - -КонецПроцедуры // НормализоватьXML() - // Функция - проверяет, что данные упакованы по алгоритму deflate // если в начале данных расположен BOM (0xEF (239), 0xBB (187), 0xBF (191)) - данные не упакованы // @@ -1243,9 +825,10 @@ ИЛИ ТипЗнч(Данные) = Тип("ПотокВПамяти") Тогда Данные.СкопироватьВ(Поток); Иначе - ВызватьИсключение СтрШаблон("Некоректный тип ""%1"" параметра ""Данные"", + НекорректныйТип = ТипЗнч(Данные); + ВызватьИсключение СтрШаблон("Некорректный тип ""%1"" параметра ""Данные"", | ожидается ""Base64Строка, Поток, ДвоичныеДанные""", - ТипЗнч(Данные)); + НекорректныйТип); КонецЕсли; ДлинаБОМ = 3; diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index 36d45db..5286374 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -233,11 +233,9 @@ ИмяОбъектаБДСправочника = "Reference34"; ИмяОбъектаБДТабличнойЧасти = "Reference34_VT36"; ИмяОбъектаБДТабличнойЧастиСокр = "VT36"; - ИмяОбъектаБДПоля = "Fld35"; ИмяСправочника = "Справочник1"; ИмяТабличнойЧасти = "ТабличнаяЧасть1"; - ИмяРеквизита = "Реквизит1"; СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); @@ -316,7 +314,7 @@ КонецПроцедуры // ТестДолжен_ПолучитьЗанимаемоеБазойМесто() &Тест -Процедура ТестДолжен_ПолучитьРазмерыИПараметрыИспользованияТаблицБазы() Экспорт +Процедура ТестДолжен_ПолучитьПоказателиИспользованияТаблицБазы() Экспорт ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); @@ -326,7 +324,7 @@ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); - ТаблицыБазы = СтруктураХраненияИБ.РазмерыИПараметрыИспользованияТаблицБазы(); + ТаблицыБазы = СтруктураХраненияИБ.ПоказателиИспользованияТаблицБазы(); ТестоваяТаблица = "Config"; @@ -353,7 +351,7 @@ Утверждения.ПроверитьБольше(ТекТаблица.ВсегоЗанято, 0, ТекстОшибки); -КонецПроцедуры // ТестДолжен_ПолучитьРазмерыИПараметрыИспользованияТаблицБазы() +КонецПроцедуры // ТестДолжен_ПолучитьПоказателиИспользованияТаблицБазы() &Тест Процедура ТестДолжен_УдалитьТестовуюБазу() Экспорт From c99e2a5400c2ca28d4331e667478cf3a48c4ea0f Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sat, 28 May 2022 11:28:11 +0300 Subject: [PATCH 23/38] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20Con?= =?UTF-8?q?fig.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\321\202\320\276\320\262\320\221\320\2241\320\241.json" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" "b/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" index 5a2ced8..444137c 100644 --- "a/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" +++ "b/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" @@ -405,6 +405,12 @@ "Тип": "НомерСтроки", "ТипАнгл": "LineNumber", "Назначение": "Поле" + }, + "CONFIG": { + "ПрефиксВБазе": "Config", + "Тип": "Конфигурация", + "ТипАнгл": "Configuration", + "Назначение": "Конфигурация" } } From a987ed962133c7b16bab45eabb2154b7c1780d67 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sat, 28 May 2022 12:15:49 +0300 Subject: [PATCH 24/38] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B2=20=D0=BE=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B1=D0=B0=D0=B7=D1=8B;=20=D0=A0=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20=D0=B1=D0=B5=D0=B7=D0=BE?= =?UTF-8?q?=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B0;=20=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20=D1=87?= =?UTF-8?q?=D1=82=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B4=D0=BD=D0=BE=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BD=D1=8B=D1=85=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=20=D0=BE=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D1=8F=D0=B5=D1=82=20=D1=82=D0=B8=D0=BF=20?= =?UTF-8?q?=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE=D0=B2.=20fix:=20?= =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9=20=D0=9D=D0=BE=D0=BC=D0=B5=D1=80=D0=A1=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B8=20=D0=A1=D1=81=D1=8B=D0=BB?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=87=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D1=87=D0=B0=D1=81=D1=82=D0=B5=D0=B9.=20style:=20?= =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B0=20=D0=B8?= =?UTF-8?q?=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\275\320\270\321\217\320\230\320\221.os" | 287 +++++++++++------- 1 file changed, 184 insertions(+), 103 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index 5989fd5..05991aa 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -68,12 +68,7 @@ ДобавлятьКолонки = Ложь; - НазначениеОбъекта = ""; - Если НазначенияОбъектовБазы.Свойство(ОписаниеОбъектаБазы.Префикс) Тогда - НазначениеОбъекта = НазначенияОбъектовБазы[ОписаниеОбъектаБазы.Префикс].Назначение; - КонецЕсли; - - Если НазначениеОбъекта = "Поле" Тогда + Если НазначениеОбъектаБазы(ОписаниеОбъектаБазы.Префикс).Назначение = "Поле" Тогда КолонкиБазы = КолонкиБазы(, СтрШаблон("%%%1%%", ИмяОбъекта)); Если КолонкиБазы.Количество() > 0 Тогда ОписаниеОбъектаБазы = КолонкиБазы[ИмяОбъекта]; @@ -98,11 +93,13 @@ ТекОписание = ОписаниеОбъектаБазы; Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл - ИмяМетаданных = ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание.Ид); + ИмяМетаданных = ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание); ТекОписание.Вставить("ИмяМетаданных", ИмяМетаданных); ТекОписание = ТекОписание.Владелец; КонецЦикла; + ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы(ОписаниеОбъектаБазы); + Возврат ОписаниеОбъектаБазы; КонецФункции // ОписаниеМетаданныхОбъектаБД1С() @@ -138,12 +135,7 @@ Продолжить; КонецЕсли; - НазначениеОбъекта = ""; - Если НазначенияОбъектовБазы.Свойство(ТекЭлемент.Значение.Префикс) Тогда - НазначениеОбъекта = НазначенияОбъектовБазы[ТекЭлемент.Значение.Префикс].Назначение; - КонецЕсли; - - Если НазначениеОбъекта = "Поле" Тогда + Если НазначениеОбъектаБазы(ТекЭлемент.Значение.Префикс).Назначение = "Поле" Тогда ОписаниеОбъектаБазы = КолонкиБазы[Имя]; Если ОписаниеОбъектаБазы = Неопределено Тогда Продолжить; @@ -160,8 +152,7 @@ Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); - Если НазначенияОбъектовБазы.Свойство(ОписаниеВладельца.Префикс) - И НазначенияОбъектовБазы[ОписаниеВладельца.Префикс].Подчиненный Тогда + Если НазначениеОбъектаБазы(ОписаниеВладельца.Префикс).Подчиненный Тогда ОписанияМетаданных.Вставить(СтрШаблон("%1_%2", ОписаниеВладельца.Владелец.Имя, ОписаниеВладельца.Имя), ОписаниеВладельца); КонецЕсли; @@ -181,10 +172,11 @@ ТекОписание = ОписаниеОбъектаБазы; Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл ТекОписание.ИмяМетаданных = - ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание.Ид); + ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание); ТекОписание = ТекОписание.Владелец; КонецЦикла; + ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы(ОписаниеОбъектаБазы); КонецЦикла; Возврат ОписанияМетаданных; @@ -377,12 +369,7 @@ СтрокаСоответствия.Вставить("Префикс", ПривестиСтроку(ЧастиСтроки[1])); СтрокаСоответствия.Вставить("Индекс" , ПривестиСтроку(ИндексСтрокой)); - НазначениеОбъекта = ""; - Если НазначенияОбъектовБазы.Свойство(СтрокаСоответствия.Префикс) Тогда - НазначениеОбъекта = НазначенияОбъектовБазы[СтрокаСоответствия.Префикс].Назначение; - КонецЕсли; - - Если НЕ ДобавлятьКолонки И НазначениеОбъекта = "Поле" Тогда + Если НЕ ДобавлятьКолонки И НазначениеОбъектаБазы(СтрокаСоответствия.Префикс).Назначение = "Поле" Тогда ТекСтрока = Чтение.ПрочитатьСтроку(); Продолжить; КонецЕсли; @@ -473,6 +460,31 @@ КонецФункции // НазначенияОбъектовБазы() +// Функция - возвращает описание назначения объекта базы +// +// Возвращаемое значение: +// Структура - назначения объектов базы +// +Функция НазначениеОбъектаБазы(ПрефиксОбъекта) + + Если НЕ ТипЗнч(НазначенияОбъектовБазы) = Тип("Структура") Тогда + НазначенияОбъектовБазы = НазначенияОбъектовБазы(); + КонецЕсли; + + ОписаниеНазначения = Новый Структура(); + + Для Каждого ТекЭлемент Из НазначенияОбъектовБазы.Config Цикл + ОписаниеНазначения.Вставить(ТекЭлемент.Ключ, ""); + КонецЦикла; + + Если НазначенияОбъектовБазы.Свойство(ПрефиксОбъекта) Тогда + ЗаполнитьЗначенияСвойств(ОписаниеНазначения, НазначенияОбъектовБазы[ПрефиксОбъекта]); + КонецЕсли; + + Возврат ОписаниеНазначения; + +КонецФункции // НазначениеОбъектаБазы() + // Функция - возвращает список таблиц базы, соответствующих фильтру // // Параметры: @@ -541,6 +553,63 @@ КонецФункции // ТабличныеЧастиИВладельцы() +// Функция - возвращает список колонок базы, соответствующих фильтру +// +// Параметры: +// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" +// ФильтрКолонокПоИмени - Строка - фильтр имен колонок в формате для оператора "LIKE" +// +// Возвращаемое значение: +// Соответствие - список колонок базы +// +Функция КолонкиБазы(ФильтрТаблицПоИмени = "", ФильтрКолонокПоИмени = "") + + Лог.Отладка("Получение списка колонок базы ""%1\%2"": %3", ТекущийСервер, База); + + Попытка + Колонки = ПодключениеКСУБД.КолонкиБазы(База, ФильтрТаблицПоИмени, ФильтрКолонокПоИмени); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Лог.Отладка("Получен список колонок базы ""%1\%2""", ТекущийСервер, База); + + КэшВладельцев = Новый Соответствие(); + + Результат = Новый Соответствие(); + + Для Каждого ТекКолонка Из Колонки Цикл + + Если КэшВладельцев[ТекКолонка.Таблица] = Неопределено Тогда + ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(ТекКолонка.Таблица); + КэшВладельцев.Вставить(ТекКолонка.Таблица, ОписаниеОбъектаВладельца); + КонецЕсли; + + ОписаниеОбъектаКолонки = ОписаниеОбъектаБазыПоИмени(ТекКолонка.Колонка); + ОписаниеОбъектаКолонки.Владелец = КэшВладельцев[ТекКолонка.Таблица]; + + // Проверка, что поле является ссылкой из табличной части + Если ЗначениеЗаполнено(ОписаниеОбъектаКолонки.Владелец.Владелец) + И ОписаниеОбъектаКолонки.Имя = ОписаниеОбъектаКолонки.Владелец.Владелец.Имя Тогда + ОписаниеОбъектаКолонки.Тип = "Ссылка"; + ОписаниеОбъектаКолонки.ТипАнгл = "Ref"; + ОписаниеОбъектаКолонки.Назначение = "Поле"; + КонецЕсли; + + Результат.Вставить(ОписаниеОбъектаКолонки.Имя, ОписаниеОбъектаКолонки); + + КонецЦикла; + + Возврат Результат; + +КонецФункции // КолонкиБазы() + // Функция - возвращает структуру описания объекта базы данных 1С // // Возвращаемое значение: @@ -576,41 +645,13 @@ КонецФункции // СтруктураОписанияОбъектаБазы() -Функция ПрочитатьСимволы(Знач ИсходнаяСтрока, ЧитатьЧисла = Ложь) - - НачалоСледующегоСимвола = 2; - - ПрочитанныеСимволы = ""; - - Символ = Сред(ИсходнаяСтрока, 1, 1); - - Пока НЕ (ЭтоЧисло(Символ) ИЛИ ЧитатьЧисла) - ИЛИ (ЭтоЧисло(Символ) И ЧитатьЧисла) Цикл - - ПрочитанныеСимволы = ПрочитанныеСимволы + Символ; - - Если СтрДлина(ИсходнаяСтрока) = 1 Тогда - ИсходнаяСтрока = ""; - Символ = ""; - Прервать; - КонецЕсли; - - ИсходнаяСтрока = Сред(ИсходнаяСтрока, НачалоСледующегоСимвола); - Символ = Сред(ИсходнаяСтрока, 1, 1); - - КонецЦикла; - - Возврат ПрочитанныеСимволы; - -КонецФункции // ПрочитатьСимволы() - // Функция - раскладывает имя объекта базы на префикс, индекс, владельца и суффикс // // Параметры: // ИмяОбъектаБазы - Строка - имя объекта базы // // Возвращаемое значение: -// Структура - имя объекта базы, префикс, индекс, владелец и суффикс +// Структура - имя объекта базы, префикс, индекс, владелец и суффикс (см. СтруктураОписанияОбъектаБазы()) // Функция ОписаниеОбъектаБазыПоИмени(Знач ИмяОбъектаБазы) @@ -618,7 +659,7 @@ УбратьЛидирующееПодчеркивание(ИмяОбъектаБазы); - ПрефиксОбъекта = ПрочитатьСимволы(ИмяОбъектаБазы); + ПрефиксОбъекта = ПрочитатьОднотипныеСимволы(ИмяОбъектаБазы); ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, СтрДлина(ПрефиксОбъекта) + 1); Символ = Сред(ИмяОбъектаБазы, 1, 1); @@ -642,10 +683,7 @@ Символ = Сред(ИмяОбъектаБазы, 1, 1); КонецЕсли; - Если НазначенияОбъектовБазы.Свойство(ПрефиксОбъекта) Тогда - НазначениеОбъекта = НазначенияОбъектовБазы[ПрефиксОбъекта]; - ЗаполнитьЗначенияСвойств(ОписаниеОбъектаБазы, НазначениеОбъекта); - КонецЕсли; + ЗаполнитьЗначенияСвойств(ОписаниеОбъектаБазы, НазначениеОбъектаБазы(ПрефиксОбъекта)); // состав и имена таблицы итогов по счету зависит от количества субконто, // поэтому добавляем еще 1 цифру @@ -657,7 +695,7 @@ ОписаниеОбъектаБазы.Префикс = ПрефиксОбъекта; - ИндексОбъекта = ПрочитатьСимволы(ИмяОбъектаБазы, Истина); + ИндексОбъекта = ПрочитатьОднотипныеСимволы(ИмяОбъектаБазы); ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, СтрДлина(ИндексОбъекта) + 1); Символ = Сред(ИмяОбъектаБазы, 1, 1); @@ -677,88 +715,88 @@ КонецФункции // ОписаниеОбъектаБазыПоИмени() -// Функция - возвращает список колонок базы, соответствующих фильтру +// Функция - собирает полное имя объекта метаданных по описанию с учетом всех владельцев +// например (Справочник.Справочник1.Реквизит1, Документ.ТабличнаяЧасть2.Реквизит8) // // Параметры: -// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE" -// ФильтрКолонокПоИмени - Строка - фильтр имен колонок в формате для оператора "LIKE" +// ОписаниеОбъектаБазы - Структура - описание объекта метаданных (см. ОписаниеОбъектаБазыПоИмени()) // // Возвращаемое значение: -// Соответствие - список колонок базы +// Строка - полное имя объекта метаданных // -Функция КолонкиБазы(ФильтрТаблицПоИмени = "", ФильтрКолонокПоИмени = "") - - Лог.Отладка("Получение списка колонок базы ""%1\%2"": %3", ТекущийСервер, База); - - Попытка - Колонки = ПодключениеКСУБД.КолонкиБазы(База, ФильтрТаблицПоИмени, ФильтрКолонокПоИмени); - Исключение - ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4", - ТекущийСервер, - База, - Символы.ПС, - ТекстОшибки); - ВызватьИсключение ТекстОшибки; - КонецПопытки; +Функция ПолноеИмяОбъектаМетаданных(Знач ОписаниеОбъектаБазы) - Лог.Отладка("Получен список колонок базы ""%1\%2""", ТекущийСервер, База); + Если НЕ ЗначениеЗаполнено(ОписаниеОбъектаБазы.ИмяМетаданных) Тогда + Возврат ""; + КонецЕсли; - КэшВладельцев = Новый Соответствие(); + ТекОписание = ОписаниеОбъектаБазы; - Результат = Новый Соответствие(); + ПолноеИмя = ТекОписание.ИмяМетаданных; - Для Каждого ТекКолонка Из Колонки Цикл + Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл + ПолноеИмя = СтрШаблон("%1.%2", ТекОписание.Владелец.ИмяМетаданных, ПолноеИмя); + ТекОписание = ТекОписание.Владелец; + КонецЦикла; - Если КэшВладельцев[ТекКолонка.Таблица] = Неопределено Тогда - ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(ТекКолонка.Таблица); - КэшВладельцев.Вставить(ТекКолонка.Таблица, ОписаниеОбъектаВладельца); - КонецЕсли; + Возврат СтрШаблон("%1.%2", ТекОписание.Тип, ПолноеИмя); - ОписаниеОбъектаКолонки = ОписаниеОбъектаБазыПоИмени(ТекКолонка.Колонка); - ОписаниеОбъектаКолонки.Владелец = КэшВладельцев[ТекКолонка.Таблица]; +КонецФункции // ПолноеИмяОбъектаМетаданных() - // Проверка, что поле является ссылкой из табличной части - Если ЗначениеЗаполнено(ОписаниеОбъектаКолонки.Владелец.Владелец) - И ОписаниеОбъектаКолонки.Имя = ОписаниеОбъектаКолонки.Владелец.Владелец.Имя Тогда - ОписаниеОбъектаКолонки.Тип = "Ссылка"; - ОписаниеОбъектаКолонки.ТипАнгл = "Ref"; - ОписаниеОбъектаКолонки.Назначение = "Поле"; - КонецЕсли; +// Процедура - заполняет полные имена метаданных в описании объекта базы и его владельцах +// +// Параметры: +// ОписаниеОбъектаБазы - Структура - описание объекта метаданных (см. ОписаниеОбъектаБазыПоИмени()) +// +Процедура ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы(ОписаниеОбъектаБазы) - Результат.Вставить(ОписаниеОбъектаКолонки.Имя, ОписаниеОбъектаКолонки); + ТекОписание = ОписаниеОбъектаБазы; + Пока ЗначениеЗаполнено(ТекОписание) Цикл + ТекОписание.Вставить("ПолноеИмяМетаданных", ПолноеИмяОбъектаМетаданных(ТекОписание)); + ТекОписание = ТекОписание.Владелец; КонецЦикла; - Возврат Результат; - -КонецФункции // КолонкиБазы() +КонецПроцедуры // ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы() // Функция - находит в тестовом описании объекта метаданных его имя +// для отдельных типов объектов возвращает стандартное имя // // Параметры: -// Описание - Строка - описание объекта метаданных (скобкотекст) -// Ид - Строка - UUID объекта метаданных +// ТекстОписания - Строка - описание объекта метаданных (скобкотекст) +// ИдИлиОписаниеОбъектаБазы - Структура, Строка - UUID объекта метаданных // // Возвращаемое значение: // Строка - имя объекта метаданных // -Функция ИмяМетаданных(Описание, Ид) +Функция ИмяМетаданных(ТекстОписания, ИдИлиОписаниеОбъектаБазы) + + Если ТипЗнч(ИдИлиОписаниеОбъектаБазы) = Тип("Структура") Тогда + Если ИдИлиОписаниеОбъектаБазы.Тип = "НомерСтроки" Тогда + Возврат "НомерСтроки"; + ИначеЕсли ИдИлиОписаниеОбъектаБазы.Тип = "Ссылка" Тогда + Возврат "Ссылка"; + Иначе + Ид = ИдИлиОписаниеОбъектаБазы.Ид; + КонецЕсли; + Иначе + Ид = ИдИлиОписаниеОбъектаБазы; + КонецЕсли; СмещениеОтИд = 3; ИмяМетаданных = ""; - Позиция = СтрНайти(Описание, Ид); + Позиция = СтрНайти(ТекстОписания, Ид); Если Позиция = 0 Тогда Возврат ""; КонецЕсли; Позиция = Позиция + СтрДлина(Ид) + СмещениеОтИд; - Символ = Сред(Описание, Позиция, 1); + Символ = Сред(ТекстОписания, Позиция, 1); Пока НЕ Символ = """" Цикл ИмяМетаданных = ИмяМетаданных + Символ; Позиция = Позиция + 1; - Символ = Сред(Описание, Позиция, 1); + Символ = Сред(ТекстОписания, Позиция, 1); КонецЦикла; Возврат ИмяМетаданных; @@ -892,6 +930,49 @@ КонецПроцедуры // УбратьЛидирующееПодчеркивание() +// Функция - возвращает часть строки до первого символа "тип" которого отличается от прочитанных +// т.е. читает все цифры до первого нецифрового символа либо все нецифровые символы до первой цифры +// +// Параметры: +// ИсходнаяСтрока - Строка - исходная строка +// +// Возвращаемое значение: +// Строка - Истина - строка не пустая и содержит только цифры +// +Функция ПрочитатьОднотипныеСимволы(Знач ИсходнаяСтрока) + + Если НЕ ЗначениеЗаполнено(ИсходнаяСтрока) Тогда + Возврат ""; + КонецЕсли; + + НачалоСледующегоСимвола = 2; + + ПрочитанныеСимволы = ""; + + Символ = Сред(ИсходнаяСтрока, 1, 1); + + ЧитатьЦифры = ЭтоЧисло(Символ); + + Пока НЕ (ЭтоЧисло(Символ) ИЛИ ЧитатьЦифры) + ИЛИ (ЭтоЧисло(Символ) И ЧитатьЦифры) Цикл + + ПрочитанныеСимволы = ПрочитанныеСимволы + Символ; + + Если СтрДлина(ИсходнаяСтрока) = 1 Тогда + ИсходнаяСтрока = ""; + Символ = ""; + Прервать; + КонецЕсли; + + ИсходнаяСтрока = Сред(ИсходнаяСтрока, НачалоСледующегоСимвола); + Символ = Сред(ИсходнаяСтрока, 1, 1); + + КонецЦикла; + + Возврат ПрочитанныеСимволы; + +КонецФункции // ПрочитатьОднотипныеСимволы() + // Функция - проверяет, что строка не пустая и содержит только цифры // // Параметры: From 4d789145e7344cb1e3a1ee3effd3c5a4e17f2920 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sat, 28 May 2022 12:48:22 +0300 Subject: [PATCH 25/38] =?UTF-8?q?refactor:=20=D0=A4=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D1=8B=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D1=85=D0=BE=D0=B4=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=83=20=D0=BE=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B0;=20=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=D0=BE=D0=B7=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20=D1=81=D1=81=D1=8B=D0=BB=D0=BE=D0=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\275\320\270\321\217\320\230\320\221.os" | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index 05991aa..e548457 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -68,7 +68,7 @@ ДобавлятьКолонки = Ложь; - Если НазначениеОбъектаБазы(ОписаниеОбъектаБазы.Префикс).Назначение = "Поле" Тогда + Если НазначениеОбъектаБазы(ОписаниеОбъектаБазы).Назначение = "Поле" Тогда КолонкиБазы = КолонкиБазы(, СтрШаблон("%%%1%%", ИмяОбъекта)); Если КолонкиБазы.Количество() > 0 Тогда ОписаниеОбъектаБазы = КолонкиБазы[ИмяОбъекта]; @@ -135,7 +135,7 @@ Продолжить; КонецЕсли; - Если НазначениеОбъектаБазы(ТекЭлемент.Значение.Префикс).Назначение = "Поле" Тогда + Если НазначениеОбъектаБазы(ТекЭлемент.Значение).Назначение = "Поле" Тогда ОписаниеОбъектаБазы = КолонкиБазы[Имя]; Если ОписаниеОбъектаБазы = Неопределено Тогда Продолжить; @@ -152,7 +152,7 @@ Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); - Если НазначениеОбъектаБазы(ОписаниеВладельца.Префикс).Подчиненный Тогда + Если НазначениеОбъектаБазы(ОписаниеВладельца).Подчиненный Тогда ОписанияМетаданных.Вставить(СтрШаблон("%1_%2", ОписаниеВладельца.Владелец.Имя, ОписаниеВладельца.Имя), ОписаниеВладельца); КонецЕсли; @@ -368,14 +368,15 @@ СтрокаСоответствия.Вставить("Ид" , ПривестиСтроку(ЧастиСтроки[0])); СтрокаСоответствия.Вставить("Префикс", ПривестиСтроку(ЧастиСтроки[1])); СтрокаСоответствия.Вставить("Индекс" , ПривестиСтроку(ИндексСтрокой)); + СтрокаСоответствия.Вставить("Суффикс", ""); - Если НЕ ДобавлятьКолонки И НазначениеОбъектаБазы(СтрокаСоответствия.Префикс).Назначение = "Поле" Тогда + Если НЕ ДобавлятьКолонки И НазначениеОбъектаБазы(СтрокаСоответствия).Назначение = "Поле" Тогда ТекСтрока = Чтение.ПрочитатьСтроку(); Продолжить; КонецЕсли; - ИмяТаблицы = СтрШаблон("%1%2", СтрокаСоответствия.Префикс, ИндексСтрокой); - ИменаТаблицОбъектовКонфигурации1С.Вставить(ИмяТаблицы, СтрокаСоответствия); + ИмяОбъекта = СтрШаблон("%1%2", СтрокаСоответствия.Префикс, ИндексСтрокой); + ИменаТаблицОбъектовКонфигурации1С.Вставить(ИмяОбъекта, СтрокаСоответствия); ТекСтрока = Чтение.ПрочитатьСтроку(); КонецЦикла; @@ -462,10 +463,13 @@ // Функция - возвращает описание назначения объекта базы // +// Параметры: +// ОписаниеОбъектаБазы - Структура - описание объекта базы +// // Возвращаемое значение: // Структура - назначения объектов базы // -Функция НазначениеОбъектаБазы(ПрефиксОбъекта) +Функция НазначениеОбъектаБазы(ОписаниеОбъектаБазы) Если НЕ ТипЗнч(НазначенияОбъектовБазы) = Тип("Структура") Тогда НазначенияОбъектовБазы = НазначенияОбъектовБазы(); @@ -477,8 +481,17 @@ ОписаниеНазначения.Вставить(ТекЭлемент.Ключ, ""); КонецЦикла; - Если НазначенияОбъектовБазы.Свойство(ПрефиксОбъекта) Тогда - ЗаполнитьЗначенияСвойств(ОписаниеНазначения, НазначенияОбъектовБазы[ПрефиксОбъекта]); + Если НазначенияОбъектовБазы.Свойство(ОписаниеОбъектаБазы.Префикс) Тогда + ЗаполнитьЗначенияСвойств(ОписаниеНазначения, НазначенияОбъектовБазы[ОписаниеОбъектаБазы.Префикс]); + КонецЕсли; + + Если ОписаниеОбъектаБазы.Свойство("Владелец") + И ЗначениеЗаполнено(ОписаниеОбъектаБазы.Владелец) + И ОписаниеОбъектаБазы.Владелец.Тип = "ТабличнаяЧасть" + И ОписаниеОбъектаБазы.Суффикс = "_IDRRef" Тогда + ОписаниеНазначения.Тип = "Ссылка"; + ОписаниеНазначения.ТипАнгл = "Ref"; + ОписаниеНазначения.Назначение = "Поле"; КонецЕсли; Возврат ОписаниеНазначения; @@ -683,8 +696,6 @@ Символ = Сред(ИмяОбъектаБазы, 1, 1); КонецЕсли; - ЗаполнитьЗначенияСвойств(ОписаниеОбъектаБазы, НазначениеОбъектаБазы(ПрефиксОбъекта)); - // состав и имена таблицы итогов по счету зависит от количества субконто, // поэтому добавляем еще 1 цифру Если ПрефиксОбъекта = "AccRgAT" Тогда @@ -711,6 +722,8 @@ ОписаниеОбъектаБазы.Суффикс = ИмяОбъектаБазы; КонецЕсли; + ЗаполнитьЗначенияСвойств(ОписаниеОбъектаБазы, НазначениеОбъектаБазы(ОписаниеОбъектаБазы)); + Возврат ОписаниеОбъектаБазы; КонецФункции // ОписаниеОбъектаБазыПоИмени() From 152fb749e047884efcf1eb4ced725da495a277de Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sat, 28 May 2022 14:17:21 +0300 Subject: [PATCH 26/38] =?UTF-8?q?refactor:=20=D0=94=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=20SonarQube.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\320\265\320\275\320\270\320\265MSSQL.os" | 6 +- ...20\241\320\241\320\243\320\221\320\224.os" | 8 +- ...20\275\320\270\321\217\320\230\320\221.os" | 123 +++++++++++------- 3 files changed, 84 insertions(+), 53 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" index a8d50b3..2a114d7 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" @@ -1456,8 +1456,10 @@ Ид = ЗначенияАтрибутов["FILENAME"]; Данные = ЗначенияАтрибутов["BINARYDATA"]; - Если ЗначенияАтрибутов.Количество() = 0 ИЛИ Ид = Неопределено - ИЛИ Данные = Неопределено ИЛИ СтрДлина(Ид) <> ДлинаИд Тогда + ДанныеНеПрочитаны = (ЗначенияАтрибутов.Количество() = 0 ИЛИ Ид = Неопределено + ИЛИ Данные = Неопределено ИЛИ СтрДлина(Ид) <> ДлинаИд); + + Если ДанныеНеПрочитаны Тогда Продолжить; КонецЕсли; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" index 2603bbe..ce2abd0 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\243\320\221\320\224.os" @@ -293,13 +293,15 @@ // Возвращаемое значение: // Строка - логическое имя файла в базе данных // -Функция ПолучитьЛогическоеИмяФайла(База, ТипФайла = "ROWS") Экспорт +Функция ПолучитьЛогическоеИмяФайла(База, Знач ТипФайла = "ROWS") Экспорт ТипФайлаПредставление = "неизвестного типа"; - Если ВРег(ТипФайла) = "ROWS" ИЛИ ВРег(ТипФайла) = "D" Тогда + ТипФайла = ВРег(ТипФайла); + + Если ТипФайла = "ROWS" ИЛИ ТипФайла = "D" Тогда ТипФайлаПредставление = "данных"; - ИначеЕсли ВРег(ТипФайла) = "LOG" ИЛИ ВРег(ТипФайла) = "L" Тогда + ИначеЕсли ТипФайла = "LOG" ИЛИ ТипФайла = "L" Тогда ТипФайлаПредставление = "журнала"; Иначе Возврат Неопределено; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index e548457..a399adc 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -118,36 +118,19 @@ ИменаТаблицОбъектовКонфигурации1С = ИменаТаблицОбъектовКонфигурации1С(ДобавлятьКолонки); - ТабличныеЧасти = ТабличныеЧастиИВладельцы(); - СоответствиеИменМетаданных = СоответствиеИменМетаданных(); - КолонкиБазы = Новый Соответствие(); - Если ДобавлятьКолонки Тогда - КолонкиБазы = КолонкиБазы(); - КонецЕсли; - Для Каждого ТекЭлемент Из ИменаТаблицОбъектовКонфигурации1С Цикл Имя = СтрШаблон("%1%2", ТекЭлемент.Значение.Префикс, Формат(ТекЭлемент.Значение.Индекс, "ЧРГ=; ЧГ=")); - Если НЕ ОписанияМетаданных[Имя] = Неопределено Тогда - Продолжить; - КонецЕсли; + ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(ТекЭлемент.Значение, ДобавлятьКолонки); - Если НазначениеОбъектаБазы(ТекЭлемент.Значение).Назначение = "Поле" Тогда - ОписаниеОбъектаБазы = КолонкиБазы[Имя]; - Если ОписаниеОбъектаБазы = Неопределено Тогда - Продолжить; - КонецЕсли; - ИначеЕсли ТабличныеЧасти[Имя] = Неопределено Тогда - ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(Имя); - Иначе - ОписаниеОбъектаБазы = ТабличныеЧасти[Имя]; + Если НЕ ОписанияМетаданных[Имя] = Неопределено + ИЛИ ОписаниеОбъектаБазы = Неопределено Тогда + Продолжить; КонецЕсли; - ОписаниеОбъектаБазы.Ид = ТекЭлемент.Значение.Ид; - ОписаниеВладельца = ОписаниеОбъектаБазы; Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; @@ -162,11 +145,13 @@ Если ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя] = Неопределено Тогда Продолжить; КонецЕсли; + ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; Если НЕ СоответствиеИменМетаданных[ОписаниеВладельца.Ид] = Неопределено Тогда ОписаниеВладельца.ИмяМетаданных = СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных; КонецЕсли; + ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); ТекОписание = ОписаниеОбъектаБазы; @@ -233,9 +218,9 @@ Если ЭтоЧисло(РазмерСтрокой) Тогда Результат[ТекЭлемент.Ключ] = Число(РазмерСтрокой); Множитель = 1024; - Если ВРег(Размерность) = "KB" Тогда + Если Размерность = "KB" Тогда Результат[ТекЭлемент.Ключ] = Результат[ТекЭлемент.Ключ] * Множитель; - ИначеЕсли ВРег(Размерность) = "MB" Тогда + ИначеЕсли Размерность = "MB" Тогда Результат[ТекЭлемент.Ключ] = Результат[ТекЭлемент.Ключ] * Множитель * Множитель; КонецЕсли; Иначе @@ -485,10 +470,11 @@ ЗаполнитьЗначенияСвойств(ОписаниеНазначения, НазначенияОбъектовБазы[ОписаниеОбъектаБазы.Префикс]); КонецЕсли; - Если ОписаниеОбъектаБазы.Свойство("Владелец") - И ЗначениеЗаполнено(ОписаниеОбъектаБазы.Владелец) - И ОписаниеОбъектаБазы.Владелец.Тип = "ТабличнаяЧасть" - И ОписаниеОбъектаБазы.Суффикс = "_IDRRef" Тогда + ЭтоСсылкаНаВладельцаТЧ = (ОписаниеОбъектаБазы.Свойство("Владелец") + И ЗначениеЗаполнено(ОписаниеОбъектаБазы.Владелец) + И ОписаниеОбъектаБазы.Владелец.Тип = "ТабличнаяЧасть" + И ОписаниеОбъектаБазы.Суффикс = "_IDRRef"); + Если ЭтоСсылкаНаВладельцаТЧ Тогда ОписаниеНазначения.Тип = "Ссылка"; ОписаниеНазначения.ТипАнгл = "Ref"; ОписаниеНазначения.Назначение = "Поле"; @@ -644,15 +630,16 @@ СтруктураОписания = Новый Структура(); СтруктураОписания.Вставить("Владелец"); - СтруктураОписания.Вставить("Тип" , ""); - СтруктураОписания.Вставить("ТипАнгл" , ""); - СтруктураОписания.Вставить("Назначение" , ""); - СтруктураОписания.Вставить("Имя" , ""); - СтруктураОписания.Вставить("Префикс" , ""); + СтруктураОписания.Вставить("Тип" , ""); + СтруктураОписания.Вставить("ТипАнгл" , ""); + СтруктураОписания.Вставить("Назначение" , ""); + СтруктураОписания.Вставить("Имя" , ""); + СтруктураОписания.Вставить("Префикс" , ""); СтруктураОписания.Вставить("Индекс"); - СтруктураОписания.Вставить("Суффикс" , ""); - СтруктураОписания.Вставить("Ид" , ""); - СтруктураОписания.Вставить("ИмяМетаданных", ""); + СтруктураОписания.Вставить("Суффикс" , ""); + СтруктураОписания.Вставить("Ид" , ""); + СтруктураОписания.Вставить("ИмяМетаданных" , ""); + СтруктураОписания.Вставить("ПолноеИмяМетаданных", ""); Возврат СтруктураОписания; @@ -728,6 +715,43 @@ КонецФункции // ОписаниеОбъектаБазыПоИмени() +// Функция - подготавливает описание объекта базы по описанию соответствия имени объекта базы и UUID +// +// Параметры: +// СоответствиеИмениОбъектаИИд - Структура - описание соответствия имени объекта базы и UUID +// ДобавлятьКолонки - Строка - Истина - будет добавлена информация для колонок таблиц +// +// Возвращаемое значение: +// Структура - имя объекта базы, префикс, индекс, владелец и суффикс (см. СтруктураОписанияОбъектаБазы()) +// +Функция ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(СоответствиеИмениОбъектаИИд, ДобавлятьКолонки) + + Имя = СтрШаблон("%1%2", СоответствиеИмениОбъектаИИд.Префикс, Формат(СоответствиеИмениОбъектаИИд.Индекс, "ЧРГ=; ЧГ=")); + + КолонкиБазы = Новый Соответствие(); + Если ДобавлятьКолонки Тогда + КолонкиБазы = КолонкиБазы(); + КонецЕсли; + + ТабличныеЧасти = ТабличныеЧастиИВладельцы(); + + Если НазначениеОбъектаБазы(СоответствиеИмениОбъектаИИд).Назначение = "Поле" Тогда + ОписаниеОбъектаБазы = КолонкиБазы[Имя]; + Если ОписаниеОбъектаБазы = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + ИначеЕсли ТабличныеЧасти[Имя] = Неопределено Тогда + ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(Имя); + Иначе + ОписаниеОбъектаБазы = ТабличныеЧасти[Имя]; + КонецЕсли; + + ОписаниеОбъектаБазы.Ид = СоответствиеИмениОбъектаИИд.Ид; + + Возврат ОписаниеОбъектаБазы; + +КонецФункции // ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд() + // Функция - собирает полное имя объекта метаданных по описанию с учетом всех владельцев // например (Справочник.Справочник1.Реквизит1, Документ.ТабличнаяЧасть2.Реквизит8) // @@ -828,15 +852,15 @@ // Функция ПрочитатьУпакованныеДанные(УпакованныеДанные, КакТекст = Ложь) - Если ТипЗнч(УпакованныеДанные) = Тип("ДвоичныеДанные") Тогда + ТипУпакованныхДанных = ТипЗнч(УпакованныеДанные); + Если ТипУпакованныхДанных = Тип("ДвоичныеДанные") Тогда Данные = УпакованныеДанные; - ИначеЕсли ТипЗнч(УпакованныеДанные) = Тип("Строка") Тогда + ИначеЕсли ТипУпакованныхДанных = Тип("Строка") Тогда Данные = Base64Значение(УпакованныеДанные); Иначе - НекорректныйТип = ТипЗнч(УпакованныеДанные); ВызватьИсключение СтрШаблон("Некорректный тип параметра ""УпакованныеДанные"" ""%1"", | ожидается ""ДвоичныеДанные"" или ""Строка""", - НекорректныйТип); + ТипУпакованныхДанных); КонецЕсли; Если ДанныеУпакованы(Данные) Тогда @@ -866,20 +890,22 @@ // Функция ДанныеУпакованы(Знач Данные) - Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда + ТипДанных = ТипЗнч(Данные); + ЭтоПоток = (ТипДанных = Тип("Поток") + ИЛИ ТипДанных = Тип("ФайловыйПоток") + ИЛИ ТипДанных = Тип("ПотокВПамяти")); + + Если ТипДанных = Тип("ДвоичныеДанные") Тогда Поток = Данные.ОткрытьПотокДляЧтения(); - ИначеЕсли ТипЗнч(Данные) = Тип("Строка") Тогда + ИначеЕсли ТипДанных = Тип("Строка") Тогда Данные = Base64Значение(Данные); Поток = Данные.ОткрытьПотокДляЧтения(); - ИначеЕсли ТипЗнч(Данные) = Тип("Поток") - ИЛИ ТипЗнч(Данные) = Тип("ФайловыйПоток") - ИЛИ ТипЗнч(Данные) = Тип("ПотокВПамяти") Тогда + ИначеЕсли ЭтоПоток Тогда Данные.СкопироватьВ(Поток); Иначе - НекорректныйТип = ТипЗнч(Данные); ВызватьИсключение СтрШаблон("Некорректный тип ""%1"" параметра ""Данные"", | ожидается ""Base64Строка, Поток, ДвоичныеДанные""", - НекорректныйТип); + ТипДанных); КонецЕсли; ДлинаБОМ = 3; @@ -1004,9 +1030,10 @@ КоличествоТочек = 0; Для й = 1 По СтрДлина(Строка) Цикл - Если Сред(Строка, й, 1) = "." Тогда + ТекущийСимвол = Сред(Строка, й, 1); + Если ТекущийСимвол = "." Тогда КоличествоТочек = КоличествоТочек + 1; - ИначеЕсли СтрНайти(Цифры, Сред(Строка, й, 1)) = 0 Тогда + ИначеЕсли СтрНайти(Цифры, ТекущийСимвол) = 0 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; From 7548ff6b5901b1c76acd4d2520b94a22bf5727dc Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sat, 28 May 2022 14:18:20 +0300 Subject: [PATCH 27/38] =?UTF-8?q?test:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D0=B5=D0=BC=D0=BE?= =?UTF-8?q?=D0=BC=20=D1=82=D0=B5=D1=81=D1=82=D0=B5;=20=D0=A3=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=89=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20=D1=81=D0=BE=20=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D1=80=D0=BE=D0=B9=20=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=98=D0=91=201=D0=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/qa.yml | 2 +- tests/batch-tests.os | 4 ++ tests/file-tests.os | 14 ++++++ tests/ib-structure-tests.os | 93 ++++++++++++++++--------------------- tests/ib-tests.os | 6 +++ tests/nextcloud-tests.os | 10 ++++ tests/sql-tests.os | 40 +++++++++++++++- tests/ssh-tests.os | 10 ++++ 8 files changed, 124 insertions(+), 55 deletions(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 8bfcefc..af2700b 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -62,7 +62,7 @@ jobs: SFTP_TEST_ADDRESS: ${{ secrets.SFTP_TEST_ADDRESS }} SFTP_TEST_USER: ${{ secrets.SFTP_TEST_USER }} SFTP_TEST_PWD: ${{ secrets.SFTP_TEST_PWD }} - LOGOS_CONFIG : "logger.oscript.app.cpdb=DEBUG" + LOGOS_CONFIG : "logger.oscript.app.cpdb=INFO" run: oscript ./tasks/coverage.os # Остановка и удаление контейнеров NextCloud и OpenSSH diff --git a/tests/batch-tests.os b/tests/batch-tests.os index 4ec09a6..614e490 100644 --- a/tests/batch-tests.os +++ b/tests/batch-tests.os @@ -21,6 +21,8 @@ &Тест Процедура ТестДолжен_ВыполнитьПакетныйЗапускКоманд() Экспорт + Лог.Информация("Тест: Пакетный запуск команды"); + ИмяСервера = ПолучитьПеременнуюСреды("CPDB_SQL_SRVR"); ИмяПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_USER"); ПарольПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_PWD"); @@ -56,6 +58,8 @@ &Тест Процедура ТестДолжен_ВыполнитьЗапускКомандыИспользуяПараметрыИзФайла() Экспорт + Лог.Информация("Тест: Пакетный запуск команды с параметрами из файла"); + ИмяСервера = ПолучитьПеременнуюСреды("CPDB_SQL_SRVR"); ИмяПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_USER"); ПарольПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_PWD"); diff --git a/tests/file-tests.os b/tests/file-tests.os index 9e9e0fc..a76201e 100644 --- a/tests/file-tests.os +++ b/tests/file-tests.os @@ -34,6 +34,8 @@ &Тест Процедура ТестДолжен_СоздатьФайл() Экспорт + Лог.Информация("Перед тестами: Создание тестового файла"); + ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных); РазмерФайла = 31457280; @@ -49,6 +51,8 @@ &Тест Процедура ТестДолжен_ПроверитьКопированиеФайла() Экспорт + Лог.Информация("Тест: Копирование файла"); + КаталогДляКопирования = ОбъединитьПути(КаталогВременныхДанных, "ForCopy"); ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); @@ -66,6 +70,8 @@ &Тест Процедура ТестДолжен_ПроверитьРазбиениеФайлаНаЧасти() Экспорт + Лог.Информация("Тест: Разбиение файла на части"); + ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); ПутьКАрхиву = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.7z.001", ТестовыйФайл.ИмяБезРасширения)); @@ -87,6 +93,8 @@ &Тест Процедура ТестДолжен_УдалитьТестовыйФайл() Экспорт + Лог.Информация("Тест: Удаление файла"); + УдалитьФайлы(ПутьКТестовомуФайлу); ТекстОшибки = СтрШаблон("Ошибка удаления файла ""%1""", ПутьКТестовомуФайлу); @@ -98,6 +106,8 @@ &Тест Процедура ТестДолжен_ПроверитьСборкуФайлаИзЧастейИзАрхива() Экспорт + Лог.Информация("Тест: Сборка файла из частей из архива"); + ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); Если ТестовыйФайл.Существует() Тогда @@ -117,6 +127,8 @@ &Тест Процедура ТестДолжен_ПроверитьСборкуФайлаИзЧастейИзСписка() Экспорт + Лог.Информация("Тест: Сборка файла из частей по списку файлов"); + ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу); Если ТестовыйФайл.Существует() Тогда @@ -136,6 +148,8 @@ &Тест Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт + Лог.Информация("После тестов: Удаление тестового каталога"); + УдалитьФайлы(КаталогВременныхДанных); ТекстОшибки = СтрШаблон("Ошибка удаления каталога временных файлов ""%1""", КаталогВременныхДанных); diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index 5286374..de314ff 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -43,6 +43,8 @@ &Тест Процедура ТестДолжен_ПодготовитьТестовуюБазу() Экспорт + Лог.Информация("Перед тестами: Подготовка тестовой базы данных"); + Для й = 1 По 3 Цикл ИмяБазы = СтрШаблон("%1_%2", ПрефиксИмениБД, й); @@ -76,6 +78,8 @@ &Тест Процедура ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() Экспорт + Лог.Информация("Тест: Получение версии формата конфигурации"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -95,6 +99,8 @@ &Тест Процедура ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() Экспорт + Лог.Информация("Тест: Получение описания объекта метаданных 1С по имени таблицы БД"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -104,19 +110,21 @@ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); ИмяОбъектаБД = "Reference34"; - ИмяОбъектаМетаданных = "Справочник1"; + ИмяОбъектаМетаданных = "Справочник.Справочник1"; ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С для объекта БД ""%1""", ИмяОбъектаБД); - Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ПолноеИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); КонецПроцедуры // ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() &Тест Процедура ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() Экспорт + Лог.Информация("Тест: Получение описания табличной части объекта метаданных 1С по имени таблицы БД"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -126,29 +134,23 @@ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); ИмяОбъектаБД = "_Reference34_VT36"; - ИмяОбъектаМетаданных = "Справочник1"; - ИмяТабличнойЧасти = "ТабличнаяЧасть1"; + ИмяТабличнойЧасти = "Справочник.Справочник1.ТабличнаяЧасть1"; ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); - ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С табличной части, - | для объекта БД ""%1""", - ИмяОбъектаБД); - - Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); - ТекстОшибки = СтрШаблон("Ошибка получения описания табличной части - | объекта метаданных ""%1"" 1С для объекта БД ""%2""", - ИмяОбъектаМетаданных, + | объекта метаданных 1С для объекта БД ""%1""", ИмяОбъектаБД); - Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ПолноеИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); КонецПроцедуры // ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() &Тест Процедура ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() Экспорт + Лог.Информация("Тест: Получение описания реквизита объекта метаданных 1С по имени таблицы БД"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -158,29 +160,23 @@ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); ИмяОбъектаБД = "_Fld35"; - ИмяОбъектаМетаданных = "Справочник1"; - ИмяРеквизита = "Реквизит1"; + ИмяРеквизита = "Справочник.Справочник1.Реквизит1"; ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); - ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С реквизита, - | для объекта БД ""%1""", - ИмяОбъектаБД); - - Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки); - ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита - | объекта метаданных ""%1"" 1С для объекта БД ""%2""", - ИмяОбъектаМетаданных, + | объекта метаданных 1С для объекта БД ""%1""", ИмяОбъектаБД); - Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяРеквизита, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ПолноеИмяМетаданных, ИмяРеквизита, ТекстОшибки); КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() &Тест Процедура ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() Экспорт + Лог.Информация("Тест: Получение описания реквизита табличной части объекта метаданных 1С по имени таблицы БД"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -190,40 +186,23 @@ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); ИмяОбъектаБД = "_Fld38"; - ИмяТабличнойЧасти = "ТабличнаяЧасть1"; - ИмяОбъектаМетаданных = "Справочник1"; - ИмяРеквизита = "Реквизит1"; + ИмяРеквизита = "Справочник.Справочник1.ТабличнаяЧасть1.Реквизит1"; ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД); - ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С реквизита, - | для объекта БД ""%1""", - ИмяОбъектаБД); - - Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.Владелец.ИмяМетаданных, - ИмяОбъектаМетаданных, - ТекстОшибки); - ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части - | объекта метаданных ""%1"" 1С для объекта БД ""%2""", - ИмяОбъектаМетаданных, - ИмяОбъектаБД); - - Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.Владелец.ИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); - - ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части ""%1"" - | объекта метаданных ""%2"" 1С для объекта БД ""%3""", - ИмяТабличнойЧасти, - ИмяОбъектаМетаданных, + | объекта метаданных 1С для объекта БД ""%1""", ИмяОбъектаБД); - Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ИмяМетаданных, ИмяРеквизита, ТекстОшибки); + Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ПолноеИмяМетаданных, ИмяРеквизита, ТекстОшибки); КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() &Тест Процедура ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1С() Экспорт + Лог.Информация("Тест: Получение описания структуры хранения базы данных 1С"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -234,8 +213,8 @@ ИмяОбъектаБДТабличнойЧасти = "Reference34_VT36"; ИмяОбъектаБДТабличнойЧастиСокр = "VT36"; - ИмяСправочника = "Справочник1"; - ИмяТабличнойЧасти = "ТабличнаяЧасть1"; + ИмяСправочника = "Справочник.Справочник1"; + ИмяТабличнойЧасти = "Справочник.Справочник1.ТабличнаяЧасть1"; СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); @@ -245,7 +224,7 @@ | не найдено имя для объекта БД ""%1"" справочника", ИмяОбъектаБДСправочника); - Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДСправочника].ИмяМетаданных, + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДСправочника].ПолноеИмяМетаданных, ИмяСправочника, ТекстОшибки); @@ -253,7 +232,7 @@ | не найдено имя для объекта БД ""%1"" табличной части по полному имени", ИмяОбъектаБДТабличнойЧасти); - Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧасти].ИмяМетаданных, + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧасти].ПолноеИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); @@ -261,7 +240,7 @@ | не найдено имя для объекта БД ""%1"" табличной части по сокращенному имени", ИмяОбъектаБДТабличнойЧастиСокр); - Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧастиСокр].ИмяМетаданных, + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧастиСокр].ПолноеИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); @@ -270,6 +249,8 @@ &Тест Процедура ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1ССПолями() Экспорт + Лог.Информация("Тест: Получение описания структуры хранения базы данных 1С с полями"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -278,7 +259,7 @@ ИмяОбъектаБДПоля = "Fld35"; - ИмяРеквизита = "Реквизит1"; + ИмяРеквизита = "Справочник.Справочник1.Реквизит1"; СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); @@ -288,7 +269,7 @@ | не найдено имя для объекта БД ""%1"" реквизита", ИмяОбъектаБДПоля); - Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДПоля].ИмяМетаданных, + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДПоля].ПолноеИмяМетаданных, ИмяРеквизита, ТекстОшибки); @@ -297,6 +278,8 @@ &Тест Процедура ТестДолжен_ПолучитьЗанимаемоеБазойМесто() Экспорт + Лог.Информация("Тест: Получение объема места занимаемого базой данных"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -316,6 +299,8 @@ &Тест Процедура ТестДолжен_ПолучитьПоказателиИспользованияТаблицБазы() Экспорт + Лог.Информация("Тест: Получение показателей использования таблиц базы данных"); + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); @@ -356,6 +341,8 @@ &Тест Процедура ТестДолжен_УдалитьТестовуюБазу() Экспорт + Лог.Информация("После тестов: Удаление временной базы"); + Для й = 1 По 3 Цикл ИмяБазы = СтрШаблон("%1_%2", ПрефиксИмениБД, й); diff --git a/tests/ib-tests.os b/tests/ib-tests.os index 4b7de3b..48a686c 100644 --- a/tests/ib-tests.os +++ b/tests/ib-tests.os @@ -30,6 +30,8 @@ &Тест Процедура ТестДолжен_СоздатьФайловуюБазу1С() Экспорт + Лог.Информация("Тест: Создание файловой информационной базы 1С"); + ИмяИБ = СтрШаблон("%1%2", ПрефиксИмениИБ, 1); КаталогИБ = ОбъединитьПути(КаталогВременныхДанных, ИмяИБ); @@ -51,6 +53,8 @@ &Тест Процедура ТестДолжен_ВыгрузитьБазуВФайл() Экспорт + Лог.Информация("Тест: Выгрузка информационной базы 1С в файл"); + ИмяИБ = СтрШаблон("%1%2", ПрефиксИмениИБ, 1); КаталогИБ = ОбъединитьПути(КаталогВременныхДанных, ИмяИБ); @@ -86,6 +90,8 @@ &Тест Процедура ТестДолжен_ЗагрузитьБазуИзФайла() Экспорт + Лог.Информация("Тест: Загрузка информационной базы 1С из файла"); + ИмяИБ = СтрШаблон("%1%2", ПрефиксИмениИБ, 1); КаталогИБ = ОбъединитьПути(КаталогВременныхДанных, ИмяИБ); diff --git a/tests/nextcloud-tests.os b/tests/nextcloud-tests.os index b7a798e..2af1ae3 100644 --- a/tests/nextcloud-tests.os +++ b/tests/nextcloud-tests.os @@ -34,6 +34,8 @@ &Тест Процедура ТестДолжен_СоздатьФайл() Экспорт + Лог.Информация("Перед тестами: Создание тестового файла"); + ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных); РазмерФайла = 31457280; @@ -49,6 +51,8 @@ &Тест Процедура ТестДолжен_СоздатьПапкуВNextCloud() Экспорт + Лог.Информация("Тест: Создание каталога в сервисе NextCloud"); + АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); @@ -73,6 +77,8 @@ &Тест Процедура ТестДолжен_ОтправитьФайлВNextCloud() Экспорт + Лог.Информация("Тест: Отправка файла на сервис NextCloud"); + АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); @@ -110,6 +116,8 @@ &Тест Процедура ТестДолжен_ПолучитьФайлИзNextCloud() Экспорт + Лог.Информация("Тест: Получение файла с сервиса NextCloud"); + АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); @@ -159,6 +167,8 @@ &Тест Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт + Лог.Информация("После тестов: Удаление тестового каталога"); + УдалитьФайлы(КаталогВременныхДанных); ТекстОшибки = СтрШаблон("Ошибка удаления каталога временных файлов ""%1""", КаталогВременныхДанных); diff --git a/tests/sql-tests.os b/tests/sql-tests.os index e7da83c..2ce6a47 100644 --- a/tests/sql-tests.os +++ b/tests/sql-tests.os @@ -49,19 +49,23 @@ &Тест Процедура ТестДолжен_ПолучитьВерсиюSQLServer() Экспорт + Лог.Информация("Тест: Получение версии MS SQL Server"); + Результат = ПодключениеКСУБД.ПолучитьВерсиюСУБД(); Лог.Информация("Версия сервера СУБД: %1", Результат.Представление); ТекстОшибки = СтрШаблон("Ошибка получения версии MS SQL Server"); - Утверждения.ПроверитьБольше(Найти(ВРег(Результат.Представление), "MICROSOFT"), 0, ТекстОшибки); + Утверждения.ПроверитьБольше(СтрНайти(ВРег(Результат.Представление), "MICROSOFT"), 0, ТекстОшибки); КонецПроцедуры // ТестДолжен_ПолучитьВерсиюSQLServer() &Тест Процедура ТестДолжен_ПолучитьДоступностьФункционалаSQLServer() Экспорт + Лог.Информация("Тест: Получение доступного функционала MS SQL Server"); + Результат = ПодключениеКСУБД.ДоступностьФункционалаСУБД("Компрессия"); ТекстОшибки = СтрШаблон("Ошибка получения доступности функционала MS SQL Server"); @@ -73,6 +77,8 @@ &Тест Процедура ТестДолжен_ВыполнитьСценарийСУБДИзФайла() Экспорт + Лог.Информация("Тест: Выполнение сценария работы с MS SQL Server из файла"); + ФС.ОбеспечитьКаталог(КаталогВременныхДанных); ПутьКСкрипту = ОбъединитьПути(КаталогВременныхДанных, "test.sql"); Скрипт = Новый ТекстовыйДокумент(); @@ -92,6 +98,8 @@ &Тест Процедура ТестДолжен_СоздатьБазуДанных() Экспорт + Лог.Информация("Тест: Создание базы данных на MS SQL Server"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -111,6 +119,8 @@ &Тест Процедура ТестДолжен_ПроверитьОшибкуСозданияБазыДанных() Экспорт + Лог.Информация("Тест: Проверка возникновения ошибки создания базы данных на MS SQL Server"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -159,6 +169,8 @@ &Тест Процедура ТестДолжен_УдалитьБазуДанных() Экспорт + Лог.Информация("Тест: Удаление базы данных на MS SQL Server"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -182,6 +194,8 @@ &Тест Процедура ТестДолжен_ПроверитьОшибкуУдаленияБазыДанных() Экспорт + Лог.Информация("Тест: Проверка возникновения ошибки удаления базы данных на MS SQL Server"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ВозниклаОшибка = Неопределено; @@ -201,6 +215,8 @@ &Тест Процедура ТестДолжен_ПолучитьЛогическоеИмяФайлаВБазе() Экспорт + Лог.Информация("Тест: Получение логического имени файла базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -232,6 +248,8 @@ &Тест Процедура ТестДолжен_ИзменитьЛогическиеИменаФайловВБазе() Экспорт + Лог.Информация("Тест: Изменение логического имени файла базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -270,6 +288,8 @@ &Тест Процедура ТестДолжен_СоздатьРезервнуюКопиюБазы() Экспорт + Лог.Информация("Тест: Создание резервной копии базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -301,6 +321,8 @@ &Тест Процедура ТестДолжен_ПолучитьОшибкуСозданияРезервнойКопииБазы() Экспорт + Лог.Информация("Тест: Проверка возникновения ошибки создания резервной копии базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 3); ПутьКРезервнойКопии = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.bak", ИмяБД)); @@ -324,6 +346,8 @@ &Тест Процедура ТестДолжен_ВосстановитьБазуИзРезервнойКопии() Экспорт + Лог.Информация("Тест: Восстановление базы данных из резервной копии"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -353,6 +377,8 @@ &Тест Процедура ТестДолжен_ПолучитьОшибкуВосстановленияБазыИзРезервнойКопии() Экспорт + Лог.Информация("Тест: Проверка возникновения ошибки при восстановлении базы данных из резервной копии"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 2); ПутьКРезервнойКопии = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.bak", ИмяБД)); @@ -380,6 +406,8 @@ &Тест Процедура ТестДолжен_ИзменитьВладельцаБазы() Экспорт + Лог.Информация("Тест: Изменение владельца базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ВладелецДо = ПодключениеКСУБД.Пользователь(); ВладелецПосле = "sa"; @@ -411,6 +439,8 @@ &Тест Процедура ТестДолжен_ИзменитьМодельВосстановленияБазы() Экспорт + Лог.Информация("Тест: Изменение модели восстановления базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); МодельВосстановленияДо = "SIMPLE"; МодельВосстановленияПосле = "FULL"; @@ -442,6 +472,8 @@ &Тест Процедура ТестДолжен_ПолучитьОшибкуИзмененияМоделиВосстановленияБазы() Экспорт + Лог.Информация("Тест: Проверка возникновения ошибки при изменении модели восстановления базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); МодельВосстановленияПосле = "WRONGMODEL"; @@ -472,6 +504,8 @@ &Тест Процедура ТестДолжен_ВыполнитьКомпрессиюБазы() Экспорт + Лог.Информация("Тест: Компрессия таблиц базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -489,6 +523,8 @@ &Тест Процедура ТестДолжен_СжатьБазу() Экспорт + Лог.Информация("Тест: Сжатие (shrink) базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); @@ -506,6 +542,8 @@ &Тест Процедура ТестДолжен_СжатьФайлЖурналаТранзакций() Экспорт + Лог.Информация("Тест: Сжатие (shrink) журнала транзакций базы данных"); + ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1); ФС.ОбеспечитьКаталог(КаталогВременныхДанных); diff --git a/tests/ssh-tests.os b/tests/ssh-tests.os index 9190f75..542fc6f 100644 --- a/tests/ssh-tests.os +++ b/tests/ssh-tests.os @@ -34,6 +34,8 @@ &Тест Процедура ТестДолжен_СоздатьФайл() Экспорт + Лог.Информация("Перед тестами: Создание тестового файла"); + ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных); РазмерФайла = 31457280; @@ -49,6 +51,8 @@ &Тест Процедура ТестДолжен_СоздатьПапкуНаSFTP() Экспорт + Лог.Информация("Тест: Создание каталога на SFTP-сервере"); + АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); @@ -73,6 +77,8 @@ &Тест Процедура ТестДолжен_ОтправитьФайлНаSFTP() Экспорт + Лог.Информация("Тест: Отправка файла на SFTP-сервер"); + АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); @@ -112,6 +118,8 @@ &Тест Процедура ТестДолжен_ПолучитьФайлСSFTP() Экспорт + Лог.Информация("Тест: Получение файла с SFTP-сервера"); + АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS"); ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER"); ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD"); @@ -162,6 +170,8 @@ &Тест Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт + Лог.Информация("После тестов: Удаление тестового каталога"); + УдалитьФайлы(КаталогВременныхДанных); ТекстОшибки = СтрШаблон("Ошибка удаления каталога временных файлов ""%1""", КаталогВременныхДанных); From 0beb5d18133b7aa30fe9159817b8c49ca8de4ef0 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sat, 28 May 2022 14:19:50 +0300 Subject: [PATCH 28/38] =?UTF-8?q?test:=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D1=83=D0=B5=D0=BC=D1=8B=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B2=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=85=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/batch-tests.os | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/batch-tests.os b/tests/batch-tests.os index 614e490..cde81f5 100644 --- a/tests/batch-tests.os +++ b/tests/batch-tests.os @@ -47,11 +47,9 @@ Контекст.Вставить("АргументыКоманднойСтроки", Новый ФиксированныйМассив(Аргументы)); - ВремяЗапуска = ТекущаяДата(); - КаталогИсходников = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "src"); - Сценарий = ЗагрузитьСценарий(ОбъединитьПути(КаталогИсходников, "cmd", "cpdb.os"), Контекст); + ЗагрузитьСценарий(ОбъединитьПути(КаталогИсходников, "cmd", "cpdb.os"), Контекст); КонецПроцедуры // ТестДолжен_ВыполнитьПакетныйЗапускКоманд() @@ -87,11 +85,9 @@ Контекст.Вставить("АргументыКоманднойСтроки", Новый ФиксированныйМассив(Аргументы)); Контекст.Вставить("ЭтоТест" , Истина); - ВремяЗапуска = ТекущаяДата(); - КаталогИсходников = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "src"); - Сценарий = ЗагрузитьСценарий(ОбъединитьПути(КаталогИсходников, "cmd", "cpdb.os"), Контекст); + ЗагрузитьСценарий(ОбъединитьПути(КаталогИсходников, "cmd", "cpdb.os"), Контекст); ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБазы); From 3b8fb3c3d7b975a614480ae36b93f2e9467daa9a Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sun, 29 May 2022 15:09:39 +0300 Subject: [PATCH 29/38] =?UTF-8?q?refactor:=20=D0=9F=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20(=D0=9F?= =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B8=D0=BA=D1=81=D0=92=D0=91=D0=B0=D0=B7?= =?UTF-8?q?=D0=B5=20->=20=D0=9F=D1=80=D0=B5=D1=84=D0=B8=D0=BA=D1=81);=20?= =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20=D0=B8=D0=B7=D0=BB=D0=B8?= =?UTF-8?q?=D1=88=D0=BD=D0=B5=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BB=D0=BE=D0=BD=D0=BE=D0=BA=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=20=D0=B8=20=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=87=D0=BD=D1=8B=D1=85=20=D1=87=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=B9;=20=D0=A3=D0=B2=D0=B5=D0=BB=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D1=80=D1=86=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=BE=D0=B1=D1=8A=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D0=B2=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B7=D0=B0=201=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=20=D0=B4=D0=BE=205000;=20=D0=A4=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4?= =?UTF-8?q?=D1=83=D1=80=D1=83=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D0=B2;=20=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=87=D0=BD=D1=8B=D1=85=20=D1=87=D0=B0=D1=81=D1=82=D0=B5=D0=B9?= =?UTF-8?q?;=20=D0=9F=D0=BE=D0=B8=D1=81=D0=BA=20=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D1=81=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D1=80=D0=B5=D0=B3?= =?UTF-8?q?=D1=83=D0=BB=D1=8F=D1=80=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=D1=8B?= =?UTF-8?q?=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F;=20=D0=9F=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BD=D0=B0=20=D0=BD=D0=B0=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=87=D0=B8=D1=81=D0=BB=D0=B0=20=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D0=BE=D1=82=D0=B8=D0=BF=D0=BD=D1=8B=D1=85=20=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=B2=D0=BE=D0=BB=D0=BE=D0=B2=20=D0=B2=D1=8B=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D1=8F=D1=8E=D1=82=D1=81=D1=8F=20=D1=81=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC=20=D1=80=D0=B5=D0=B3=D1=83=D0=BB=D1=8F=D1=80?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=D1=8B=D1=80=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\275\320\270\321\217\320\230\320\221.os" | 167 ++++++++---------- ...276\320\262\320\221\320\2241\320\241.json" | 136 +++++++------- 2 files changed, 144 insertions(+), 159 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index a399adc..f0e1a77 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -9,12 +9,15 @@ #Использовать deflator -Перем ПодключениеКСУБД; // - ПодключениеКСУБД - объект подключения к СУБД -Перем ТекущийСервер; // - Строка - адрес сервера СУБД -Перем База; // - Строка - адрес сервера СУБД -Перем НазначенияОбъектовБазы; // - Структура - соответствие назначений объектов префиксам имен объектов БД - -Перем Лог; // - Объект - объект записи лога приложения +Перем ПодключениеКСУБД; // - ПодключениеКСУБД - объект подключения к СУБД +Перем ТекущийСервер; // - Строка - адрес сервера СУБД +Перем База; // - Строка - адрес сервера СУБД +Перем НазначенияОбъектовБазы; // - Структура - соответствие назначений объектов + // префиксам имен объектов БД +Перем ПодчиненныеОбъектыБазы; // - Структура - назначения табличных частей префиксам имен объектов БД +Перем РегуляркаПроверкиЧисла; // - РегулярноеВыражение - регулярное выражение для проверки числа +Перем РегуляркаОднотипныхСимволов; // - РегулярноеВыражение - регулярное выражение для проверки числа +Перем Лог; // - Объект - объект записи лога приложения #Область ПрограммныйИнтерфейс @@ -120,11 +123,20 @@ СоответствиеИменМетаданных = СоответствиеИменМетаданных(); + КолонкиБазы = Новый Соответствие(); + Если ДобавлятьКолонки Тогда + КолонкиБазы = КолонкиБазы(); + КонецЕсли; + + ТабличныеЧасти = ТабличныеЧастиИВладельцы(); + Для Каждого ТекЭлемент Из ИменаТаблицОбъектовКонфигурации1С Цикл Имя = СтрШаблон("%1%2", ТекЭлемент.Значение.Префикс, Формат(ТекЭлемент.Значение.Индекс, "ЧРГ=; ЧГ=")); - ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(ТекЭлемент.Значение, ДобавлятьКолонки); + ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(ТекЭлемент.Значение, + ТабличныеЧасти, + КолонкиБазы); Если НЕ ОписанияМетаданных[Имя] = Неопределено ИЛИ ОписаниеОбъектаБазы = Неопределено Тогда @@ -151,7 +163,7 @@ Если НЕ СоответствиеИменМетаданных[ОписаниеВладельца.Ид] = Неопределено Тогда ОписаниеВладельца.ИмяМетаданных = СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных; КонецЕсли; - + ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); ТекОписание = ОписаниеОбъектаБазы; @@ -380,7 +392,7 @@ // Возвращаемое значение: // Соответствие - соответствия UUID метаданных и имен метаданных // -Функция СоответствиеИменМетаданных(Ид = "", ПорцияЧтения = 1000) +Функция СоответствиеИменМетаданных(Ид = "", ПорцияЧтения = 5000) Лог.Отладка("Получение соответствия имен метаданных базы ""%1\%2"": %3", ТекущийСервер, @@ -420,12 +432,14 @@ КонецФункции // СоответствиеИменМетаданных() -// Функция - возвращает соответствие имен объектов базы данных Типм и именам объектов 1С +// Процедура - заполняет соответствие имен объектов базы данных Типам и именам объектов 1С +// в переменной модуля "НазначенияОбъектовБазы" +// и назначения табличных частей в переменной модуля "ПодчиненныеОбъектыБазы" // // Возвращаемое значение: // Соответствие - назначения объектов базы // -Функция НазначенияОбъектовБазы() +Процедура ЗаполнитьНазначенияОбъектовБазы() ИмяМакета = "НазначенияОбъектовБД1С.json"; ПутьКМакету = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "Макеты", ИмяМакета); @@ -433,18 +447,19 @@ Чтение = Новый ЧтениеJSON(); Чтение.ОткрытьФайл(ФайлМакета.ПолноеИмя, КодировкаТекста.UTF8); - - Результат = ПрочитатьJSON(Чтение, Ложь); - Для Каждого ТекЭлемент Из Результат Цикл + НазначенияОбъектовБазы = ПрочитатьJSON(Чтение, Ложь); + ПодчиненныеОбъектыБазы = Новый Структура(); + + Для Каждого ТекЭлемент Из НазначенияОбъектовБазы Цикл Если НЕ ТекЭлемент.Значение.Свойство("Подчиненный") Тогда ТекЭлемент.Значение.Вставить("Подчиненный", Ложь); + ИначеЕсли ТекЭлемент.Значение.Подчиненный Тогда + ПодчиненныеОбъектыБазы.Вставить(ТекЭлемент.Ключ, ТекЭлемент.Значение); КонецЕсли; КонецЦикла; - Возврат Результат; - -КонецФункции // НазначенияОбъектовБазы() +КонецПроцедуры // ЗаполнитьНазначенияОбъектовБазы() // Функция - возвращает описание назначения объекта базы // @@ -457,7 +472,7 @@ Функция НазначениеОбъектаБазы(ОписаниеОбъектаБазы) Если НЕ ТипЗнч(НазначенияОбъектовБазы) = Тип("Структура") Тогда - НазначенияОбъектовБазы = НазначенияОбъектовБазы(); + ЗаполнитьНазначенияОбъектовБазы(); КонецЕсли; ОписаниеНазначения = Новый Структура(); @@ -531,13 +546,9 @@ ТабличныеЧастиИВладельцы = Новый Соответствие(); - Для Каждого ТекНазначение Из НазначенияОбъектовБазы Цикл + Для Каждого ТекНазначение Из ПодчиненныеОбъектыБазы Цикл - Если НЕ ТекНазначение.Значение.Подчиненный Тогда - Продолжить; - КонецЕсли; - - ТаблицыБазы = ТаблицыБазы(СтрШаблон("%%_%1%%", ТекНазначение.Значение.ПрефиксВБазе)); + ТаблицыБазы = ТаблицыБазы(СтрШаблон("%%_%1%%", ТекНазначение.Значение.Префикс)); Для Каждого ТекТаблица Из ТаблицыБазы Цикл ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(ТекТаблица.Значение); @@ -663,17 +674,16 @@ ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, СтрДлина(ПрефиксОбъекта) + 1); Символ = Сред(ИмяОбъектаБазы, 1, 1); - ПозицияИмениТЧ = 0; - ПрефиксИмениТЧ = ""; - Для Каждого ТекЭлемент Из НазначенияОбъектовБазы Цикл - Если ТекЭлемент.Значение.Подчиненный Тогда - ПозицияИмениТЧ = СтрНайти(ИмяОбъектаБазы, СтрШаблон("_%1", ТекЭлемент.Значение.ПрефиксВБазе)); - Если ПозицияИмениТЧ > 0 Тогда - ПрефиксИмениТЧ = ТекЭлемент.Значение.ПрефиксВБазе; - Прервать; - КонецЕсли; + ПозицияИмениТЧ = СтрНайти(ИмяОбъектаБазы, "_"); + Если ПозицияИмениТЧ > 0 Тогда + ПрефиксИмениТЧ = ПрочитатьОднотипныеСимволы(Сред(ИмяОбъектаБазы, ПозицияИмениТЧ + 1)); + Если ПодчиненныеОбъектыБазы.Свойство(ПрефиксИмениТЧ) Тогда + ПрефиксИмениТЧ = ПодчиненныеОбъектыБазы[ПрефиксИмениТЧ].Префикс; + Иначе + ПозицияИмениТЧ = 0; + ПрефиксИмениТЧ = ""; КонецЕсли; - КонецЦикла; + КонецЕсли; Если ПозицияИмениТЧ > 0 Тогда ОписаниеОбъектаБазы.Владелец = @@ -724,17 +734,16 @@ // Возвращаемое значение: // Структура - имя объекта базы, префикс, индекс, владелец и суффикс (см. СтруктураОписанияОбъектаБазы()) // -Функция ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(СоответствиеИмениОбъектаИИд, ДобавлятьКолонки) +Функция ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(СоответствиеИмениОбъектаИИд, + ТабличныеЧасти = Неопределено, + КолонкиБазы = Неопределено); Имя = СтрШаблон("%1%2", СоответствиеИмениОбъектаИИд.Префикс, Формат(СоответствиеИмениОбъектаИИд.Индекс, "ЧРГ=; ЧГ=")); - КолонкиБазы = Новый Соответствие(); - Если ДобавлятьКолонки Тогда - КолонкиБазы = КолонкиБазы(); + Если НЕ ТипЗнч(КолонкиБазы) = Тип("Соответствие") Тогда + КолонкиБазы = Новый Соответствие(); КонецЕсли; - ТабличныеЧасти = ТабличныеЧастиИВладельцы(); - Если НазначениеОбъектаБазы(СоответствиеИмениОбъектаИИд).Назначение = "Поле" Тогда ОписаниеОбъектаБазы = КолонкиБазы[Имя]; Если ОписаниеОбъектаБазы = Неопределено Тогда @@ -808,11 +817,14 @@ // Функция ИмяМетаданных(ТекстОписания, ИдИлиОписаниеОбъектаБазы) + ИмяМетаданных = ""; + Если ТипЗнч(ИдИлиОписаниеОбъектаБазы) = Тип("Структура") Тогда + Ид = ""; Если ИдИлиОписаниеОбъектаБазы.Тип = "НомерСтроки" Тогда - Возврат "НомерСтроки"; + ИмяМетаданных = "НомерСтроки"; ИначеЕсли ИдИлиОписаниеОбъектаБазы.Тип = "Ссылка" Тогда - Возврат "Ссылка"; + ИмяМетаданных = "Ссылка"; Иначе Ид = ИдИлиОписаниеОбъектаБазы.Ид; КонецЕсли; @@ -820,21 +832,19 @@ Ид = ИдИлиОписаниеОбъектаБазы; КонецЕсли; - СмещениеОтИд = 3; - - ИмяМетаданных = ""; - Позиция = СтрНайти(ТекстОписания, Ид); - Если Позиция = 0 Тогда - Возврат ""; + Если НЕ ЗначениеЗаполнено(Ид) Тогда + Возврат ИмяМетаданных; КонецЕсли; - Позиция = Позиция + СтрДлина(Ид) + СмещениеОтИд; - Символ = Сред(ТекстОписания, Позиция, 1); - Пока НЕ Символ = """" Цикл - ИмяМетаданных = ИмяМетаданных + Символ; - Позиция = Позиция + 1; - Символ = Сред(ТекстОписания, Позиция, 1); - КонецЦикла; + РВ = Новый РегулярноеВыражение(СтрШаблон("%1},""([_a-zA-Zа-яА-ЯёЁ\d]+)""", Ид)); + + Совпадения = РВ.НайтиСовпадения(ТекстОписания); + + Если Совпадения.Количество() = 0 Тогда + ИмяМетаданных = ""; + Иначе + ИмяМетаданных = Совпадения[0].Группы[1].Значение; + КонецЕсли; Возврат ИмяМетаданных; @@ -984,29 +994,13 @@ Возврат ""; КонецЕсли; - НачалоСледующегоСимвола = 2; - - ПрочитанныеСимволы = ""; - - Символ = Сред(ИсходнаяСтрока, 1, 1); + Совпадения = РегуляркаОднотипныхСимволов.НайтиСовпадения(ИсходнаяСтрока); - ЧитатьЦифры = ЭтоЧисло(Символ); - - Пока НЕ (ЭтоЧисло(Символ) ИЛИ ЧитатьЦифры) - ИЛИ (ЭтоЧисло(Символ) И ЧитатьЦифры) Цикл - - ПрочитанныеСимволы = ПрочитанныеСимволы + Символ; - - Если СтрДлина(ИсходнаяСтрока) = 1 Тогда - ИсходнаяСтрока = ""; - Символ = ""; - Прервать; - КонецЕсли; - - ИсходнаяСтрока = Сред(ИсходнаяСтрока, НачалоСледующегоСимвола); - Символ = Сред(ИсходнаяСтрока, 1, 1); - - КонецЦикла; + Если Совпадения.Количество() = 0 Тогда + ПрочитанныеСимволы = ""; + Иначе + ПрочитанныеСимволы = Совпадения[0].Группы[0].Значение; + КонецЕсли; Возврат ПрочитанныеСимволы; @@ -1026,19 +1020,7 @@ Возврат Ложь; КонецЕсли; - Цифры = "0123456789"; - КоличествоТочек = 0; - - Для й = 1 По СтрДлина(Строка) Цикл - ТекущийСимвол = Сред(Строка, й, 1); - Если ТекущийСимвол = "." Тогда - КоличествоТочек = КоличествоТочек + 1; - ИначеЕсли СтрНайти(Цифры, ТекущийСимвол) = 0 Тогда - Возврат Ложь; - КонецЕсли; - КонецЦикла; - - Возврат НЕ (КоличествоТочек > 1); + Возврат РегуляркаПроверкиЧисла.Совпадает(Строка); КонецФункции // ЭтоЧисло() @@ -1059,7 +1041,10 @@ ТекущийСервер = ПодключениеКСУБД.Сервер(); База = _База; - НазначенияОбъектовБазы = НазначенияОбъектовБазы(); + ЗаполнитьНазначенияОбъектовБазы(); + + РегуляркаПроверкиЧисла = Новый РегулярноеВыражение("^\d+$|^\d+.\d+$"); + РегуляркаОднотипныхСимволов = Новый РегулярноеВыражение("^\d+|^[a-zAZ]+"); Лог = ПараметрыСистемы.Лог(); diff --git "a/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" "b/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" index 444137c..29f1c0c 100644 --- "a/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" +++ "b/src/core/\320\234\320\260\320\272\320\265\321\202\321\213/\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\320\221\320\2241\320\241.json" @@ -1,413 +1,413 @@ { "ACC": { - "ПрефиксВБазе": "Acc", + "Префикс": "Acc", "Тип": "ПланСчетов", "ТипАнгл": "ChartOfAccounts", "Назначение": "Основная" }, "ACCCHNGR": { - "ПрефиксВБазе": "AccChngR", + "Префикс": "AccChngR", "Тип": "ПланСчетов", "ТипАнгл": "ChartOfAccounts", "Назначение": "Изменения" }, "ACCOPT": { - "ПрефиксВБазе": "AccOpt", + "Префикс": "AccOpt", "Тип": "РегистрБухгалтерии", "ТипАнгл": "AccountingRegister", "Назначение": "Опции" }, "ACCRG": { - "ПрефиксВБазе": "AccRg", + "Префикс": "AccRg", "Тип": "РегистрБухгалтерии", "ТипАнгл": "AccountingRegister", "Назначение": "Основная" }, "ACCRGAT": { - "ПрефиксВБазе": "AccRgAT", + "Префикс": "AccRgAT", "Тип": "РегистрБухгалтерии", "ТипАнгл": "AccountingRegister", "Назначение": "ИтогиПоСчету" }, "ACCRGCHNGR": { - "ПрефиксВБазе": "AccRgChngR", + "Префикс": "AccRgChngR", "Тип": "РегистрБухгалтерии", "ТипАнгл": "AccountingRegister", "Назначение": "Изменения" }, "ACCRGCT": { - "ПрефиксВБазе": "AccRgCT", + "Префикс": "AccRgCT", "Тип": "РегистрБухгалтерии", "ТипАнгл": "AccountingRegister", "Назначение": "ОборотыМеждуСчетами" }, "ACCRGED": { - "ПрефиксВБазе": "AccRgED", + "Префикс": "AccRgED", "Тип": "РегистрБухгалтерии", "ТипАнгл": "AccountingRegister", "Назначение": "ЗначенияСубконто" }, "ACCRGOPT": { - "ПрефиксВБазе": "AccRgOpt", + "Префикс": "AccRgOpt", "Тип": "РегистрБухгалтерии", "ТипАнгл": "AccountingRegister", "Назначение": "НастройкиХраненияИтогов" }, "ACCSINF": { - "ПрефиксВБазе": "AccSInf", + "Префикс": "AccSInf", "Тип": "РегистрБухгалтерии", "ТипАнгл": "AccountingRegister", "Назначение": "ИнициализированныеОбласти" }, "ACCUMRG": { - "ПрефиксВБазе": "AccumRg", + "Префикс": "AccumRg", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "Основная" }, "ACCUMRGAGGGRIDK": { - "ПрефиксВБазе": "AccumRgAggGridK", + "Префикс": "AccumRgAggGridK", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "СетьАгрегатов" }, "ACCUMRGAGGOPTK": { - "ПрефиксВБазе": "AccumRgAggOptK", + "Префикс": "AccumRgAggOptK", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "ОпцииСетиАгрегатов" }, "ACCUMRGBFK": { - "ПрефиксВБазе": "AccumRgBfK", + "Префикс": "AccumRgBfK", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "БуферНовыхОборотов" }, "ACCUMRGCHNGR": { - "ПрефиксВБазе": "AccumRgChngR", + "Префикс": "AccumRgChngR", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "Изменения" }, "ACCUMRGDLK": { - "ПрефиксВБазе": "AccumRgDlK", + "Префикс": "AccumRgDlK", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "НовыеОбороты" }, "ACCUMRGOPT": { - "ПрефиксВБазе": "AccumRgOpt", + "Префикс": "AccumRgOpt", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "Опции" }, "ACCUMRGST": { - "ПрефиксВБазе": "AccumRgSt", + "Префикс": "AccumRgSt", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "Стаистика" }, "ACCUMRGT": { - "ПрефиксВБазе": "AccumRgT", + "Префикс": "AccumRgT", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "Остатки" }, "ACCUMRGTN": { - "ПрефиксВБазе": "AccumRgTn", + "Префикс": "AccumRgTn", "Тип": "РегистрНакопления", "ТипАнгл": "AccumulationRegister", "Назначение": "Обороты" }, "BPR": { - "ПрефиксВБазе": "BPr", + "Префикс": "BPr", "Тип": "БизнесПроцесс", "ТипАнгл": "BusinessProcess", "Назначение": "Основная" }, "BPRCHNGR": { - "ПрефиксВБазе": "BPrChngR", + "Префикс": "BPrChngR", "Тип": "БизнесПроцесс", "ТипАнгл": "BusinessProcess", "Назначение": "Изменения" }, "BPRPOINTS": { - "ПрефиксВБазе": "BPrPoints", + "Префикс": "BPrPoints", "Тип": "БизнесПроцесс", "ТипАнгл": "BusinessProcess", "Назначение": "ТочкиМаршрута" }, "CHRC": { - "ПрефиксВБазе": "Chrc", + "Префикс": "Chrc", "Тип": "ПланВидовХарактеристик", "ТипАнгл": "ChartOfCharacteristicTypes", "Назначение": "Основная" }, "CHRCCHNGR": { - "ПрефиксВБазе": "ChrcChngR", + "Префикс": "ChrcChngR", "Тип": "ПланВидовХарактеристик", "ТипАнгл": "ChartOfCharacteristicTypes", "Назначение": "Изменения" }, "CHRCOPT": { - "ПрефиксВБазе": "ChrcOpt", + "Префикс": "ChrcOpt", "Тип": "ПланВидовХарактеристик", "ТипАнгл": "ChartOfCharacteristicTypes", "Назначение": "Опции" }, "CHRCSINF": { - "ПрефиксВБазе": "ChrcSInf", + "Префикс": "ChrcSInf", "Тип": "ПланВидовХарактеристик", "ТипАнгл": "ChartOfCharacteristicTypes", "Назначение": "ИнициализированныеОбласти" }, "CKINDS": { - "ПрефиксВБазе": "CKinds", + "Префикс": "CKinds", "Тип": "ПланВидовРасчета", "ТипАнгл": "ChartOfCalculationTypes", "Назначение": "Основная" }, "CKINDSCHNGR": { - "ПрефиксВБазе": "CKindsChngR", + "Префикс": "CKindsChngR", "Тип": "ПланВидовРасчета", "ТипАнгл": "ChartOfCalculationTypes", "Назначение": "Изменения" }, "CKINDSOPT": { - "ПрефиксВБазе": "CKindsOpt", + "Префикс": "CKindsOpt", "Тип": "ПланВидовРасчета", "ТипАнгл": "ChartOfCalculationTypes", "Назначение": "Опции" }, "CKINDSSINF": { - "ПрефиксВБазе": "CKindsSInf", + "Префикс": "CKindsSInf", "Тип": "ПланВидовРасчета", "ТипАнгл": "ChartOfCalculationTypes", "Назначение": "ИнициализированныеОбласти" }, "CONST": { - "ПрефиксВБазе": "Const", + "Префикс": "Const", "Тип": "Константы", "ТипАнгл": "Constants", "Назначение": "Основная" }, "CONSTCHNGR": { - "ПрефиксВБазе": "ConstChngR", + "Префикс": "ConstChngR", "Тип": "Константы", "ТипАнгл": "Constants", "Назначение": "Изменения" }, "CONSTS": { - "ПрефиксВБазе": "Consts", + "Префикс": "Consts", "Тип": "Константа", "ТипАнгл": "Constant", "Назначение": "Основная" }, "CONSTSCHNGR": { - "ПрефиксВБазе": "ConstsChngR", + "Префикс": "ConstsChngR", "Тип": "Константа", "ТипАнгл": "Constant", "Назначение": "Изменения" }, "CRG": { - "ПрефиксВБазе": "CRg", + "Префикс": "CRg", "Тип": "РегистрРасчета", "ТипАнгл": "CalculationRegister", "Назначение": "Основная" }, "CRGCHNGR": { - "ПрефиксВБазе": "CRgChngR", + "Префикс": "CRgChngR", "Тип": "РегистрРасчета", "ТипАнгл": "CalculationRegister", "Назначение": "Изменения" }, "CRGACTPER": { - "ПрефиксВБазе": "CRgActPer", + "Префикс": "CRgActPer", "Тип": "РегистрРасчета", "ТипАнгл": "CalculationRegister", "Назначение": "ФактическиеПериодыДействия" }, "CRGRECALC": { - "ПрефиксВБазе": "CRgRecalc", + "Префикс": "CRgRecalc", "Тип": "РегистрРасчета", "ТипАнгл": "CalculationRegister", "Назначение": "Перерасчеты" }, "CRGRECALCCHNGR": { - "ПрефиксВБазе": "CRgRecalcChngR", + "Префикс": "CRgRecalcChngR", "Тип": "РегистрРасчета", "ТипАнгл": "CalculationRegister", "Назначение": "ПерерасчетыИзменения" }, "DOCUMENT": { - "ПрефиксВБазе": "Document", + "Префикс": "Document", "Тип": "Документ", "ТипАнгл": "Document", "Назначение": "Основная" }, "DOCUMENTCHNGR": { - "ПрефиксВБазе": "DocumentChngR", + "Префикс": "DocumentChngR", "Тип": "Документ", "ТипАнгл": "Document", "Назначение": "Изменения" }, "DOCUMENTJOURNAL": { - "ПрефиксВБазе": "DocumentJournal", + "Префикс": "DocumentJournal", "Тип": "ЖурналДокументов", "ТипАнгл": "DocumentJournal", "Назначение": "Основная" }, "ENUM": { - "ПрефиксВБазе": "Enum", + "Префикс": "Enum", "Тип": "Перечисление", "ТипАнгл": "Enum", "Назначение": "Основная" }, "INFORG": { - "ПрефиксВБазе": "InfoRg", + "Префикс": "InfoRg", "Тип": "РегистрСведений", "ТипАнгл": "InformationRegister", "Назначение": "Основная" }, "INFORGCHNGR": { - "ПрефиксВБазе": "InfoRgChngR", + "Префикс": "InfoRgChngR", "Тип": "РегистрСведений", "ТипАнгл": "InformationRegister", "Назначение": "Изменения" }, "INFORGOPT": { - "ПрефиксВБазе": "InfoRgOpt", + "Префикс": "InfoRgOpt", "Тип": "РегистрСведений", "ТипАнгл": "InformationRegister", "Назначение": "Опции" }, "INFORGSF": { - "ПрефиксВБазе": "InfoRgSF", + "Префикс": "InfoRgSF", "Тип": "РегистрСведений", "ТипАнгл": "InformationRegister", "Назначение": "СрезПервых" }, "INFORGSL": { - "ПрефиксВБазе": "InfoRgSL", + "Префикс": "InfoRgSL", "Тип": "РегистрСведений", "ТипАнгл": "InformationRegister", "Назначение": "СрезПоследних" }, "INTEGSERVICESETTINGS": { - "ПрефиксВБазе": "IntegServiceSettings", + "Префикс": "IntegServiceSettings", "Тип": "СервисИнтеграции", "ТипАнгл": "InterationService", "Назначение": "Основная" }, "NODE": { - "ПрефиксВБазе": "Node", + "Префикс": "Node", "Тип": "ПланОбмена", "ТипАнгл": "ExchangePlan", "Назначение": "Основная" }, "REFERENCE": { - "ПрефиксВБазе": "Reference", + "Префикс": "Reference", "Тип": "Справочник", "ТипАнгл": "Catalog", "Назначение": "Основная" }, "REFERENCECHNGR": { - "ПрефиксВБазе": "ReferenceChngR", + "Префикс": "ReferenceChngR", "Тип": "Справочник", "ТипАнгл": "Catalog", "Назначение": "Изменения" }, "REFOPT": { - "ПрефиксВБазе": "RefOpt", + "Префикс": "RefOpt", "Тип": "Справочник", "ТипАнгл": "Catalog", "Назначение": "Опции" }, "REFSINF": { - "ПрефиксВБазе": "RefSInf", + "Префикс": "RefSInf", "Тип": "Справочник", "ТипАнгл": "Catalog", "Назначение": "ИнициализированныеОбласти" }, "SCHEDULEDJOBS": { - "ПрефиксВБазе": "ScheduledJobs", + "Префикс": "ScheduledJobs", "Тип": "РегламентноеЗадание", "ТипАнгл": "ScheduledJob", "Назначение": "Основная" }, "SEQ": { - "ПрефиксВБазе": "Seq", + "Префикс": "Seq", "Тип": "Последовательность", "ТипАнгл": "Sequence", "Назначение": "Основная" }, "SEQCHNGR": { - "ПрефиксВБазе": "SeqChngR", + "Префикс": "SeqChngR", "Тип": "Последовательность", "ТипАнгл": "Sequence", "Назначение": "Изменения" }, "TASK": { - "ПрефиксВБазе": "Task", + "Префикс": "Task", "Тип": "Задача", "ТипАнгл": "Task", "Назначение": "Основная" }, "TASKCHNGR": { - "ПрефиксВБазе": "TaskChngR", + "Префикс": "TaskChngR", "Тип": "Задача", "ТипАнгл": "Task", "Назначение": "Изменения" }, "VT": { - "ПрефиксВБазе": "VT", + "Префикс": "VT", "Подчиненный" : true, "Тип": "ТабличнаяЧасть", "ТипАнгл": "TabularSection", "Назначение": "ТабличнаяЧасть" }, "EXTDIM": { - "ПрефиксВБазе": "ExtDim", + "Префикс": "ExtDim", "Подчиненный" : true, "Тип": "ВидыСубконто", "ТипАнгл": "ExtDimensionTypes", "Назначение": "ТабличнаяЧасть" }, "LEADINGCK": { - "ПрефиксВБазе": "LeadingCK", + "Префикс": "LeadingCK", "Подчиненный" : true, "Тип": "ВедущиеВидыРасчета", "ТипАнгл": "LeadingCalculationTypes", "Назначение": "ТабличнаяЧасть" }, "BASECK": { - "ПрефиксВБазе": "BaseCK", + "Префикс": "BaseCK", "Подчиненный" : true, "Тип": "БазовыеВидыРасчета", "ТипАнгл": "BaseCalculationTypes", "Назначение": "ТабличнаяЧасть" }, "DISPLACEDCK": { - "ПрефиксВБазе": "DisplacedCK", + "Префикс": "DisplacedCK", "Подчиненный" : true, "Тип": "ВытесняющиеВидыРасчета ", "ТипАнгл": "DisplacingCalculationTypes", "Назначение": "ТабличнаяЧасть " }, "FLD": { - "ПрефиксВБазе": "Fld", + "Префикс": "Fld", "Тип": "Поле", "ТипАнгл": "Field", "Назначение": "Поле" }, "LINENO": { - "ПрефиксВБазе": "LineNo", + "Префикс": "LineNo", "Тип": "НомерСтроки", "ТипАнгл": "LineNumber", "Назначение": "Поле" }, "CONFIG": { - "ПрефиксВБазе": "Config", + "Префикс": "Config", "Тип": "Конфигурация", "ТипАнгл": "Configuration", "Назначение": "Конфигурация" From e503745f7894b0d416f3cb0cc2e832a665792f00 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Sun, 29 May 2022 15:10:46 +0300 Subject: [PATCH 30/38] =?UTF-8?q?refactor:=20=D0=98=D1=81=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B5=20=D1=81=D1=83?= =?UTF-8?q?=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B1=D0=B0=D0=B7=D1=8B=20=D0=B2=D1=8B=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=83=D0=B2=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BF=D0=BE=D1=81=D1=80=D0=B5=D0=B4=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=20=D0=B8=D0=B7=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\320\265\320\275\320\270\320\265MSSQL.os" | 74 +++++++------------ 1 file changed, 25 insertions(+), 49 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" index 2a114d7..ec22e15 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" @@ -95,6 +95,12 @@ ИначеЕсли ВариантСообщенияОСуществовании = ВариантыСообщения.СообщатьОбОтсутствии И НЕ Результат Тогда Лог.Предупреждение("База ""%1"" не существует!", База); + ИначеЕсли ВариантСообщенияОСуществовании = ВариантыСообщения.ИсключениеПриСуществовании + И Результат Тогда + ВызватьИсключение СтрШаблон("База ""%1"" уже существует!", База); + ИначеЕсли ВариантСообщенияОСуществовании = ВариантыСообщения.ИсключениеПриОтсутствии + И НЕ Результат Тогда + ВызватьИсключение СтрШаблон("База ""%1"" не существует!", База); ИначеЕсли Результат Тогда Лог.Отладка("База ""%1"" существует!", База); Иначе @@ -219,10 +225,7 @@ // Функция ПолучитьМодельВосстановления(База) Экспорт - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; | @@ -273,10 +276,7 @@ ВызватьИсключение ТекстОшибки; КонецЕсли; - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ТекстЗапроса = СтрШаблон("""USE [master]; | @@ -308,10 +308,7 @@ // Функция ПолучитьВладельцаБазы(База) Экспорт - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; | @@ -356,10 +353,7 @@ // Процедура УстановитьВладельцаБазы(База, НовыйВладелец) Экспорт - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); РезультатЗапроса = ""; ТекстЗапроса = СтрШаблон("""ALTER AUTHORIZATION ON DATABASE::%1 TO %2""", База, НовыйВладелец); @@ -383,10 +377,7 @@ // Процедура СжатьБазу(База) Экспорт - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ТекстЗапроса = СтрШаблон("""DBCC SHRINKDATABASE(N'%1', 0)""", База); @@ -410,10 +401,7 @@ // Процедура СжатьФайлЖурналаТранзакций(База) Экспорт - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ЛогическоеИмяФайлаЖурнала = ПолучитьЛогическоеИмяФайлаВБазе(База, "L"); @@ -462,10 +450,7 @@ Возврат; КонецЕсли; - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ТекстЗапроса = СтрШаблон("""USE [%1];", База); Если КомпрессияТаблиц Тогда @@ -503,10 +488,7 @@ // Процедура СоздатьРезервнуюКопию(База, Знач ПутьКРезервнойКопии) Экспорт - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии); @@ -711,10 +693,7 @@ ВызватьИсключение ТекстОшибки; КонецЕсли; - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; | @@ -766,10 +745,7 @@ Возврат; КонецЕсли; - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ТекстЗапроса = СтрШаблон("""USE [master]; | @@ -1298,10 +1274,7 @@ // Функция ВерсияФорматаКонфигурации1С(База) Экспорт - Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда - ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База); - ВызватьИсключение ТекстОшибки; - КонецЕсли; + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; | SELECT @@ -1628,8 +1601,9 @@ ПутьКФайлуРезультата = ПолучитьИмяВременногоФайла(); КомандаРК.ДобавитьПараметр(СтрШаблон("-o ""%1""", ПутьКФайлуРезультата)); - КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы( Ложь ); - КомандаРК.ПоказыватьВыводНемедленно( Ложь ); + КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы(Ложь); + КомандаРК.УстановитьОбработчикОжидания(Неопределено, 10); + КомандаРК.ПоказыватьВыводНемедленно(Ложь); КодВозврата = КомандаРК.Исполнить(); @@ -1775,9 +1749,11 @@ Функция ВариантыСообщенияОСуществованииБД() ВариантыСообщения = Новый Структура(); - ВариантыСообщения.Вставить("НеСообщать" , "НЕСООБЩАТЬ"); - ВариантыСообщения.Вставить("СообщатьОСуществовании", "СООБЩАТЬОСУЩЕСТВОВАНИИ"); - ВариантыСообщения.Вставить("СообщатьОбОтсутствии" , "СООБЩАТЬОБОТСУТСТВИИ"); + ВариантыСообщения.Вставить("НеСообщать" , "НЕСООБЩАТЬ"); + ВариантыСообщения.Вставить("СообщатьОСуществовании" , "СООБЩАТЬОСУЩЕСТВОВАНИИ"); + ВариантыСообщения.Вставить("ИсключениеПриСуществовании", "ИСКЛЮЧЕНИЕПРИСУЩЕСТВОВАНИИ"); + ВариантыСообщения.Вставить("СообщатьОбОтсутствии" , "СООБЩАТЬОБОТСУТСТВИИ"); + ВариантыСообщения.Вставить("ИсключениеПриОтсутствии" , "ИСКЛЮЧЕНИЕПРИОТСУТСТВИИ"); Возврат Новый ФиксированнаяСтруктура(ВариантыСообщения); From 6bbf7f1d277bc81f60f919724c10e839147d69cc Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Mon, 30 May 2022 12:35:16 +0300 Subject: [PATCH 31/38] =?UTF-8?q?refactor:=20=D0=9F=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D1=85=D1=80=D0=B0=D0=BD=D1=8F=D1=89=D0=B8=D1=85=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B3=D1=83=D0=BB=D1=8F=D1=80=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=B2=D1=8B=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F;=20?= =?UTF-8?q?=D0=97=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B1=D0=B0=D0=B7=D1=8B=20?= =?UTF-8?q?=D0=B2=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B5=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=B2=D1=8B=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D0=BE=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8E;=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B1=D0=B0=D0=B7=D1=8B=20=D0=B2=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=BC=D1=83=20?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85;=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D1=8B=20=D0=B8=D0=B7=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=BC=D1=83=20?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\275\320\270\321\217\320\230\320\221.os" | 127 ++++++++++++------ tests/ib-structure-tests.os | 33 ++++- 2 files changed, 112 insertions(+), 48 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index f0e1a77..03f70c0 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -15,8 +15,8 @@ Перем НазначенияОбъектовБазы; // - Структура - соответствие назначений объектов // префиксам имен объектов БД Перем ПодчиненныеОбъектыБазы; // - Структура - назначения табличных частей префиксам имен объектов БД -Перем РегуляркаПроверкиЧисла; // - РегулярноеВыражение - регулярное выражение для проверки числа -Перем РегуляркаОднотипныхСимволов; // - РегулярноеВыражение - регулярное выражение для проверки числа +Перем ВыражениеПроверкиЧисла; // - РегулярноеВыражение - регулярное выражение для проверки числа +Перем ВыражениеОднотипныхСимволов; // - РегулярноеВыражение - регулярное выражение для проверки числа Перем Лог; // - Объект - объект записи лога приложения #Область ПрограммныйИнтерфейс @@ -113,7 +113,7 @@ // ДобавлятьКолонки - Строка - Истина - будет добавлена информация для колонок таблиц // // Возвращаемое значение: -// Соответствие - соответствия имен таблиц СУБД и описаний метаданных +// Соответствие - соответствия имен таблиц СУБД и полных имен метаданных 1С описаниям объектов метаданных 1С // Функция ОписаниеМетаданныхОбъектовБД1С(ДобавлятьКолонки = Ложь) Экспорт @@ -132,48 +132,25 @@ Для Каждого ТекЭлемент Из ИменаТаблицОбъектовКонфигурации1С Цикл - Имя = СтрШаблон("%1%2", ТекЭлемент.Значение.Префикс, Формат(ТекЭлемент.Значение.Индекс, "ЧРГ=; ЧГ=")); - ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(ТекЭлемент.Значение, ТабличныеЧасти, КолонкиБазы); - Если НЕ ОписанияМетаданных[Имя] = Неопределено - ИЛИ ОписаниеОбъектаБазы = Неопределено Тогда - Продолжить; - КонецЕсли; + ОписаниеВладельца = ЗаполнитьОписаниеОбъектаБазыИВладельцев(ОписаниеОбъектаБазы, + ОписанияМетаданных, + ИменаТаблицОбъектовКонфигурации1С, + СоответствиеИменМетаданных); - ОписаниеВладельца = ОписаниеОбъектаБазы; - Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл - ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; - ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); - Если НазначениеОбъектаБазы(ОписаниеВладельца).Подчиненный Тогда - ОписанияМетаданных.Вставить(СтрШаблон("%1_%2", ОписаниеВладельца.Владелец.Имя, ОписаниеВладельца.Имя), - ОписаниеВладельца); - КонецЕсли; - ОписаниеВладельца = ОписаниеВладельца.Владелец; - КонецЦикла; - - Если ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя] = Неопределено Тогда - Продолжить; + Если ЗначениеЗаполнено(ОписаниеВладельца) Тогда + ОписанияМетаданных.Вставить(ОписаниеВладельца.ПолноеИмяМетаданных, ОписаниеВладельца); КонецЕсли; - - ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; - - Если НЕ СоответствиеИменМетаданных[ОписаниеВладельца.Ид] = Неопределено Тогда - ОписаниеВладельца.ИмяМетаданных = СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных; - КонецЕсли; - - ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); ТекОписание = ОписаниеОбъектаБазы; Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл - ТекОписание.ИмяМетаданных = - ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание); + ОписанияМетаданных.Вставить(ТекОписание.ПолноеИмяМетаданных, ТекОписание); ТекОписание = ТекОписание.Владелец; КонецЦикла; - ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы(ОписаниеОбъектаБазы); КонецЦикла; Возврат ОписанияМетаданных; @@ -728,24 +705,29 @@ // Функция - подготавливает описание объекта базы по описанию соответствия имени объекта базы и UUID // // Параметры: -// СоответствиеИмениОбъектаИИд - Структура - описание соответствия имени объекта базы и UUID -// ДобавлятьКолонки - Строка - Истина - будет добавлена информация для колонок таблиц +// СоответствиеИмениОбъектаИИд - Структура - описание соответствия имени объекта базы и UUID +// ТабличныеЧасти - Соответствие - описания табличных частей +// Колонки - Строка - описания колонок // // Возвращаемое значение: // Структура - имя объекта базы, префикс, индекс, владелец и суффикс (см. СтруктураОписанияОбъектаБазы()) // Функция ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(СоответствиеИмениОбъектаИИд, ТабличныеЧасти = Неопределено, - КолонкиБазы = Неопределено); + Колонки = Неопределено); Имя = СтрШаблон("%1%2", СоответствиеИмениОбъектаИИд.Префикс, Формат(СоответствиеИмениОбъектаИИд.Индекс, "ЧРГ=; ЧГ=")); - Если НЕ ТипЗнч(КолонкиБазы) = Тип("Соответствие") Тогда - КолонкиБазы = Новый Соответствие(); + Если НЕ ТипЗнч(ТабличныеЧасти) = Тип("Соответствие") Тогда + ТабличныеЧасти = Новый Соответствие(); + КонецЕсли; + + Если НЕ ТипЗнч(Колонки) = Тип("Соответствие") Тогда + Колонки = Новый Соответствие(); КонецЕсли; Если НазначениеОбъектаБазы(СоответствиеИмениОбъектаИИд).Назначение = "Поле" Тогда - ОписаниеОбъектаБазы = КолонкиБазы[Имя]; + ОписаниеОбъектаБазы = Колонки[Имя]; Если ОписаниеОбъектаБазы = Неопределено Тогда Возврат Неопределено; КонецЕсли; @@ -761,6 +743,65 @@ КонецФункции // ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд() +// Функция - подготавливает описание объекта базы по описанию соответствия имени объекта базы и UUID +// +// Параметры: +// ОписаниеОбъектаБазы - Структура - описание метаданных 1С объекта базы +// ОписанияМетаданных - Соответствие - соответствия имен таблиц СУБД и полных имен метаданных 1С +// описаниям объектов метаданных 1С +// ИменаТаблицОбъектовКонфигурации1С - Соответствие - соответствия UUID объектов метаданных +// конфигурации 1С именам объектов СУБД +// СоответствиеИменМетаданных - Соответствие - соответствия UUID метаданных и имен метаданных +// +// Возвращаемое значение: +// Структура - описание корневого владельца объекта базы +// +Функция ЗаполнитьОписаниеОбъектаБазыИВладельцев(ОписаниеОбъектаБазы, + ОписанияМетаданных, + ИменаТаблицОбъектовКонфигурации1С, + СоответствиеИменМетаданных); + + Если НЕ ОписанияМетаданных[ОписаниеОбъектаБазы.Имя] = Неопределено + ИЛИ ОписаниеОбъектаБазы = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ОписаниеВладельца = ОписаниеОбъектаБазы; + Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл + ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; + ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); + Если НазначениеОбъектаБазы(ОписаниеВладельца).Подчиненный Тогда + ИмяОбъектаБазы = СтрШаблон("%1_%2", ОписаниеВладельца.Владелец.Имя, ОписаниеВладельца.Имя); + ОписанияМетаданных.Вставить(ИмяОбъектаБазы, ОписаниеВладельца); + КонецЕсли; + ОписаниеВладельца = ОписаниеВладельца.Владелец; + КонецЦикла; + + Если ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя] = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид; + + Если НЕ СоответствиеИменМетаданных[ОписаниеВладельца.Ид] = Неопределено Тогда + ОписаниеВладельца.ИмяМетаданных = СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных; + КонецЕсли; + + ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца); + + ТекОписание = ОписаниеОбъектаБазы; + Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл + ТекОписание.ИмяМетаданных = + ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание); + ТекОписание = ТекОписание.Владелец; + КонецЦикла; + + ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы(ОписаниеОбъектаБазы); + + Возврат ОписаниеВладельца; + +КонецФункции // ЗаполнитьОписаниеОбъектаБазыИВладельцев() + // Функция - собирает полное имя объекта метаданных по описанию с учетом всех владельцев // например (Справочник.Справочник1.Реквизит1, Документ.ТабличнаяЧасть2.Реквизит8) // @@ -994,7 +1035,7 @@ Возврат ""; КонецЕсли; - Совпадения = РегуляркаОднотипныхСимволов.НайтиСовпадения(ИсходнаяСтрока); + Совпадения = ВыражениеОднотипныхСимволов.НайтиСовпадения(ИсходнаяСтрока); Если Совпадения.Количество() = 0 Тогда ПрочитанныеСимволы = ""; @@ -1020,7 +1061,7 @@ Возврат Ложь; КонецЕсли; - Возврат РегуляркаПроверкиЧисла.Совпадает(Строка); + Возврат ВыражениеПроверкиЧисла.Совпадает(Строка); КонецФункции // ЭтоЧисло() @@ -1043,8 +1084,8 @@ ЗаполнитьНазначенияОбъектовБазы(); - РегуляркаПроверкиЧисла = Новый РегулярноеВыражение("^\d+$|^\d+.\d+$"); - РегуляркаОднотипныхСимволов = Новый РегулярноеВыражение("^\d+|^[a-zAZ]+"); + ВыражениеПроверкиЧисла = Новый РегулярноеВыражение("^\d+$|^\d+.\d+$"); + ВыражениеОднотипныхСимволов = Новый РегулярноеВыражение("^\d+|^[a-zAZ]+"); Лог = ПараметрыСистемы.Лог(); diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index de314ff..727b8da 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -221,7 +221,7 @@ ОписаниеОбъектовМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектовБД1С(); ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, - | не найдено имя для объекта БД ""%1"" справочника", + | не найдено описание для объекта БД ""%1"" справочника", ИмяОбъектаБДСправочника); Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДСправочника].ПолноеИмяМетаданных, @@ -229,7 +229,7 @@ ТекстОшибки); ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, - | не найдено имя для объекта БД ""%1"" табличной части по полному имени", + | не найдено описание для объекта БД ""%1"" табличной части по полному имени", ИмяОбъектаБДТабличнойЧасти); Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧасти].ПолноеИмяМетаданных, @@ -237,13 +237,29 @@ ТекстОшибки); ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, - | не найдено имя для объекта БД ""%1"" табличной части по сокращенному имени", + | не найдено описание для объекта БД ""%1"" табличной части по сокращенному имени", ИмяОбъектаБДТабличнойЧастиСокр); Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧастиСокр].ПолноеИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки); + ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, + | не найдено описание для объекта метаданных ""%1"" справочника", + ИмяСправочника); + + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяСправочника].Имя, + ИмяОбъектаБДСправочника, + ТекстОшибки); + + ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, + | не найдено описание для объекта метаданных ""%1"" табличной части", + ИмяТабличнойЧасти); + + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяТабличнойЧасти].Имя, + ИмяОбъектаБДТабличнойЧастиСокр, + ТекстОшибки); + КонецПроцедуры // ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1С() &Тест @@ -258,7 +274,6 @@ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); ИмяОбъектаБДПоля = "Fld35"; - ИмяРеквизита = "Справочник.Справочник1.Реквизит1"; СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); @@ -266,13 +281,21 @@ ОписаниеОбъектовМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектовБД1С(Истина); ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, - | не найдено имя для объекта БД ""%1"" реквизита", + | не найдено описание для объекта БД ""%1"" реквизита", ИмяОбъектаБДПоля); Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДПоля].ПолноеИмяМетаданных, ИмяРеквизита, ТекстОшибки); + ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С, + | не найдено описание для объекта метаданных ""%1""", + ИмяРеквизита); + + Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяРеквизита].Имя, + ИмяОбъектаБДПоля, + ТекстОшибки); + КонецПроцедуры // ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1ССПолями() &Тест From b3f1254c77fe98d68235706bce526e3c779cbbd3 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Tue, 31 May 2022 09:29:30 +0300 Subject: [PATCH 32/38] =?UTF-8?q?style:=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83?= =?UTF-8?q?=D1=80=20=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\276\321\202\320\260\320\241NextCloud.os" | 2 +- ...262\320\265\321\200\320\276\320\274SSH.os" | 4 +- ...21\201\320\224\320\270\321\201\320\272.os" | 15 ++---- ...20\275\320\270\321\217\320\230\320\221.os" | 50 ++++++++++--------- ...21\202\320\260\320\241\320\230\320\221.os" | 14 +++--- ...20\271\320\273\320\260\320\274\320\270.os" | 12 ++--- 6 files changed, 47 insertions(+), 50 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241NextCloud.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241NextCloud.os" index 00d7870..4d44f88 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241NextCloud.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241NextCloud.os" @@ -164,7 +164,7 @@ // ПутьНаДиске - Строка - расположение файла на сервисе NextCloud // // Возвращаемое значение: -// Булево - Истина - Файл / каталг существует +// Булево - Истина - файл / каталог существует // Функция Существует(Знач ПутьНаДиске) Экспорт diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\265\321\200\320\262\320\265\321\200\320\276\320\274SSH.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\265\321\200\320\262\320\265\321\200\320\276\320\274SSH.os" index dd4932a..55a3c0c 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\265\321\200\320\262\320\265\321\200\320\276\320\274SSH.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\241\320\265\321\200\320\262\320\265\321\200\320\276\320\274SSH.os" @@ -207,7 +207,7 @@ // ПутьНаДиске - Строка - расположение файла на сервере SFTP // // Возвращаемое значение: -// Булево - Истина - Файл / каталг существует +// Булево - Истина - файл / каталог существует // Функция Существует(Знач ПутьНаДиске) Экспорт @@ -268,7 +268,7 @@ // Процедура - удаляет каталог на сервере SFTP // // Параметры: -// ПутьНаДиске - Строка - расположение каталог на сервере SFTP +// ПутьНаДиске - Строка - расположение каталога на сервере SFTP // Процедура УдалитьКаталог(Знач ПутьНаДиске) Экспорт diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" index caedc4b..eb4dd59 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" @@ -42,15 +42,12 @@ КонецПроцедуры // УстановитьПараметрыСоединения() -// Создает каталог на Yandex-диске +// Процедура - Создает каталог на Yandex-диске // // Параметры: // ЦелевойПуть - ЯндексДиск - путь на yandex-диске к создаваемому каталогу // -// Возвращаемое значение: -// Строка - Созданный путь -// -Функция СоздатьКаталог(Знач ЦелевойПуть) Экспорт +Процедура СоздатьКаталог(Знач ЦелевойПуть) Экспорт КаталогНайден = Ложь; Попытка @@ -80,15 +77,13 @@ КонецПопытки; КонецЕсли; - Возврат ТекущийПуть; - -КонецФункции // СоздатьКаталог() +КонецПроцедуры // СоздатьКаталог() // Функция отправки файла на Yandex-Диск // // Параметры: // ПутьКФайлу - Строка - путь к отправляемому файлу -// ЦелевойПуть - ЯндексДиск - путь на yandex-диске, куда будет загружен файл +// ЦелевойПуть - Строка - путь на yandex-диске, куда будет загружен файл // Перезаписывать - Булево - перезаписать файл на Яндекс-диске при загрузке // Процедура ОтправитьФайл(Знач ПутьКФайлу, Знач ЦелевойПуть, Перезаписывать = Ложь) Экспорт @@ -190,7 +185,7 @@ // ПутьНаДиске - Строка - расположение файла на Yandex-Диске // // Возвращаемое значение: -// Булево - Истина - Файл / каталг существует +// Булево - Истина - файл / каталог существует // Функция Существует(Знач ПутьНаДиске) Экспорт diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index 03f70c0..eb4ad98 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -61,7 +61,7 @@ // ИмяОбъекта - Строка - Имя таблицы или поля таблицы СУБД // // Возвращаемое значение: -// Структура - описание метаданных 1С по имени объекта СУБД +// Структура - описание метаданных 1С по имени объекта СУБД (см. СтруктураОписанияОбъектаБазы()) // Функция ОписаниеМетаданныхОбъектаБД1С(Знач ИмяОбъекта) Экспорт @@ -107,13 +107,14 @@ КонецФункции // ОписаниеМетаданныхОбъектаБД1С() -// Функция - возвращает описание метаданных 1С для таблиц СУБД +// Функция - возвращает описание метаданных 1С для таблиц и полей таблиц СУБД // // Параметры: -// ДобавлятьКолонки - Строка - Истина - будет добавлена информация для колонок таблиц +// ДобавлятьКолонки - Булево - Истина - будет добавлена информация для колонок таблиц // // Возвращаемое значение: // Соответствие - соответствия имен таблиц СУБД и полных имен метаданных 1С описаниям объектов метаданных 1С +// (см. СтруктураОписанияОбъектаБазы()) // Функция ОписаниеМетаданныхОбъектовБД1С(ДобавлятьКолонки = Ложь) Экспорт @@ -160,14 +161,14 @@ // Функция - возвращает описание занимаеиого места в базе MS SQL Server // // Возвращаемое значение: -// Структура - описание занимаего места -// * РазмерБазы - Число - размер текущей базы данных в байтах, включает файлы данных и журналов -// * Свободно - Число - место в базе данных, не зарезервированное для объектов базы данных -// * Зарезервировано - Число - общий объем, выделенный объектам в базе данных -// * Данные - Число - общий объем, используемый данными -// * Индексы - Число - общий объем, используемый индексами -// * НеИспользуется - Число - общий объем, зарезервированный для объектов в базе данных, -// но пока не используемый +// Структура - описание занимаего места +// * РазмерБазы - Число - размер текущей базы данных в байтах, включает файлы данных и журналов +// * Свободно - Число - место в базе данных, не зарезервированное для объектов базы данных +// * Зарезервировано - Число - общий объем, выделенный объектам в базе данных +// * Данные - Число - общий объем, используемый данными +// * Индексы - Число - общий объем, используемый индексами +// * НеИспользуется - Число - общий объем, зарезервированный для объектов в базе данных, +// но пока не используемый // Функция ЗанимаемоеМесто() Экспорт @@ -600,19 +601,20 @@ // Функция - возвращает структуру описания объекта базы данных 1С // // Возвращаемое значение: -// Структура - структура описания объекта базы -// *Владелец - Структура - структура описания объекта владельца -// *Тип - Строка - тип объекта или коллекция -// (например: Справочник, Документ, ТабличнаяЧасть, Поле) -// *ТипАнгл - Строка - тип объекта или коллекция на английском -// (например: Reference, Document, TabularSection, Field) -// *Назначение - Строка - назначение таблицы БД (например: Основная, Итоги, Обороты) -// *Имя - Строка - имя объекта в БД (Префикс + Индекс) -// *Префикс - Строка - префикс объекта (например: Reference, Document, VT, Fld)) -// *Индекс - Число - числовой индекс объекта -// *Суффикс - Строка - дополнительный суффикс имени объекта (например: "_RRef") -// *Ид - Строка - UUID объекта 1С -// *ИмяМетаданных - Строка - имя метаданных 1С +// Структура - структура описания объекта базы +// *Владелец - Структура - структура описания объекта владельца +// *Тип - Строка - тип объекта или коллекция +// (например: Справочник, Документ, ТабличнаяЧасть, Поле) +// *ТипАнгл - Строка - тип объекта или коллекция на английском +// (например: Reference, Document, TabularSection, Field) +// *Назначение - Строка - назначение таблицы БД (например: Основная, Итоги, Обороты) +// *Имя - Строка - имя объекта в БД (Префикс + Индекс) +// *Префикс - Строка - префикс объекта (например: Reference, Document, VT, Fld)) +// *Индекс - Число - числовой индекс объекта +// *Суффикс - Строка - дополнительный суффикс имени объекта (например: "_RRef") +// *Ид - Строка - UUID объекта 1С +// *ИмяМетаданных - Строка - имя метаданных 1С +// *ПолноеИмяМетаданных - Строка - имя метаданных 1С // Функция СтруктураОписанияОбъектаБазы() diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\230\320\221.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\230\320\221.os" index 1d147b6..eea05bc 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\230\320\221.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\230\320\221.os" @@ -25,7 +25,7 @@ // * Пароль - Строка - пароль пользователя базы 1С // ПутьКФайлу - Строка - путь к DT-файлу для выгрузки базы 1С // ИспользуемаяВерсияПлатформы - Строка - маска версии 1С -// КлючРазрешения - Строка - ключь разрешения входа в заблоrированную серверную базу 1С (/UC) +// КлючРазрешения - Строка - ключ разрешения входа в заблоrированную серверную базу 1С (/UC) // Процедура ВыгрузитьИнформационнуюБазуВФайл(Знач ПараметрыИБ, Знач ПутьКФайлу, @@ -72,9 +72,9 @@ // * СтрокаПодключения - Строка - строка подключения к базе 1С // * Пользователь - Строка - имя пользователя базы 1С // * Пароль - Строка - пароль пользователя базы 1С -// ПутьКФайлу - Строка - путь к DT-файлу для выгрузки базы 1С +// ПутьКФайлу - Строка - путь к DT-файлу для загрузки в базу 1С // ИспользуемаяВерсияПлатформы - Строка - маска версии 1С -// КлючРазрешения - Строка - ключь разрешения входа в заблоrированную серверную базу 1С (/UC) +// КлючРазрешения - Строка - ключ разрешения входа в заблоrированную серверную базу 1С (/UC) // Процедура ЗагрузитьИнформационнуюБазуИзФайла(Знач ПараметрыИБ, Знач ПутьКФайлу, @@ -240,7 +240,7 @@ КонецПроцедуры // ОтключитьОтХранилища() -// Выполняет отключение информационной базы от хранилища конфигурации +// Выполняет подключение информационной базы к хранилищу конфигурации // // Параметры: // ПараметрыИБ - Структура - параметры подключения к базе 1С @@ -328,8 +328,8 @@ // * РазрешитьВыдачуЛицензий - Булево - Истина - разрешить выдачу лицензий сервером 1С (по умолчанию: Истина) // * РазрешитьРегЗадания - Булево - Истина - разрешить запуск рег. заданий (по умолчанию: Ложь) // ПараметрыСУБД - Структура -// * ТипСУБД - Строка - Тип сервера СУБД ("MSSQLServer" <по умолчанию>; -// "PostgreSQL"; "IBMDB2"; "OracleDatabase") +// * ТипСУБД - Строка - Тип сервера СУБД ("MSSQLServer" <по умолчанию>, +// "PostgreSQL", "IBMDB2", "OracleDatabase") // * СерверСУБД - Строка - Адрес сервера СУБД // * ПользовательСУБД - Строка - Пользователь сервера СУБД // * ПарольСУБД - Строка - Пароль пользователя сервера СУБД @@ -387,7 +387,7 @@ КонецПроцедуры // СоздатьСервернуюБазу() -// Создание серверной информационной базы 1С +// Создание файловой информационной базы 1С // // Параметры: // ПутьКБазе - Строка - путь к каталогу базы 1С diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" index fb02b55..f2515eb 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" @@ -15,7 +15,7 @@ #Область ПрограммныйИнтерфейс -// Функция, выполняет копирование/перемещение указанных файлов с использованием команд системы (xcopy) +// Процедура, выполняет копирование/перемещение указанных файлов с использованием команд системы (xcopy) // // Параметры: // Источник - Строка - копируемые файлы @@ -86,8 +86,8 @@ // Функция, выполняет удаление указанных файлов с использованием команды системы (del) // // Параметры: -// ПутьКФайлу - Строка - путь к удаляемому файлы -// ИсключениеПриОшибке - Строка - Истина - вызывать исключение при ошибке удаления +// ПутьКФайлу - Строка - путь к удаляемому файлу +// ИсключениеПриОшибке - Булево - Истина - вызывать исключение при ошибке удаления // Процедура КомандаСистемыУдалитьФайл(Знач ПутьКФайлу, ИсключениеПриОшибке = Ложь) Экспорт @@ -134,12 +134,12 @@ // // Параметры: // ПутьКСписку - Строка - путь к файлу со списком файлов архива -// ДобавитьПутьКИсходномуФайлу - Строка - Истина - при чтении добавлять к результату +// ДобавитьПутьКИсходномуФайлу - Булево - Истина - при чтении добавлять к результату // путь к исходному файлу списка -// ДобавитьИсходныйФайл - Строка - Истина - добавить исходный файл в список +// ДобавитьИсходныйФайл - Булево - Истина - добавить исходный файл в список // // Возвращаемое значение: -// Массив из Строка - список файлов архива +// Массив из Строка - прочитанный список файлов // Функция ПрочитатьСписокФайлов(Знач ПутьКСписку, ДобавитьПутьКИсходномуФайлу = Ложь, ДобавитьИсходныйФайл = Ложь) Экспорт From f57b895e0d89bed325bb69a2dd3048ad23d4b764 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Tue, 31 May 2022 09:30:03 +0300 Subject: [PATCH 33/38] =?UTF-8?q?docs:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20API=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 621 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 601 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index b52df45..f63e9e5 100644 --- a/README.md +++ b/README.md @@ -11,16 +11,28 @@ [![Tech debt](https://open.checkbsl.org/api/project_badges/measure?project=cpdb&metric=sqale_index)](https://open.checkbsl.org/dashboard/index/cpdb) -Набор скриптов oscript для копирования баз данных 1C / MS SQL и развертывания на целевой системе. -Типичный сценарий работы: -1. Сформировать резервную копию базы -2. Передать резервную копию на целевую систему - - Через общую папку / С использованием Yandex-Диск - - Возможно разбиение больших файлов на части (используется 7-zip) -5. Восстановить резервную копию в новую или существующую базу -6. Подключить базу к хранилищу конфигурации - -Требуются следующие библиотеки и инструменты: +Библиотека и приложение для получения информации о базах 1С, копирования баз 1C и развертывания на целевой системе. + +* [Зависимости](#Зависимости) +* [Команды приложения](#Приложение) + * [database](#database) + * [infobase](#infobase) + * [file](#file) + * [yadisk](#yadisk) + * [nextcloud](#nextcloud) + * [sftp](#sftp) + * [batch](#batch) + * [Использование c Jenkins](#jenkins) +* [Библиотека](#Библиотека) + * [Класс РаботаССУБД](#lib-database) + * [Модуль РаботаСИБ](#lib-infobase) + * [Модуль РаботаСФайлами](#lib-file) + * [Класс РаботаСЯндексДиск](#lib-yadisk) + * [Класс РаботаСNextCloud](#lib-nextcloud) + * [Класс РаботаСSFTP](#lib-sftp) + * [Класс СтруктураХраненияИБ](#lib-dbstoragestructure) + + Требуются следующие библиотеки и инструменты: - [1commands](https://github.com/artbear/1commands) - [logos](https://github.com/oscript-library/logos) - [v8runner](https://github.com/oscript-library/v8runner) @@ -33,10 +45,18 @@ - [7-zip](http://www.7-zip.org/) - [MS Command Line Utilities for SQL Server (sqlcmd)](https://www.microsoft.com/en-us/download/details.aspx?id=53591) - -## Возможные команды +## Команды приложения --- +### Типичный сценарий работы: +1. Сформировать резервную копию базы +2. Передать резервную копию на целевую систему + - Через общую папку / С использованием Yandex-Диск + - Возможно разбиение больших файлов на части (используется 7-zip) +3. Восстановить резервную копию в новую или существующую базу +4. Подключить базу к хранилищу конфигурации + + |||| |-|-|-| |**database** | Группа команд работы с СУБД|| @@ -74,7 +94,7 @@ Для подсказки по конкретной команде наберите **<команда> --help** -## database - Группа команд работы с СУБД +## database - Группа команд работы с СУБД | Общие параметры для команд группы: || |-|-| @@ -193,7 +213,7 @@ UPDATE SchemaStorage SET Status = 100 PRINT N'$(message)' ``` -## infobase - Группа команд работы с информационной базой 1С +## infobase - Группа команд работы с информационной базой 1С | Общие параметры для команд группы: || |-|-| | **--v8version** | - маска версии платформы 1С (например: 8.3.8, 8.3.17.1851) | @@ -329,7 +349,7 @@ cpdb infobase --v8version 8.3.8 uconstorage --ib-path "/FD:/data/MyDatabase" --i cpdb infobase --v8version 8.3. constorage --ib-path "/FD:/data/MyDatabase" --ib-user Администратор --ib-pwd 123456 --storage-path "tcp://MyServer/MyRepository" --storage-user MyDatabase_usr1 --storage-pwd 123456 --uccode 12348 ``` -## file - Группа команд работы с файлами +## file - Группа команд работы с файлами --- ## copy - Скопировать/переместить файлы @@ -423,7 +443,7 @@ cpdb file mapdrive --drive N --res "\\MyServer\MyFolder" --user superuser --pwd cpdb file umapdrive --drive N ``` -## yadisk - Группа команд работы с сервисом Yandex-Диск +## yadisk - Группа команд работы с сервисом Yandex-Диск | Общие параметры для команд группы: || |-|-| @@ -492,7 +512,7 @@ cpdb yadisk --token XXXXXXXXXXXXXXXXXXXXXXXXXXXXX get --path "d:\MSSQL\Backup\" * Получить токен для приложения: перейти по ссылке https://oauth.yandex.ru/authorize?response_type=token&client_id=<ВАШ ID (ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)> * На вопрос "Приложение OScript.YaDisk запрашивает доступ к вашим данным на Яндексе" ответить "Разрешить": после этого на экране появится сформированный токен -## nextcloud - Группа команд работы с сервисом NextCloud +## nextcloud - Группа команд работы с сервисом NextCloud | Общие параметры для команд группы: || |-|-| @@ -548,7 +568,7 @@ cpdb nextcloud --service "http://MyNextCloud" --user "admin" --pwd "P@$$w0rd" ge cpdb nextcloud --service "http://MyNextCloud" --user "admin" --pwd "P@$$w0rd" get --path "d:\MSSQL\Backup\" --token XXXXXXXXXXXXXXXXXXXXXXXXXXXXX --list "/transfer/MyDatabase_copy.split" -delsrc ``` -## sftp - Группа команд работы с SFTP-сервером +## sftp - Группа команд работы с SFTP-сервером | Общие параметры для команд группы: || |-|-| @@ -606,7 +626,7 @@ cpdb sftp --server "sftp.myServer.org" --port 22 --user "user" --pwd "P@$$w0rd" cpdb sftp --server "sftp.myServer.org" --port 22 --user "user" --pwd "P@$$w0rd" get --path "d:\MSSQL\Backup\" --list "/transfer/MyDatabase_copy.split" -delsrc ``` -## batch - Выполнить сценарий +## batch - Выполнить сценарий Последовательно выполняет команды указнные в файле JSON @@ -666,7 +686,7 @@ cpdb batch "./rest_TST_DB_MyDomain.json" } ``` -## Использование c Jenkins +## Использование c Jenkins В jenkinsfile описан конвейер, выполняющий следующий сценарий: * Создание резервной копии указанной базы на системе-источнике @@ -703,3 +723,564 @@ cpdb batch "./rest_TST_DB_MyDomain.json" | **dst_ib_cred** | - Идентификатор credentials для доступа к информационной базе | | **dst_ib_storage_adr** | - Адрес хранилища конфигурации | | **dst_ib_storage_cred** | - Идентификатор credentials для подключения к хранилищу конфигурации | + +## Прграммный интерфейс библиотеки (API) +--- + +### Класс РаботаССУБД + +```bsl +Подключение = Новый ПодключениеMSSQL("MyServer", "user", "P@ssw0rd); +РаботаССУБД = Новый РаботаССУБД(Подключение); +``` + +#### **Функция ВыполнитьСкрипты()** - проверяет существование базу на сервере СУБД +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | + +*Возвращаемое значение:* Булево - Истина - база существует + +#### **Процедура СоздатьБазуДанных()** - создает базу данных + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | +| МодельВосстановления | Строка | модель восстановления (FULL, SIMPLE, BULK_LOGGED) | +| ПутьККаталогу | Строка | путь к каталогу для размещения файлов базы данных если не указан, то файлы размещаются в каталоге по умолчанию SQL Server | + +#### **Процедура УдалитьБазуДанных()** - удаляет базу данных + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | + +#### **Процедура ВыполнитьВосстановление()** - выполняет резервное копирование базы + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | +| ПутьКРезервнойКопии | Строка | путь к файлу резервной копии | + +#### **Процедура ВыполнитьВосстановление()** - выполняет восстановление базы из резервной копии + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | +| ПутьКРезервнойКопии | Строка | путь к файлу резервной копии | +| ПутьКФайлуДанных | Строка | путь к файлу данных базы | +| ПутьКФайлуЖурнала | Строка | путь к файлу журнала транзакций базы | +| СоздаватьБазу | Булево | Истина - создать базу в случае отсутствия + +#### **Функция ПолучитьВладельца()** - получает текущего владельца базы + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | + +*Возвращаемое значение:* Строка - имя текущего владельца базы + +#### **Процедура ИзменитьВладельца()** - устанавливает нового владельца базы + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | +| ВладелецБазы | Строка | новый владелец базы | + +#### **Процедура ПолучитьМодельВосстановления()** - получает модель восстановления базы (FULL, SIMPLE, BULK_LOGGED) + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | + +*Возвращаемое значение:* Строка - текущая модель восстановления базы + +#### **Процедура ИзменитьМодельВосстановления()** - устанавливает модель восстановления базы (FULL, SIMPLE, BULK_LOGGED) + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | +| МодельВосстановления | Строка | новая модель восстановления (FULL, SIMPLE, BULK_LOGGED) | + +#### **Функция ПолучитьЛогическоеИмяФайла()** - получает логическое имя файла в базе +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | +| ТипФайла | Строка | ROWS - файл базы; LOG - файл журнала транзакций | + +*Возвращаемое значение:* Строка - логическое имя файла в базе данных + +#### **Процедура ИзменитьЛогическоеИмяФайла()** - устанавливает новое логическое имя файла базы + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | +| Имя | Строка | логическое имя файла для изменения | +| НовоеИмя | Строка | новое логическое имя файла| + +#### **Процедура УстановитьЛогическиеИменаФайлов()** - устанавливает логические имена файлов в формате + +*<НовоеИмя>* - для файла данных + +*<НовоеИмя>_log* - для файла журнала транзакций + +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | +| НовоеИмя | Строка | новое имя файлов, если не указано, то используется имя базы | + +#### **Процедура ВключитьКомпрессию()** - включает компрессию данных базы на уровне страниц +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | + +#### **Процедура СжатьБазу()** - выполняет сжатие базы (shrink) +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | + +#### **Процедура СжатьФайлЖурналаТранзакций()** - выполняет сжатие файла журнала транзакций (shrink) +| Параметры: ||| +|-|-|-| +| База | Строка | имя базы данных | + +#### **Функция ВыполнитьСкрипты()** - выполняет указанные скрипты +| Параметры: ||| +|-|-|-| +| СкриптыВыполнения | Строка | пути к файлам скриптов, разделенные ";" | +| СтрокаПеременных | Строка | набор значений переменных в виде "<Имя>=<Значение>", разделенные ";" | + +*Возвращаемое значение:* Строка - результат выполнения скриптов + +#### **Функция ВыполнитьЗапрос()** - выполняет запрос к СУБД + +| Параметры: ||| +|-|-|-| +| ТекстЗапроса | Строка | текст исполняемого запроса | +| Разделитель | Строка | символ - разделитель колонок результата | +| УбратьПробелы | Булево | Истина - будут убраны выравнивающие пробелы из результата | + +*Возвращаемое значение:* Строка - результат выполнения запроса + +### Модуль РаботаСИБ + +#### **Процедура ВыгрузитьИнформационнуюБазуВФайл()** - выполняет выгрузку информационной базы в DT-файл +| Параметры: ||| +|-|-|-| +| ПараметрыИБ | Структура | параметры подключения к базе 1С | +| * *СтрокаПодключения* | Строка | строка подключения к базе 1С | +| * *Пользователь* | Строка | имя пользователя базы 1С | +| * *Пароль* | Строка | пароль пользователя базы 1С | +| ПутьКФайлу | Строка | путь к DT-файлу для выгрузки базы 1С | +| ИспользуемаяВерсияПлатформы | Строка | маска версии 1С | +| КлючРазрешения | Строка | ключ разрешения входа в заблоrированную серверную базу 1С (/UC) | + +#### **Процедура ЗагрузитьИнформационнуюБазуИзФайла()** - выполняет загрузку информационной базы из DT-файла +| Параметры: ||| +|-|-|-| +| ПараметрыИБ | Структура | параметры подключения к базе 1С | +| * *СтрокаПодключения* | Строка | строка подключения к базе 1С | +| * *Пользователь* | Строка | имя пользователя базы 1С | +| * *Пароль* | Строка | пароль пользователя базы 1С | +| ПутьКФайлу | Строка | путь к DT-файлу для загрузки в базу 1С | +| ИспользуемаяВерсияПлатформы | Строка | маска версии 1С | +| КлючРазрешения | Строка | ключ разрешения входа в заблоrированную серверную базу 1С (/UC) | + +#### **Процедура ОчиститьЛокальныйКэшИнформационнойБазы()** - выполняет очистку локального кэша информационной базы 1С +| Параметры: ||| +|-|-|-| +| СтрокаПодключения | Строка | строка подключения к базе 1С | + +#### **Процедура ОчиститьВсеЛокальныеКэшиИнформационныхБаз()** - выполняет очистку всех локальных кэшей информационных баз 1С +| Параметры: ||| +|-|-|-| +| нет | | | + +#### **Процедура ОтключитьОтХранилища()** - выполняет отключение информационной базы от хранилища конфигурации +| Параметры: ||| +|-|-|-| +| ПараметрыИБ | Структура | параметры подключения к базе 1С | +| * *СтрокаПодключения* | Строка | строка подключения к базе 1С | +| * *Пользователь* | Строка | имя пользователя базы 1С | +| * *Пароль* | Строка | пароль пользователя базы 1С | +| ИспользуемаяВерсияПлатформы | Строка | маска версии 1С | +| ИмяРасширения | Строка | имя расширения, отключаемого от хранилища (если не указано, отключается основная конфигурация) | +| КлючРазрешения | Строка | ключ разрешения входа в заблоrированную серверную базу 1С (/UC) | + +#### **Процедура ПодключитьКХранилищу()** - выполняет подключение информационной базы к хранилищу конфигурации +| Параметры: ||| +|-|-|-| +| ПараметрыИБ | Структура | параметры подключения к базе 1С | +| * *СтрокаПодключения* | Строка | строка подключения к базе 1С | +| * *Пользователь* | Строка | имя пользователя базы 1С | +| * *Пароль* | Строка | пароль пользователя базы 1С | +| ПараметрыХранилища | Структура | параметры подключения к хранилищу конфигурации | +| * *Адрес* | Строка | адрес хранилища конфигурации | +| * *Пользователь* | Строка | имя пользователя хранилища конфигурации | +| * *Пароль* | Строка | пароль пользователя хранилища конфигурации | +| ИспользуемаяВерсияПлатформы | Строка | маска версии 1С | +| ИмяРасширения | Строка | имя расширения, отключаемого от хранилища (если не указано, отключается основная конфигурация) | +| ОбновитьИБ | Булево | Истина - после обновления обновить конфигурацию базы данных | +| КлючРазрешения | Строка | ключ разрешения входа в заблоrированную серверную базу 1С (/UC) | + +#### **Процедура СоздатьСервернуюБазу()** - создание серверной информационной базы 1С +| Параметры: ||| +|-|-|-| +| Параметры1С | Структура | параметры создания базы 1С | +| * *Сервер1С* | Строка | адрес кластера серверов 1С ([<протокол>://]<адрес>[:<порт>]) | +| * *ИмяИБ* | Строка | имя информационной базы на сервере 1С | +| * *РазрешитьВыдачуЛицензий* | Булево | Истина - разрешить выдачу лицензий сервером 1С (по умолчанию: Истина) | +| * *РазрешитьРегЗадания* | Булево | Истина - разрешить запуск рег. заданий (по умолчанию: Ложь) | +| ПараметрыСУБД | Структура | параметры подключения к СУБД | +| * *ТипСУБД* | Строка | тип сервера СУБД ("MSSQLServer" <по умолчанию>, "PostgreSQL", "IBMDB2", "OracleDatabase") | +| * *СерверСУБД* | Строка | адрес сервера СУБД | +| * *ПользовательСУБД* | Строка | пользователь сервера СУБД | +| * *ПарольСУБД* | Строка | пароль пользователя сервера СУБД | +| * *ИмяБД* | Строка | имя базы на сервере СУБД (если не указано будет использовано имя ИБ 1С) | +| * *СмещениеДат* | Число | смещение дат на сервере MS SQL (0; 2000 <по умолчанию>) | +| * *СоздаватьБД* | Булево | Истина - будет создана база на сервере СУБД в случае отсутствия | +| АвторизацияВКластере | Структура | параметры авторизации в кластере 1С | +| * *Имя* | Строка | имя администратора кластера 1С | +| * *Пароль* | Строка | пароль администратора кластера 1С | +| ИспользуемаяВерсияПлатформы | Строка | маска версии 1С | +| ОшибкаЕслиСуществует | Булево | Истина - вызвать исключение если ИБ в кластере 1С существует (по умолчанию: Ложь) | +| ПутьКШаблону | Строка | путь к шаблону для создания информационной базы (*.cf; *.dt). Если шаблон не указан, то будет создана пустая ИБ | +| ИмяВСпискеБаз | Строка | имя в списке баз пользователя (если не задано, то ИБ в список не добавляется) | + +#### **Процедура СоздатьФайловуюБазу()** - создание файловой информационной базы 1С +| Параметры: ||| +|-|-|-| +| ПутьКБазе | Строка | путь к каталогу базы 1С | +| ИспользуемаяВерсияПлатформы | Строка | маска версии 1С | +| ПутьКШаблону | Строка | путь к шаблону для создания информационной базы (*.cf; *.dt). Если шаблон не указан, то будет создана пустая ИБ | +| ИмяВСпискеБаз | Строка | имя в списке баз пользователя (если не задано, то ИБ в список не добавляется) | + +### Модуль РаботаСФайлами + +#### **Процедура КомандаСистемыКопироватьФайл()** - выполняет копирование/перемещение указанных файлов с использованием команд системы (xcopy) +| Параметры: ||| +|-|-|-| +| Источник | Строка | копируемые файлы | +| Приемник | Строка | назначение копирования, каталог или файл | +| Перемещение | Булево | выполнить перемещение файлов (удалить источник после копирования) | +| ТолькоСегодня | Булево | копирование файлов, измененных не ранее текущей даты (параметр /D для xcopy) | + +#### **Процедура КомандаСистемыУдалитьФайл()** - выполняет удаление указанных файлов с использованием команды системы (del) +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | путь к удаляемому файлу | +| ИсключениеПриОшибке | Булево | Истина - вызывать исключение при ошибке удаления | + +#### **Функция ПрочитатьСписокФайлов()** - читает список файлов из файла +| Параметры: ||| +|-|-|-| +| ПутьКСписку | Строка | путь к удаляемому файлу | +| ДобавитьПутьКИсходномуФайлу | Булево | Истина - при чтении добавлять к результату путь к исходному файлу списка | +| ДобавитьИсходныйФайл | Булево | Истина - добавить исходный файл в список | + +*Возвращаемое значение:* Массив из Строка - прочитанный список файлов + +#### **Процедура КомандаСистемыУдалитьФайл()** - выполняет удаление указанных файлов с использованием команды системы (del) +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | путь к удаляемому файлу | +| ИсключениеПриОшибке | Булево | Истина - вызывать исключение при ошибке удаления | + +#### **Процедура ЗапаковатьВАрхив()** - выполняет архиваци указанного файла с разбитием на части указанного размера +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | путь к файлу, который будет архивироваться | +| ИмяАрхива | Строка | имя файла-архива | +| ИмяСпискаФайлов | Строка | имя файла-списка (содержащего все чати архива) | +| РазмерТома | Строка | размер части {, , } (по умолчанию 50m) | +| СтепеньСжатия | Число | уровень сжатия частей архива {0 - 9} (по умолчанию 0 - не сжимать) | +| УдалитьИсточник | Булево | Истина - после архивации исходный файл будет удален | + +#### **Процедура РаспаковатьАрхив()** - выполняет выполняет распаковку архива +| Параметры: ||| +|-|-|-| +| ПутьКАрхиву | Строка | путь к файлу архива, который будет распаковываться | +| ЭтоСписокФайлов | Булево | Истина - передан список файлов; Ложь - передан первый том архива | +| УдалитьИсточник | Булево | Истина - после распаковки исходный файл будет удален | + +#### **Процедура ПодключитьДиск()** - подключает указанный сетевой диск +| Параметры: ||| +|-|-|-| +| ИмяУстройства | Строка | имя (буква) подключаемого диска | +| ИмяРесурса | Строка | сетевой путь к подключаемому ресурсу | +| Пользователь | Строка | пользователь от имени которого выполняется подключение | +| ПарольПользователя | Строка | пароль пользователя от имени которого выполняется подключение | + +#### **Процедура ОтключитьДиск()** - отключает указанный сетевой диск +| Параметры: ||| +|-|-|-| +| ИмяУстройства | Строка | имя (буква) отключаемого диска | + +### Класс РаботаСЯндексДиск + +```bsl +РаботаСЯндексДиск = Новый РаботаСЯндексДиск(<Токен>); +``` + +| Параметры: ||| +|-|-|-| +| _Токен | Строка | токен авторизации Yandex-диска | + +#### **Функция Соединение()** - возвращает соединение с Yandex-диском +| Параметры: ||| +|-|-|-| +| нет ||| + +*Возвращаемое значение:* ЯндексДиск - соединение с Yandex-диском + +#### **Процедура УстановитьПараметрыСоединения()** - создает соединение с Yandex-диском с указанными параметрами +| Параметры: ||| +|-|-|-| +| _Токен | Строка | токен авторизации Yandex-диска | + +#### **Процедура СоздатьКаталог()** - создает каталог на Yandex-диске +| Параметры: ||| +|-|-|-| +| ЦелевойПуть | Строка | путь на yandex-диске к создаваемому каталогу | + +#### **Процедура ОтправитьФайл()** - отправляет файл на Yandex-Диск +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | путь к отправляемому файлу | +| ЦелевойПуть | Строка | путь на yandex-диске, куда будет загружен файл | +| Перезаписывать | Булево | перезаписать файл на Яндекс-диске при загрузке | + +#### **Функция ПолучитьФайл()** - получает файл из Yandex-Диска +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | расположение файла на yandex-диске | +| ЦелевойПуть | Строка | путь, куда будет загружен файл | +| УдалитьИсточник | Булево | Истина - удалить файл после загрузки | + +*Возвращаемое значение:* Число - код возврата команды + +#### **Функция Существует()** - проверка существования файла / каталога на Yandex-Диске + +**Не реализовано** + +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | расположение файла на yandex-диске | + +*Возвращаемое значение:* Булево - Истина - файл / каталог существует + +#### **Процедура Удалить()** - удаляет файл из Yandex-Диска + +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | расположение файла на yandex-диске | + +### Класс РаботаСNextCloud + +```bsl +РаботаСNextCloud = Новый РаботаСNextCloud("http://MyNextCloudServer:8080", "user", "P@ssw0rd"); +``` + +#### **Функция Адрес()** - возвращает адрес сервера NextCloud + +*Возвращаемое значение:* Строка - адрес сервера NextCloud + +#### **Функция Пользователь()** - возвращает имя пользователя сервера NextCloud + +*Возвращаемое значение:* Строка - имя пользователя сервера NextCloud + +#### **Функция Соединение()** - возвращает соединение с сервером NextCloud + +*Возвращаемое значение:* ПодключениеNextCloud - соединение с сервером NextCloud + +#### **Процедура УстановитьПараметрыСоединения()** - создает соединение с сервером NextCloud с указанными параметрами + +| Параметры: ||| +|-|-|-| +| _Адрес | Строка | адрес сервера NextCloud | +| _Пользователь | Строка | имя пользователя сервера NextCloud | +| Пароль | Строка | пароль пользователя сервера NextCloud | + +#### **Процедура СоздатьКаталог()** - создает каталог в сервисе NextCloud +| Параметры: ||| +|-|-|-| +| ЦелевойПуть | Строка | путь к создаваемому каталогу | + +#### **Процедура ОтправитьФайл()** - отправляет файл в сервис NextCloud +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | путь к отправляемому файлу | +| ЦелевойПуть | Строка | путь к каталогу в сервисе NextCloud, куда будет загружен файл | +| Перезаписывать | Булево | перезаписать файл в сервисе NextCloud при загрузке | + +#### **Функция ПолучитьФайл()** - получает файл из сервиса NextCloud +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | расположение файла на сервисе NextCloud | +| ЦелевойКаталог | Строка | путь к каталогу, куда будет загружен файл | +| УдалитьИсточник | Булево | Истина - удалить файл после загрузки | + +*Возвращаемое значение:* Строка - путь к полученному файлу + +#### **Функция Существует()** - проверяет существование файла / каталога в сервиса NextCloud + +| Параметры: ||| +|-|-|-| +| ПутьНаДиске | Строка | расположение файла на сервисе NextCloud | + +*Возвращаемое значение:* Булево - Истина - файл / каталог существует + +#### **Процедура Удалить()** - удаляет файл из сервиса NextCloud + +| Параметры: ||| +|-|-|-| +| ПутьНаДиске | Строка | расположение файла на сервисе NextCloud | + +### Класс РаботаСSFTP +```bsl +РаботаСSFTP = Новый РаботаСSFTP("MySFTPServer:2222", "user", "P@ssw0rd"); +``` + +#### **Функция Адрес()** - возвращает адрес сервера SSH + +*Возвращаемое значение:* Строка - адрес сервера SSH + +#### **Функция Пользователь()** - возвращает имя пользователя сервера SSH + +*Возвращаемое значение:* Строка - имя пользователя сервера SSH + +#### **Функция Соединение()** - возвращает соединение с сервером SSH + +*Возвращаемое значение:* КлиентSSH - соединение с сервером SSH + +#### **Процедура УстановитьПараметрыСоединения()** - создает соединение с сервером SSH с указанными параметрами + +| Параметры: ||| +|-|-|-| +| _Адрес | Строка | адрес сервера SSH | +| _Пользователь | Строка | имя пользователя сервера SSH | +| ПутьККлючу | Строка | путь к файлу закрытого ключа сервера SSH | + +#### **Процедура СоздатьКаталог()** - каталог на сервере SFTP +| Параметры: ||| +|-|-|-| +| ЦелевойПуть | Строка | путь к создаваемому каталогу | + +#### **Процедура ОтправитьФайл()** - отправляет файл в сервис NextCloud +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | путь к отправляемому файлу | +| ЦелевойПуть | Строка | путь к каталогу на сервере SFTP, куда будет загружен файл | +| Перезаписывать | Булево | перезаписать файл на сервере SFTP при загрузке | + +#### **Функция ПолучитьФайл()** - получает файл с сервера SFTP + +| Параметры: ||| +|-|-|-| +| ПутьКФайлу | Строка | расположение файла на сервере SFTP | +| ЦелевойКаталог | Строка | путь к каталогу, куда будет загружен файл | +| УдалитьИсточник | Булево | Истина - удалить файл после загрузки | + +*Возвращаемое значение:* Строка - путь к полученному файлу + +#### **Функция Существует()** - проверяет существование файла / каталога на сервере SFTP + +| Параметры: ||| +|-|-|-| +| ПутьНаДиске | Строка | расположение файла на сервере SFTP | + +*Возвращаемое значение:* Булево - Истина - файл / каталог существует + +#### **Процедура УдалитьФайл()** - удаляет файл с сервера SFTP + +| Параметры: ||| +|-|-|-| +| ПутьНаДиске | Строка | расположение файла на сервере SFTP | + +#### **Процедура УдалитьКаталог()** - удаляет каталог с сервера SFTP + +| Параметры: ||| +|-|-|-| +| ПутьНаДиске | Строка | расположение каталога на сервере SFTP | + +### Класс СтруктураХраненияИБ + +```bsl +СтруктураИБ = Новый СтруктураХраненияИБ(); +``` + +#### **Функция ВерсияФорматаКонфигурации()** - возвращает версию формата конфигурации + +| Параметры: ||| +|-|-|-| +| нет ||| + +*Возвращаемое значение:* Булево - Истина - файл / каталог существует + + *Версия - Число - номер версии формата конфигурации + *ТребуемаяВерсияПлатформы - Строка - минимальная версия платформы 1С + +#### **Функция ОписаниеМетаданныхОбъектаБД1С()** - возвращает описание метаданных 1С для объекта СУБД по его имени + +| Параметры: ||| +|-|-|-| +| ИмяОбъекта | Строка | имя таблицы или поля таблицы СУБД | + +*Возвращаемое значение:* Структура - описание метаданных 1С по имени объекта СУБД + + *Владелец - Структура - структура описания объекта владельца + *Тип - Строка - тип объекта или коллекция + (например: Справочник, Документ, ТабличнаяЧасть, Поле) + *ТипАнгл - Строка - тип объекта или коллекция на английском + (например: Reference, Document, TabularSection, Field) + *Назначение - Строка - назначение таблицы БД (например: Основная, Итоги, Обороты) + *Имя - Строка - имя объекта в БД (Префикс + Индекс) + *Префикс - Строка - префикс объекта (например: Reference, Document, VT, Fld)) + *Индекс - Число - числовой индекс объекта + *Суффикс - Строка - дополнительный суффикс имени объекта (например: "_RRef") + *Ид - Строка - UUID объекта 1С + *ИмяМетаданных - Строка - имя метаданных 1С + *ПолноеИмяМетаданных - Строка - имя метаданных 1С + +#### **Функция ОписаниеМетаданныхОбъектаБД1С()** - возвращает описание метаданных 1С для таблиц и полей таблиц СУБД + +| Параметры: ||| +|-|-|-| +| ДобавлятьКолонки | Булево | Истина - будет добавлена информация для колонок таблиц | + +*Возвращаемое значение:* Соответствие - соответствия имен таблиц СУБД и полных имен метаданных 1С описаниям объектов метаданных (см. ОписаниеМетаданныхОбъектаБД1С) + +#### **Функция ЗанимаемоеМесто()** - возвращает описание занимаеиого места в базе MS SQL Server + +| Параметры: ||| +|-|-|-| +| нет ||| + +*Возвращаемое значение:* Структура - описание занимаего места + + * РазмерБазы - Число - размер текущей базы данных в байтах, включает файлы данных и журналов + * Свободно - Число - место в базе данных, не зарезервированное для объектов базы данных + * Зарезервировано - Число - общий объем, выделенный объектам в базе данных + * Данные - Число - общий объем, используемый данными + * Индексы - Число - общий объем, используемый индексами + * НеИспользуется - Число - общий объем, зарезервированный для объектов в базе данных, + но пока не используемый + +#### **Функция ОписаниеМетаданныхОбъектаБД1С()** - возвращает список таблиц в базе MS SQL Server и их показатели использования + +| Параметры: ||| +|-|-|-| +| ФильтрТаблицПоИмени | Строка | фильтр имен таблиц в формате для оператора "LIKE" | + +*Возвращаемое значение:* Массив из Структура - таблицы и показатели использования + + *Таблица - Строка - имя таблицы + *КоличествоСтрок - Число - количество строк в таблице + *ВсегоЗанято - Число - общий объем заниаемого места (байт) + *Используется - Число - объем, используемый данными (байт) + *НеИспользуется - Число - не используемый объем (байт) + *ОперацийЧтения - Число - количество операций чтения (read) + *ОперацийВыборки - Число - количество операций выборки (select) + *ОперацийСканирования - Число - количество операций сканирования (scan) + *ОперацийПоиска - Число - количество операций поиска (seek) + *ОперацийЗаписи - Число - количество операций записи (write) From f33def430066fe6a5bd761e7bb46c586b35e149e Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Tue, 31 May 2022 13:27:03 +0300 Subject: [PATCH 34/38] =?UTF-8?q?feat:=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=201?= =?UTF-8?q?=D0=A1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\320\265\320\275\320\270\320\265MSSQL.os" | 63 +++++++ ...20\275\320\270\321\217\320\230\320\221.os" | 160 ++++++++++++++++++ tests/ib-structure-tests.os | 21 +++ 3 files changed, 244 insertions(+) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" index ec22e15..c9a950e 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" @@ -1316,6 +1316,69 @@ КонецФункции // ВерсияФорматаКонфигурации1С() +// Функция - возвращает версию формата конфигурации 1С +// +// Параметры: +// База - Строка - имя базы данных +// ИдФайла - Строка - идентификатор файла конфигурации 1С +// +// Возвращаемое значение: +// Структура - описание версии формата конфигурации +// *Версия - Число - номер версии формата конфигурации +// *ТребуемаяВерсияПлатформы - Строка - минимальная версия платформы 1С +// +Функция ФайлКонфигурации1С(База, ИдФайла) Экспорт + + БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии); + + ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON; + | SELECT + | [BinaryData] + | FROM %1.[dbo].[Config] + | WHERE [FileName] = '%2' + | FOR XML RAW, BINARY BASE64; + |SET NOCOUNT OFF;"" ", + База, + ИдФайла); + + РезультатЗапроса = ""; + КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса); + + Если НЕ КодВозврата = 0 Тогда + ТекстОшибки = СтрШаблон("Ошибка получения корневого файла конфигурации 1С базы ""%1\%2"":%3%4", + Сервер, + База, + Символы.ПС, + РезультатЗапроса); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + НормализоватьXML(РезультатЗапроса); + + ЗначенияАтрибутов = Новый Соответствие(); + + Парсер = Новый ЧтениеXML; + Парсер.УстановитьСтроку(РезультатЗапроса); + + Пока Парсер.Прочитать() Цикл + Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И ВРег(Парсер.Имя) = "ROW" Тогда + ЗначенияАтрибутов = ЗначенияАтрибутов(Парсер); + Прервать; + КонецЕсли; + КонецЦикла; + + Парсер.Закрыть(); + + Данные = ЗначенияАтрибутов["BINARYDATA"]; + + Если НЕ ЗначениеЗаполнено(Данные) Тогда + Данные = ""; + КонецЕсли; + + Возврат Base64Значение(Данные); + +КонецФункции // ФайлКонфигурации1С() + // Функция - возвращает количество записей в таблице конфигурации информационной базы 1С // // Параметры: diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index eb4ad98..a7d47c3 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -55,6 +55,96 @@ КонецФункции // ВерсияФорматаКонфигурации() +// Функция - возвращает описание конфигурации +// +// Возвращаемое значение: +// Структура - описание конфигурации +// *Имя - Строка - имя конфигурации +// *Синоним - Строка - синоним конфигурации +// *Версия - Строка - версия конфигурации +// *РежимСовместимости - Строка - версия режима совместимости конфигурации +// *КраткаяИнформация - Строка - краткая информация о конфигурации +// *ПодробнаяИнформация - Строка - подробная информация о конфигурации +// *Поставщик - Строка - поставщик конфигурации +// *АвторскиеПрава - Строка - данные об авторских правах +// *АдресИнформацииОПоставщике - Строка - адрес сайта с информацией о поставщике +// *АдресИнформацииОКонфигурации - Строка - адрес сайта с информацией о конфигурации +// *АдресКаталогаОбновлений - Строка - адрес сайта с каталогом обновлений +// +Функция ОписаниеКонфигурации() Экспорт + + ОписаниеКонфигурации = Новый Структура(); + ОписаниеКонфигурации.Вставить("Имя" , ""); + ОписаниеКонфигурации.Вставить("Синоним" , ""); + ОписаниеКонфигурации.Вставить("Версия" , ""); + ОписаниеКонфигурации.Вставить("РежимСовместимости" , ""); + ОписаниеКонфигурации.Вставить("КраткаяИнформация" , ""); + ОписаниеКонфигурации.Вставить("ПодробнаяИнформация" , ""); + ОписаниеКонфигурации.Вставить("Поставщик" , ""); + ОписаниеКонфигурации.Вставить("АвторскиеПрава" , ""); + ОписаниеКонфигурации.Вставить("АдресИнформацииОПоставщике" , ""); + ОписаниеКонфигурации.Вставить("АдресИнформацииОКонфигурации", ""); + ОписаниеКонфигурации.Вставить("АдресКаталогаОбновлений" , ""); + + Лог.Отладка("Начало получения корневого файла конфигурации 1С базы ""%1\%2""", + ТекущийСервер, + База); + + Попытка + Результат = ПодключениеКСУБД.ФайлКонфигурации1С(База, "root"); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения корневого файла конфигурации 1С базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Данные = ПрочитатьУпакованныеДанные(Результат, Истина); + + РВ = Новый РегулярноеВыражение("\{\d+,(?i)([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})," + + "((?:.|\s)*)\}"); + + Совпадения = РВ.НайтиСовпадения(Данные); + + Если Совпадения.Количество() = 0 Тогда + Возврат Результат; + КонецЕсли; + + ИдФайла = Совпадения[0].Группы[1].Значение; + + Лог.Отладка("Получен корневой файл конфигурации 1С базы ""%1\%2"": %3", + ТекущийСервер, + База, + ИдФайла); + + Лог.Отладка("Начало получения описания конфигурации 1С базы ""%1\%2""", + ТекущийСервер, + База); + + Попытка + Результат = ПодключениеКСУБД.ФайлКонфигурации1С(База, ИдФайла); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтрШаблон("Ошибка получения описания конфигурации 1С базы ""%1\%2"":%3%4", + ТекущийСервер, + База, + Символы.ПС, + ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Данные = ПрочитатьУпакованныеДанные(Результат, Истина); + + ЗаполнитьТекстыВОписанииКонфигурации(ОписаниеКонфигурации, Данные); + ЗаполнитьВерсиюВОписанииКонфигурации(ОписаниеКонфигурации, Данные); + + Возврат ОписаниеКонфигурации; + +КонецФункции // ОписаниеКонфигурации() + // Функция - возвращает описание метаданных 1С для объекта СУБД по его имени // // Параметры: @@ -893,6 +983,76 @@ КонецФункции // ИмяМетаданных() +// Функция - находит в текстовом описании (скобочнике) информацию о конфигурации, авторе и т.п. и добавляет в описание +// +// Параметры: +// ОписаниеКонфигурации - Структура - структура описания конфигурации +// ТекстОписания - Строка - текстовое описание конфигурации (скобочник) +// +Процедура ЗаполнитьТекстыВОписанииКонфигурации(ОписаниеКонфигурации, ТекстОписания) + + РВ_Имя = Новый РегулярноеВыражение("^\{\d+,\d+," + + "(?i)(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\},""(.+)"","); + + РВ_Текст = Новый РегулярноеВыражение("^\{0\}|^\{\d+,"".*?"",""((?:.|\s)+?)""\}"); + + Совпадения = РВ_Имя.НайтиСовпадения(ТекстОписания); + + Если Совпадения.Количество() > 0 Тогда + ОписаниеКонфигурации.Имя = Совпадения[0].Группы[1].Значение; + КонецЕсли; + + Совпадения = РВ_Текст.НайтиСовпадения(ТекстОписания); + + Если Совпадения.Количество() > 0 Тогда + ПустоеЗначение = "{0}"; + ОписаниеКонфигурации.Синоним = + ?(Совпадения[0].Значение = ПустоеЗначение, "", Совпадения[0].Группы[1].Значение); + ОписаниеКонфигурации.ПодробнаяИнформация = + ?(Совпадения[1].Значение = ПустоеЗначение, "", Совпадения[1].Группы[1].Значение); + ОписаниеКонфигурации.КраткаяИнформация = + ?(Совпадения[2].Значение = ПустоеЗначение, "", Совпадения[2].Группы[1].Значение); + ОписаниеКонфигурации.АвторскиеПрава = + ?(Совпадения[3].Значение = ПустоеЗначение, "", Совпадения[3].Группы[1].Значение); + ОписаниеКонфигурации.АдресИнформацииОПоставщике = + ?(Совпадения[4].Значение = ПустоеЗначение, "", Совпадения[4].Группы[1].Значение); + ОписаниеКонфигурации.АдресИнформацииОКонфигурации = + ?(Совпадения[5].Значение = ПустоеЗначение, "", Совпадения[5].Группы[1].Значение); + КонецЕсли; + +КонецПроцедуры // ЗаполнитьТекстыВОписанииКонфигурации() + +// Функция - находит в текстовом описании (скобочнике) информацию о версии конфигурации и добавляет в описание +// +// Параметры: +// ОписаниеКонфигурации - Структура - структура описания конфигурации +// ТекстОписания - Строка - текстовое описание конфигурации (скобочник) +// +Процедура ЗаполнитьВерсиюВОписанииКонфигурации(ОписаниеКонфигурации, ТекстОписания) + + РВ_Версия = Новый РегулярноеВыражение("^(?:\{0\}|\{\d+,"".*"","".*""\})," + + "(?:(?i)(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}),){4}" + + "\d+,""(.*)"",""(.*)"",""(.*)"","); + РВ_РежимСовместимости = + Новый РегулярноеВыражение("^\{?\d+,\d+\},\d+," + + "(?:(?i)(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}),){4}(\d+)"); + + Совпадения = РВ_Версия.НайтиСовпадения(ТекстОписания); + + Если Совпадения.Количество() > 0 Тогда + ОписаниеКонфигурации.Поставщик = Совпадения[0].Группы[1].Значение; + ОписаниеКонфигурации.Версия = Совпадения[0].Группы[2].Значение; + ОписаниеКонфигурации.АдресКаталогаОбновлений = Совпадения[0].Группы[3].Значение; + КонецЕсли; + + Совпадения = РВ_РежимСовместимости.НайтиСовпадения(ТекстОписания); + + Если Совпадения.Количество() > 0 Тогда + ОписаниеКонфигурации.РежимСовместимости = Совпадения[0].Группы[1].Значение; + КонецЕсли; + +КонецПроцедуры // ЗаполнитьОписаниеКонфигурации() + // Функция - распаковыает переданные данные, упакованные по алгоритму deflate // // Параметры: diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os index 727b8da..55f14d3 100644 --- a/tests/ib-structure-tests.os +++ b/tests/ib-structure-tests.os @@ -96,6 +96,27 @@ КонецПроцедуры // ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() +&Тест +Процедура ТестДолжен_ПолучитьОписаниеКонфигурации() Экспорт + + Лог.Информация("Тест: Получение описания конфигурации"); + + ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1); + + ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД); + + Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки); + + СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД); + + ОписаниеКонфигурации = СтруктураХраненияИБ.ОписаниеКонфигурации(); + + ТекстОшибки = СтрШаблон("Ошибка получения описания конфигурации 1С базы ""%1""", ИмяБД); + + Утверждения.ПроверитьРавенство(ОписаниеКонфигурации.Имя, "CPDB_TEST", ТекстОшибки); + +КонецПроцедуры // ТестДолжен_ПолучитьОписаниеКонфигурации() + &Тест Процедура ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() Экспорт From 40dde3e6fc1106eeeb4bd63a15a01113218de5aa Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Tue, 31 May 2022 13:32:00 +0300 Subject: [PATCH 35/38] =?UTF-8?q?docs:=20=D0=94=D0=BE=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=20readme=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++++++++++-- packagedef | 2 +- ...21\201\321\202\320\265\320\274\321\213.os" | 2 +- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f63e9e5..3253be6 100644 --- a/README.md +++ b/README.md @@ -1215,11 +1215,31 @@ cpdb batch "./rest_TST_DB_MyDomain.json" |-|-|-| | нет ||| -*Возвращаемое значение:* Булево - Истина - файл / каталог существует +*Возвращаемое значение:* Структура - информация о версии формата конфигурации *Версия - Число - номер версии формата конфигурации *ТребуемаяВерсияПлатформы - Строка - минимальная версия платформы 1С +#### **Функция ОписаниеКонфигурации()** - возвращает описание конфигурации + +| Параметры: ||| +|-|-|-| +| нет ||| + +*Возвращаемое значение:* Структура - описание конфигурации + + *Имя - Строка - имя конфигурации + *Синоним - Строка - синоним конфигурации + *Версия - Строка - версия конфигурации + *РежимСовместимости - Строка - версия режима совместимости конфигурации + *КраткаяИнформация - Строка - краткая информация о конфигурации + *ПодробнаяИнформация - Строка - подробная информация о конфигурации + *Поставщик - Строка - поставщик конфигурации + *АвторскиеПрава - Строка - данные об авторских правах + *АдресИнформацииОПоставщике - Строка - адрес сайта с информацией о поставщике + *АдресИнформацииОКонфигурации - Строка - адрес сайта с информацией о конфигурации + *АдресКаталогаОбновлений - Строка - адрес сайта с каталогом обновлений + #### **Функция ОписаниеМетаданныхОбъектаБД1С()** - возвращает описание метаданных 1С для объекта СУБД по его имени | Параметры: ||| @@ -1242,7 +1262,7 @@ cpdb batch "./rest_TST_DB_MyDomain.json" *ИмяМетаданных - Строка - имя метаданных 1С *ПолноеИмяМетаданных - Строка - имя метаданных 1С -#### **Функция ОписаниеМетаданныхОбъектаБД1С()** - возвращает описание метаданных 1С для таблиц и полей таблиц СУБД +#### **Функция ОписаниеМетаданныхОбъектовБД1С()** - возвращает описание метаданных 1С для таблиц и полей таблиц СУБД | Параметры: ||| |-|-|-| diff --git a/packagedef b/packagedef index afa45af..c6c2aaf 100644 --- a/packagedef +++ b/packagedef @@ -1,5 +1,5 @@ Описание.Имя("cpdb") - .Версия("1.1.0") + .Версия("1.2.0") .ВерсияСреды("1.7.0") .ЗависитОт("logos") .ЗависитОт("1commands") diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" index fc56481..326307a 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" @@ -137,6 +137,6 @@ // Функция Версия() Экспорт - Возврат "1.1.0"; + Возврат "1.2.0"; КонецФункции // Версия() From a6687863d74e85b8cb66ff7912bfadd583edae97 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Tue, 31 May 2022 17:40:32 +0300 Subject: [PATCH 36/38] =?UTF-8?q?style:=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B8=D0=B9=20=D0=BA=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=86=D0=B5=D0=B4=D1=83=D1=80=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index a7d47c3..0a9fdaf 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -1051,7 +1051,7 @@ ОписаниеКонфигурации.РежимСовместимости = Совпадения[0].Группы[1].Значение; КонецЕсли; -КонецПроцедуры // ЗаполнитьОписаниеКонфигурации() +КонецПроцедуры // ЗаполнитьВерсиюВОписанииКонфигурации() // Функция - распаковыает переданные данные, упакованные по алгоритму deflate // From 9586cfe6588d89944ee9dfab6b0ac6d96954487f Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Tue, 31 May 2022 18:43:24 +0300 Subject: [PATCH 37/38] =?UTF-8?q?fix=20(#39):=20fix:=20=D0=9F=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5?= =?UTF-8?q?=D1=82=D0=B5=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=B4=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0;=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F/=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=B5?= =?UTF-8?q?=D1=82=D0=B5=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=B4=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\271\320\273\320\260\320\274\320\270.os" | 26 +++++----- tests/nextcloud-tests.os | 52 +++++++++++++++++++ 2 files changed, 65 insertions(+), 13 deletions(-) diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" index f2515eb..e2f6359 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\260\320\274\320\270.os" @@ -354,8 +354,8 @@ КомандаРК.ДобавитьПараметр("use"); КомандаРК.ДобавитьПараметр(ИмяУстройства); КомандаРК.ДобавитьПараметр(ИмяРесурса); - КомандаРК.ДобавитьПараметр(ПарольПользователя); КомандаРК.ДобавитьПараметр("/USER:" + Пользователь); + КомандаРК.ДобавитьПараметр(ПарольПользователя); КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы( Ложь ); КомандаРК.ПоказыватьВыводНемедленно( Ложь ); @@ -364,12 +364,7 @@ ОписаниеРезультата = КомандаРК.ПолучитьВывод(); - Если КодВозврата = 0 Тогда - Лог.Информация("Подключен сетевой ресурс ""%1"" к устройству ""%2"": %3", - ИмяРесурса, - ИмяУстройства, - ОписаниеРезультата); - Иначе + Если НЕ КодВозврата = 0 Тогда ВызватьИсключение СтрШаблон("Ошибка ошибка подключения ресурса ""%1"" к устройству ""%2"", код ошибки %3: %4%5", ИмяРесурса, ИмяУстройства, @@ -378,6 +373,11 @@ ОписаниеРезультата); КонецЕсли; + Лог.Информация("Подключен сетевой ресурс ""%1"" к устройству ""%2"": %3", + ИмяРесурса, + ИмяУстройства, + ОписаниеРезультата); + КонецПроцедуры // ПодключитьДиск() // Процедура отключает указанный сетевой диск @@ -403,18 +403,18 @@ ОписаниеРезультата = КомандаРК.ПолучитьВывод(); - Если КодВозврата = 0 Тогда - Лог.Информация("Отключено устройство ""%1"": %2", - ИмяУстройства, - ОписаниеРезультата); - Иначе + Если НЕ КодВозврата = 0 Тогда ВызватьИсключение СтрШаблон("Ошибка ошибка отключения устройства ""%1"", код ошибки %2: %3%4", ИмяУстройства, КодВозврата, Символы.ПС, ОписаниеРезультата); КонецЕсли; - + + Лог.Информация("Отключено устройство ""%1"": %2", + ИмяУстройства, + ОписаниеРезультата); + КонецПроцедуры // ОтключитьДиск() #КонецОбласти // ПрограммныйИнтерфейс diff --git a/tests/nextcloud-tests.os b/tests/nextcloud-tests.os index 2af1ae3..bc84b36 100644 --- a/tests/nextcloud-tests.os +++ b/tests/nextcloud-tests.os @@ -164,6 +164,58 @@ КонецПроцедуры // ТестДолжен_ПолучитьФайлИзNextCloud() +&Тест +Процедура ТестДолжен_ПодключитьСетевойДиск() Экспорт + + Лог.Информация("Тест: Подключение сетевого диска WebDAV"); + + АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); + АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); + АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); + + АдресДиска = СтрШаблон("%1/remote.php/dav/files/%2/", АдресСервиса, АдминИмя); + БукваДиска = "T:"; + ИмяФайла = "Nextcloud.png"; + ПутьДляПроверки = СтрШаблон("%1/%2", БукваДиска, ИмяФайла); + + РаботаСФайлами.ПодключитьДиск(БукваДиска, АдресДиска, АдминИмя, АдминПароль); + + ТекстОшибки = СтрШаблон("Ошибка подключения сетевого диска ""%1""", АдресДиска); + + Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьДляПроверки), ТекстОшибки); + + РаботаСФайлами.ОтключитьДиск(БукваДиска); + +КонецПроцедуры // ТестДолжен_ПодключитьСетевойДиск() + +&Тест +Процедура ТестДолжен_ОтключитьСетевойДиск() Экспорт + + Лог.Информация("Тест: Отключение сетевого диска WebDAV"); + + АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS"); + АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME"); + АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD"); + + АдресДиска = СтрШаблон("%1/remote.php/dav/files/%2/", АдресСервиса, АдминИмя); + БукваДиска = "T:"; + ИмяФайла = "Nextcloud.png"; + ПутьДляПроверки = СтрШаблон("%1/%2", БукваДиска, ИмяФайла); + + РаботаСФайлами.ПодключитьДиск(БукваДиска, АдресДиска, АдминИмя, АдминПароль); + + ТекстОшибки = СтрШаблон("Ошибка подключения сетевого диска ""%1""", АдресДиска); + + Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьДляПроверки), ТекстОшибки); + + РаботаСФайлами.ОтключитьДиск(БукваДиска); + + ТекстОшибки = СтрШаблон("Ошибка отключения сетевого диска ""%1""", БукваДиска); + + Утверждения.ПроверитьЛожь(ФС.ФайлСуществует(ПутьДляПроверки), ТекстОшибки); + +КонецПроцедуры // ТестДолжен_ОтключитьСетевойДиск() + &Тест Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт From 5bfa9a4e48c3a2457337fcbe42deb2a2b009bd58 Mon Sep 17 00:00:00 2001 From: Artem Kuznetsov Date: Tue, 31 May 2022 19:12:40 +0300 Subject: [PATCH 38/38] =?UTF-8?q?fix:=20=D0=9E=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20SonarQube.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\237\320\260\320\272\320\265\321\202.os" | 3 +- ...20\274\320\260\320\275\320\264\321\213.os" | 3 +- ...7\320\265\320\275\320\270\320\265MSSQL.os" | 1 - ...21\201\320\224\320\270\321\201\320\272.os" | 1 - ...20\275\320\270\321\217\320\230\320\221.os" | 41 +++++++++++++++---- ...21\202\320\260\320\241\320\230\320\221.os" | 3 +- 6 files changed, 38 insertions(+), 14 deletions(-) diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\237\320\260\320\272\320\265\321\202.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\237\320\260\320\272\320\265\321\202.os" index 46e5c0a..019745e 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\237\320\260\320\272\320\265\321\202.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\270\321\202\321\214\320\237\320\260\320\272\320\265\321\202.os" @@ -92,10 +92,11 @@ Попытка ПрочитатьСценарииИзФайла(Сценарии, ТекФайл); Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка чтения файла сценариев ""%1"":%2%3", ТекФайл, Символы.ПС, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстОшибки); ВызватьИсключение ТекстОшибки; КонецПопытки; diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\321\202\320\265\320\275\320\270\320\265\320\236\320\277\321\206\320\270\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\321\202\320\265\320\275\320\270\320\265\320\236\320\277\321\206\320\270\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" index 7621a1c..5200d6f 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\321\202\320\265\320\275\320\270\320\265\320\236\320\277\321\206\320\270\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\321\202\320\265\320\275\320\270\320\265\320\236\320\277\321\206\320\270\320\271\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" @@ -69,10 +69,11 @@ ПараметрыИзФайла = ПрочитатьJSON(Чтение, Истина); Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ТекстОшибки = СтрШаблон("Ошибка чтения файла параметров ""%1"":%2%3", ТекФайл, Символы.ПС, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстОшибки); ВызватьИсключение ТекстОшибки; КонецПопытки; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" index c9a950e..1b94e67 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265MSSQL.os" @@ -1665,7 +1665,6 @@ КомандаРК.ДобавитьПараметр(СтрШаблон("-o ""%1""", ПутьКФайлуРезультата)); КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы(Ложь); - КомандаРК.УстановитьОбработчикОжидания(Неопределено, 10); КомандаРК.ПоказыватьВыводНемедленно(Ложь); КодВозврата = КомандаРК.Исполнить(); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" index eb4dd59..9cf5528 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\257\320\275\320\264\320\265\320\272\321\201\320\224\320\270\321\201\320\272.os" @@ -62,7 +62,6 @@ ВызватьИсключение ТекстОшибки; КонецЕсли; - ТекущийПуть = ""; Если НЕ КаталогНайден Тогда Попытка Соединение.СоздатьПапку(ЦелевойПуть); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" index 0a9fdaf..7deea74 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260\320\245\321\200\320\260\320\275\320\265\320\275\320\270\321\217\320\230\320\221.os" @@ -1002,22 +1002,41 @@ ОписаниеКонфигурации.Имя = Совпадения[0].Группы[1].Значение; КонецЕсли; + Синоним_Индекс = 0; + ПодробнаяИнформация_Индекс = 1; + КраткаяИнформация_Индекс = 2; + АвторскиеПрава_Индекс = 3; + АдресИнформацииОПоставщике_Индекс = 4; + АдресИнформацииОКонфигурации_Индекс = 5; + Совпадения = РВ_Текст.НайтиСовпадения(ТекстОписания); Если Совпадения.Количество() > 0 Тогда ПустоеЗначение = "{0}"; ОписаниеКонфигурации.Синоним = - ?(Совпадения[0].Значение = ПустоеЗначение, "", Совпадения[0].Группы[1].Значение); + ?(Совпадения[Синоним_Индекс].Значение = ПустоеЗначение, + "", + Совпадения[Синоним_Индекс].Группы[1].Значение); ОписаниеКонфигурации.ПодробнаяИнформация = - ?(Совпадения[1].Значение = ПустоеЗначение, "", Совпадения[1].Группы[1].Значение); + ?(Совпадения[ПодробнаяИнформация_Индекс].Значение = ПустоеЗначение, + "", + Совпадения[ПодробнаяИнформация_Индекс].Группы[1].Значение); ОписаниеКонфигурации.КраткаяИнформация = - ?(Совпадения[2].Значение = ПустоеЗначение, "", Совпадения[2].Группы[1].Значение); + ?(Совпадения[КраткаяИнформация_Индекс].Значение = ПустоеЗначение, + "", + Совпадения[КраткаяИнформация_Индекс].Группы[1].Значение); ОписаниеКонфигурации.АвторскиеПрава = - ?(Совпадения[3].Значение = ПустоеЗначение, "", Совпадения[3].Группы[1].Значение); + ?(Совпадения[АвторскиеПрава_Индекс].Значение = ПустоеЗначение, + "", + Совпадения[АвторскиеПрава_Индекс].Группы[1].Значение); ОписаниеКонфигурации.АдресИнформацииОПоставщике = - ?(Совпадения[4].Значение = ПустоеЗначение, "", Совпадения[4].Группы[1].Значение); + ?(Совпадения[АдресИнформацииОПоставщике_Индекс].Значение = ПустоеЗначение, + "", + Совпадения[АдресИнформацииОПоставщике_Индекс].Группы[1].Значение); ОписаниеКонфигурации.АдресИнформацииОКонфигурации = - ?(Совпадения[5].Значение = ПустоеЗначение, "", Совпадения[5].Группы[1].Значение); + ?(Совпадения[АдресИнформацииОКонфигурации_Индекс].Значение = ПустоеЗначение, + "", + Совпадения[АдресИнформацииОКонфигурации_Индекс].Группы[1].Значение); КонецЕсли; КонецПроцедуры // ЗаполнитьТекстыВОписанииКонфигурации() @@ -1037,12 +1056,16 @@ Новый РегулярноеВыражение("^\{?\d+,\d+\},\d+," + "(?:(?i)(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}),){4}(\d+)"); + Поставщик_Индекс = 1; + Версия_Индекс = 2; + АдресКаталогаОбновлений_Индекс = 3; + Совпадения = РВ_Версия.НайтиСовпадения(ТекстОписания); Если Совпадения.Количество() > 0 Тогда - ОписаниеКонфигурации.Поставщик = Совпадения[0].Группы[1].Значение; - ОписаниеКонфигурации.Версия = Совпадения[0].Группы[2].Значение; - ОписаниеКонфигурации.АдресКаталогаОбновлений = Совпадения[0].Группы[3].Значение; + ОписаниеКонфигурации.Поставщик = Совпадения[0].Группы[Поставщик_Индекс].Значение; + ОписаниеКонфигурации.Версия = Совпадения[0].Группы[Версия_Индекс].Значение; + ОписаниеКонфигурации.АдресКаталогаОбновлений = Совпадения[0].Группы[АдресКаталогаОбновлений_Индекс].Значение; КонецЕсли; Совпадения = РВ_РежимСовместимости.НайтиСовпадения(ТекстОписания); diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\230\320\221.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\230\320\221.os" index eea05bc..1bf3386 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\230\320\221.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\230\320\221.os" @@ -174,10 +174,11 @@ УдалитьФайлы(ТекКаталог.ПолноеИмя); Лог.Информация("Удален каталог кэша ""%1"".", ТекКаталог.ПолноеИмя); Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); Лог.Предупреждение("Ошибка удаления каталога кэша ""%1"": %2%3", ТекКаталог.ПолноеИмя, Символы.ПС, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстОшибки); КонецПопытки; КонецЦикла;