diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml
index 9653bfe..af2700b 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=INFO"
run: oscript ./tasks/coverage.os
# Остановка и удаление контейнеров NextCloud и OpenSSH
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/README.md b/README.md
index b52df45..3253be6 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,584 @@ 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)
diff --git a/lib.config b/lib.config
index c2af88c..a4d1a82 100644
--- a/lib.config
+++ b/lib.config
@@ -1,49 +1,12 @@
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/packagedef b/packagedef
index d3b9fd6..c6c2aaf 100644
--- a/packagedef
+++ b/packagedef
@@ -1,5 +1,5 @@
Описание.Имя("cpdb")
- .Версия("1.1.0")
+ .Версия("1.2.0")
.ВерсияСреды("1.7.0")
.ЗависитОт("logos")
.ЗависитОт("1commands")
@@ -10,7 +10,8 @@
.ЗависитОт("fs")
.ЗависитОт("yadisk")
.ЗависитОт("nextcloud-lib")
- .ЗависитОт("ClientSSH", "0.5.0")
+ .ЗависитОт("ClientSSH", "0.5.1")
+ .ЗависитОт("deflator", "0.2.1")
.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("asserts")
.ВключитьФайл("src")
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\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\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\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\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\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/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/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"
new file mode 100644
index 0000000..1b94e67
--- /dev/null
+++ "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"
@@ -0,0 +1,1943 @@
+// ----------------------------------------------------------
+// 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/
+// ----------------------------------------------------------
+
+#Использовать 1commands
+#Использовать fs
+
+Перем Лог; // - Объект - объект записи лога приложения
+Перем Сервер; // - Строка - адрес сервера СУБД
+Перем Пользователь; // - Строка - Пользователь сервера СУБД
+Перем Пароль; // - Строка - Пароль пользователя сервера СУБД
+
+#Область ПрограммныйИнтерфейс
+
+Функция Сервер() Экспорт
+
+ Возврат Сервер;
+
+КонецФункции // Сервер()
+
+Процедура УстановитьСервер(Знач НовоеЗначение) Экспорт
+
+ Сервер = НовоеЗначение;
+
+КонецПроцедуры // УстановитьСервер()
+
+Функция Пользователь() Экспорт
+
+ Возврат Пользователь;
+
+КонецФункции // Пользователь()
+
+Процедура УстановитьПользователь(Знач НовоеЗначение) Экспорт
+
+ Пользователь = НовоеЗначение;
+
+КонецПроцедуры // УстановитьПользователь()
+
+Процедура УстановитьПароль(Знач НовоеЗначение) Экспорт
+
+ Пароль = НовоеЗначение;
+
+КонецПроцедуры // УстановитьПароль()
+
+// Функция проверяет существование базу на сервере СУБД
+//
+// Параметры:
+// База - Строка - имя базы данных
+// ВариантСообщенияОСуществовании - Строка - в каких случаях выводить сообщение о существании БД
+//
+// Возвращаемое значение:
+// Булево - Истина - база существует на сервере СУБД
+//
+Функция БазаСуществует(База, ВариантСообщенияОСуществовании = Неопределено) Экспорт
+
+ ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
+ |SELECT
+ | COUNT(name)
+ |FROM
+ | sysdatabases
+ |WHERE
+ | name = '%1';
+ |
+ |SET NOCOUNT OFF"" ",
+ База);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если КодВозврата = 0 Тогда
+ РезультатЗапроса = СокрЛП(СтрЗаменить(РезультатЗапроса, "-", ""));
+ Результат = РезультатЗапроса = "1";
+ Иначе
+ ТекстОшибки = СтрШаблон("Ошибка проверки существования базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ ВариантыСообщения = ВариантыСообщенияОСуществованииБД();
+
+ Если НЕ ЗначениеЗаполнено(ВариантСообщенияОСуществовании) Тогда
+ ВариантСообщенияОСуществовании = ВариантыСообщения.НеСообщать;
+ КонецЕсли;
+
+ Если ВариантСообщенияОСуществовании = ВариантыСообщения.СообщатьОСуществовании
+ И Результат Тогда
+ Лог.Предупреждение("База ""%1"" уже существует!", База);
+ ИначеЕсли ВариантСообщенияОСуществовании = ВариантыСообщения.СообщатьОбОтсутствии
+ И НЕ Результат Тогда
+ Лог.Предупреждение("База ""%1"" не существует!", База);
+ ИначеЕсли ВариантСообщенияОСуществовании = ВариантыСообщения.ИсключениеПриСуществовании
+ И Результат Тогда
+ ВызватьИсключение СтрШаблон("База ""%1"" уже существует!", База);
+ ИначеЕсли ВариантСообщенияОСуществовании = ВариантыСообщения.ИсключениеПриОтсутствии
+ И НЕ Результат Тогда
+ ВызватьИсключение СтрШаблон("База ""%1"" не существует!", База);
+ ИначеЕсли Результат Тогда
+ Лог.Отладка("База ""%1"" существует!", База);
+ Иначе
+ Лог.Отладка("База ""%1"" не существует!", База);
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции // БазаСуществует()
+
+// Процедура выполняет команду создания базы на сервере СУБД
+//
+// Параметры:
+// База - Строка - имя базы данных
+// МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED)
+// ПутьККаталогу - Строка - путь к каталогу для размещения файлов базы данных
+// если не указан, то файлы размещаются в каталоге по умолчанию SQL Server
+// ОшибкаЕслиСуществует - Строка - Истина - вызвать исключение если база существует
+//
+Процедура СоздатьБазу(База,
+ Знач МодельВосстановления = Неопределено,
+ Знач ПутьККаталогу = "",
+ Знач ОшибкаЕслиСуществует = Ложь) Экспорт
+
+ Если БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОСуществовании) Тогда
+ Если ОшибкаЕслиСуществует Тогда
+ ТекстОшибки = СтрШаблон("База ""%1"" уже существует", База);
+ ВызватьИсключение ТекстОшибки;
+ Иначе
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если НЕ ЗначениеЗаполнено(МодельВосстановления) Тогда
+ МодельВосстановления = МоделиВосстановленияБД().Полная;
+ КонецЕсли;
+
+ ПутьККаталогу = ФС.ПолныйПуть(ПутьККаталогу);
+
+ Если ЗначениеЗаполнено(ПутьККаталогу) Тогда
+ ТекстЗапроса = СтрШаблон("""USE [master];
+ |
+ |CREATE DATABASE [%1]
+ |ON
+ |( NAME = %1,
+ | FILENAME = '%2\%1.mdf')
+ |LOG ON
+ |( NAME = %1_log,
+ | FILENAME = '%2\%1_log.ldf');
+ |
+ |ALTER DATABASE [%1]
+ |SET RECOVERY %3"" ",
+ База,
+ ПутьККаталогу,
+ МодельВосстановления);
+ Иначе
+ ТекстЗапроса = СтрШаблон("""USE [master];
+ |
+ |CREATE DATABASE [%1];
+ |
+ |ALTER DATABASE [%1]
+ |SET RECOVERY %2"" ",
+ База,
+ МодельВосстановления);
+ КонецЕсли;
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка создания базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // СоздатьБазу()
+
+// Процедура выполняет команду удаления базы на сервере СУБД
+//
+// Параметры:
+// База - Строка - имя базы данных
+// ОшибкаЕслиНеСуществует - Строка - Истина - вызвать исключение если база не существует
+//
+Процедура УдалитьБазу(База, ОшибкаЕслиНеСуществует = Ложь) Экспорт
+
+ Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
+ Если ОшибкаЕслиНеСуществует Тогда
+ ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База);
+ ВызватьИсключение ТекстОшибки;
+ Иначе
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ ТекстЗапроса = СтрШаблон("""USE [master];
+ |
+ |DROP DATABASE [%1]"" ",
+ База);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка удаления базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // УдалитьБазу()
+
+// Функция получает модель восстановления базы
+//
+// Параметры:
+// База - Строка - имя базы данных
+//
+// Возвращаемое значение:
+// Строка - модель восстановления (FULL, SIMPLE, BULK_LOGGED)
+//
+Функция ПолучитьМодельВосстановления(База) Экспорт
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
+ |
+ |SELECT
+ | [recovery_model_desc] AS Recovery_model
+ |FROM sys.databases
+ |
+ |WHERE name = '%1';
+ |
+ |SET NOCOUNT OFF;"" ",
+ База);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если КодВозврата = 0 Тогда
+ Разделитель = "---";
+ Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
+ Если Поз > 0 Тогда
+ РезультатЗапроса = ВРег(СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))));
+ КонецЕсли;
+ Иначе
+ ТекстОшибки = СтрШаблон("Ошибка получения модели восстановления базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ Возврат РезультатЗапроса;
+
+КонецФункции // ПолучитьМодельВосстановления()
+
+// Процедура устанавливает модель восстановления базы
+//
+// Параметры:
+// База - Строка - имя базы данных
+// МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED)
+//
+Процедура УстановитьМодельВосстановления(База, Знач МодельВосстановления = Неопределено) Экспорт
+
+ МодельВосстановления = ВРег(МодельВосстановления);
+
+ Если Найти("FULL,SIMPLE,BULK_LOGGED", МодельВосстановления) = 0 Тогда
+ ТекстОшибки = СтрШаблон("Указана некорректная модель восстановления ""%1""
+ | (возможные значения: ""FULL"", ""SIMPLE"", ""BULK_LOGGED"")!",
+ МодельВосстановления);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ТекстЗапроса = СтрШаблон("""USE [master];
+ |
+ |ALTER DATABASE %1
+ |SET RECOVERY %2"" ",
+ База,
+ МодельВосстановления);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка получения модели восстановления базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // УстановитьМодельВосстановления()
+
+// Функция изменяет владельца базы
+//
+// Параметры:
+// База - Строка - имя базы данных
+//
+// Возвращаемое значение:
+// Строка - имя текущего владельца базы
+//
+Функция ПолучитьВладельцаБазы(База) Экспорт
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
+ |
+ |SELECT
+ | logins.name AS login
+ |
+ |FROM sys.databases AS databases
+ |LEFT JOIN sys.syslogins AS logins
+ |ON databases.owner_sid = logins.sid
+ |
+ |WHERE databases.name = '%1'
+ |
+ |SET NOCOUNT OFF;"" ",
+ База);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если КодВозврата = 0 Тогда
+ Разделитель = "---";
+ Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
+ Если Поз > 0 Тогда
+ РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
+ КонецЕсли;
+ Иначе
+ ТекстОшибки = СтрШаблон("Ошибка получения владельца базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ Возврат РезультатЗапроса;
+
+КонецФункции // ПолучитьВладельцаБазы()
+
+// Процедура изменяет владельца базы
+//
+// Параметры:
+// База - Строка - имя базы данных
+// НовыйВладелец - Строка - новый владелец базы
+//
+Процедура УстановитьВладельцаБазы(База, НовыйВладелец) Экспорт
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ РезультатЗапроса = "";
+ ТекстЗапроса = СтрШаблон("""ALTER AUTHORIZATION ON DATABASE::%1 TO %2""", База, НовыйВладелец);
+
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка изменения владельца базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // УстановитьВладельцаБазы()
+
+// Процедура выполняет сжатие базы (shrink)
+//
+// Параметры:
+// База - Строка - имя базы данных
+//
+Процедура СжатьБазу(База) Экспорт
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ТекстЗапроса = СтрШаблон("""DBCC SHRINKDATABASE(N'%1', 0)""", База);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла данных базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // СжатьБазу()
+
+// Процедура выполняет сжатие файла лог (shrink)
+//
+// Параметры:
+// База - Строка - Имя базы данных
+//
+Процедура СжатьФайлЖурналаТранзакций(База) Экспорт
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ЛогическоеИмяФайлаЖурнала = ПолучитьЛогическоеИмяФайлаВБазе(База, "L");
+
+ ТекстЗапроса = СтрШаблон("""USE [%1];
+ |
+ |DBCC SHRINKFILE(N'%2', 0, TRUNCATEONLY); "" ",
+ База,
+ ЛогическоеИмяФайлаЖурнала);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла журнала базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // СжатьФайлЖурналаТранзакций()
+
+// Процедура выполняет выполняет компрессию базы и индексов на уровне страниц (DATA_COMPRESSION = PAGE)
+//
+// Параметры:
+// База - Строка - имя базы данных
+// КомпрессияТаблиц - Булево - Истина - будет выполнена компрессия таблиц базы
+// КомпрессияИндексов - Булево - Истина - будет выполнена компрессия индексов базы
+//
+Процедура ВключитьКомпрессиюСтраниц(База,
+ КомпрессияТаблиц = Истина,
+ КомпрессияИндексов = Истина) Экспорт
+
+ ОписаниеВерсии = ПолучитьВерсиюСУБД();
+
+ Если НЕ ДоступностьФункционалаСУБД("Компрессия", ОписаниеВерсии) Тогда
+ Лог.Предупреждение("Для данной версии СУБД ""MS SQL Server %1 %2""
+ |не доступна функциональность компресии страниц!",
+ ОписаниеВерсии.Версия,
+ ОписаниеВерсии.Редакция);
+ Возврат;
+ КонецЕсли;
+
+ Если НЕ (КомпрессияТаблиц ИЛИ КомпрессияИндексов) Тогда
+ Лог.Предупреждение("Не указан флаг включения компрессии страниц для индексов или таблиц!");
+ Возврат;
+ КонецЕсли;
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ТекстЗапроса = СтрШаблон("""USE [%1];", База);
+ Если КомпрессияТаблиц Тогда
+ ТекстЗапроса = СтрШаблон("%1%2EXEC sp_MSforeachtable 'ALTER TABLE ? REBUILD WITH (DATA_COMPRESSION = PAGE)'",
+ ТекстЗапроса,
+ Символы.ПС);
+ КонецЕсли;
+
+ Если КомпрессияИндексов Тогда
+ ТекстЗапроса = СтрШаблон("%1%2EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? REBUILD WITH (DATA_COMPRESSION = PAGE)'",
+ ТекстЗапроса,
+ Символы.ПС);
+ КонецЕсли;
+
+ ТекстЗапроса = СтрШаблон("%1""", ТекстЗапроса);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка компресии базы ""%1"": %2%3",
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // ВключитьКомпрессиюСтраниц()
+
+// Процедура создает файл резервной копии базы
+//
+// Параметры:
+// База - Строка - имя базы данных
+// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии
+//
+Процедура СоздатьРезервнуюКопию(База, Знач ПутьКРезервнойКопии) Экспорт
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии);
+
+ ТекстЗапроса = СтрШаблон("""BACKUP DATABASE [%1] TO DISK = N'%2'
+ |WITH NOFORMAT, INIT, NAME = N'%1 FULL Backup',
+ |SKIP,
+ |NOREWIND,
+ |NOUNLOAD,
+ |COMPRESSION,
+ |STATS = 10"" ",
+ База,
+ ПутьКРезервнойКопии);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка резервного копирования базы ""%1"" в файл ""%2"": %3%4",
+ База,
+ ПутьКРезервнойКопии,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // СоздатьРезервнуюКопию()
+
+// Процедура выполняет восстановление базы из файла с резервной копией
+//
+// Параметры:
+// База - Строка - имя базы данных
+// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии
+// ПутьКФайлуДанных - Строка - путь к файлу базы
+// ПутьКФайлуЖурнала - Строка - путь к файлу журнала (transaction log) базы
+// СоздаватьБазу - Булево - Истина - будет создана новая база в случае отсутствия
+//
+Процедура ВосстановитьИзРезервнойКопии(База,
+ Знач ПутьКРезервнойКопии,
+ Знач ПутьКФайлуДанных = "",
+ Знач ПутьКФайлуЖурнала = "",
+ СоздаватьБазу = Ложь) Экспорт
+
+ Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
+ Если НЕ СоздаватьБазу Тогда
+ ТекстОшибки = СтрШаблон("База ""%1"" не обнаружена", База);
+ ВызватьИсключение ТекстОшибки;
+ Иначе
+ СоздатьБазу(База, МоделиВосстановленияБД().Простая);
+ КонецЕсли;
+ КонецЕсли;
+
+ ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии);
+
+ Если ЗначениеЗаполнено(ПутьКФайлуДанных) Тогда
+ ПутьКФайлуДанных = ФС.ПолныйПуть(ПутьКФайлуДанных);
+ Иначе
+ ПутьКФайлуДанных = РасположениеФайловБазПоУмолчанию("D");
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ПутьКФайлуЖурнала) Тогда
+ ПутьКФайлуЖурнала = ФС.ПолныйПуть(ПутьКФайлуЖурнала);
+ Иначе
+ ПутьКФайлуЖурнала = РасположениеФайловБазПоУмолчанию("L");
+ КонецЕсли;
+
+ ЛогическоеИмяФайлаДанных = ПолучитьЛогическоеИмяФайлаВРезервнойКопии(ПутьКРезервнойКопии, "D");
+ ЛогическоеИмяФайлаЖурнала = ПолучитьЛогическоеИмяФайлаВРезервнойКопии(ПутьКРезервнойКопии, "L");
+
+ ТекстЗапроса = СтрШаблон("""USE [master];
+ |
+ |ALTER DATABASE [%1] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
+ |
+ |RESTORE DATABASE [%1] FROM DISK = N'%2' WITH FILE = 1,
+ |MOVE N'%3' TO N'%4\%1.mdf',
+ |MOVE N'%5' TO N'%6\%1_log.ldf',
+ |NOUNLOAD, REPLACE, STATS = 10;
+ |
+ |ALTER DATABASE [%1] SET MULTI_USER"" ",
+ База,
+ ПутьКРезервнойКопии,
+ ЛогическоеИмяФайлаДанных,
+ ПутьКФайлуДанных,
+ ЛогическоеИмяФайлаЖурнала,
+ ПутьКФайлуЖурнала);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4",
+ ПутьКРезервнойКопии,
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // ВосстановитьИзРезервнойКопии()
+
+// Функция возвращает логическое имя файла в резервной копии
+//
+// Параметры:
+// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии
+// ТипФайла - Строка - D - файл данных; L - файл журнала транзакций
+//
+// Возвращаемое значение:
+// Строка - логическое имя файла базы в файле резервной копии
+//
+Функция ПолучитьЛогическоеИмяФайлаВРезервнойКопии(Знач ПутьКРезервнойКопии, Знач ТипФайла = Неопределено) Экспорт
+
+ ТипыФайлов = ТипыФайловБД();
+ ТипыФайловСокр = ТипыФайловБД(Истина);
+
+ Если НЕ ЗначениеЗаполнено(ТипФайла) Тогда
+ ТипФайла = ТипыФайловСокр.Данные;
+ КонецЕсли;
+
+ ТипФайла = ВРег(ТипФайла);
+
+ Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда
+ ТипФайла = ТипыФайловСокр.Данные;
+ ТипФайлаПредставление = "данных";
+ ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда
+ ТипФайла = ТипыФайловСокр.Журнал;
+ ТипФайлаПредставление = "журнала";
+ Иначе
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии);
+
+ ПоляТаблицыФайловРезервнойКопии = ПоляТаблицыФайловРезервнойКопии();
+
+ ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
+ |
+ |DECLARE @T1CTmp TABLE (%1);
+ |
+ |INSERT INTO @T1CTmp EXECUTE('RESTORE FILELISTONLY FROM DISK = N''%2''');
+ |
+ |SELECT
+ | [LogicalName]
+ |FROM
+ | @T1CTmp
+ |WHERE
+ | [Type] = '%3';
+ |
+ |SET NOCOUNT OFF;"" ",
+ ПоляТаблицыФайловРезервнойКопии,
+ ПутьКРезервнойКопии,
+ ТипФайла);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если КодВозврата = 0 Тогда
+ Разделитель = "---";
+ Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
+ Если Поз > 0 Тогда
+ РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
+ КонецЕсли;
+ Иначе
+ ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в резервной копии ""%2"": %3%4",
+ ТипФайлаПредставление,
+ ПутьКРезервнойКопии,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ Возврат РезультатЗапроса;
+
+КонецФункции // ПолучитьЛогическоеИмяФайлаВРезервнойКопии()
+
+// Функция возвращает логическое имя файла в базе
+//
+// Параметры:
+// База - Строка - имя базы данных
+// ТипФайла - Строка - ROWS - файл базы; LOG - файл журнала транзакций
+//
+// Возвращаемое значение:
+// Строка - логическое имя файла базы
+//
+Функция ПолучитьЛогическоеИмяФайлаВБазе(База, Знач ТипФайла = Неопределено) Экспорт
+
+ ТипыФайлов = ТипыФайловБД();
+ ТипыФайловСокр = ТипыФайловБД(Истина);
+
+ Если НЕ ЗначениеЗаполнено(ТипФайла) Тогда
+ ТипФайла = ТипыФайлов.Данные;
+ КонецЕсли;
+
+ Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда
+ ТипФайла = ТипыФайлов.Данные;
+ ТипФайлаПредставление = "данных";
+ ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда
+ ТипФайла = ТипыФайлов.Журнал;
+ ТипФайлаПредставление = "журнала";
+ Иначе
+ ТекстОшибки = СтрШаблон("Некорректно указан тип файла ""%1"" для получения логического имени,
+ | ожидается ""ROWS (D) ИЛИ LOG (L).",
+ ТипФайла);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
+ |
+ |SELECT
+ | [name]
+ |FROM
+ | sys.master_files
+ |WHERE
+ | [database_id]=db_id('%1')
+ | AND type_desc='%2';
+ |
+ |SET NOCOUNT OFF;"" ",
+ База,
+ ТипФайла);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если КодВозврата = 0 Тогда
+ Разделитель = "---";
+ Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
+ Если Поз > 0 Тогда
+ РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
+ КонецЕсли;
+ Иначе
+ ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2"": %3%4",
+ ТипФайлаПредставление,
+ База,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ Возврат РезультатЗапроса;
+
+КонецФункции // ПолучитьЛогическоеИмяФайлаВБазе()
+
+// Процедура изменяет логическое имя файла базы
+//
+// Параметры:
+// База - Строка - имя базы данных
+// Имя - Строка - логическое имя изменяемого файла
+// НовоеИмя - Строка - новое логическое имя
+//
+Процедура ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя) Экспорт
+
+ Если Имя = НовоеИмя Тогда
+ Лог.Предупреждение("Новое логическое имя ""%1"" совпадает со старым ""%2""!", Имя, НовоеИмя);
+ Возврат;
+ КонецЕсли;
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ТекстЗапроса = СтрШаблон("""USE [master];
+ |
+ |ALTER DATABASE [%1]
+ |MODIFY FILE (NAME = N'%2', NEWNAME = N'%3');"" ",
+ База,
+ Имя,
+ НовоеИмя);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" базы ""%2"" на ""%3"": %4%5",
+ Имя,
+ База,
+ НовоеИмя,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры // ИзменитьЛогическоеИмяФайлаВБазе()
+
+// Функция возвращает путь к расположению по умолчанию для указанного типа файлов базы
+//
+// Параметры:
+// ТипФайла - Строка - ROWS - файл базы; LOG - файл журнала транзакций
+//
+// Возвращаемое значение:
+// Строка - путь к расположению по умолчанию
+//
+Функция РасположениеФайловБазПоУмолчанию(Знач ТипФайла = Неопределено) Экспорт
+
+ ТипыФайлов = ТипыФайловБД();
+ ТипыФайловСокр = ТипыФайловБД(Истина);
+
+ Если НЕ ЗначениеЗаполнено(ТипФайла) Тогда
+ ТипФайла = ТипыФайлов.Данные;
+ КонецЕсли;
+
+ Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда
+ ТипФайла = ТипыФайлов.Данные;
+ ТипФайлаПредставление = "данных";
+ ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда
+ ТипФайла = ТипыФайлов.Журнал;
+ ТипФайлаПредставление = "журналов";
+ Иначе
+ Возврат Неопределено;
+ КонецЕсли;
+
+
+ ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
+ |
+ |SELECT
+ | [physical_name]
+ |FROM
+ | sys.master_files
+ |WHERE
+ | [database_id]=4
+ | AND type_desc='%1';
+ |
+ |SET NOCOUNT OFF;"" ",
+ ТипФайла);
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
+
+ Если КодВозврата = 0 Тогда
+ Разделитель = "---";
+ Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
+ Если Поз > 0 Тогда
+ РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
+ КонецЕсли;
+
+ ФайлБазы = Новый Файл(РезультатЗапроса);
+ РезультатЗапроса = Сред(ФайлБазы.Путь, 1, СтрДлина(ФайлБазы.Путь) - 1);
+
+ Иначе
+ ТекстОшибки = СтрШаблон("Ошибка получения расположения по умолчанию файлов %1: %2%3",
+ ТипФайлаПредставление,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ Возврат РезультатЗапроса;
+
+КонецФункции // РасположениеФайловБазПоУмолчанию()
+
+// Функция возвращает описание установленной версии SQL Server
+//
+// Возвращаемое значение:
+// Структура - описание версии 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;
+ |SET NOCOUNT OFF;"" ";
+
+ РезультатЗапроса = "";
+ КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса, "|", Истина);
+
+ Если КодВозврата = 0 Тогда
+ Разделитель = "---";
+ Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
+ Если Поз > 0 Тогда
+ РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
+ КонецЕсли;
+ Иначе
+ ТекстОшибки = СтрШаблон("Ошибка получения версии СУБД: %1%2",
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ ИмяСервера = 0;
+ ИмяЭкземпляраСУБД = 1;
+ Редакция = 2;
+ Версия = 3;
+ Уровень = 4;
+ Представление = 5;
+
+ // 2000 - 2000 (8)), 2005 - 9, 2008 - 10, 2012 - 11, 2014 - 12, 2016 - 13, 2017 - 14, 2019 - 15
+ МассивВерсий = СтрРазделить("2000-8,9,10,11,12,13,14,15", ",");
+
+ СоответствиеВерсий = Новый Соответствие();
+
+ Для Каждого ТекВерсия Из МассивВерсий Цикл
+ ЧастиВерсии = СтрРазделить(ТекВерсия, "-");
+
+ КоличествоЧастей = ЧастиВерсии.Количество();
+ Если КоличествоЧастей = 1 Тогда
+ СоответствиеВерсий.Вставить(ЧастиВерсии[0], Число(ЧастиВерсии[0]));
+ ИначеЕсли КоличествоЧастей > 1 Тогда
+ СоответствиеВерсий.Вставить(ЧастиВерсии[0], Число(ЧастиВерсии[1]));
+ Иначе
+ Возврат Неопределено;
+ КонецЕсли;
+ КонецЦикла;
+
+ СтруктураРезультата = Новый Структура();
+
+ МассивЗначений = СтрРазделить(РезультатЗапроса, "|", Ложь);
+
+ СтруктураРезультата.Вставить("ИмяСервера" , МассивЗначений[ИмяСервера]);
+ СтруктураРезультата.Вставить("ИмяЭкземпляраСУБД", МассивЗначений[ИмяЭкземпляраСУБД]);
+ СтруктураРезультата.Вставить("Редакция" , МассивЗначений[Редакция]);
+ СтруктураРезультата.Вставить("Версия" , МассивЗначений[Версия]);
+ СтруктураРезультата.Вставить("Уровень" , МассивЗначений[Уровень]);
+ СтруктураРезультата.Вставить("Представление" , МассивЗначений[Представление]);
+
+ МассивВерсии = СтрРазделить(СтруктураРезультата["Версия"], ".");
+ СтруктураРезультата.Вставить("ВерсияМакс" , СоответствиеВерсий[МассивВерсии[0]]);
+
+ СтруктураРезультата.Вставить("Корп" , СтрНайти(ВРег(СтруктураРезультата["Редакция"]), "ENTERPRISE") > 0);
+
+ Возврат СтруктураРезультата;
+
+КонецФункции // ПолучитьВерсиюСУБД()
+
+// Функция - возвращает описание занимаемого места в базе 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С(База) Экспорт
+
+ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().ИсключениеПриОтсутствии);
+
+ ТекстЗапроса = СтрШаблон("""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;
+ | 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С
+//
+// Параметры:
+// База - Строка - имя базы данных
+// ИдОбъектов - Число - массив идентификаторов объектов метаданных,
+// если не указан, считываются все записи
+//
+// Возвращаемое значение:
+// Число - количество записей в таблице конфигурации информационной базы 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
+//
+// Параметры:
+// Функционал - Строка - наименование проверяемого функционала
+// ОписаниеВерсии - Соответствие - описание версии SQL Server
+// *ИмяСервера - Строка - имя сервера
+// *ИмяЭкземпляраСУБД - Строка - имя экземпляра СУБД на сервере
+// *Редакция - Строка - номер редакции
+// *Версия - Строка - номер версии
+// *Уровень - Строка - уровень продукта
+// *ВерсияМакс - Строка - старший номер версии (2000 - 2000 (8)), 2005 - 9,
+// 2008 - 10, 2012 - 11, 2014 - 12, 2016 - 13)
+// *Корп - Строка - признак Enterprise версии
+//
+// Возвращаемое значение:
+// Булево - Истина - функционал доступен
+//
+Функция ДоступностьФункционалаСУБД(Знач Функционал, ОписаниеВерсии = Неопределено) Экспорт
+
+ МинВерсияАвторизации = 10;
+ МинВерсияКомпрессии = 13;
+
+ СтруктураФункционала = Новый Структура("Компрессия, ИзменениеАвторизации", Ложь, Ложь);
+
+ Если НЕ ТипЗнч(ОписаниеВерсии) = Тип("Соответствие") Тогда
+ ОписаниеВерсии = ПолучитьВерсиюСУБД();
+ КонецЕсли;
+
+ Если ОписаниеВерсии = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Если ОписаниеВерсии.ВерсияМакс >= МинВерсияАвторизации Тогда
+ СтруктураФункционала.ИзменениеАвторизации = Истина;
+ КонецЕсли;
+
+ Если ОписаниеВерсии.ВерсияМакс >= МинВерсияКомпрессии ИЛИ ОписаниеВерсии.Корп Тогда
+ СтруктураФункционала.Компрессия = Истина;
+ КонецЕсли;
+
+ Если НЕ СтруктураФункционала.Свойство(Функционал) Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат СтруктураФункционала[Функционал];
+
+КонецФункции // ДоступностьФункционалаСУБД()
+
+// Функция выполняет запрос к СУБД (используется консольная утилита sqlcmd)
+//
+// Параметры:
+// ТекстЗапроса - Строка - текст исполняемого запроса
+// РезультатЗапроса - Строка - результат выполнения команду
+// Разделитель - Строка - символ - разделитель колонок результата
+// УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата
+//
+// Возвращаемое значение:
+// Булево - Истина - команда выполнена успешно
+//
+Функция ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса = "", Разделитель = "", УбратьПробелы = Ложь) Экспорт
+
+ Лог.Отладка("Текст запроса: %1", ТекстЗапроса);
+
+ КомандаРК = Новый Команда;
+
+ КомандаРК.УстановитьКоманду("sqlcmd");
+ КомандаРК.ДобавитьПараметр("-S " + Сервер);
+ Если ЗначениеЗаполнено(Пользователь) Тогда
+ КомандаРК.ДобавитьПараметр("-U " + Пользователь);
+ Если ЗначениеЗаполнено(пароль) Тогда
+ КомандаРК.ДобавитьПараметр("-P " + Пароль);
+ КонецЕсли;
+ КонецЕсли;
+ КомандаРК.ДобавитьПараметр("-Q " + ТекстЗапроса);
+ КомандаРК.ДобавитьПараметр("-b");
+
+ Если ЗначениеЗаполнено(Разделитель) Тогда
+ КомандаРК.ДобавитьПараметр(СтрШаблон("-s ""%1""", Разделитель));
+ КонецЕсли;
+
+ Если УбратьПробелы Тогда
+ КомандаРК.ДобавитьПараметр("-W");
+ Иначе
+ КомандаРК.ДобавитьПараметр("-y 0");
+ КонецЕсли;
+
+ ПутьКФайлуРезультата = ПолучитьИмяВременногоФайла();
+ КомандаРК.ДобавитьПараметр(СтрШаблон("-o ""%1""", ПутьКФайлуРезультата));
+
+ КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы(Ложь);
+ КомандаРК.ПоказыватьВыводНемедленно(Ложь);
+
+ КодВозврата = КомандаРК.Исполнить();
+
+ Если ФС.Существует(ПутьКФайлуРезультата) Тогда
+ ТекстРезультата = Новый ТекстовыйДокумент();
+ ТекстРезультата.Прочитать(ПутьКФайлуРезультата);
+ РезультатЗапроса = СокрЛП(ТекстРезультата.ПолучитьТекст());
+ УдалитьФайлы(ПутьКФайлуРезультата);
+ Иначе
+ РезультатЗапроса = КомандаРК.ПолучитьВывод();
+ КонецЕсли;
+
+ Возврат КодВозврата;
+
+КонецФункции // ВыполнитьЗапросСУБД()
+
+// Функция выполняет запрос к СУБД, выполняя текст из файлов скриптов (используется консольная утилита sqlcmd)
+//
+// Параметры:
+// МассивСкриптов - Массив из Строка - массив с путями к файлам скриптов
+// МассивПеременных - Массив из Строка - массив со значениями переменных вида "<Имя>=<Значение>"
+// РезультатЗапроса - Строка - результат выполнения команды
+//
+// Возвращаемое значение:
+// Булево - Истина - команда выполнена успешно
+//
+Функция ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных = Неопределено, РезультатЗапроса = "") Экспорт
+
+ КомандаРК = Новый Команда;
+
+ КомандаРК.УстановитьКоманду("sqlcmd");
+ КомандаРК.ДобавитьПараметр("-S " + Сервер);
+ Если ЗначениеЗаполнено(Пользователь) Тогда
+ КомандаРК.ДобавитьПараметр("-U " + Пользователь);
+ Если ЗначениеЗаполнено(пароль) Тогда
+ КомандаРК.ДобавитьПараметр("-P " + Пароль);
+ КонецЕсли;
+ КонецЕсли;
+
+ Для каждого Файл Из МассивСкриптов Цикл
+ Лог.Отладка("Добавлен файл скрипта: %1", Файл);
+
+ КомандаРК.ДобавитьПараметр(СтрШаблон("-i %1", Файл));
+ КонецЦикла;
+
+ Если ТипЗнч(МассивПеременных) = Тип("Массив") Тогда
+ Для каждого Переменная Из МассивПеременных Цикл
+ Лог.Отладка("Добавлено значение переменной: %1", Переменная);
+
+ КомандаРК.ДобавитьПараметр(СтрШаблон("-v %1", Переменная));
+ КонецЦикла;
+ КонецЕсли;
+
+ КомандаРК.ДобавитьПараметр("-b");
+
+ КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы( Ложь );
+ КомандаРК.ПоказыватьВыводНемедленно( Ложь );
+
+ КодВозврата = КомандаРК.Исполнить();
+
+ РезультатЗапроса = КомандаРК.ПолучитьВывод();
+
+ Возврат КодВозврата;
+
+КонецФункции // ВыполнитьСкриптыЗапросСУБД()
+
+#КонецОбласти // ПрограммныйИнтерфейс
+
+#Область СлужебныеПроцедурыИФункции
+
+// Функция возвращает список полей таблицы информации о резервной копии
+//
+// Возвращаемое значение:
+// Строка - список полей таблицы с информацией о резервной копии (разделенный ",")
+//
+Функция ПоляТаблицыФайловРезервнойКопии()
+
+ ОписаниеПолей = "[LogicalName] nvarchar(128),
+ |[PhysicalName] nvarchar(260),
+ |[Type] char(1),
+ |[FileGroupName] nvarchar(128),
+ |[Size] numeric(20,0),
+ |[MaxSize] numeric(20,0),
+ |[FileID] bigint,
+ |[CreateLSN] numeric(25,0),
+ |[DropLSN] numeric(25,0) NULL,
+ |[UniqueID] uniqueidentifier,
+ |[ReadOnlyLSN] numeric(25,0) NULL,
+ |[ReadWriteLSN] numeric(25,0) NULL,
+ |[BackupSizeInBytes] bigint,
+ |[SourceBlockSize] int,
+ |[FileGroupID] int,
+ |[LogGroupGUID] uniqueidentifier NULL,
+ |[DifferentialBaseLSN] numeric(25,0) NULL,
+ |[DifferentialBaseGUID] uniqueidentifier,
+ |[IsReadOnly] bit,
+ |[IsPresent] bit,
+ |[TDEThumbprint] varbinary(32)";
+
+ ОписаниеВерсии = ПолучитьВерсиюСУБД();
+
+ Версия2016 = 13;
+
+ Если ОписаниеВерсии.ВерсияМакс >= Версия2016 Тогда
+ ОписаниеПолей = СтрШаблон("%1,
+ |[SnapshotUrl] nvarchar(360)",
+ ОписаниеПолей);
+ КонецЕсли;
+
+ Возврат ОписаниеПолей;
+
+КонецФункции // ПоляТаблицыФайловРезервнойКопии()
+
+// Функция возвращает список возможных типов файлов базы данных или таблиц резервной копии
+//
+// Параметры:
+// Сокращенные - Булево - Истина - возвращать список сокращенных обозначений
+// типов баз (для файлов в файлах резервных копий);
+// Ложь - список полных обозначений (для файлов баз данных)
+//
+// Возвращаемое значение:
+// ФиксированнаяСтруктура - список возможных типов файлов базы данных или таблиц резервной копии
+//
+Функция ТипыФайловБД(Сокращенные = Ложь)
+
+ ТипыФайлов = Новый Структура();
+ ТипыФайлов.Вставить("Данные" , "ROWS");
+ ТипыФайлов.Вставить("Журнал" , "LOG");
+
+ ТипыФайловСокр = Новый Структура();
+ ТипыФайловСокр.Вставить("Данные", "D");
+ ТипыФайловСокр.Вставить("Журнал", "L");
+
+ Возврат Новый ФиксированнаяСтруктура(?(Сокращенные, ТипыФайловСокр, ТипыФайлов));
+
+КонецФункции // ТипыФайловБД()
+
+// Функция возвращает список вариантов сообщения о существовании базы данных при проверке
+//
+// Возвращаемое значение:
+// ФиксированнаяСтруктура - варианты сообщения о существовании базы данных при проверке
+//
+Функция ВариантыСообщенияОСуществованииБД()
+
+ ВариантыСообщения = Новый Структура();
+ ВариантыСообщения.Вставить("НеСообщать" , "НЕСООБЩАТЬ");
+ ВариантыСообщения.Вставить("СообщатьОСуществовании" , "СООБЩАТЬОСУЩЕСТВОВАНИИ");
+ ВариантыСообщения.Вставить("ИсключениеПриСуществовании", "ИСКЛЮЧЕНИЕПРИСУЩЕСТВОВАНИИ");
+ ВариантыСообщения.Вставить("СообщатьОбОтсутствии" , "СООБЩАТЬОБОТСУТСТВИИ");
+ ВариантыСообщения.Вставить("ИсключениеПриОтсутствии" , "ИСКЛЮЧЕНИЕПРИОТСУТСТВИИ");
+
+ Возврат Новый ФиксированнаяСтруктура(ВариантыСообщения);
+
+КонецФункции // ВариантыСообщенияОСуществованииБД()
+
+// Функция возвращает список возможных моделей восстановления базы данных
+//
+// Возвращаемое значение:
+// ФиксированнаяСтруктура - возможные модели восстановления базы данных
+//
+Функция МоделиВосстановленияБД()
+
+ МоделиВосстановления = Новый Структура();
+ МоделиВосстановления.Вставить("Простая" , "SIMPLE");
+ МоделиВосстановления.Вставить("Полная" , "FULL");
+ МоделиВосстановления.Вставить("МинимальноеПротоколирование", "BULK_LOGGED");
+
+ Возврат Новый ФиксированнаяСтруктура(МоделиВосстановления);
+
+КонецФункции // ВариантыСообщенияОСуществованииБД()
+
+// Функция - читает атрибуты узла 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\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"
deleted file mode 100644
index bb1aa29..0000000
--- "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"
+++ /dev/null
@@ -1,1104 +0,0 @@
-// ----------------------------------------------------------
-// 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/
-// ----------------------------------------------------------
-
-#Использовать 1commands
-#Использовать fs
-
-Перем Лог; // - Объект - объект записи лога приложения
-Перем Сервер; // - Строка - адрес сервера СУБД
-Перем Пользователь; // - Строка - Пользователь сервера СУБД
-Перем Пароль; // - Строка - Пароль пользователя сервера СУБД
-
-#Область ПрограммныйИнтерфейс
-
-Функция Сервер() Экспорт
-
- Возврат Сервер;
-
-КонецФункции // Сервер()
-
-Процедура УстановитьСервер(Знач НовоеЗначение) Экспорт
-
- Сервер = НовоеЗначение;
-
-КонецПроцедуры // УстановитьСервер()
-
-Функция Пользователь() Экспорт
-
- Возврат Пользователь;
-
-КонецФункции // Пользователь()
-
-Процедура УстановитьПользователь(Знач НовоеЗначение) Экспорт
-
- Пользователь = НовоеЗначение;
-
-КонецПроцедуры // УстановитьПользователь()
-
-Процедура УстановитьПароль(Знач НовоеЗначение) Экспорт
-
- Пароль = НовоеЗначение;
-
-КонецПроцедуры // УстановитьПароль()
-
-////////////////////////////////////////////////////////////////////////////////
-// Работа с СУБД
-
-// Функция проверяет существование базу на сервере СУБД
-//
-// Параметры:
-// База - Строка - имя базы данных
-// ВариантСообщенияОСуществовании - Строка - в каких случаях выводить сообщение о существании БД
-//
-// Возвращаемое значение:
-// Булево - Истина - база существует на сервере СУБД
-//
-Функция БазаСуществует(База, ВариантСообщенияОСуществовании = Неопределено) Экспорт
-
- ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
- |SELECT
- | COUNT(name)
- |FROM
- | sysdatabases
- |WHERE
- | name = '%1';
- |
- |SET NOCOUNT OFF""",
- База);
-
- РезультатЗапроса = "";
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
-
- Если КодВозврата = 0 Тогда
- РезультатЗапроса = СокрЛП(СтрЗаменить(РезультатЗапроса, "-", ""));
- Результат = РезультатЗапроса = "1";
- Иначе
- Результат = Ложь;
- КонецЕсли;
-
- ВариантыСообщения = ВариантыСообщенияОСуществованииБД();
-
- Если НЕ ЗначениеЗаполнено(ВариантСообщенияОСуществовании) Тогда
- ВариантСообщенияОСуществовании = ВариантыСообщения.НеСообщать;
- КонецЕсли;
-
- Если ВариантСообщенияОСуществовании = ВариантыСообщения.СообщатьОСуществовании
- И Результат Тогда
- Лог.Предупреждение("База ""%1"" уже существует!", База);
- ИначеЕсли ВариантСообщенияОСуществовании = ВариантыСообщения.СообщатьОбОтсутствии
- И НЕ Результат Тогда
- Лог.Предупреждение("База ""%1"" не существует!", База);
- ИначеЕсли Результат Тогда
- Лог.Отладка("База ""%1"" существует!", База);
- Иначе
- Лог.Отладка("База ""%1"" не существует!", База);
- КонецЕсли;
-
- Возврат Результат;
-
-КонецФункции // БазаСуществует()
-
-// Функция выполняет команду создания базы на сервере СУБД
-//
-// Параметры:
-// База - Строка - имя базы данных
-// МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED)
-// ПутьККаталогу - Строка - путь к каталогу для размещения файлов базы данных
-// если не указан, то файлы размещаются в каталоге по умолчанию SQL Server
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция СоздатьБазу(База,
- Знач МодельВосстановления = Неопределено,
- Знач ПутьККаталогу = "",
- ОписаниеРезультата = "") Экспорт
-
- Если БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОСуществовании) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Если НЕ ЗначениеЗаполнено(МодельВосстановления) Тогда
- МодельВосстановления = МоделиВосстановленияБД().Полная;
- КонецЕсли;
-
- ПутьККаталогу = ФС.ПолныйПуть(ПутьККаталогу);
-
- Если ЗначениеЗаполнено(ПутьККаталогу) Тогда
- ТекстЗапроса = СтрШаблон("""USE [master];
- |
- |CREATE DATABASE [%1]
- |ON
- |( NAME = %1,
- | FILENAME = '%2\%1.mdf')
- |LOG ON
- |( NAME = %1_log,
- | FILENAME = '%2\%1_log.ldf');
- |
- |ALTER DATABASE [%1]
- |SET RECOVERY %3""",
- База,
- ПутьККаталогу,
- МодельВосстановления);
- Иначе
- ТекстЗапроса = СтрШаблон("""USE [master];
- |
- |CREATE DATABASE [%1];
- |
- |ALTER DATABASE [%1]
- |SET RECOVERY %2""",
- База,
- МодельВосстановления);
- КонецЕсли;
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // СоздатьБазу()
-
-// Функция выполняет команду удаления базы на сервере СУБД
-//
-// Параметры:
-// База - Строка - имя базы данных
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция УдалитьБазу(База, ОписаниеРезультата = "") Экспорт
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""USE [master];
- |
- |DROP DATABASE [%1]""",
- База);
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // УдалитьБазу()
-
-// Функция получает модель восстановления базы
-//
-// Параметры:
-// База - Строка - имя базы данных
-//
-// Возвращаемое значение:
-// Строка - модель восстановления (FULL, SIMPLE, BULK_LOGGED)
-//
-Функция ПолучитьМодельВосстановления(База) Экспорт
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Неопределено;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
- |
- |SELECT
- | [recovery_model_desc] AS Recovery_model
- |FROM sys.databases
- |
- |WHERE name = '%1';
- |
- |SET NOCOUNT OFF;""",
- База);
-
- РезультатЗапроса = "";
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
-
- Если КодВозврата = 0 Тогда
- Разделитель = "---";
- Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
- РезультатЗапроса = ВРег(СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель))));
- Иначе
- РезультатЗапроса = Неопределено;
- КонецЕсли;
-
- Возврат РезультатЗапроса;
-
-КонецФункции // ПолучитьМодельВосстановления()
-
-// Функция устанавливает модель восстановления базы
-//
-// Параметры:
-// База - Строка - имя базы данных
-// МодельВосстановления - Строка - новая модель восстановления (FULL, SIMPLE, BULK_LOGGED)
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция УстановитьМодельВосстановления(База, МодельВосстановления = Неопределено, ОписаниеРезультата = "") Экспорт
-
- Если Найти("FULL,SIMPLE,BULK_LOGGED", ВРег(МодельВосстановления)) = 0 Тогда
- Лог.Предупреждение("Указана некорректная модель восстановления ""%1""
- | (возможные значения: ""FULL"", ""SIMPLE"", ""BULK_LOGGED"")!",
- МодельВосстановления);
- Возврат Ложь;
- КонецЕсли;
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""USE [master];
- |
- |ALTER DATABASE %1
- |SET RECOVERY %2""",
- База,
- ВРег(МодельВосстановления));
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // УстановитьМодельВосстановления()
-
-// Функция изменяет владельца базы
-//
-// Параметры:
-// База - Строка - имя базы данных
-//
-// Возвращаемое значение:
-// Строка - имя текущего владельца базы
-//
-Функция ПолучитьВладельцаБазы(База) Экспорт
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
- |
- |SELECT
- | logins.name AS login
- |
- |FROM sys.databases AS databases
- |LEFT JOIN sys.syslogins AS logins
- |ON databases.owner_sid = logins.sid
- |
- |WHERE databases.name = '%1'
- |
- |SET NOCOUNT OFF;""",
- База);
-
- РезультатЗапроса = "";
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
-
- Если КодВозврата = 0 Тогда
- Разделитель = "---";
- Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
- РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
- Иначе
- РезультатЗапроса = Неопределено;
- КонецЕсли;
-
- Возврат РезультатЗапроса;
-
-КонецФункции // ПолучитьВладельцаБазы()
-
-// Функция изменяет владельца базы
-//
-// Параметры:
-// База - Строка - имя базы данных
-// НовыйВладелец - Строка - новый владелец базы
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция УстановитьВладельцаБазы(База, НовыйВладелец, ОписаниеРезультата = "") Экспорт
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""ALTER AUTHORIZATION ON DATABASE::%1 TO %2""", База, НовыйВладелец);
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // УстановитьВладельцаБазы()
-
-// Функция выполняет сжатие базы (shrink)
-//
-// Параметры:
-// База - Строка - имя базы данных
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция СжатьБазу(База, ОписаниеРезультата = "") Экспорт
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""DBCC SHRINKDATABASE(N'%1', 0)""", База);
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // СжатьБазу()
-
-// Функция выполняет сжатие файла лог (shrink)
-//
-// Параметры:
-// База - Строка - Имя базы данных
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция СжатьФайлЖурналаТранзакций(База, ОписаниеРезультата = "") Экспорт
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ЛогическоеИмяФайлаЖурнала = ПолучитьЛогическоеИмяФайлаВБазе(База, "L");
-
- ТекстЗапроса = СтрШаблон("""USE [%1];
- |
- |DBCC SHRINKFILE(N'%2', 0, TRUNCATEONLY); """,
- База,
- ЛогическоеИмяФайлаЖурнала);
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // СжатьФайлЖурналаТранзакций()
-
-// Функция выполняет выполняет компрессию базы и индексов на уровне страниц (DATA_COMPRESSION = PAGE)
-//
-// Параметры:
-// База - Строка - имя базы данных
-// КомпрессияТаблиц - Булево - Истина - будет выполнена компрессия таблиц базы
-// КомпрессияИндексов - Булево - Истина - будет выполнена компрессия индексов базы
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция ВключитьКомпрессиюСтраниц(База,
- КомпрессияТаблиц = Истина,
- КомпрессияИндексов = Истина,
- ОписаниеРезультата = "") Экспорт
-
- ОписаниеВерсии = ПолучитьВерсиюСУБД();
-
- Если НЕ ДоступностьФункционалаСУБД("Компрессия", ОписаниеВерсии) Тогда
- Лог.Предупреждение("Для данной версии СУБД ""MS SQL Server %1 %2""
- |не доступна функциональность компресии страниц!",
- ОписаниеВерсии.Версия,
- ОписаниеВерсии.Редакция);
- Возврат Истина;
- КонецЕсли;
-
- Если НЕ (КомпрессияТаблиц ИЛИ КомпрессияИндексов) Тогда
- Лог.Предупреждение("Не указан флаг включения компрессии страниц для индексов или таблиц!");
- Возврат Истина;
- КонецЕсли;
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""USE [%1];", База);
- Если КомпрессияТаблиц Тогда
- ТекстЗапроса = СтрШаблон("%1%2EXEC sp_MSforeachtable 'ALTER TABLE ? REBUILD WITH (DATA_COMPRESSION = PAGE)'",
- ТекстЗапроса,
- Символы.ПС);
- КонецЕсли;
-
- Если КомпрессияИндексов Тогда
- ТекстЗапроса = СтрШаблон("%1%2EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? REBUILD WITH (DATA_COMPRESSION = PAGE)'",
- ТекстЗапроса,
- Символы.ПС);
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("%1""", ТекстЗапроса);
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // ВключитьКомпрессиюСтраниц()
-
-// Функция создает файл резервной копии базы
-//
-// Параметры:
-// База - Строка - имя базы данных
-// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция СоздатьРезервнуюКопию(База, Знач ПутьКРезервнойКопии, ОписаниеРезультата = "") Экспорт
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии);
-
- ТекстЗапроса = СтрШаблон("""BACKUP DATABASE [%1] TO DISK = N'%2'
- |WITH NOFORMAT, INIT, NAME = N'%1 FULL Backup',
- |SKIP,
- |NOREWIND,
- |NOUNLOAD,
- |COMPRESSION,
- |STATS = 10""",
- База,
- ПутьКРезервнойКопии);
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // СоздатьРезервнуюКопию()
-
-// Функция выполняет восстановление базы из файла с резервной копией
-//
-// Параметры:
-// База - Строка - имя базы данных
-// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии
-// ПутьКФайлуДанных - Строка - путь к файлу базы
-// ПутьКФайлуЖурнала - Строка - путь к файлу журнала (transaction log) базы
-// СоздаватьБазу - Булево - Истина - будет создана новая база в случае отсутствия
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция ВосстановитьИзРезервнойКопии(База,
- Знач ПутьКРезервнойКопии,
- Знач ПутьКФайлуДанных = "",
- Знач ПутьКФайлуЖурнала = "",
- СоздаватьБазу = Ложь,
- ОписаниеРезультата = "") Экспорт
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Если НЕ СоздаватьБазу Тогда
- Возврат Ложь;
- Иначе
- Если НЕ СоздатьБазу(База, МоделиВосстановленияБД().Простая, ОписаниеРезультата) Тогда
- Возврат Ложь;
- КонецЕсли;
- КонецЕсли;
- КонецЕсли;
-
- ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии);
-
- Если ЗначениеЗаполнено(ПутьКФайлуДанных) Тогда
- ПутьКФайлуДанных = ФС.ПолныйПуть(ПутьКФайлуДанных);
- Иначе
- ПутьКФайлуДанных = РасположениеФайловБазПоУмолчанию("D");
- КонецЕсли;
-
- Если ЗначениеЗаполнено(ПутьКФайлуЖурнала) Тогда
- ПутьКФайлуЖурнала = ФС.ПолныйПуть(ПутьКФайлуЖурнала);
- Иначе
- ПутьКФайлуЖурнала = РасположениеФайловБазПоУмолчанию("L");
- КонецЕсли;
-
- ЛогическоеИмяФайлаДанных = ПолучитьЛогическоеИмяФайлаВРезервнойКопии(ПутьКРезервнойКопии, "D");
- ЛогическоеИмяФайлаЖурнала = ПолучитьЛогическоеИмяФайлаВРезервнойКопии(ПутьКРезервнойКопии, "L");
-
- ТекстЗапроса = СтрШаблон("""USE [master];
- |
- |ALTER DATABASE [%1] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
- |
- |RESTORE DATABASE [%1] FROM DISK = N'%2' WITH FILE = 1,
- |MOVE N'%3' TO N'%4\%1.mdf',
- |MOVE N'%5' TO N'%6\%1_log.ldf',
- |NOUNLOAD, REPLACE, STATS = 10;
- |
- |ALTER DATABASE [%1] SET MULTI_USER""",
- База,
- ПутьКРезервнойКопии,
- ЛогическоеИмяФайлаДанных,
- ПутьКФайлуДанных,
- ЛогическоеИмяФайлаЖурнала,
- ПутьКФайлуЖурнала);
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // ВосстановитьИзРезервнойКопии()
-
-// Функция возвращает логическое имя файла в резервной копии
-//
-// Параметры:
-// ПутьКРезервнойКопии - Строка - путь к файлу резервной копии
-// ТипФайла - Строка - D - файл данных; L - файл журнала транзакций
-//
-// Возвращаемое значение:
-// Строка - логическое имя файла базы в файле резервной копии
-//
-Функция ПолучитьЛогическоеИмяФайлаВРезервнойКопии(Знач ПутьКРезервнойКопии, Знач ТипФайла = Неопределено) Экспорт
-
- ТипыФайлов = ТипыФайловБД();
- ТипыФайловСокр = ТипыФайловБД(Истина);
-
- Если НЕ ЗначениеЗаполнено(ТипФайла) Тогда
- ТипФайла = ТипыФайловСокр.Данные;
- КонецЕсли;
-
- Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда
- ТипФайла = ТипыФайловСокр.Данные;
- ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда
- ТипФайла = ТипыФайловСокр.Журнал;
- Иначе
- Возврат Неопределено;
- КонецЕсли;
-
- ПутьКРезервнойКопии = ФС.ПолныйПуть(ПутьКРезервнойКопии);
-
- ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
- |
- |DECLARE @T1CTmp TABLE (%1);
- |
- |INSERT INTO @T1CTmp EXECUTE('RESTORE FILELISTONLY FROM DISK = N''%2''');
- |
- |SELECT
- | [LogicalName]
- |FROM
- | @T1CTmp
- |WHERE
- | [Type] = '%3';
- |
- |SET NOCOUNT OFF;""",
- ПолучитьСписокПолейТаблицыФайловРезервнойКопии(),
- ПутьКРезервнойКопии,
- ВРег(ТипФайла));
-
- РезультатЗапроса = "";
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
-
- Если КодВозврата = 0 Тогда
- Разделитель = "---";
- Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
- РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
- КонецЕсли;
-
- Возврат РезультатЗапроса;
-
-КонецФункции // ПолучитьЛогическоеИмяФайлаВРезервнойКопии()
-
-// Функция возвращает логическое имя файла в базе
-//
-// Параметры:
-// База - Строка - имя базы данных
-// ТипФайла - Строка - ROWS - файл базы; LOG - файл журнала транзакций
-//
-// Возвращаемое значение:
-// Строка - логическое имя файла базы
-//
-Функция ПолучитьЛогическоеИмяФайлаВБазе(База, Знач ТипФайла = Неопределено) Экспорт
-
- ТипыФайлов = ТипыФайловБД();
- ТипыФайловСокр = ТипыФайловБД(Истина);
-
- Если НЕ ЗначениеЗаполнено(ТипФайла) Тогда
- ТипФайла = ТипыФайлов.Данные;
- КонецЕсли;
-
- Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда
- ТипФайла = ТипыФайлов.Данные;
- ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда
- ТипФайла = ТипыФайлов.Журнал;
- Иначе
- Возврат Неопределено;
- КонецЕсли;
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Неопределено;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
- |
- |SELECT
- | [name]
- |FROM
- | sys.master_files
- |WHERE
- | [database_id]=db_id('%1')
- | AND type_desc='%2';
- |
- |SET NOCOUNT OFF;""",
- База,
- ТипФайла);
-
- РезультатЗапроса = "";
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
-
- Если КодВозврата = 0 Тогда
- Разделитель = "---";
- Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
- РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
- Иначе
- РезультатЗапроса = Неопределено;
- КонецЕсли;
-
- Возврат РезультатЗапроса;
-
-КонецФункции // ПолучитьЛогическоеИмяФайлаВБазе()
-
-// Функция изменяет логическое имя файла базы
-//
-// Параметры:
-// База - Строка - имя базы данных
-// Имя - Строка - логическое имя изменяемого файла
-// НовоеИмя - Строка - новое логическое имя
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя, ОписаниеРезультата = "") Экспорт
-
- Если Имя = НовоеИмя Тогда
- Лог.Предупреждение("Новое логическое имя ""%1"" совпадает со старым ""%2""!", Имя, НовоеИмя);
- Возврат Истина;
- КонецЕсли;
-
- Если НЕ БазаСуществует(База, ВариантыСообщенияОСуществованииБД().СообщатьОбОтсутствии) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ТекстЗапроса = СтрШаблон("""USE [master];
- |
- |ALTER DATABASE [%1]
- |MODIFY FILE (NAME = N'%2', NEWNAME = N'%3');""",
- База,
- Имя,
- НовоеИмя);
-
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата);
-
- Возврат КодВозврата = 0;
-
-КонецФункции // ИзменитьЛогическоеИмяФайлаВБазе()
-
-// Функция возвращает логическое имя файла в базе
-//
-// Параметры:
-// ТипФайла - Строка - ROWS - файл базы; LOG - файл журнала транзакций
-//
-// Возвращаемое значение:
-// Строка - логическое имя файла базы
-//
-Функция РасположениеФайловБазПоУмолчанию(Знач ТипФайла = Неопределено) Экспорт
-
- ТипыФайлов = ТипыФайловБД();
- ТипыФайловСокр = ТипыФайловБД(Истина);
-
- Если НЕ ЗначениеЗаполнено(ТипФайла) Тогда
- ТипФайла = ТипыФайлов.Данные;
- КонецЕсли;
-
- Если ТипФайла = ТипыФайлов.Данные ИЛИ ТипФайла = ТипыФайловСокр.Данные Тогда
- ТипФайла = ТипыФайлов.Данные;
- ИначеЕсли ТипФайла = ТипыФайлов.Журнал ИЛИ ТипФайла = ТипыФайловСокр.Журнал Тогда
- ТипФайла = ТипыФайлов.Журнал;
- Иначе
- Возврат Неопределено;
- КонецЕсли;
-
-
- ТекстЗапроса = СтрШаблон("""SET NOCOUNT ON;
- |
- |SELECT
- | [physical_name]
- |FROM
- | sys.master_files
- |WHERE
- | [database_id]=4
- | AND type_desc='%1';
- |
- |SET NOCOUNT OFF;""",
- ТипФайла);
-
- РезультатЗапроса = "";
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, РезультатЗапроса);
-
- Если КодВозврата = 0 Тогда
- Разделитель = "---";
- Поз = СтрНайти(РезультатЗапроса, Разделитель, НаправлениеПоиска.FromEnd);
- РезультатЗапроса = СокрЛП(Сред(РезультатЗапроса, Поз + СтрДлина(Разделитель)));
-
- ФайлБазы = Новый Файл(РезультатЗапроса);
- РезультатЗапроса = Сред(ФайлБазы.Путь, 1, СтрДлина(ФайлБазы.Путь) - 1);
-
- Иначе
- РезультатЗапроса = Неопределено;
- КонецЕсли;
-
- Возврат РезультатЗапроса;
-
-КонецФункции // РасположениеФайловБазПоУмолчанию()
-
-// Функция возвращает описание установленной версии SQL Server
-//
-// Возвращаемое значение:
-// Структура - описание версии 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""";
-
- ОписаниеРезультата = "";
- КодВозврата = ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата, "|", Истина);
-
- СтрокаОписанияВерсии = 3;
- ИмяСервера = 0;
- ИмяЭкземпляраСУБД = 1;
- Редакция = 2;
- Версия = 3;
- Уровень = 4;
- Представление = 5;
-
- // 2000 - 2000 (8)), 2005 - 9, 2008 - 10, 2012 - 11, 2014 - 12, 2016 - 13, 2017 - 14, 2019 - 15
- МассивВерсий = СтрРазделить("2000-8,9,10,11,12,13,14,15", ",");
-
- СоответствиеВерсий = Новый Соответствие();
-
- Для Каждого ТекВерсия Из МассивВерсий Цикл
- ЧастиВерсии = СтрРазделить(ТекВерсия, "-");
-
- КоличествоЧастей = ЧастиВерсии.Количество();
- Если КоличествоЧастей = 1 Тогда
- СоответствиеВерсий.Вставить(ЧастиВерсии[0], Число(ЧастиВерсии[0]));
- ИначеЕсли КоличествоЧастей > 1 Тогда
- СоответствиеВерсий.Вставить(ЧастиВерсии[0], Число(ЧастиВерсии[1]));
- Иначе
- Возврат Неопределено;
- КонецЕсли;
- КонецЦикла;
-
- Если КодВозврата = 0 Тогда
- СтруктураРезультата = Новый Структура();
-
- Текст = Новый ТекстовыйДокумент();
- Текст.УстановитьТекст(ОписаниеРезультата);
-
- МассивЗначений = СтрРазделить(Текст.ПолучитьСтроку(СтрокаОписанияВерсии), "|");
-
- СтруктураРезультата.Вставить("ИмяСервера" , МассивЗначений[ИмяСервера]);
- СтруктураРезультата.Вставить("ИмяЭкземпляраСУБД", МассивЗначений[ИмяЭкземпляраСУБД]);
- СтруктураРезультата.Вставить("Редакция" , МассивЗначений[Редакция]);
- СтруктураРезультата.Вставить("Версия" , МассивЗначений[Версия]);
- СтруктураРезультата.Вставить("Уровень" , МассивЗначений[Уровень]);
- СтруктураРезультата.Вставить("Представление" , МассивЗначений[Представление]);
-
- МассивВерсии = СтрРазделить(СтруктураРезультата["Версия"], ".");
- СтруктураРезультата.Вставить("ВерсияМакс" , СоответствиеВерсий[МассивВерсии[0]]);
-
- СтруктураРезультата.Вставить("Корп" , СтрНайти(ВРег(СтруктураРезультата["Редакция"]), "ENTERPRISE") > 0);
-
- Возврат СтруктураРезультата;
- Иначе
- Возврат Неопределено;
- КонецЕсли;
-
-КонецФункции // ПолучитьВерсиюСУБД()
-
-// Функция возвращает признак доступности функционала SQL Server
-//
-// Параметры:
-// Функционал - Строка - наименование проверяемого функционала
-// ОписаниеВерсии - Соответствие - наименование проверяемого функционала
-//
-// Возвращаемое значение:
-// Булево - Истина - функционал доступен
-//
-Функция ДоступностьФункционалаСУБД(Знач Функционал, ОписаниеВерсии = Неопределено) Экспорт
-
- МинВерсияАвторизации = 10;
- МинВерсияКомпрессии = 13;
-
- СтруктураФункционала = Новый Структура("Компрессия, ИзменениеАвторизации", Ложь, Ложь);
-
- Если НЕ ТипЗнч(ОписаниеВерсии) = Тип("Соответствие") Тогда
- ОписаниеВерсии = ПолучитьВерсиюСУБД();
- КонецЕсли;
-
- Если ОписаниеВерсии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Если ОписаниеВерсии.ВерсияМакс >= МинВерсияАвторизации Тогда
- СтруктураФункционала.ИзменениеАвторизации = Истина;
- КонецЕсли;
-
- Если ОписаниеВерсии.ВерсияМакс >= МинВерсияКомпрессии ИЛИ ОписаниеВерсии.Корп Тогда
- СтруктураФункционала.Компрессия = Истина;
- КонецЕсли;
-
- Если НЕ СтруктураФункционала.Свойство(Функционал) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Возврат СтруктураФункционала[Функционал];
-
-КонецФункции // ДоступностьФункционалаСУБД()
-
-#КонецОбласти // ПрограммныйИнтерфейс
-
-#Область СлужебныеПроцедурыИФункции
-
-// Функция выполняет запрос к СУБД (используется консольная утилита sqlcmd)
-//
-// Параметры:
-// ТекстЗапроса - Строка - текст исполняемого запроса
-// ОписаниеРезультата - Строка - результат выполнения команду
-// Разделитель - Строка - символ - разделитель колонок результата
-// УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата = "", Разделитель = "", УбратьПробелы = Ложь)
-
- Лог.Отладка("Текст запроса: %1", ТекстЗапроса);
-
- КомандаРК = Новый Команда;
-
- КомандаРК.УстановитьКоманду("sqlcmd");
- КомандаРК.ДобавитьПараметр("-S " + Сервер);
- Если ЗначениеЗаполнено(Пользователь) Тогда
- КомандаРК.ДобавитьПараметр("-U " + Пользователь);
- Если ЗначениеЗаполнено(пароль) Тогда
- КомандаРК.ДобавитьПараметр("-P " + Пароль);
- КонецЕсли;
- КонецЕсли;
- КомандаРК.ДобавитьПараметр("-Q " + ТекстЗапроса);
- КомандаРК.ДобавитьПараметр("-b");
-
- Если ЗначениеЗаполнено(Разделитель) Тогда
- КомандаРК.ДобавитьПараметр(СтрШаблон("-s ""%1""", Разделитель));
- КонецЕсли;
-
- Если УбратьПробелы Тогда
- КомандаРК.ДобавитьПараметр("-W");
- КонецЕсли;
-
- КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы( Ложь );
- КомандаРК.ПоказыватьВыводНемедленно( Ложь );
-
- КодВозврата = КомандаРК.Исполнить();
-
- ОписаниеРезультата = КомандаРК.ПолучитьВывод();
-
- Возврат КодВозврата;
-
-КонецФункции // ВыполнитьЗапросСУБД()
-
-// Функция выполняет запрос к СУБД, выполняя текст из файлов скриптов (используется консольная утилита sqlcmd)
-//
-// Параметры:
-// МассивСкриптов - Массив из Строка - массив с путями к файлам скриптов
-// МассивПеременных - Массив из Строка - массив со значениями переменных вида "<Имя>=<Значение>"
-// ОписаниеРезультата - Строка - результат выполнения команды
-//
-// Возвращаемое значение:
-// Булево - Истина - команда выполнена успешно
-//
-Функция ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных = Неопределено, ОписаниеРезультата = "") Экспорт
-
- КомандаРК = Новый Команда;
-
- КомандаРК.УстановитьКоманду("sqlcmd");
- КомандаРК.ДобавитьПараметр("-S " + Сервер);
- Если ЗначениеЗаполнено(Пользователь) Тогда
- КомандаРК.ДобавитьПараметр("-U " + Пользователь);
- Если ЗначениеЗаполнено(пароль) Тогда
- КомандаРК.ДобавитьПараметр("-P " + Пароль);
- КонецЕсли;
- КонецЕсли;
-
- Для каждого Файл Из МассивСкриптов Цикл
- Лог.Отладка("Добавлен файл скрипта: %1", Файл);
-
- КомандаРК.ДобавитьПараметр(СтрШаблон("-i %1", Файл));
- КонецЦикла;
-
- Если ТипЗнч(МассивПеременных) = Тип("Массив") Тогда
- Для каждого Переменная Из МассивПеременных Цикл
- Лог.Отладка("Добавлено значение переменной: %1", Переменная);
-
- КомандаРК.ДобавитьПараметр(СтрШаблон("-v %1", Переменная));
- КонецЦикла;
- КонецЕсли;
-
- КомандаРК.ДобавитьПараметр("-b");
-
- КомандаРК.УстановитьИсполнениеЧерезКомандыСистемы( Ложь );
- КомандаРК.ПоказыватьВыводНемедленно( Ложь );
-
- КодВозврата = КомандаРК.Исполнить();
-
- ОписаниеРезультата = КомандаРК.ПолучитьВывод();
-
- Возврат КодВозврата;
-
-КонецФункции // ВыполнитьСкриптыЗапросСУБД()
-
-// Функция возвращает список полей таблицы информации о резервной копии
-//
-// Возвращаемое значение:
-// Строка - список полей таблицы с информацией о резервной копии (разделенный ",")
-//
-Функция ПолучитьСписокПолейТаблицыФайловРезервнойКопии()
-
- ОписаниеПолей = "[LogicalName] nvarchar(128),
- |[PhysicalName] nvarchar(260),
- |[Type] char(1),
- |[FileGroupName] nvarchar(128),
- |[Size] numeric(20,0),
- |[MaxSize] numeric(20,0),
- |[FileID] bigint,
- |[CreateLSN] numeric(25,0),
- |[DropLSN] numeric(25,0) NULL,
- |[UniqueID] uniqueidentifier,
- |[ReadOnlyLSN] numeric(25,0) NULL,
- |[ReadWriteLSN] numeric(25,0) NULL,
- |[BackupSizeInBytes] bigint,
- |[SourceBlockSize] int,
- |[FileGroupID] int,
- |[LogGroupGUID] uniqueidentifier NULL,
- |[DifferentialBaseLSN] numeric(25,0) NULL,
- |[DifferentialBaseGUID] uniqueidentifier,
- |[IsReadOnly] bit,
- |[IsPresent] bit,
- |[TDEThumbprint] varbinary(32)";
-
- ОписаниеВерсии = ПолучитьВерсиюСУБД();
-
- Версия2016 = 13;
-
- Если ОписаниеВерсии.ВерсияМакс >= Версия2016 Тогда
- ОписаниеПолей = СтрШаблон("%1,
- |[SnapshotUrl] nvarchar(360)",
- ОписаниеПолей);
- КонецЕсли;
-
- Возврат ОписаниеПолей;
-
-КонецФункции // ПолучитьСписокПолейТаблицыФайловРезервнойКопии()
-
-// Функция возвращает список возможных типов файлов базы данных или таблиц резервной копии
-//
-// Параметры:
-// Сокращенные - Булево - Истина - возвращать список сокращенных обозначений
-// типов баз (для файлов в файлах резервных копий);
-// Ложь - список полных обозначений (для файлов баз данных)
-//
-// Возвращаемое значение:
-// ФиксированнаяСтруктура - список возможных типов файлов базы данных или таблиц резервной копии
-//
-Функция ТипыФайловБД(Сокращенные = Ложь)
-
- ТипыФайлов = Новый Структура();
- ТипыФайлов.Вставить("Данные" , "ROWS");
- ТипыФайлов.Вставить("Журнал" , "LOG");
-
- ТипыФайловСокр = Новый Структура();
- ТипыФайловСокр.Вставить("Данные", "D");
- ТипыФайловСокр.Вставить("Журнал", "L");
-
- Возврат Новый ФиксированнаяСтруктура(?(Сокращенные, ТипыФайловСокр, ТипыФайлов));
-
-КонецФункции // ТипыФайловБД()
-
-// Функция возвращает список вариантов сообщения о существовании базы данных при проверке
-//
-// Возвращаемое значение:
-// ФиксированнаяСтруктура - варианты сообщения о существовании базы данных при проверке
-//
-Функция ВариантыСообщенияОСуществованииБД()
-
- ВариантыСообщения = Новый Структура();
- ВариантыСообщения.Вставить("НеСообщать" , "НЕСООБЩАТЬ");
- ВариантыСообщения.Вставить("СообщатьОСуществовании", "СООБЩАТЬОСУЩЕСТВОВАНИИ");
- ВариантыСообщения.Вставить("СообщатьОбОтсутствии" , "СООБЩАТЬОБОТСУТСТВИИ");
-
- Возврат Новый ФиксированнаяСтруктура(ВариантыСообщения);
-
-КонецФункции // ВариантыСообщенияОСуществованииБД()
-
-// Функция возвращает список возможных моделей восстановления базы данных
-//
-// Возвращаемое значение:
-// ФиксированнаяСтруктура - возможные модели восстановления базы данных
-//
-Функция МоделиВосстановленияБД()
-
- МоделиВосстановления = Новый Структура();
- МоделиВосстановления.Вставить("Простая" , "SIMPLE");
- МоделиВосстановления.Вставить("Полная" , "FULL");
- МоделиВосстановления.Вставить("МинимальноеПротоколирование", "BULK_LOGGED");
-
- Возврат Новый ФиксированнаяСтруктура(МоделиВосстановления);
-
-КонецФункции // ВариантыСообщенияОСуществованииБД()
-
-#КонецОбласти // СлужебныеПроцедурыИФункции
-
-#Область ОбработчикиСобытий
-
-// Процедура - обработчик события "ПриСозданииОбъекта"
-//
-// Параметры:
-// _Сервер - Строка - адрес сервера СУБД
-// _Пользователь - Строка - пользователь сервера СУБД
-// _Пароль - Строка - пароль пользователя сервера СУБД
-//
-Процедура ПриСозданииОбъекта(Знач _Сервер, Знач _Пользователь, Знач _Пароль) Экспорт
-
- Сервер = _Сервер;
- Пользователь = _Пользователь;
- Пароль = _Пароль;
-
- Лог = ПараметрыСистемы.Лог();
-
-КонецПроцедуры // ПриСозданииОбъекта()
-
-#КонецОбласти // ОбработчикиСобытий
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\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..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"
@@ -48,29 +48,10 @@
//
Процедура СоздатьБазуДанных(База, МодельВосстановления = "FULL", ПутьККаталогу = "") Экспорт
- Лог.Информация("Начало создания базы ""%1\%2""",
- ТекущийСервер,
- База);
+ Лог.Отладка("Начало создания базы ""%1\%2""", ТекущийСервер, База);
- ОписаниеРезультата = "";
-
Попытка
- Результат = ПодключениеКСУБД.СоздатьБазу(База, МодельВосстановления, ПутьККаталогу, ОписаниеРезультата);
-
- Если Результат Тогда
- Лог.Информация("Создана база данных ""%1\%2"":%3%4",
- ТекущийСервер,
- База,
- Символы.ПС,
- ОписаниеРезультата);
- Иначе
- ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1\%2"":%3%4",
- ТекущийСервер,
- База,
- Символы.ПС,
- ОписаниеРезультата);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
+ ПодключениеКСУБД.СоздатьБазу(База, МодельВосстановления, ПутьККаталогу);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1\%2"":%3%4",
@@ -81,6 +62,8 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Создана база данных ""%1\%2""", ТекущийСервер, База);
+
КонецПроцедуры // СоздатьБазуДанных()
// Удаляет базу данных
@@ -90,29 +73,10 @@
//
Процедура УдалитьБазуДанных(База) Экспорт
- Лог.Информация("Начало удаления базы ""%1\%2""",
- ТекущийСервер,
- База);
+ Лог.Отладка("Начало удаления базы ""%1\%2""", ТекущийСервер, База);
- ОписаниеРезультата = "";
-
Попытка
- Результат = ПодключениеКСУБД.УдалитьБазу(База, ОписаниеРезультата);
-
- Если Результат Тогда
- Лог.Информация("Удалена база данных ""%1\%2"":%3%4",
- ТекущийСервер,
- База,
- Символы.ПС,
- ОписаниеРезультата);
- Иначе
- ТекстОшибки = СтрШаблон("Ошибка удаления базы данных ""%1\%2"":%3%4",
- ТекущийСервер,
- База,
- Символы.ПС,
- ОписаниеРезультата);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
+ ПодключениеКСУБД.УдалитьБазу(База);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка удаления базы данных ""%1\%2"":%3%4",
@@ -123,6 +87,8 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Удалена база данных ""%1\%2""", ТекущийСервер, База);
+
КонецПроцедуры // УдалитьБазуДанных()
// Выполняет резервное копирование базы
@@ -133,32 +99,13 @@
//
Процедура ВыполнитьРезервноеКопирование(База, ПутьКРезервнойКопии) Экспорт
- Лог.Информация("Начало создания резервной копии ""%1"" базы ""%2\%3""",
- ПутьКРезервнойКопии,
- ТекущийСервер,
- База);
+ Лог.Отладка("Начало создания резервной копии ""%1"" базы ""%2\%3""",
+ ПутьКРезервнойКопии,
+ ТекущийСервер,
+ База);
- ОписаниеРезультата = "";
-
Попытка
- Результат = ПодключениеКСУБД.СоздатьРезервнуюКопию(База, ПутьКРезервнойКопии, ОписаниеРезультата);
-
- Если Результат Тогда
- Лог.Информация("Создана резервная копия ""%1"" базы ""%2\%3"": %4%5",
- ПутьКРезервнойКопии,
- ТекущийСервер,
- База,
- Символы.ПС,
- ОписаниеРезультата);
- Иначе
- ТекстОшибки = СтрШаблон("Ошибка создания резервной копии ""%1"" базы ""%2\%3"": %4%5",
- ПутьКРезервнойКопии,
- ТекущийСервер,
- База,
- Символы.ПС,
- ОписаниеРезультата);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
+ ПодключениеКСУБД.СоздатьРезервнуюКопию(База, ПутьКРезервнойКопии);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка создания резервной копии ""%1"" базы ""%2\%3"": %4%5",
@@ -170,6 +117,11 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Создана резервная копия ""%1"" базы ""%2\%3""",
+ ПутьКРезервнойКопии,
+ ТекущийСервер,
+ База);
+
КонецПроцедуры // ВыполнитьРезервноеКопирование()
// Выполняет восстановление базы из резервной копии
@@ -187,35 +139,17 @@
ПутьКФайлуЖурнала,
СоздаватьБазу) Экспорт
- Лог.Информация("Начало восстановления базы ""%1\%2"" из резервной копии ""%3""",
- ТекущийСервер,
- База,
- ПутьКРезервнойКопии);
-
- ОписаниеРезультата = "";
+ Лог.Отладка("Начало восстановления базы ""%1\%2"" из резервной копии ""%3""",
+ ТекущийСервер,
+ База,
+ ПутьКРезервнойКопии);
Попытка
- Результат = ПодключениеКСУБД.ВосстановитьИзРезервнойКопии(База,
- ПутьКРезервнойКопии,
- ПутьКФайлуДанных,
- ПутьКФайлуЖурнала,
- СоздаватьБазу,
- ОписаниеРезультата);
-
- Если Результат Тогда
- Лог.Информация("Выполнено восстановление базы ""%1"" из резервной копии ""%2"": %3",
- База,
- ПутьКРезервнойКопии,
- ОписаниеРезультата);
- Иначе
- ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4",
- База,
- ПутьКРезервнойКопии,
- Символы.ПС,
- ОписаниеРезультата);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
-
+ ПодключениеКСУБД.ВосстановитьИзРезервнойКопии(База,
+ ПутьКРезервнойКопии,
+ ПутьКФайлуДанных,
+ ПутьКФайлуЖурнала,
+ СоздаватьБазу);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2"": %3%4",
@@ -226,6 +160,10 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Выполнено восстановление базы ""%1"" из резервной копии ""%2""",
+ База,
+ ПутьКРезервнойКопии);
+
КонецПроцедуры // ВыполнитьВосстановление()
// Получает текущего владельца базы
@@ -238,6 +176,8 @@
//
Функция ПолучитьВладельца(База) Экспорт
+ Лог.Отладка("Начало получения владельца базы ""%1"":%2%3", База);
+
Попытка
Результат = ПодключениеКСУБД.ПолучитьВладельцаБазы(База);
Исключение
@@ -249,6 +189,8 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Получен владелец ""%1"" базы ""%2""", Результат, База);
+
Возврат Результат;
КонецФункции // ПолучитьВладельца()
@@ -261,19 +203,12 @@
//
Процедура ИзменитьВладельца(База, ВладелецБазы) Экспорт
- Попытка
- Результат = ПодключениеКСУБД.УстановитьВладельцаБазы(База, ВладелецБазы);
-
- Если НЕ Результат Тогда
- ТекстОшибки = СтрШаблон("Ошибка смены владельца базы ""%1"" на ""%2""",
- База,
- ВладелецБазы);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
+ Лог.Отладка("Начало установки владельца ""%1"" лля базы ""%2""",
+ ВладелецБазы,
+ База);
- Лог.Информация("Для базы ""%1"" установлен новый владелец ""%2""",
- База,
- ВладелецБазы);
+ Попытка
+ ПодключениеКСУБД.УстановитьВладельцаБазы(База, ВладелецБазы);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка смены владельца базы ""%1"" на ""%2"":%3%4",
@@ -284,6 +219,10 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Для базы ""%1"" установлен новый владелец ""%2""",
+ База,
+ ВладелецБазы);
+
КонецПроцедуры // ИзменитьВладельца()
// Получает модель восстановления базы (FULL, SIMPLE, BULK_LOGGED)
@@ -296,6 +235,8 @@
//
Функция ПолучитьМодельВосстановления(База) Экспорт
+ Лог.Отладка("Начало получения модели восстановления базы ""%1""", База);
+
Попытка
Результат = ПодключениеКСУБД.ПолучитьМодельВосстановления(База);
Исключение
@@ -307,6 +248,8 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Получена модель восстановления ""%1"" для базы ""%2""", Результат, База);
+
Возврат Результат;
КонецФункции // ПолучитьМодельВосстановления()
@@ -319,19 +262,12 @@
//
Процедура ИзменитьМодельВосстановления(База, МодельВосстановления) Экспорт
- Попытка
- Результат = ПодключениеКСУБД.УстановитьМодельВосстановления(База, МодельВосстановления);
-
- Если НЕ Результат Тогда
- ТекстОшибки = СтрШаблон("Ошибка смены модели восстановления базы ""%1"" на ""%2""",
- База,
- МодельВосстановления);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
+ Лог.Отладка("Начало установки модели восстановления ""%1"" для базы ""%2""",
+ МодельВосстановления,
+ База);
- Лог.Информация("Для базы ""%1"" установлена модель восстановления ""%2""",
- База,
- МодельВосстановления);
+ Попытка
+ ПодключениеКСУБД.УстановитьМодельВосстановления(База, МодельВосстановления);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка смены модели восстановления базы ""%1"" на ""%2"":%3%4",
@@ -342,6 +278,10 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Для базы ""%1"" установлена модель восстановления ""%2""",
+ База,
+ МодельВосстановления);
+
КонецПроцедуры // ИзменитьМодельВосстановления()
// Получает логическое имя файла в базе
@@ -353,28 +293,28 @@
// Возвращаемое значение:
// Строка - логическое имя файла в базе данных
//
-Функция ПолучитьЛогическоеИмяФайла(База, ТипФайла = "ROWS") Экспорт
+Функция ПолучитьЛогическоеИмяФайла(База, Знач ТипФайла = "ROWS") Экспорт
ТипФайлаПредставление = "неизвестного типа";
- Если ВРег(ТипФайла) = "ROWS" ИЛИ ВРег(ТипФайла) = "D" Тогда
+ ТипФайла = ВРег(ТипФайла);
+
+ Если ТипФайла = "ROWS" ИЛИ ТипФайла = "D" Тогда
ТипФайлаПредставление = "данных";
- ИначеЕсли ВРег(ТипФайла) = "LOG" ИЛИ ВРег(ТипФайла) = "L" Тогда
+ ИначеЕсли ТипФайла = "LOG" ИЛИ ТипФайла = "L" Тогда
ТипФайлаПредставление = "журнала";
Иначе
Возврат Неопределено;
КонецЕсли;
- Попытка
- Результат = ПодключениеКСУБД.ПолучитьЛогическоеИмяФайлаВБазе(База, ТипФайла);
+ Лог.Отладка("Начало получения логического имени файла %1 для базы ""%2""",
+ ТипФайлаПредставление,
+ База);
- Если Результат = Неопределено Тогда
- ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2""",
- ТипФайлаПредставление,
- База);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
+ Результат = Неопределено;
+ Попытка
+ Результат = ПодключениеКСУБД.ПолучитьЛогическоеИмяФайлаВБазе(База, ТипФайла);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2"":%3%4",
@@ -384,7 +324,19 @@
ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
-
+
+ Если Результат = Неопределено Тогда
+ ТекстОшибки = СтрШаблон("Ошибка получения логического имени файла %1 в базе ""%2""",
+ ТипФайлаПредставление,
+ База);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ Лог.Отладка("Получено логическое имя ""%1"" файла %2 для базы ""%3""",
+ Результат,
+ ТипФайлаПредставление,
+ База);
+
Возврат Результат;
КонецФункции // ПолучитьЛогическоеИмяФайла()
@@ -398,25 +350,17 @@
//
Процедура ИзменитьЛогическоеИмяФайла(База, Имя, НовоеИмя) Экспорт
+ Лог.Отладка("Начало изменения логического имени файла ""%1"" на ""%2"" в базе ""%3""",
+ Имя,
+ НовоеИмя,
+ База);
+
Если Имя = НовоеИмя Тогда
Возврат;
КонецЕсли;
Попытка
- Результат = ПодключениеКСУБД.ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя);
-
- Если НЕ Результат Тогда
- ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" на ""%2"" в базе ""%3""",
- Имя,
- НовоеИмя,
- База);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
-
- Лог.Информация("Изменено логическое имя файла ""%1"" на ""%2"" в базе ""%3""",
- Имя,
- НовоеИмя,
- База);
+ ПодключениеКСУБД.ИзменитьЛогическоеИмяФайлаВБазе(База, Имя, НовоеИмя);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка изменения логического имени файла ""%1"" на ""%2"" в базе ""%3"":%4%5",
@@ -427,7 +371,12 @@
ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
-
+
+ Лог.Отладка("Изменено логическое имя файла ""%1"" на ""%2"" в базе ""%3""",
+ Имя,
+ НовоеИмя,
+ База);
+
КонецПроцедуры // ИзменитьЛогическоеИмяФайла()
// Устанавливает логические имена файлов в формате:
@@ -444,48 +393,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 +412,10 @@
//
Процедура ВключитьКомпрессию(База) Экспорт
- Лог.Информация("Начало компрессии страниц базы ""%1""", База);
-
- Попытка
- Результат = ПодключениеКСУБД.ВключитьКомпрессиюСтраниц(База);
-
- Если НЕ Результат Тогда
- ТекстОшибки = СтрШаблон("Ошибка включения компрессии страниц в базе ""%1""", База);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
+ Лог.Отладка("Начало компрессии страниц базы ""%1""", База);
- Лог.Информация("Включена компрессия страниц в базе ""%1""", База);
+ Попытка
+ ПодключениеКСУБД.ВключитьКомпрессиюСтраниц(База, Истина, Истина);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстОшибки = СтрШаблон("Ошибка включения компрессии страниц в базе ""%1"": ""%2""",
@@ -515,6 +424,8 @@
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Включена компрессия страниц в базе ""%1""", База);
+
КонецПроцедуры // ВключитьКомпрессию()
// Выполняет сжатие базы (shrink)
@@ -524,26 +435,21 @@
//
Процедура СжатьБазу(База) Экспорт
- Лог.Информация("Начало сжатия (shrink) файла данных базы ""%1""", База);
-
- Попытка
- Результат = ПодключениеКСУБД.СжатьБазу(База);
+ Лог.Отладка("Начало сжатия (shrink) файла данных базы ""%1""", База);
- Если НЕ Результат Тогда
- ТекстОшибки = СтрШаблон("Ошибка сжатия файла данных базы ""%1""", База);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
-
- Лог.Информация("Выполнено сжатие файла данных базы ""%1""", База);
+ Попытка
+ ПодключениеКСУБД.СжатьБазу(База);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
- ТекстОшибки = СтрШаблон("Ошибка сжатия файла данных базы ""%1"":%2%3",
+ ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла данных базы ""%1"":%2%3",
База,
Символы.ПС,
ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Выполнено сжатие (shrink) файла данных базы ""%1""", База);
+
КонецПроцедуры // СжатьБазу()
// Выполняет сжатие файла лога (shrink)
@@ -553,31 +459,21 @@
//
Процедура СжатьФайлЖурналаТранзакций(База) Экспорт
- Лог.Информация("Начало сжатия (shrink) файла журнала транзакций базы ""%1""", База);
-
- Попытка
- ОписаниеРезультата = "";
-
- Результат = ПодключениеКСУБД.СжатьФайлЖурналаТранзакций(База, ОписаниеРезультата);
-
- Если НЕ Результат Тогда
- ТекстОшибки = СтрШаблон("Ошибка сжатия файла журнала транзакций базы ""%1"":%2%3",
- База,
- Символы.ПС,
- ОписаниеРезультата);
- ВызватьИсключение ТекстОшибки;
- КонецЕсли;
+ Лог.Отладка("Начало сжатия (shrink) файла журнала транзакций базы ""%1""", База);
- Лог.Информация("Выполнено сжатие файла журнала транзакций базы ""%1""", База);
+ Попытка
+ ПодключениеКСУБД.СжатьФайлЖурналаТранзакций(База);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
- ТекстОшибки = СтрШаблон("Ошибка сжатия файла журнала транзакций базы ""%1"":%2%3",
+ ТекстОшибки = СтрШаблон("Ошибка сжатия (shrink) файла журнала транзакций базы ""%1"":%2%3",
База,
Символы.ПС,
ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецПопытки;
+ Лог.Отладка("Выполнено сжатие (shrink) файла журнала транзакций базы ""%1""", База);
+
КонецПроцедуры // СжатьФайлЖурналаТранзакций()
// Функция выполняет указанные скрипты
@@ -594,18 +490,63 @@
МассивСкриптов = СтрРазделить(СкриптыВыполнения, ";", Ложь);
МассивПеременных = СтрРазделить(СтрокаПеременных, ";", Ложь);
+ Лог.Отладка("Начало выполнения скриптов ""%1"", со значениями переменных ""%2""",
+ СкриптыВыполнения,
+ СтрокаПеременных);
+
+ РезультатЗапроса = "";
+
+ КодВозврата = ПодключениеКСУБД.ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных, РезультатЗапроса);
+
+ Если НЕ КодВозврата = 0 Тогда
+ ТекстОшибки = СтрШаблон("Ошибка выполнения скриптов ""%1"" со значениями переменных ""%2""
+ |на сервере ""%3"", код возврата %4: %5%6",
+ СкриптыВыполнения,
+ СтрокаПеременных,
+ ТекущийСервер,
+ КодВозврата,
+ Символы.ПС,
+ РезультатЗапроса);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+ СтрокаРезультата = "";
+
+ Если ЗначениеЗаполнено(РезультатЗапроса) Тогда
+ СтрокаРезультата = СтрШаблон(", результатЖ %1%2", Символы.ПС, РезультатЗапроса);
+ КонецЕсли;
+
+ Лог.Отладка("Выполнены скрипты ""%1"" со значениями переменных ""%2""%3",
+ СкриптыВыполнения,
+ СтрокаПеременных,
+ СтрокаРезультата);
+
+ Возврат РезультатЗапроса;
+
+КонецФункции // ВыполнитьСкрипты()
+
+// Функция выполняет запрос к СУБД
+//
+// Параметры:
+// ТекстЗапроса - Строка - текст исполняемого запроса
+// Разделитель - Строка - символ - разделитель колонок результата
+// УбратьПробелы - Булево - Истина - будут убраны выравнивающие пробелы из результата
+//
+// Возвращаемое значение:
+// Строка - результат выполнения запроса
+//
+Функция ВыполнитьЗапрос(ТекстЗапроса, Разделитель = "", УбратьПробелы = Ложь) Экспорт
+
ОписаниеРезультата = "";
- КодВозврата = ПодключениеКСУБД.ВыполнитьСкриптыЗапросСУБД(МассивСкриптов, МассивПеременных, ОписаниеРезультата);
+ КодВозврата = ПодключениеКСУБД.ВыполнитьЗапросСУБД(ТекстЗапроса, ОписаниеРезультата, Разделитель, УбратьПробелы);
Если КодВозврата = 0 Тогда
Если ЗначениеЗаполнено(ОписаниеРезультата) Тогда
Лог.Отладка("Результат выполнения:%1%2", Символы.ПС, ОписаниеРезультата);
КонецЕсли;
Иначе
- ТекстОшибки = СтрШаблон("Ошибка выполнения скриптов ""%1"" для значений переменных ""%2""
- |на сервере ""%3"", код возврата %4: %5%6",
- СкриптыВыполнения,
- СтрокаПеременных,
+ ТекстОшибки = СтрШаблон("Ошибка выполнения запроса ""%1"" на сервере ""%2"", код возврата %3: %4%5",
+ ТекстЗапроса,
ТекущийСервер,
КодВозврата,
Символы.ПС,
@@ -615,7 +556,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\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 5f1512a..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"
@@ -42,15 +42,12 @@
КонецПроцедуры // УстановитьПараметрыСоединения()
-// Создает каталог на Yandex-диске
+// Процедура - Создает каталог на Yandex-диске
//
// Параметры:
// ЦелевойПуть - ЯндексДиск - путь на yandex-диске к создаваемому каталогу
//
-// Возвращаемое значение:
-// Строка - Созданный путь
-//
-Функция СоздатьКаталог(Знач ЦелевойПуть) Экспорт
+Процедура СоздатьКаталог(Знач ЦелевойПуть) Экспорт
КаталогНайден = Ложь;
Попытка
@@ -65,7 +62,6 @@
ВызватьИсключение ТекстОшибки;
КонецЕсли;
- ТекущийПуть = "";
Если НЕ КаталогНайден Тогда
Попытка
Соединение.СоздатьПапку(ЦелевойПуть);
@@ -80,15 +76,13 @@
КонецПопытки;
КонецЕсли;
- Возврат ТекущийПуть;
-
-КонецФункции // СоздатьКаталог()
+КонецПроцедуры // СоздатьКаталог()
// Функция отправки файла на Yandex-Диск
//
// Параметры:
// ПутьКФайлу - Строка - путь к отправляемому файлу
-// ЦелевойПуть - ЯндексДиск - путь на yandex-диске, куда будет загружен файл
+// ЦелевойПуть - Строка - путь на yandex-диске, куда будет загружен файл
// Перезаписывать - Булево - перезаписать файл на Яндекс-диске при загрузке
//
Процедура ОтправитьФайл(Знач ПутьКФайлу, Знач ЦелевойПуть, Перезаписывать = Ложь) Экспорт
@@ -190,13 +184,11 @@
// ПутьНаДиске - Строка - расположение файла на 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"
new file mode 100644
index 0000000..7deea74
--- /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,1280 @@
+// ----------------------------------------------------------
+// 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""",
+ ТекущийСервер,
+ База);
+
+ Попытка
+ Результат = ПодключениеКСУБД.ВерсияФорматаКонфигурации1С(База);
+ Исключение
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ ТекстОшибки = СтрШаблон("Ошибка получения версия формата конфигурации 1С базы ""%1\%2"":%3%4",
+ ТекущийСервер,
+ База,
+ Символы.ПС,
+ ТекстОшибки);
+ ВызватьИсключение ТекстОшибки;
+ КонецПопытки;
+
+ Лог.Отладка("Получена версии формата конфигурации 1С базы ""%1\%2"": %3",
+ ТекущийСервер,
+ База,
+ Результат.Версия);
+
+ Возврат Результат;
+
+КонецФункции // ВерсияФорматаКонфигурации()
+
+// Функция - возвращает описание конфигурации
+//
+// Возвращаемое значение:
+// Структура - описание конфигурации
+// *Имя - Строка - имя конфигурации
+// *Синоним - Строка - синоним конфигурации
+// *Версия - Строка - версия конфигурации
+// *РежимСовместимости - Строка - версия режима совместимости конфигурации
+// *КраткаяИнформация - Строка - краткая информация о конфигурации
+// *ПодробнаяИнформация - Строка - подробная информация о конфигурации
+// *Поставщик - Строка - поставщик конфигурации
+// *АвторскиеПрава - Строка - данные об авторских правах
+// *АдресИнформацииОПоставщике - Строка - адрес сайта с информацией о поставщике
+// *АдресИнформацииОКонфигурации - Строка - адрес сайта с информацией о конфигурации
+// *АдресКаталогаОбновлений - Строка - адрес сайта с каталогом обновлений
+//
+Функция ОписаниеКонфигурации() Экспорт
+
+ ОписаниеКонфигурации = Новый Структура();
+ ОписаниеКонфигурации.Вставить("Имя" , "");
+ ОписаниеКонфигурации.Вставить("Синоним" , "");
+ ОписаниеКонфигурации.Вставить("Версия" , "");
+ ОписаниеКонфигурации.Вставить("РежимСовместимости" , "");
+ ОписаниеКонфигурации.Вставить("КраткаяИнформация" , "");
+ ОписаниеКонфигурации.Вставить("ПодробнаяИнформация" , "");
+ ОписаниеКонфигурации.Вставить("Поставщик" , "");
+ ОписаниеКонфигурации.Вставить("АвторскиеПрава" , "");
+ ОписаниеКонфигурации.Вставить("АдресИнформацииОПоставщике" , "");
+ ОписаниеКонфигурации.Вставить("АдресИнформацииОКонфигурации", "");
+ ОписаниеКонфигурации.Вставить("АдресКаталогаОбновлений" , "");
+
+ Лог.Отладка("Начало получения корневого файла конфигурации 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С для объекта СУБД по его имени
+//
+// Параметры:
+// ИмяОбъекта - Строка - Имя таблицы или поля таблицы СУБД
+//
+// Возвращаемое значение:
+// Структура - описание метаданных 1С по имени объекта СУБД (см. СтруктураОписанияОбъектаБазы())
+//
+Функция ОписаниеМетаданныхОбъектаБД1С(Знач ИмяОбъекта) Экспорт
+
+ УбратьЛидирующееПодчеркивание(ИмяОбъекта);
+
+ ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(ИмяОбъекта);
+
+ ДобавлятьКолонки = Ложь;
+
+ Если НазначениеОбъектаБазы(ОписаниеОбъектаБазы).Назначение = "Поле" Тогда
+ КолонкиБазы = КолонкиБазы(, СтрШаблон("%%%1%%", ИмяОбъекта));
+ Если КолонкиБазы.Количество() > 0 Тогда
+ ОписаниеОбъектаБазы = КолонкиБазы[ИмяОбъекта];
+ Иначе
+ Возврат Неопределено;
+ КонецЕсли;
+ ДобавлятьКолонки = Истина;
+ КонецЕсли;
+
+ ИменаТаблицОбъектовКонфигурации1С = ИменаТаблицОбъектовКонфигурации1С(ДобавлятьКолонки);
+
+ ОписаниеВладельца = ОписаниеОбъектаБазы;
+ Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл
+ ОписаниеВладельца.Вставить("Ид", ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид);
+ ОписаниеВладельца = ОписаниеВладельца.Владелец;
+ КонецЦикла;
+ ОписаниеВладельца.Вставить("Ид", ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид);
+
+ СоответствиеИменМетаданных = СоответствиеИменМетаданных(ОписаниеВладельца.Ид);
+
+ ОписаниеВладельца.Вставить("ИмяМетаданных", СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных);
+
+ ТекОписание = ОписаниеОбъектаБазы;
+ Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл
+ ИмяМетаданных = ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание);
+ ТекОписание.Вставить("ИмяМетаданных", ИмяМетаданных);
+ ТекОписание = ТекОписание.Владелец;
+ КонецЦикла;
+
+ ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы(ОписаниеОбъектаБазы);
+
+ Возврат ОписаниеОбъектаБазы;
+
+КонецФункции // ОписаниеМетаданныхОбъектаБД1С()
+
+// Функция - возвращает описание метаданных 1С для таблиц и полей таблиц СУБД
+//
+// Параметры:
+// ДобавлятьКолонки - Булево - Истина - будет добавлена информация для колонок таблиц
+//
+// Возвращаемое значение:
+// Соответствие - соответствия имен таблиц СУБД и полных имен метаданных 1С описаниям объектов метаданных 1С
+// (см. СтруктураОписанияОбъектаБазы())
+//
+Функция ОписаниеМетаданныхОбъектовБД1С(ДобавлятьКолонки = Ложь) Экспорт
+
+ ОписанияМетаданных = Новый Соответствие();
+
+ ИменаТаблицОбъектовКонфигурации1С = ИменаТаблицОбъектовКонфигурации1С(ДобавлятьКолонки);
+
+ СоответствиеИменМетаданных = СоответствиеИменМетаданных();
+
+ КолонкиБазы = Новый Соответствие();
+ Если ДобавлятьКолонки Тогда
+ КолонкиБазы = КолонкиБазы();
+ КонецЕсли;
+
+ ТабличныеЧасти = ТабличныеЧастиИВладельцы();
+
+ Для Каждого ТекЭлемент Из ИменаТаблицОбъектовКонфигурации1С Цикл
+
+ ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(ТекЭлемент.Значение,
+ ТабличныеЧасти,
+ КолонкиБазы);
+
+ ОписаниеВладельца = ЗаполнитьОписаниеОбъектаБазыИВладельцев(ОписаниеОбъектаБазы,
+ ОписанияМетаданных,
+ ИменаТаблицОбъектовКонфигурации1С,
+ СоответствиеИменМетаданных);
+
+ Если ЗначениеЗаполнено(ОписаниеВладельца) Тогда
+ ОписанияМетаданных.Вставить(ОписаниеВладельца.ПолноеИмяМетаданных, ОписаниеВладельца);
+ КонецЕсли;
+
+ ТекОписание = ОписаниеОбъектаБазы;
+ Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл
+ ОписанияМетаданных.Вставить(ТекОписание.ПолноеИмяМетаданных, ТекОписание);
+ ТекОписание = ТекОписание.Владелец;
+ КонецЦикла;
+
+ КонецЦикла;
+
+ Возврат ОписанияМетаданных;
+
+КонецФункции // ОписаниеМетаданныхОбъектовБД1С()
+
+// Функция - возвращает описание занимаеиого места в базе MS SQL Server
+//
+// Возвращаемое значение:
+// Структура - описание занимаего места
+// * РазмерБазы - Число - размер текущей базы данных в байтах, включает файлы данных и журналов
+// * Свободно - Число - место в базе данных, не зарезервированное для объектов базы данных
+// * Зарезервировано - Число - общий объем, выделенный объектам в базе данных
+// * Данные - Число - общий объем, используемый данными
+// * Индексы - Число - общий объем, используемый индексами
+// * НеИспользуется - Число - общий объем, зарезервированный для объектов в базе данных,
+// но пока не используемый
+//
+Функция ЗанимаемоеМесто() Экспорт
+
+ Результат = Новый Структура();
+ Результат.Вставить("РазмерБазы");
+ Результат.Вставить("Свободно");
+ Результат.Вставить("Зарезервировано");
+ Результат.Вставить("Данные");
+ Результат.Вставить("Индексы");
+ Результат.Вставить("НеИспользуется");
+
+ Лог.Отладка("Начало получения информации о занимаемом месте для базы ""%1\%2""",
+ ТекущийСервер,
+ База);
+
+ Попытка
+ Результат = ПодключениеКСУБД.ЗанимаемоеБазойМесто(База);
+ Исключение
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ ТекстОшибки = СтрШаблон("Ошибка получения информации о занимаемом месте для базы ""%1\%2"":%3%4",
+ ТекущийСервер,
+ База,
+ Символы.ПС,
+ ТекстОшибки);
+ ВызватьИсключение ТекстОшибки;
+ КонецПопытки;
+
+ Лог.Отладка("Получена информация о занимаемом месте для базы ""%1\%2""", ТекущийСервер, База);
+
+ СимволовРазмерности = 2;
+
+ Для Каждого ТекЭлемент Из Результат Цикл
+
+ Размерность = ВРег(Прав(ТекЭлемент.Значение, СимволовРазмерности));
+ РазмерСтрокой = СокрЛП(Лев(ТекЭлемент.Значение, СтрДлина(ТекЭлемент.Значение) - СтрДлина(Размерность)));
+
+ Если ЭтоЧисло(РазмерСтрокой) Тогда
+ Результат[ТекЭлемент.Ключ] = Число(РазмерСтрокой);
+ Множитель = 1024;
+ Если Размерность = "KB" Тогда
+ Результат[ТекЭлемент.Ключ] = Результат[ТекЭлемент.Ключ] * Множитель;
+ ИначеЕсли Размерность = "MB" Тогда
+ Результат[ТекЭлемент.Ключ] = Результат[ТекЭлемент.Ключ] * Множитель * Множитель;
+ КонецЕсли;
+ Иначе
+ Результат[ТекЭлемент.Ключ] = Неопределено;
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции // ЗанимаемоеМесто()
+
+// Функция - возвращает список таблиц в базе MS SQL Server и их показатели использования
+//
+// Параметры:
+// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE"
+//
+// Возвращаемое значение:
+// Массив из Структура - таблицы и показатели использования
+// *Таблица - Строка - имя таблицы
+// *КоличествоСтрок - Число - количество строк в таблице
+// *ВсегоЗанято - Число - общий объем заниаемого места (байт)
+// *Используется - Число - объем, используемый данными (байт)
+// *НеИспользуется - Число - не используемый объем (байт)
+// *ОперацийЧтения - Число - количество операций чтения (read)
+// *ОперацийВыборки - Число - количество операций выборки (select)
+// *ОперацийСканирования - Число - количество операций сканирования (scan)
+// *ОперацийПоиска - Число - количество операций поиска (seek)
+// *ОперацийЗаписи - Число - количество операций записи (write)
+//
+Функция ПоказателиИспользованияТаблицБазы(ФильтрТаблицПоИмени = "") Экспорт
+
+ Лог.Отладка("Начало получения информации о показателях использования таблиц для базы ""%1\%2""",
+ ТекущийСервер,
+ База);
+
+ Попытка
+ ПоказателиТаблиц = ПодключениеКСУБД.ПоказателиИспользованияТаблицБазы(База, ФильтрТаблицПоИмени);
+ Исключение
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ ТекстОшибки = СтрШаблон("Ошибка получения информации о показателях использования таблиц
+ | для базы ""%1\%2"":%3%4",
+ ТекущийСервер,
+ База,
+ Символы.ПС,
+ ТекстОшибки);
+ ВызватьИсключение ТекстОшибки;
+ КонецПопытки;
+
+ Лог.Отладка("Получена информация о показателях использования таблиц для базы ""%1\%2""", ТекущийСервер, База);
+
+ Для Каждого ТекТаблица Из ПоказателиТаблиц Цикл
+
+ Для Каждого ТекПоказатель Из ТекТаблица Цикл
+
+ Если ВРег(ТекПоказатель.Ключ) = "ТАБЛИЦА" Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если ЭтоЧисло(ТекПоказатель.Значение) Тогда
+ ТекТаблица[ТекПоказатель.Ключ] = Число(ТекПоказатель.Значение);
+ Иначе
+ ТекТаблица[ТекПоказатель.Ключ] = Неопределено;
+ КонецЕсли;
+ КонецЦикла;
+
+ КонецЦикла;
+
+ Возврат ПоказателиТаблиц;
+
+КонецФункции // ПоказателиИспользованияТаблицБазы()
+
+#КонецОбласти // ПрограммныйИнтерфейс
+
+#Область СлужебныеПроцедурыИФункции
+
+// Функция - читает соответствия UUID объектов метаданных конфигурации 1С именам объектов базы
+// из таблицы Params из записи где "[FileName] = 'DBNames'"
+//
+// Параметры:
+// ДобавлятьКолонки - Строка - Истина - будет добавлена информация для колонок таблиц
+//
+// Возвращаемое значение:
+// Соответствие - соответствия UUID объектов метаданных конфигурации 1С именам объектов СУБД
+//
+Функция ИменаТаблицОбъектовКонфигурации1С(ДобавлятьКолонки = Ложь)
+
+ Лог.Отладка("Начало получения соответствия UUID объектов метаданных конфигурации 1С
+ | именам объектов базы ""%1\%2""",
+ ТекущийСервер,
+ База);
+
+ Попытка
+ Данные = ПодключениеКСУБД.ИменаТаблицОбъектовКонфигурации1С(База);
+ Исключение
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ ТекстОшибки = СтрШаблон("Ошибка получения соответствия UUID объектов метаданных конфигурации 1С
+ | именам объектов базы ""%1\%2"":%3%4",
+ ТекущийСервер,
+ База,
+ Символы.ПС,
+ ТекстОшибки);
+ ВызватьИсключение ТекстОшибки;
+ КонецПопытки;
+
+ Данные = ПрочитатьУпакованныеДанные(Данные);
+
+ Чтение = Новый ЧтениеТекста(Данные.ОткрытьПотокДляЧтения(), КодировкаТекста.UTF8, Символы.ПС, Символы.ПС + Символы.ВК);
+
+ ИменаТаблицОбъектовКонфигурации1С = Новый Соответствие();
+
+ КоличествоПолей = 3;
+
+ ТекСтрока = Чтение.ПрочитатьСтроку();
+
+ Пока НЕ ТекСтрока = Неопределено Цикл
+
+ ТекСтрока = СтрЗаменить(ТекСтрока, "{", "");
+ ТекСтрока = СтрЗаменить(ТекСтрока, "}", "");
+
+ ЧастиСтроки = СтрРазделить(ТекСтрока, ",", Ложь);
+
+ Если ЧастиСтроки.Количество() < КоличествоПолей Тогда
+ ТекСтрока = Чтение.ПрочитатьСтроку();
+ Продолжить;
+ КонецЕсли;
+
+ ИндексСтрокой = ЧастиСтроки[2];
+
+ СтрокаСоответствия = Новый Структура();
+ СтрокаСоответствия.Вставить("Ид" , ПривестиСтроку(ЧастиСтроки[0]));
+ СтрокаСоответствия.Вставить("Префикс", ПривестиСтроку(ЧастиСтроки[1]));
+ СтрокаСоответствия.Вставить("Индекс" , ПривестиСтроку(ИндексСтрокой));
+ СтрокаСоответствия.Вставить("Суффикс", "");
+
+ Если НЕ ДобавлятьКолонки И НазначениеОбъектаБазы(СтрокаСоответствия).Назначение = "Поле" Тогда
+ ТекСтрока = Чтение.ПрочитатьСтроку();
+ Продолжить;
+ КонецЕсли;
+
+ ИмяОбъекта = СтрШаблон("%1%2", СтрокаСоответствия.Префикс, ИндексСтрокой);
+ ИменаТаблицОбъектовКонфигурации1С.Вставить(ИмяОбъекта, СтрокаСоответствия);
+
+ ТекСтрока = Чтение.ПрочитатьСтроку();
+ КонецЦикла;
+
+ Возврат ИменаТаблицОбъектовКонфигурации1С;
+
+КонецФункции // ИменаТаблицОбъектовКонфигурации1С()
+
+// Функция - читает таблицу Config базы 1С и возвращает соответствия UUID метаданных и имен метаданных
+//
+// Параметры:
+// Ид - Число - идентификатор объекта метаданных,
+// если не указан, считываются все записи
+// ПорцияЧтения - Число - количество строк таблицы Config читаемое за 1 запрос
+//
+// Возвращаемое значение:
+// Соответствие - соответствия UUID метаданных и имен метаданных
+//
+Функция СоответствиеИменМетаданных(Ид = "", ПорцияЧтения = 5000)
+
+ Лог.Отладка("Получение соответствия имен метаданных базы ""%1\%2"": %3",
+ ТекущийСервер,
+ База);
+
+ СоответствиеИменМетаданных = Новый Соответствие();
+
+ ВсегоЗаписей = ПодключениеКСУБД.КоличествоОбъектовКонфигурацииБазы1С(База, Ид);
+ Прочитано = 0;
+
+ Пока Прочитано < ВсегоЗаписей Цикл
+
+ Попытка
+ ОбъектыКонфигурации = ПодключениеКСУБД.ОбъектыКонфигурацииБазы1С(База, Ид, Прочитано, ПорцияЧтения);
+ Исключение
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ ТекстОшибки = СтрШаблон("Ошибка получения соответствия имен метаданных базы ""%1\%2"":%3%4",
+ ТекущийСервер,
+ База,
+ Символы.ПС,
+ ТекстОшибки);
+ ВызватьИсключение ТекстОшибки;
+ КонецПопытки;
+
+ Для Каждого ТекЭлемент Из ОбъектыКонфигурации Цикл
+ Данные = ПрочитатьУпакованныеДанные(ТекЭлемент.Значение.Данные, Истина);
+ ТекЭлемент.Значение.Вставить("Данные", Данные);
+ ТекЭлемент.Значение.Вставить("ИмяМетаданных", ИмяМетаданных(Данные, ТекЭлемент.Значение.Ид));
+ СоответствиеИменМетаданных.Вставить(ТекЭлемент.Ключ, ТекЭлемент.Значение);
+ КонецЦикла;
+
+ Прочитано = Прочитано + ПорцияЧтения;
+
+ КонецЦикла;
+
+ Возврат СоответствиеИменМетаданных;
+
+КонецФункции // СоответствиеИменМетаданных()
+
+// Процедура - заполняет соответствие имен объектов базы данных Типам и именам объектов 1С
+// в переменной модуля "НазначенияОбъектовБазы"
+// и назначения табличных частей в переменной модуля "ПодчиненныеОбъектыБазы"
+//
+// Возвращаемое значение:
+// Соответствие - назначения объектов базы
+//
+Процедура ЗаполнитьНазначенияОбъектовБазы()
+
+ ИмяМакета = "НазначенияОбъектовБД1С.json";
+ ПутьКМакету = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "Макеты", ИмяМакета);
+ ФайлМакета = Новый Файл(ПутьКМакету);
+
+ Чтение = Новый ЧтениеJSON();
+ Чтение.ОткрытьФайл(ФайлМакета.ПолноеИмя, КодировкаТекста.UTF8);
+
+ НазначенияОбъектовБазы = ПрочитатьJSON(Чтение, Ложь);
+ ПодчиненныеОбъектыБазы = Новый Структура();
+
+ Для Каждого ТекЭлемент Из НазначенияОбъектовБазы Цикл
+ Если НЕ ТекЭлемент.Значение.Свойство("Подчиненный") Тогда
+ ТекЭлемент.Значение.Вставить("Подчиненный", Ложь);
+ ИначеЕсли ТекЭлемент.Значение.Подчиненный Тогда
+ ПодчиненныеОбъектыБазы.Вставить(ТекЭлемент.Ключ, ТекЭлемент.Значение);
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры // ЗаполнитьНазначенияОбъектовБазы()
+
+// Функция - возвращает описание назначения объекта базы
+//
+// Параметры:
+// ОписаниеОбъектаБазы - Структура - описание объекта базы
+//
+// Возвращаемое значение:
+// Структура - назначения объектов базы
+//
+Функция НазначениеОбъектаБазы(ОписаниеОбъектаБазы)
+
+ Если НЕ ТипЗнч(НазначенияОбъектовБазы) = Тип("Структура") Тогда
+ ЗаполнитьНазначенияОбъектовБазы();
+ КонецЕсли;
+
+ ОписаниеНазначения = Новый Структура();
+
+ Для Каждого ТекЭлемент Из НазначенияОбъектовБазы.Config Цикл
+ ОписаниеНазначения.Вставить(ТекЭлемент.Ключ, "");
+ КонецЦикла;
+
+ Если НазначенияОбъектовБазы.Свойство(ОписаниеОбъектаБазы.Префикс) Тогда
+ ЗаполнитьЗначенияСвойств(ОписаниеНазначения, НазначенияОбъектовБазы[ОписаниеОбъектаБазы.Префикс]);
+ КонецЕсли;
+
+ ЭтоСсылкаНаВладельцаТЧ = (ОписаниеОбъектаБазы.Свойство("Владелец")
+ И ЗначениеЗаполнено(ОписаниеОбъектаБазы.Владелец)
+ И ОписаниеОбъектаБазы.Владелец.Тип = "ТабличнаяЧасть"
+ И ОписаниеОбъектаБазы.Суффикс = "_IDRRef");
+ Если ЭтоСсылкаНаВладельцаТЧ Тогда
+ ОписаниеНазначения.Тип = "Ссылка";
+ ОписаниеНазначения.ТипАнгл = "Ref";
+ ОписаниеНазначения.Назначение = "Поле";
+ КонецЕсли;
+
+ Возврат ОписаниеНазначения;
+
+КонецФункции // НазначениеОбъектаБазы()
+
+// Функция - возвращает список таблиц базы, соответствующих фильтру
+//
+// Параметры:
+// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE"
+//
+// Возвращаемое значение:
+// Соответствие - список таблиц базы
+//
+Функция ТаблицыБазы(ФильтрТаблицПоИмени = "")
+
+ Лог.Отладка("Получение списка таблиц базы ""%1\%2"": %3", ТекущийСервер, База);
+
+ Попытка
+ Таблицы = ПодключениеКСУБД.ТаблицыБазы(База, ФильтрТаблицПоИмени);
+ Исключение
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ ТекстОшибки = СтрШаблон("Ошибка получения списка таблиц базы ""%1\%2"":%3%4",
+ ТекущийСервер,
+ База,
+ Символы.ПС,
+ ТекстОшибки);
+ ВызватьИсключение ТекстОшибки;
+ КонецПопытки;
+
+ Лог.Отладка("Получен список таблиц базы ""%1\%2""", ТекущийСервер, База);
+
+ Результат = Новый Соответствие();
+
+ Для Каждого ТекТаблица Из Таблицы Цикл
+ УбратьЛидирующееПодчеркивание(ТекТаблица);
+ Результат.Вставить(ТекТаблица, ТекТаблица);
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции // ТаблицыБазы()
+
+// Функция - список таблиц, хранящих данные табличных частей объектов 1С
+// с указанием таблиц объектов-владельцев
+//
+// Возвращаемое значение:
+// Соответствие - список таблиц, хранящих данные табличных частей объектов 1С
+//
+Функция ТабличныеЧастиИВладельцы()
+
+ ТабличныеЧастиИВладельцы = Новый Соответствие();
+
+ Для Каждого ТекНазначение Из ПодчиненныеОбъектыБазы Цикл
+
+ ТаблицыБазы = ТаблицыБазы(СтрШаблон("%%_%1%%", ТекНазначение.Значение.Префикс));
+
+ Для Каждого ТекТаблица Из ТаблицыБазы Цикл
+ ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(ТекТаблица.Значение);
+
+ ИмяОбъектаБазы = СтрШаблон("%1%2", ОписаниеОбъектаБазы.Префикс, ОписаниеОбъектаБазы.Индекс);
+ ТабличныеЧастиИВладельцы.Вставить(ИмяОбъектаБазы, ОписаниеОбъектаБазы);
+ КонецЦикла;
+
+ КонецЦикла;
+
+ Возврат ТабличныеЧастиИВладельцы;
+
+КонецФункции // ТабличныеЧастиИВладельцы()
+
+// Функция - возвращает список колонок базы, соответствующих фильтру
+//
+// Параметры:
+// ФильтрТаблицПоИмени - Строка - фильтр имен таблиц в формате для оператора "LIKE"
+// ФильтрКолонокПоИмени - Строка - фильтр имен колонок в формате для оператора "LIKE"
+//
+// Возвращаемое значение:
+// Соответствие - список колонок базы
+//
+Функция КолонкиБазы(ФильтрТаблицПоИмени = "", ФильтрКолонокПоИмени = "")
+
+ Лог.Отладка("Получение списка колонок базы ""%1\%2"": %3", ТекущийСервер, База);
+
+ Попытка
+ Колонки = ПодключениеКСУБД.КолонкиБазы(База, ФильтрТаблицПоИмени, ФильтрКолонокПоИмени);
+ Исключение
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ ТекстОшибки = СтрШаблон("Ошибка получения списка колонок базы ""%1\%2"":%3%4",
+ ТекущийСервер,
+ База,
+ Символы.ПС,
+ ТекстОшибки);
+ ВызватьИсключение ТекстОшибки;
+ КонецПопытки;
+
+ Лог.Отладка("Получен список колонок базы ""%1\%2""", ТекущийСервер, База);
+
+ КэшВладельцев = Новый Соответствие();
+
+ Результат = Новый Соответствие();
+
+ Для Каждого ТекКолонка Из Колонки Цикл
+
+ Если КэшВладельцев[ТекКолонка.Таблица] = Неопределено Тогда
+ ОписаниеОбъектаВладельца = ОписаниеОбъектаБазыПоИмени(ТекКолонка.Таблица);
+ КэшВладельцев.Вставить(ТекКолонка.Таблица, ОписаниеОбъектаВладельца);
+ КонецЕсли;
+
+ ОписаниеОбъектаКолонки = ОписаниеОбъектаБазыПоИмени(ТекКолонка.Колонка);
+ ОписаниеОбъектаКолонки.Владелец = КэшВладельцев[ТекКолонка.Таблица];
+
+ // Проверка, что поле является ссылкой из табличной части
+ Если ЗначениеЗаполнено(ОписаниеОбъектаКолонки.Владелец.Владелец)
+ И ОписаниеОбъектаКолонки.Имя = ОписаниеОбъектаКолонки.Владелец.Владелец.Имя Тогда
+ ОписаниеОбъектаКолонки.Тип = "Ссылка";
+ ОписаниеОбъектаКолонки.ТипАнгл = "Ref";
+ ОписаниеОбъектаКолонки.Назначение = "Поле";
+ КонецЕсли;
+
+ Результат.Вставить(ОписаниеОбъектаКолонки.Имя, ОписаниеОбъектаКолонки);
+
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции // КолонкиБазы()
+
+// Функция - возвращает структуру описания объекта базы данных 1С
+//
+// Возвращаемое значение:
+// Структура - структура описания объекта базы
+// *Владелец - Структура - структура описания объекта владельца
+// *Тип - Строка - тип объекта или коллекция
+// (например: Справочник, Документ, ТабличнаяЧасть, Поле)
+// *ТипАнгл - Строка - тип объекта или коллекция на английском
+// (например: Reference, Document, TabularSection, Field)
+// *Назначение - Строка - назначение таблицы БД (например: Основная, Итоги, Обороты)
+// *Имя - Строка - имя объекта в БД (Префикс + Индекс)
+// *Префикс - Строка - префикс объекта (например: Reference, Document, VT, Fld))
+// *Индекс - Число - числовой индекс объекта
+// *Суффикс - Строка - дополнительный суффикс имени объекта (например: "_RRef")
+// *Ид - Строка - UUID объекта 1С
+// *ИмяМетаданных - Строка - имя метаданных 1С
+// *ПолноеИмяМетаданных - Строка - имя метаданных 1С
+//
+Функция СтруктураОписанияОбъектаБазы()
+
+ СтруктураОписания = Новый Структура();
+ СтруктураОписания.Вставить("Владелец");
+ СтруктураОписания.Вставить("Тип" , "");
+ СтруктураОписания.Вставить("ТипАнгл" , "");
+ СтруктураОписания.Вставить("Назначение" , "");
+ СтруктураОписания.Вставить("Имя" , "");
+ СтруктураОписания.Вставить("Префикс" , "");
+ СтруктураОписания.Вставить("Индекс");
+ СтруктураОписания.Вставить("Суффикс" , "");
+ СтруктураОписания.Вставить("Ид" , "");
+ СтруктураОписания.Вставить("ИмяМетаданных" , "");
+ СтруктураОписания.Вставить("ПолноеИмяМетаданных", "");
+
+ Возврат СтруктураОписания;
+
+КонецФункции // СтруктураОписанияОбъектаБазы()
+
+// Функция - раскладывает имя объекта базы на префикс, индекс, владельца и суффикс
+//
+// Параметры:
+// ИмяОбъектаБазы - Строка - имя объекта базы
+//
+// Возвращаемое значение:
+// Структура - имя объекта базы, префикс, индекс, владелец и суффикс (см. СтруктураОписанияОбъектаБазы())
+//
+Функция ОписаниеОбъектаБазыПоИмени(Знач ИмяОбъектаБазы)
+
+ ОписаниеОбъектаБазы = СтруктураОписанияОбъектаБазы();
+
+ УбратьЛидирующееПодчеркивание(ИмяОбъектаБазы);
+
+ ПрефиксОбъекта = ПрочитатьОднотипныеСимволы(ИмяОбъектаБазы);
+ ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, СтрДлина(ПрефиксОбъекта) + 1);
+ Символ = Сред(ИмяОбъектаБазы, 1, 1);
+
+ ПозицияИмениТЧ = СтрНайти(ИмяОбъектаБазы, "_");
+ Если ПозицияИмениТЧ > 0 Тогда
+ ПрефиксИмениТЧ = ПрочитатьОднотипныеСимволы(Сред(ИмяОбъектаБазы, ПозицияИмениТЧ + 1));
+ Если ПодчиненныеОбъектыБазы.Свойство(ПрефиксИмениТЧ) Тогда
+ ПрефиксИмениТЧ = ПодчиненныеОбъектыБазы[ПрефиксИмениТЧ].Префикс;
+ Иначе
+ ПозицияИмениТЧ = 0;
+ ПрефиксИмениТЧ = "";
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ПозицияИмениТЧ > 0 Тогда
+ ОписаниеОбъектаБазы.Владелец =
+ ОписаниеОбъектаБазыПоИмени(ПрефиксОбъекта + Лев(ИмяОбъектаБазы, ПозицияИмениТЧ - 1));
+ ПрефиксОбъекта = ПрефиксИмениТЧ;
+ ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, ПозицияИмениТЧ + СтрДлина(ПрефиксИмениТЧ) + 1);
+ Символ = Сред(ИмяОбъектаБазы, 1, 1);
+ КонецЕсли;
+
+ // состав и имена таблицы итогов по счету зависит от количества субконто,
+ // поэтому добавляем еще 1 цифру
+ Если ПрефиксОбъекта = "AccRgAT" Тогда
+ ПрефиксОбъекта = ПрефиксОбъекта + Символ;
+ ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, 2);
+ Символ = Сред(ИмяОбъектаБазы, 1, 1);
+ КонецЕсли;
+
+ ОписаниеОбъектаБазы.Префикс = ПрефиксОбъекта;
+
+ ИндексОбъекта = ПрочитатьОднотипныеСимволы(ИмяОбъектаБазы);
+ ИмяОбъектаБазы = Сред(ИмяОбъектаБазы, СтрДлина(ИндексОбъекта) + 1);
+ Символ = Сред(ИмяОбъектаБазы, 1, 1);
+
+ Если ЗначениеЗаполнено(ИндексОбъекта) Тогда
+ ОписаниеОбъектаБазы.Индекс = Число(ИндексОбъекта);
+ КонецЕсли;
+
+ ОписаниеОбъектаБазы.Имя = СтрШаблон("%1%2",
+ ОписаниеОбъектаБазы.Префикс,
+ Формат(ОписаниеОбъектаБазы.Индекс, "ЧРГ=; ЧГ="));
+
+ Если ЗначениеЗаполнено(Символ) Тогда
+ ОписаниеОбъектаБазы.Суффикс = ИмяОбъектаБазы;
+ КонецЕсли;
+
+ ЗаполнитьЗначенияСвойств(ОписаниеОбъектаБазы, НазначениеОбъектаБазы(ОписаниеОбъектаБазы));
+
+ Возврат ОписаниеОбъектаБазы;
+
+КонецФункции // ОписаниеОбъектаБазыПоИмени()
+
+// Функция - подготавливает описание объекта базы по описанию соответствия имени объекта базы и UUID
+//
+// Параметры:
+// СоответствиеИмениОбъектаИИд - Структура - описание соответствия имени объекта базы и UUID
+// ТабличныеЧасти - Соответствие - описания табличных частей
+// Колонки - Строка - описания колонок
+//
+// Возвращаемое значение:
+// Структура - имя объекта базы, префикс, индекс, владелец и суффикс (см. СтруктураОписанияОбъектаБазы())
+//
+Функция ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд(СоответствиеИмениОбъектаИИд,
+ ТабличныеЧасти = Неопределено,
+ Колонки = Неопределено);
+
+ Имя = СтрШаблон("%1%2", СоответствиеИмениОбъектаИИд.Префикс, Формат(СоответствиеИмениОбъектаИИд.Индекс, "ЧРГ=; ЧГ="));
+
+ Если НЕ ТипЗнч(ТабличныеЧасти) = Тип("Соответствие") Тогда
+ ТабличныеЧасти = Новый Соответствие();
+ КонецЕсли;
+
+ Если НЕ ТипЗнч(Колонки) = Тип("Соответствие") Тогда
+ Колонки = Новый Соответствие();
+ КонецЕсли;
+
+ Если НазначениеОбъектаБазы(СоответствиеИмениОбъектаИИд).Назначение = "Поле" Тогда
+ ОписаниеОбъектаБазы = Колонки[Имя];
+ Если ОписаниеОбъектаБазы = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+ ИначеЕсли ТабличныеЧасти[Имя] = Неопределено Тогда
+ ОписаниеОбъектаБазы = ОписаниеОбъектаБазыПоИмени(Имя);
+ Иначе
+ ОписаниеОбъектаБазы = ТабличныеЧасти[Имя];
+ КонецЕсли;
+
+ ОписаниеОбъектаБазы.Ид = СоответствиеИмениОбъектаИИд.Ид;
+
+ Возврат ОписаниеОбъектаБазы;
+
+КонецФункции // ОписаниеОбъектаБазыПоСоответствиюИмениОбъектаИИд()
+
+// Функция - подготавливает описание объекта базы по описанию соответствия имени объекта базы и UUID
+//
+// Параметры:
+// ОписаниеОбъектаБазы - Структура - описание метаданных 1С объекта базы
+// ОписанияМетаданных - Соответствие - соответствия имен таблиц СУБД и полных имен метаданных 1С
+// описаниям объектов метаданных 1С
+// ИменаТаблицОбъектовКонфигурации1С - Соответствие - соответствия UUID объектов метаданных
+// конфигурации 1С именам объектов СУБД
+// СоответствиеИменМетаданных - Соответствие - соответствия UUID метаданных и имен метаданных
+//
+// Возвращаемое значение:
+// Структура - описание корневого владельца объекта базы
+//
+Функция ЗаполнитьОписаниеОбъектаБазыИВладельцев(ОписаниеОбъектаБазы,
+ ОписанияМетаданных,
+ ИменаТаблицОбъектовКонфигурации1С,
+ СоответствиеИменМетаданных);
+
+ Если НЕ ОписанияМетаданных[ОписаниеОбъектаБазы.Имя] = Неопределено
+ ИЛИ ОписаниеОбъектаБазы = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ОписаниеВладельца = ОписаниеОбъектаБазы;
+ Пока ЗначениеЗаполнено(ОписаниеВладельца.Владелец) Цикл
+ ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид;
+ ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца);
+ Если НазначениеОбъектаБазы(ОписаниеВладельца).Подчиненный Тогда
+ ИмяОбъектаБазы = СтрШаблон("%1_%2", ОписаниеВладельца.Владелец.Имя, ОписаниеВладельца.Имя);
+ ОписанияМетаданных.Вставить(ИмяОбъектаБазы, ОписаниеВладельца);
+ КонецЕсли;
+ ОписаниеВладельца = ОписаниеВладельца.Владелец;
+ КонецЦикла;
+
+ Если ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя] = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ОписаниеВладельца.Ид = ИменаТаблицОбъектовКонфигурации1С[ОписаниеВладельца.Имя].Ид;
+
+ Если НЕ СоответствиеИменМетаданных[ОписаниеВладельца.Ид] = Неопределено Тогда
+ ОписаниеВладельца.ИмяМетаданных = СоответствиеИменМетаданных[ОписаниеВладельца.Ид].ИмяМетаданных;
+ КонецЕсли;
+
+ ОписанияМетаданных.Вставить(ОписаниеВладельца.Имя, ОписаниеВладельца);
+
+ ТекОписание = ОписаниеОбъектаБазы;
+ Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл
+ ТекОписание.ИмяМетаданных =
+ ИмяМетаданных(СоответствиеИменМетаданных[ОписаниеВладельца.Ид].Данные, ТекОписание);
+ ТекОписание = ТекОписание.Владелец;
+ КонецЦикла;
+
+ ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы(ОписаниеОбъектаБазы);
+
+ Возврат ОписаниеВладельца;
+
+КонецФункции // ЗаполнитьОписаниеОбъектаБазыИВладельцев()
+
+// Функция - собирает полное имя объекта метаданных по описанию с учетом всех владельцев
+// например (Справочник.Справочник1.Реквизит1, Документ.ТабличнаяЧасть2.Реквизит8)
+//
+// Параметры:
+// ОписаниеОбъектаБазы - Структура - описание объекта метаданных (см. ОписаниеОбъектаБазыПоИмени())
+//
+// Возвращаемое значение:
+// Строка - полное имя объекта метаданных
+//
+Функция ПолноеИмяОбъектаМетаданных(Знач ОписаниеОбъектаБазы)
+
+ Если НЕ ЗначениеЗаполнено(ОписаниеОбъектаБазы.ИмяМетаданных) Тогда
+ Возврат "";
+ КонецЕсли;
+
+ ТекОписание = ОписаниеОбъектаБазы;
+
+ ПолноеИмя = ТекОписание.ИмяМетаданных;
+
+ Пока ЗначениеЗаполнено(ТекОписание.Владелец) Цикл
+ ПолноеИмя = СтрШаблон("%1.%2", ТекОписание.Владелец.ИмяМетаданных, ПолноеИмя);
+ ТекОписание = ТекОписание.Владелец;
+ КонецЦикла;
+
+ Возврат СтрШаблон("%1.%2", ТекОписание.Тип, ПолноеИмя);
+
+КонецФункции // ПолноеИмяОбъектаМетаданных()
+
+// Процедура - заполняет полные имена метаданных в описании объекта базы и его владельцах
+//
+// Параметры:
+// ОписаниеОбъектаБазы - Структура - описание объекта метаданных (см. ОписаниеОбъектаБазыПоИмени())
+//
+Процедура ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы(ОписаниеОбъектаБазы)
+
+ ТекОписание = ОписаниеОбъектаБазы;
+
+ Пока ЗначениеЗаполнено(ТекОписание) Цикл
+ ТекОписание.Вставить("ПолноеИмяМетаданных", ПолноеИмяОбъектаМетаданных(ТекОписание));
+ ТекОписание = ТекОписание.Владелец;
+ КонецЦикла;
+
+КонецПроцедуры // ЗаполнитьПолныеИменаМетаданныхВОписанииОбъектаБазы()
+
+// Функция - находит в тестовом описании объекта метаданных его имя
+// для отдельных типов объектов возвращает стандартное имя
+//
+// Параметры:
+// ТекстОписания - Строка - описание объекта метаданных (скобкотекст)
+// ИдИлиОписаниеОбъектаБазы - Структура, Строка - UUID объекта метаданных
+//
+// Возвращаемое значение:
+// Строка - имя объекта метаданных
+//
+Функция ИмяМетаданных(ТекстОписания, ИдИлиОписаниеОбъектаБазы)
+
+ ИмяМетаданных = "";
+
+ Если ТипЗнч(ИдИлиОписаниеОбъектаБазы) = Тип("Структура") Тогда
+ Ид = "";
+ Если ИдИлиОписаниеОбъектаБазы.Тип = "НомерСтроки" Тогда
+ ИмяМетаданных = "НомерСтроки";
+ ИначеЕсли ИдИлиОписаниеОбъектаБазы.Тип = "Ссылка" Тогда
+ ИмяМетаданных = "Ссылка";
+ Иначе
+ Ид = ИдИлиОписаниеОбъектаБазы.Ид;
+ КонецЕсли;
+ Иначе
+ Ид = ИдИлиОписаниеОбъектаБазы;
+ КонецЕсли;
+
+ Если НЕ ЗначениеЗаполнено(Ид) Тогда
+ Возврат ИмяМетаданных;
+ КонецЕсли;
+
+ РВ = Новый РегулярноеВыражение(СтрШаблон("%1},""([_a-zA-Zа-яА-ЯёЁ\d]+)""", Ид));
+
+ Совпадения = РВ.НайтиСовпадения(ТекстОписания);
+
+ Если Совпадения.Количество() = 0 Тогда
+ ИмяМетаданных = "";
+ Иначе
+ ИмяМетаданных = Совпадения[0].Группы[1].Значение;
+ КонецЕсли;
+
+ Возврат ИмяМетаданных;
+
+КонецФункции // ИмяМетаданных()
+
+// Функция - находит в текстовом описании (скобочнике) информацию о конфигурации, авторе и т.п. и добавляет в описание
+//
+// Параметры:
+// ОписаниеКонфигурации - Структура - структура описания конфигурации
+// ТекстОписания - Строка - текстовое описание конфигурации (скобочник)
+//
+Процедура ЗаполнитьТекстыВОписанииКонфигурации(ОписаниеКонфигурации, ТекстОписания)
+
+ РВ_Имя = Новый РегулярноеВыражение("^\{\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;
+ ПодробнаяИнформация_Индекс = 1;
+ КраткаяИнформация_Индекс = 2;
+ АвторскиеПрава_Индекс = 3;
+ АдресИнформацииОПоставщике_Индекс = 4;
+ АдресИнформацииОКонфигурации_Индекс = 5;
+
+ Совпадения = РВ_Текст.НайтиСовпадения(ТекстОписания);
+
+ Если Совпадения.Количество() > 0 Тогда
+ ПустоеЗначение = "{0}";
+ ОписаниеКонфигурации.Синоним =
+ ?(Совпадения[Синоним_Индекс].Значение = ПустоеЗначение,
+ "",
+ Совпадения[Синоним_Индекс].Группы[1].Значение);
+ ОписаниеКонфигурации.ПодробнаяИнформация =
+ ?(Совпадения[ПодробнаяИнформация_Индекс].Значение = ПустоеЗначение,
+ "",
+ Совпадения[ПодробнаяИнформация_Индекс].Группы[1].Значение);
+ ОписаниеКонфигурации.КраткаяИнформация =
+ ?(Совпадения[КраткаяИнформация_Индекс].Значение = ПустоеЗначение,
+ "",
+ Совпадения[КраткаяИнформация_Индекс].Группы[1].Значение);
+ ОписаниеКонфигурации.АвторскиеПрава =
+ ?(Совпадения[АвторскиеПрава_Индекс].Значение = ПустоеЗначение,
+ "",
+ Совпадения[АвторскиеПрава_Индекс].Группы[1].Значение);
+ ОписаниеКонфигурации.АдресИнформацииОПоставщике =
+ ?(Совпадения[АдресИнформацииОПоставщике_Индекс].Значение = ПустоеЗначение,
+ "",
+ Совпадения[АдресИнформацииОПоставщике_Индекс].Группы[1].Значение);
+ ОписаниеКонфигурации.АдресИнформацииОКонфигурации =
+ ?(Совпадения[АдресИнформацииОКонфигурации_Индекс].Значение = ПустоеЗначение,
+ "",
+ Совпадения[АдресИнформацииОКонфигурации_Индекс].Группы[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+)");
+
+ Поставщик_Индекс = 1;
+ Версия_Индекс = 2;
+ АдресКаталогаОбновлений_Индекс = 3;
+
+ Совпадения = РВ_Версия.НайтиСовпадения(ТекстОписания);
+
+ Если Совпадения.Количество() > 0 Тогда
+ ОписаниеКонфигурации.Поставщик = Совпадения[0].Группы[Поставщик_Индекс].Значение;
+ ОписаниеКонфигурации.Версия = Совпадения[0].Группы[Версия_Индекс].Значение;
+ ОписаниеКонфигурации.АдресКаталогаОбновлений = Совпадения[0].Группы[АдресКаталогаОбновлений_Индекс].Значение;
+ КонецЕсли;
+
+ Совпадения = РВ_РежимСовместимости.НайтиСовпадения(ТекстОписания);
+
+ Если Совпадения.Количество() > 0 Тогда
+ ОписаниеКонфигурации.РежимСовместимости = Совпадения[0].Группы[1].Значение;
+ КонецЕсли;
+
+КонецПроцедуры // ЗаполнитьВерсиюВОписанииКонфигурации()
+
+// Функция - распаковыает переданные данные, упакованные по алгоритму deflate
+//
+// Параметры:
+// УпакованныеДанные - Строка, ДвоичныеДАнные - данные для распаковки
+// КакТекст - Булево - Истина - результат будет возвращет в виде строки
+// Ложь - результат будет возвращет в виде двоичных данных
+//
+// Возвращаемое значение:
+// Строка, ДвоичныеДанные - распакованные данные
+//
+Функция ПрочитатьУпакованныеДанные(УпакованныеДанные, КакТекст = Ложь)
+
+ ТипУпакованныхДанных = ТипЗнч(УпакованныеДанные);
+ Если ТипУпакованныхДанных = Тип("ДвоичныеДанные") Тогда
+ Данные = УпакованныеДанные;
+ ИначеЕсли ТипУпакованныхДанных = Тип("Строка") Тогда
+ Данные = Base64Значение(УпакованныеДанные);
+ Иначе
+ ВызватьИсключение СтрШаблон("Некорректный тип параметра ""УпакованныеДанные"" ""%1"",
+ | ожидается ""ДвоичныеДанные"" или ""Строка""",
+ ТипУпакованныхДанных);
+ КонецЕсли;
+
+ Если ДанныеУпакованы(Данные) Тогда
+ Упаковщик = Новый УпаковщикDeflate();
+ Данные = Упаковщик.РаспаковатьДанные(Данные);
+ Иначе
+ Лог.Отладка("Данные ""%1"" не упакованы", УпакованныеДанные);
+ КонецЕсли;
+
+ Если КакТекст Тогда
+ Чтение = Новый ЧтениеТекста(Данные.ОткрытьПотокДляЧтения(), КодировкаТекста.UTF8);
+ Данные = Чтение.Прочитать();
+ КонецЕсли;
+
+ Возврат Данные;
+
+КонецФункции // ПрочитатьУпакованныеДанные()
+
+// Функция - проверяет, что данные упакованы по алгоритму deflate
+// если в начале данных расположен BOM (0xEF (239), 0xBB (187), 0xBF (191)) - данные не упакованы
+//
+// Параметры:
+// Данные - Строка, ДвоичныеДанные - проверяемые данные
+//
+// Возвращаемое значение:
+// Булево - Истина - данные упакованы по алгоритму deflate
+//
+Функция ДанныеУпакованы(Знач Данные)
+
+ ТипДанных = ТипЗнч(Данные);
+ ЭтоПоток = (ТипДанных = Тип("Поток")
+ ИЛИ ТипДанных = Тип("ФайловыйПоток")
+ ИЛИ ТипДанных = Тип("ПотокВПамяти"));
+
+ Если ТипДанных = Тип("ДвоичныеДанные") Тогда
+ Поток = Данные.ОткрытьПотокДляЧтения();
+ ИначеЕсли ТипДанных = Тип("Строка") Тогда
+ Данные = Base64Значение(Данные);
+ Поток = Данные.ОткрытьПотокДляЧтения();
+ ИначеЕсли ЭтоПоток Тогда
+ Данные.СкопироватьВ(Поток);
+ Иначе
+ ВызватьИсключение СтрШаблон("Некорректный тип ""%1"" параметра ""Данные"",
+ | ожидается ""Base64Строка, Поток, ДвоичныеДанные""",
+ ТипДанных);
+ КонецЕсли;
+
+ ДлинаБОМ = 3;
+ КодСимволаБОМ1 = 239; // 0xEF
+ КодСимволаБОМ2 = 187; // 0xBB
+ КодСимволаБОМ3 = 191; // 0xBF
+
+ Поток.Перейти(0, ПозицияВПотоке.Начало);
+
+ Буфер = Новый БуферДвоичныхДанных(ДлинаБОМ);
+
+ Поток.Прочитать(Буфер, 0, ДлинаБОМ);
+
+ Возврат НЕ (Буфер[0] = КодСимволаБОМ1 И Буфер[1] = КодСимволаБОМ2 И Буфер[2] = КодСимволаБОМ3);
+
+КонецФункции // ДанныеУпакованы()
+
+// Функция - убирает из строки начальные и конечные кавычки
+// если строка содержит только цифры, то преобразует в число
+//
+// Параметры:
+// Строка - Строка - исходная строка
+//
+// Возвращаемое значение:
+// Строка, Число - результат приведения
+//
+Функция ПривестиСтроку(Знач Строка)
+
+ Результат = СокрЛП(Строка);
+
+ УдалитьСимволов = 2;
+
+ Если Лев(Результат, 1) = """" И Прав(Результат, 1) = """" Тогда
+ Результат = Сред(Результат, УдалитьСимволов, СтрДлина(Результат) - УдалитьСимволов);
+ КонецЕсли;
+
+ Если ПустаяСтрока(Результат) Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ Если ЭтоЧисло(Результат) Тогда
+ Результат = Число(Результат);
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции // ПривестиСтроку()
+
+// Процедура - удаляет лидирующий символ "_" из имени объекта
+//
+// Параметры:
+// Имя - Строка - имя объекта
+//
+Процедура УбратьЛидирующееПодчеркивание(Имя)
+
+ НачальнаяПозиция = 2;
+
+ Если Лев(Имя, 1) = "_" Тогда
+ Имя = Сред(Имя, НачальнаяПозиция);
+ КонецЕсли;
+
+КонецПроцедуры // УбратьЛидирующееПодчеркивание()
+
+// Функция - возвращает часть строки до первого символа "тип" которого отличается от прочитанных
+// т.е. читает все цифры до первого нецифрового символа либо все нецифровые символы до первой цифры
+//
+// Параметры:
+// ИсходнаяСтрока - Строка - исходная строка
+//
+// Возвращаемое значение:
+// Строка - Истина - строка не пустая и содержит только цифры
+//
+Функция ПрочитатьОднотипныеСимволы(Знач ИсходнаяСтрока)
+
+ Если НЕ ЗначениеЗаполнено(ИсходнаяСтрока) Тогда
+ Возврат "";
+ КонецЕсли;
+
+ Совпадения = ВыражениеОднотипныхСимволов.НайтиСовпадения(ИсходнаяСтрока);
+
+ Если Совпадения.Количество() = 0 Тогда
+ ПрочитанныеСимволы = "";
+ Иначе
+ ПрочитанныеСимволы = Совпадения[0].Группы[0].Значение;
+ КонецЕсли;
+
+ Возврат ПрочитанныеСимволы;
+
+КонецФункции // ПрочитатьОднотипныеСимволы()
+
+// Функция - проверяет, что строка не пустая и содержит только цифры
+//
+// Параметры:
+// Строка - Строка - исходная строка
+//
+// Возвращаемое значение:
+// Булево - Истина - строка не пустая и содержит только цифры
+//
+Функция ЭтоЧисло(Строка)
+
+ Если НЕ ЗначениеЗаполнено(Строка) Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат ВыражениеПроверкиЧисла.Совпадает(Строка);
+
+КонецФункции // ЭтоЧисло()
+
+#КонецОбласти // СлужебныеПроцедурыИФункции
+
+#Область ОбработчикиСобытий
+
+// Процедура - обработчик события "ПриСозданииОбъекта"
+//
+// Параметры:
+// _ПодключениеКСУБД - ПодключениеКСУБД - объект подключения к СУБД
+// _База - Строка - имя базы данных
+//
+// BSLLS:UnusedLocalMethod-off
+Процедура ПриСозданииОбъекта(Знач _ПодключениеКСУБД, _База)
+
+ ПодключениеКСУБД = _ПодключениеКСУБД;
+ ТекущийСервер = ПодключениеКСУБД.Сервер();
+ База = _База;
+
+ ЗаполнитьНазначенияОбъектовБазы();
+
+ ВыражениеПроверкиЧисла = Новый РегулярноеВыражение("^\d+$|^\d+.\d+$");
+ ВыражениеОднотипныхСимволов = Новый РегулярноеВыражение("^\d+|^[a-zAZ]+");
+
+ Лог = ПараметрыСистемы.Лог();
+
+КонецПроцедуры // ПриСозданииОбъекта()
+// 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..29f1c0c
--- /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,493 @@
+{
+ "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",
+ "Подчиненный" : true,
+ "Тип": "ТабличнаяЧасть",
+ "ТипАнгл": "TabularSection",
+ "Назначение": "ТабличнаяЧасть"
+ },
+ "EXTDIM": {
+ "Префикс": "ExtDim",
+ "Подчиненный" : true,
+ "Тип": "ВидыСубконто",
+ "ТипАнгл": "ExtDimensionTypes",
+ "Назначение": "ТабличнаяЧасть"
+ },
+ "LEADINGCK": {
+ "Префикс": "LeadingCK",
+ "Подчиненный" : true,
+ "Тип": "ВедущиеВидыРасчета",
+ "ТипАнгл": "LeadingCalculationTypes",
+ "Назначение": "ТабличнаяЧасть"
+ },
+ "BASECK": {
+ "Префикс": "BaseCK",
+ "Подчиненный" : true,
+ "Тип": "БазовыеВидыРасчета",
+ "ТипАнгл": "BaseCalculationTypes",
+ "Назначение": "ТабличнаяЧасть"
+ },
+ "DISPLACEDCK": {
+ "Префикс": "DisplacedCK",
+ "Подчиненный" : true,
+ "Тип": "ВытесняющиеВидыРасчета ",
+ "ТипАнгл": "DisplacingCalculationTypes",
+ "Назначение": "ТабличнаяЧасть "
+ },
+ "FLD": {
+ "Префикс": "Fld",
+ "Тип": "Поле",
+ "ТипАнгл": "Field",
+ "Назначение": "Поле"
+ },
+ "LINENO": {
+ "Префикс": "LineNo",
+ "Тип": "НомерСтроки",
+ "ТипАнгл": "LineNumber",
+ "Назначение": "Поле"
+ },
+ "CONFIG": {
+ "Префикс": "Config",
+ "Тип": "Конфигурация",
+ "ТипАнгл": "Configuration",
+ "Назначение": "Конфигурация"
+ }
+}
+
+ // "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"
+ // "ExtensionsInfo"
+ // "ExtensionsInfoNGS"
+ // "ExtensionsRestruct"
+ // "ExtensionsRestructNGS"
+ // "ExtsChngR"
+ // "FilesStruDmm"
+ // "FrmDtSettings"
+ // "IBVersionStruDmm"
+ // "LineNo"
+ // "ODataSettings"
+ // "RepSettings"
+ // "RepVarSettings"
+ // "SeqB"
+ // "SystemSettings"
+ // "Turnover"
+ // "TurnoverCt"
+ // "TurnoverDt"
+ // "UsersDmm"
+ // "UsersWorkHistory"
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";
КонецФункции // Версия()
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..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"
@@ -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)
//
Процедура ЗагрузитьИнформационнуюБазуИзФайла(Знач ПараметрыИБ,
Знач ПутьКФайлу,
@@ -174,10 +174,11 @@
УдалитьФайлы(ТекКаталог.ПолноеИмя);
Лог.Информация("Удален каталог кэша ""%1"".", ТекКаталог.ПолноеИмя);
Исключение
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
Лог.Предупреждение("Ошибка удаления каталога кэша ""%1"": %2%3",
ТекКаталог.ПолноеИмя,
Символы.ПС,
- ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ ТекстОшибки);
КонецПопытки;
КонецЦикла;
@@ -240,7 +241,7 @@
КонецПроцедуры // ОтключитьОтХранилища()
-// Выполняет отключение информационной базы от хранилища конфигурации
+// Выполняет подключение информационной базы к хранилищу конфигурации
//
// Параметры:
// ПараметрыИБ - Структура - параметры подключения к базе 1С
@@ -328,8 +329,8 @@
// * РазрешитьВыдачуЛицензий - Булево - Истина - разрешить выдачу лицензий сервером 1С (по умолчанию: Истина)
// * РазрешитьРегЗадания - Булево - Истина - разрешить запуск рег. заданий (по умолчанию: Ложь)
// ПараметрыСУБД - Структура
-// * ТипСУБД - Строка - Тип сервера СУБД ("MSSQLServer" <по умолчанию>;
-// "PostgreSQL"; "IBMDB2"; "OracleDatabase")
+// * ТипСУБД - Строка - Тип сервера СУБД ("MSSQLServer" <по умолчанию>,
+// "PostgreSQL", "IBMDB2", "OracleDatabase")
// * СерверСУБД - Строка - Адрес сервера СУБД
// * ПользовательСУБД - Строка - Пользователь сервера СУБД
// * ПарольСУБД - Строка - Пароль пользователя сервера СУБД
@@ -387,7 +388,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 b3ca8ed..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"
@@ -15,7 +15,7 @@
#Область ПрограммныйИнтерфейс
-// Функция, выполняет копирование/перемещение указанных файлов с использованием команд системы (xcopy)
+// Процедура, выполняет копирование/перемещение указанных файлов с использованием команд системы (xcopy)
//
// Параметры:
// Источник - Строка - копируемые файлы
@@ -86,8 +86,8 @@
// Функция, выполняет удаление указанных файлов с использованием команды системы (del)
//
// Параметры:
-// ПутьКФайлу - Строка - путь к удаляемому файлы
-// ИсключениеПриОшибке - Строка - Истина - вызывать исключение при ошибке удаления
+// ПутьКФайлу - Строка - путь к удаляемому файлу
+// ИсключениеПриОшибке - Булево - Истина - вызывать исключение при ошибке удаления
//
Процедура КомандаСистемыУдалитьФайл(Знач ПутьКФайлу, ИсключениеПриОшибке = Ложь) Экспорт
@@ -110,7 +110,7 @@
ОписаниеРезультата = КомандаРК.ПолучитьВывод();
Если Не ПустаяСтрока(ОписаниеРезультата) Тогда
- Лог.Информация("Вывод команды удаления: " + ОписаниеРезультата);
+ Лог.Отладка("Вывод команды удаления: " + ОписаниеРезультата);
КонецЕсли;
Если КодВозврата = 0 Тогда
@@ -134,12 +134,12 @@
//
// Параметры:
// ПутьКСписку - Строка - путь к файлу со списком файлов архива
-// ДобавитьПутьКИсходномуФайлу - Строка - Истина - при чтении добавлять к результату
+// ДобавитьПутьКИсходномуФайлу - Булево - Истина - при чтении добавлять к результату
// путь к исходному файлу списка
-// ДобавитьИсходныйФайл - Строка - Истина - добавить исходный файл в список
+// ДобавитьИсходныйФайл - Булево - Истина - добавить исходный файл в список
//
// Возвращаемое значение:
-// Массив из Строка - список файлов архива
+// Массив из Строка - прочитанный список файлов
//
Функция ПрочитатьСписокФайлов(Знач ПутьКСписку, ДобавитьПутьКИсходномуФайлу = Ложь, ДобавитьИсходныйФайл = Ложь) Экспорт
@@ -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/src/lib.config b/src/lib.config
index a639a52..e790616 100644
--- a/src/lib.config
+++ b/src/lib.config
@@ -1,49 +1,12 @@
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/tests/batch-tests.os b/tests/batch-tests.os
index 559b6f1..cde81f5 100644
--- a/tests/batch-tests.os
+++ b/tests/batch-tests.os
@@ -9,7 +9,6 @@
Процедура ПередЗапускомТеста() Экспорт
Лог = ПараметрыСистемы.Лог();
- Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры // ПередЗапускомТеста()
@@ -22,11 +21,13 @@
&Тест
Процедура ТестДолжен_ВыполнитьПакетныйЗапускКоманд() Экспорт
+ Лог.Информация("Тест: Пакетный запуск команды");
+
ИмяСервера = ПолучитьПеременнуюСреды("CPDB_SQL_SRVR");
ИмяПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_USER");
ПарольПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_PWD");
- ПодключениеКСУБД = Новый ПодключениеКСУБД(ИмяСервера, ИмяПользователя, ПарольПользователя);
+ ПодключениеКСУБД = Новый ПодключениеMSSQL(ИмяСервера, ИмяПользователя, ПарольПользователя);
РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД);
@@ -46,22 +47,22 @@
Контекст.Вставить("АргументыКоманднойСтроки", Новый ФиксированныйМассив(Аргументы));
- ВремяЗапуска = ТекущаяДата();
-
КаталогИсходников = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "src");
- Сценарий = ЗагрузитьСценарий(ОбъединитьПути(КаталогИсходников, "cmd", "cpdb.os"), Контекст);
+ ЗагрузитьСценарий(ОбъединитьПути(КаталогИсходников, "cmd", "cpdb.os"), Контекст);
КонецПроцедуры // ТестДолжен_ВыполнитьПакетныйЗапускКоманд()
&Тест
Процедура ТестДолжен_ВыполнитьЗапускКомандыИспользуяПараметрыИзФайла() Экспорт
+ Лог.Информация("Тест: Пакетный запуск команды с параметрами из файла");
+
ИмяСервера = ПолучитьПеременнуюСреды("CPDB_SQL_SRVR");
ИмяПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_USER");
ПарольПользователя = ПолучитьПеременнуюСреды("CPDB_SQL_PWD");
- ПодключениеКСУБД = Новый ПодключениеКСУБД(ИмяСервера, ИмяПользователя, ПарольПользователя);
+ ПодключениеКСУБД = Новый ПодключениеMSSQL(ИмяСервера, ИмяПользователя, ПарольПользователя);
РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД);
@@ -84,11 +85,9 @@
Контекст.Вставить("АргументыКоманднойСтроки", Новый ФиксированныйМассив(Аргументы));
Контекст.Вставить("ЭтоТест" , Истина);
- ВремяЗапуска = ТекущаяДата();
-
КаталогИсходников = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "src");
- Сценарий = ЗагрузитьСценарий(ОбъединитьПути(КаталогИсходников, "cmd", "cpdb.os"), Контекст);
+ ЗагрузитьСценарий(ОбъединитьПути(КаталогИсходников, "cmd", "cpdb.os"), Контекст);
ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБазы);
diff --git a/tests/file-tests.os b/tests/file-tests.os
index fb6fe0f..a76201e 100644
--- a/tests/file-tests.os
+++ b/tests/file-tests.os
@@ -18,7 +18,6 @@
ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst");
Лог = ПараметрыСистемы.Лог();
- Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры // ПередЗапускомТеста()
@@ -35,6 +34,8 @@
&Тест
Процедура ТестДолжен_СоздатьФайл() Экспорт
+ Лог.Информация("Перед тестами: Создание тестового файла");
+
ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных);
РазмерФайла = 31457280;
@@ -47,232 +48,11 @@
КонецПроцедуры // ТестДолжен_СоздатьФайл()
-&Тест
-Процедура ТестДолжен_СоздатьПапкуВ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()
-
&Тест
Процедура ТестДолжен_ПроверитьКопированиеФайла() Экспорт
+ Лог.Информация("Тест: Копирование файла");
+
КаталогДляКопирования = ОбъединитьПути(КаталогВременныхДанных, "ForCopy");
ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);
@@ -290,6 +70,8 @@
&Тест
Процедура ТестДолжен_ПроверитьРазбиениеФайлаНаЧасти() Экспорт
+ Лог.Информация("Тест: Разбиение файла на части");
+
ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);
ПутьКАрхиву = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.7z.001", ТестовыйФайл.ИмяБезРасширения));
@@ -311,6 +93,8 @@
&Тест
Процедура ТестДолжен_УдалитьТестовыйФайл() Экспорт
+ Лог.Информация("Тест: Удаление файла");
+
УдалитьФайлы(ПутьКТестовомуФайлу);
ТекстОшибки = СтрШаблон("Ошибка удаления файла ""%1""", ПутьКТестовомуФайлу);
@@ -322,6 +106,8 @@
&Тест
Процедура ТестДолжен_ПроверитьСборкуФайлаИзЧастейИзАрхива() Экспорт
+ Лог.Информация("Тест: Сборка файла из частей из архива");
+
ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);
Если ТестовыйФайл.Существует() Тогда
@@ -341,6 +127,8 @@
&Тест
Процедура ТестДолжен_ПроверитьСборкуФайлаИзЧастейИзСписка() Экспорт
+ Лог.Информация("Тест: Сборка файла из частей по списку файлов");
+
ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);
Если ТестовыйФайл.Существует() Тогда
@@ -360,6 +148,8 @@
&Тест
Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт
+ Лог.Информация("После тестов: Удаление тестового каталога");
+
УдалитьФайлы(КаталогВременныхДанных);
ТекстОшибки = СтрШаблон("Ошибка удаления каталога временных файлов ""%1""", КаталогВременныхДанных);
diff --git a/tests/ib-structure-tests.os b/tests/ib-structure-tests.os
new file mode 100644
index 0000000..55f14d3
--- /dev/null
+++ b/tests/ib-structure-tests.os
@@ -0,0 +1,400 @@
+#Использовать 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");
+
+ ПодключениеКСУБД = Новый ПодключениеMSSQL(ИмяСервера, ИмяПользователя, ПарольПользователя);
+
+ РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД);
+
+ Лог = ПараметрыСистемы.Лог();
+
+КонецПроцедуры // ПередЗапускомТеста()
+
+// Процедура выполняется после запуска теста
+//
+Процедура ПослеЗапускаТеста() Экспорт
+
+КонецПроцедуры // ПослеЗапускаТеста()
+
+&Тест
+Процедура ТестДолжен_ПодготовитьТестовуюБазу() Экспорт
+
+ Лог.Информация("Перед тестами: Подготовка тестовой базы данных");
+
+ Для й = 1 По 3 Цикл
+ ИмяБазы = СтрШаблон("%1_%2", ПрефиксИмениБД, й);
+
+ Если НЕ РаботаССУБД.БазаСуществует(ИмяБазы) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ РаботаССУБД.УдалитьБазуДанных(ИмяБазы);
+ КонецЦикла;
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ РаботаССУБД.СоздатьБазуДанных(ИмяБД, , КаталогВременныхДанных);
+
+ ТекстОшибки = СтрШаблон("Ошибка создания базы данных ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ РаботаССУБД.ВыполнитьВосстановление(ИмяБД,
+ ФайлКопииБазы,
+ КаталогВременныхДанных,
+ КаталогВременныхДанных,
+ Истина);
+
+ ТекстОшибки = СтрШаблон("Ошибка восстановления базы ""%1"" из резервной копии ""%2""", ИмяБД, ФайлКопииБазы);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПодготовитьТестовуюБазу()
+
+&Тест
+Процедура ТестДолжен_ПолучитьВерсиюФорматаКонфигурации() Экспорт
+
+ Лог.Информация("Тест: Получение версии формата конфигурации");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ОписаниеВерсии = СтруктураХраненияИБ.ВерсияФорматаКонфигурации();
+
+ ТекстОшибки = СтрШаблон("Ошибка получения версии формата базы ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьРавенство(ОписаниеВерсии.ТребуемаяВерсияПлатформы, "80313", ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьВерсиюФорматаКонфигурации()
+
+&Тест
+Процедура ТестДолжен_ПолучитьОписаниеКонфигурации() Экспорт
+
+ Лог.Информация("Тест: Получение описания конфигурации");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ОписаниеКонфигурации = СтруктураХраненияИБ.ОписаниеКонфигурации();
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания конфигурации 1С базы ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьРавенство(ОписаниеКонфигурации.Имя, "CPDB_TEST", ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьОписаниеКонфигурации()
+
+&Тест
+Процедура ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы() Экспорт
+
+ Лог.Информация("Тест: Получение описания объекта метаданных 1С по имени таблицы БД");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ИмяОбъектаБД = "Reference34";
+ ИмяОбъектаМетаданных = "Справочник.Справочник1";
+
+ ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания объекта метаданных 1С для объекта БД ""%1""", ИмяОбъектаБД);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ПолноеИмяМетаданных, ИмяОбъектаМетаданных, ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьОписаниеОбъектаМетаданных1СПоИмениТаблицы()
+
+&Тест
+Процедура ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы() Экспорт
+
+ Лог.Информация("Тест: Получение описания табличной части объекта метаданных 1С по имени таблицы БД");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ИмяОбъектаБД = "_Reference34_VT36";
+ ИмяТабличнойЧасти = "Справочник.Справочник1.ТабличнаяЧасть1";
+
+ ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания табличной части
+ | объекта метаданных 1С для объекта БД ""%1""",
+ ИмяОбъектаБД);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ПолноеИмяМетаданных, ИмяТабличнойЧасти, ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьОписаниеТабличнойЧастиОбъектаМетаданных1СПоИмениТаблицы()
+
+&Тест
+Процедура ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки() Экспорт
+
+ Лог.Информация("Тест: Получение описания реквизита объекта метаданных 1С по имени таблицы БД");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ИмяОбъектаБД = "_Fld35";
+ ИмяРеквизита = "Справочник.Справочник1.Реквизит1";
+
+ ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита
+ | объекта метаданных 1С для объекта БД ""%1""",
+ ИмяОбъектаБД);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ПолноеИмяМетаданных, ИмяРеквизита, ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаОбъектаМетаданных1СПоИмениКолонки()
+
+&Тест
+Процедура ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки() Экспорт
+
+ Лог.Информация("Тест: Получение описания реквизита табличной части объекта метаданных 1С по имени таблицы БД");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ИмяОбъектаБД = "_Fld38";
+ ИмяРеквизита = "Справочник.Справочник1.ТабличнаяЧасть1.Реквизит1";
+
+ ОписаниеОбъектаМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектаБД1С(ИмяОбъектаБД);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания реквизита табличной части
+ | объекта метаданных 1С для объекта БД ""%1""",
+ ИмяОбъектаБД);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектаМетаданных.ПолноеИмяМетаданных, ИмяРеквизита, ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьОписаниеРеквизитаТабличнойЧасти1СПоИмениКолонки()
+
+&Тест
+Процедура ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1С() Экспорт
+
+ Лог.Информация("Тест: Получение описания структуры хранения базы данных 1С");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ ИмяОбъектаБДСправочника = "Reference34";
+ ИмяОбъектаБДТабличнойЧасти = "Reference34_VT36";
+ ИмяОбъектаБДТабличнойЧастиСокр = "VT36";
+
+ ИмяСправочника = "Справочник.Справочник1";
+ ИмяТабличнойЧасти = "Справочник.Справочник1.ТабличнаяЧасть1";
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ОписаниеОбъектовМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектовБД1С();
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С,
+ | не найдено описание для объекта БД ""%1"" справочника",
+ ИмяОбъектаБДСправочника);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДСправочника].ПолноеИмяМетаданных,
+ ИмяСправочника,
+ ТекстОшибки);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С,
+ | не найдено описание для объекта БД ""%1"" табличной части по полному имени",
+ ИмяОбъектаБДТабличнойЧасти);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧасти].ПолноеИмяМетаданных,
+ ИмяТабличнойЧасти,
+ ТекстОшибки);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С,
+ | не найдено описание для объекта БД ""%1"" табличной части по сокращенному имени",
+ ИмяОбъектаБДТабличнойЧастиСокр);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДТабличнойЧастиСокр].ПолноеИмяМетаданных,
+ ИмяТабличнойЧасти,
+ ТекстОшибки);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С,
+ | не найдено описание для объекта метаданных ""%1"" справочника",
+ ИмяСправочника);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяСправочника].Имя,
+ ИмяОбъектаБДСправочника,
+ ТекстОшибки);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С,
+ | не найдено описание для объекта метаданных ""%1"" табличной части",
+ ИмяТабличнойЧасти);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяТабличнойЧасти].Имя,
+ ИмяОбъектаБДТабличнойЧастиСокр,
+ ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1С()
+
+&Тест
+Процедура ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1ССПолями() Экспорт
+
+ Лог.Информация("Тест: Получение описания структуры хранения базы данных 1С с полями");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ ИмяОбъектаБДПоля = "Fld35";
+ ИмяРеквизита = "Справочник.Справочник1.Реквизит1";
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ОписаниеОбъектовМетаданных = СтруктураХраненияИБ.ОписаниеМетаданныхОбъектовБД1С(Истина);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С,
+ | не найдено описание для объекта БД ""%1"" реквизита",
+ ИмяОбъектаБДПоля);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяОбъектаБДПоля].ПолноеИмяМетаданных,
+ ИмяРеквизита,
+ ТекстОшибки);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения описания объектов метаданных 1С,
+ | не найдено описание для объекта метаданных ""%1""",
+ ИмяРеквизита);
+
+ Утверждения.ПроверитьРавенство(ОписаниеОбъектовМетаданных[ИмяРеквизита].Имя,
+ ИмяОбъектаБДПоля,
+ ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьОписаниеСтруктурыХраненияБД1ССПолями()
+
+&Тест
+Процедура ТестДолжен_ПолучитьЗанимаемоеБазойМесто() Экспорт
+
+ Лог.Информация("Тест: Получение объема места занимаемого базой данных");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ЗанимаемоеМесто = СтруктураХраненияИБ.ЗанимаемоеМесто();
+
+ ТекстОшибки = СтрШаблон("Ошибка получения занимаемое базой ""%1"" место", ИмяБД);
+
+ Утверждения.ПроверитьБольше(ЗанимаемоеМесто.РазмерБазы, 0, ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьЗанимаемоеБазойМесто()
+
+&Тест
+Процедура ТестДолжен_ПолучитьПоказателиИспользованияТаблицБазы() Экспорт
+
+ Лог.Информация("Тест: Получение показателей использования таблиц базы данных");
+
+ ИмяБД = СтрШаблон("%1_%2", ПрефиксИмениБД, 1);
+
+ ТекстОшибки = СтрШаблон("Не найдена тестовая база ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьИстину(РаботаССУБД.БазаСуществует(ИмяБД), ТекстОшибки);
+
+ СтруктураХраненияИБ = Новый СтруктураХраненияИБ(ПодключениеКСУБД, ИмяБД);
+
+ ТаблицыБазы = СтруктураХраненияИБ.ПоказателиИспользованияТаблицБазы();
+
+ ТестоваяТаблица = "Config";
+
+ ТекстОшибки = СтрШаблон("Ошибка получения таблиц базы ""%1""", ИмяБД);
+
+ Утверждения.ПроверитьРавенство(ТаблицыБазы.Количество(), 48, ТекстОшибки);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения таблиц базы ""%1"", не найдена таблица ""%2""", ИмяБД, ТестоваяТаблица);
+
+ ЕстьТаблица = Ложь;
+ Для Каждого ТекТаблица Из ТаблицыБазы Цикл
+ Если ТекТаблица.Таблица = ТестоваяТаблица Тогда
+ ЕстьТаблица = Истина;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ Утверждения.ПроверитьИстину(ЕстьТаблица, ТекстОшибки);
+
+ ТекстОшибки = СтрШаблон("Ошибка получения таблиц базы ""%1"",
+ | не удалось получить размер таблицы ""%2""",
+ ИмяБД,
+ ТестоваяТаблица);
+
+ Утверждения.ПроверитьБольше(ТекТаблица.ВсегоЗанято, 0, ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ПолучитьПоказателиИспользованияТаблицБазы()
+
+&Тест
+Процедура ТестДолжен_УдалитьТестовуюБазу() Экспорт
+
+ Лог.Информация("После тестов: Удаление временной базы");
+
+ Для й = 1 По 3 Цикл
+ ИмяБазы = СтрШаблон("%1_%2", ПрефиксИмениБД, й);
+
+ Если НЕ РаботаССУБД.БазаСуществует(ИмяБазы) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ РаботаССУБД.УдалитьБазуДанных(ИмяБазы);
+ КонецЦикла;
+
+КонецПроцедуры // ТестДолжен_УдалитьТестовуюБазу()
diff --git a/tests/ib-tests.os b/tests/ib-tests.os
index 0b82a03..48a686c 100644
--- a/tests/ib-tests.os
+++ b/tests/ib-tests.os
@@ -10,7 +10,7 @@
//
Процедура ПередЗапускомТеста() Экспорт
- КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "tmpdata");
+ КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "ibtmpdata");
КаталогВременныхДанных = ФС.ПолныйПуть(КаталогВременныхДанных);
ПрефиксИмениИБ = "cpdb_test_db";
@@ -18,7 +18,6 @@
ШаблонБазы = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "cpdb_test_db.dt");
Лог = ПараметрыСистемы.Лог();
- Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры // ПередЗапускомТеста()
@@ -31,6 +30,8 @@
&Тест
Процедура ТестДолжен_СоздатьФайловуюБазу1С() Экспорт
+ Лог.Информация("Тест: Создание файловой информационной базы 1С");
+
ИмяИБ = СтрШаблон("%1%2", ПрефиксИмениИБ, 1);
КаталогИБ = ОбъединитьПути(КаталогВременныхДанных, ИмяИБ);
@@ -52,6 +53,8 @@
&Тест
Процедура ТестДолжен_ВыгрузитьБазуВФайл() Экспорт
+ Лог.Информация("Тест: Выгрузка информационной базы 1С в файл");
+
ИмяИБ = СтрШаблон("%1%2", ПрефиксИмениИБ, 1);
КаталогИБ = ОбъединитьПути(КаталогВременныхДанных, ИмяИБ);
@@ -87,6 +90,8 @@
&Тест
Процедура ТестДолжен_ЗагрузитьБазуИзФайла() Экспорт
+ Лог.Информация("Тест: Загрузка информационной базы 1С из файла");
+
ИмяИБ = СтрШаблон("%1%2", ПрефиксИмениИБ, 1);
КаталогИБ = ОбъединитьПути(КаталогВременныхДанных, ИмяИБ);
diff --git a/tests/nextcloud-tests.os b/tests/nextcloud-tests.os
new file mode 100644
index 0000000..bc84b36
--- /dev/null
+++ b/tests/nextcloud-tests.os
@@ -0,0 +1,276 @@
+#Использовать fs
+#Использовать "../src/core"
+#Использовать "../src/cmd"
+
+Перем ПутьКТестовомуФайлу; // - путь к файлу для тестов
+Перем КаталогВременныхДанных; // - путь к каталогу временных данных
+Перем Лог; // - логгер
+
+#Область ОбработчикиСобытий
+
+// Процедура выполняется после запуска теста
+//
+Процедура ПередЗапускомТеста() Экспорт
+
+ КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "tmpdata");
+ КаталогВременныхДанных = ФС.ПолныйПуть(КаталогВременныхДанных);
+
+ ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst");
+
+ Лог = ПараметрыСистемы.Лог();
+
+КонецПроцедуры // ПередЗапускомТеста()
+
+// Процедура выполняется после запуска теста
+//
+Процедура ПослеЗапускаТеста() Экспорт
+
+КонецПроцедуры // ПослеЗапускаТеста()
+
+#КонецОбласти // ОбработчикиСобытий
+
+#Область Тесты
+
+&Тест
+Процедура ТестДолжен_СоздатьФайл() Экспорт
+
+ Лог.Информация("Перед тестами: Создание тестового файла");
+
+ ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных);
+
+ РазмерФайла = 31457280;
+
+ СоздатьСлучайныйФайл(ПутьКТестовомуФайлу, РазмерФайла);
+
+ ТекстОшибки = СтрШаблон("Ошибка создания файла ""%1""", ПутьКТестовомуФайлу);
+
+ Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКТестовомуФайлу), ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_СоздатьФайл()
+
+&Тест
+Процедура ТестДолжен_СоздатьПапкуВNextCloud() Экспорт
+
+ Лог.Информация("Тест: Создание каталога в сервисе NextCloud");
+
+ АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS");
+ АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME");
+ АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD");
+
+ Клиент = Новый РаботаСNextCloud(АдресСервиса, АдминИмя, АдминПароль);
+
+ ИмяКаталога = "testFolder1";
+
+ Клиент.СоздатьКаталог(ИмяКаталога);
+
+ ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" в сервисе ""%2"", для пользователя ""%3""",
+ ИмяКаталога,
+ АдресСервиса,
+ АдминИмя);
+
+ Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки);
+
+ Клиент.Удалить(ИмяКаталога);
+
+КонецПроцедуры // ТестДолжен_СоздатьПапкуВNextCloud()
+
+&Тест
+Процедура ТестДолжен_ОтправитьФайлВNextCloud() Экспорт
+
+ Лог.Информация("Тест: Отправка файла на сервис NextCloud");
+
+ АдресСервиса = ПолучитьПеременнуюСреды("NC_TEST_ADDRESS");
+ АдминИмя = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_NAME");
+ АдминПароль = ПолучитьПеременнуюСреды("NC_TEST_ADMIN_PWD");
+
+ Клиент = Новый РаботаСNextCloud(АдресСервиса, АдминИмя, АдминПароль);
+
+ ИмяКаталога = "testFolder1";
+
+ ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);
+
+ Клиент.СоздатьКаталог(ИмяКаталога);
+
+ ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" в сервисе ""%2"", для пользователя ""%3""",
+ ИмяКаталога,
+ АдресСервиса,
+ АдминИмя);
+
+ Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки);
+
+ Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога);
+
+ ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" в сервис ""%2"", для пользователя ""%3""",
+ ТестовыйФайл.ПолноеИмя,
+ АдресСервиса,
+ АдминИмя);
+
+ Утверждения.ПроверитьИстину(Клиент.Существует(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя)), ТекстОшибки);
+
+ Клиент.Удалить(ОбъединитьПути(ИмяКаталога, ТестовыйФайл.Имя));
+
+ Клиент.Удалить(ИмяКаталога);
+
+КонецПроцедуры // ТестДолжен_ОтправитьФайлВNextCloud()
+
+&Тест
+Процедура ТестДолжен_ПолучитьФайлИз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()
+
+&Тест
+Процедура ТестДолжен_ПодключитьСетевойДиск() Экспорт
+
+ Лог.Информация("Тест: Подключение сетевого диска 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""", БукваДиска);
+
+ Утверждения.ПроверитьЛожь(ФС.ФайлСуществует(ПутьДляПроверки), ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_ОтключитьСетевойДиск()
+
+&Тест
+Процедура ТестДолжен_УдалитьТестовыйКаталог() Экспорт
+
+ Лог.Информация("После тестов: Удаление тестового каталога");
+
+ УдалитьФайлы(КаталогВременныхДанных);
+
+ ТекстОшибки = СтрШаблон("Ошибка удаления каталога временных файлов ""%1""", КаталогВременныхДанных);
+
+ Утверждения.ПроверитьЛожь(ФС.ФайлСуществует(КаталогВременныхДанных), ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_УдалитьТестовыйКаталог()
+
+#КонецОбласти // Тесты
+
+#Область СлужебныеПроцедурыИФункции
+
+Процедура СоздатьСлучайныйФайл(ПутьКФайлу, РазмерФайла)
+
+ Если ФС.ФайлСуществует(ПутьКФайлу) Тогда
+ УдалитьФайлы(ПутьКФайлу);
+ КонецЕсли;
+
+ НачальноеЧисло = 1113;
+ ДлинаЧисла = 8;
+ ГраницаГСЧ = 4294836225;
+
+ ЧастейЗаписи = 100;
+ МаксПорцияЗаписи = 10485760;
+ ПорцияЗаписи = 1024;
+ Если Цел(РазмерФайла / ЧастейЗаписи) <= МаксПорцияЗаписи Тогда
+ ПорцияЗаписи = Цел(РазмерФайла / ЧастейЗаписи);
+ Иначе
+ ПорцияЗаписи = МаксПорцияЗаписи;
+ КонецЕсли;
+
+ ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
+
+ ЗаписьДанных = Новый ЗаписьДанных(ПутьКФайлу);
+
+ Записано = 0;
+
+ Пока Записано < РазмерФайла Цикл
+ Число = ГСЧ.СлучайноеЧисло(0, ГраницаГСЧ);
+
+ ЗаписьДанных.ЗаписатьЦелое64(Число);
+
+ Записано = Записано + ДлинаЧисла;
+ Если Записано % ПорцияЗаписи = 0 Тогда
+ ЗаписьДанных.СброситьБуферы();
+ КонецЕсли;
+ КонецЦикла;
+
+ ЗаписьДанных.Закрыть();
+
+КонецПроцедуры // СоздатьФайл()
+
+#КонецОбласти // СлужебныеПроцедурыИФункции
diff --git a/tests/sql-tests.os b/tests/sql-tests.os
index 265c078..2ce6a47 100644
--- a/tests/sql-tests.os
+++ b/tests/sql-tests.os
@@ -22,12 +22,11 @@
ПрефиксИмениБД = "cpdb_test_db_";
ФайлКопииБазы = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "cpdb_test_db.bak");
- ПодключениеКСУБД = Новый ПодключениеКСУБД(ИмяСервера, ИмяПользователя, ПарольПользователя);
+ ПодключениеКСУБД = Новый ПодключениеMSSQL(ИмяСервера, ИмяПользователя, ПарольПользователя);
РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД);
Лог = ПараметрыСистемы.Лог();
- Лог.УстановитьУровень(УровниЛога.Информация);
Для й = 1 По 3 Цикл
ИмяБазы = СтрШаблон("%1%2", ПрефиксИмениБД, й);
@@ -50,19 +49,23 @@
&Тест
Процедура ТестДолжен_ПолучитьВерсиюSQLServer() Экспорт
+ Лог.Информация("Тест: Получение версии MS SQL Server");
+
Результат = ПодключениеКСУБД.ПолучитьВерсиюСУБД();
Лог.Информация("Версия сервера СУБД: %1", Результат.Представление);
ТекстОшибки = СтрШаблон("Ошибка получения версии MS SQL Server");
- Утверждения.ПроверитьБольше(Найти(ВРег(Результат.Представление), "MICROSOFT"), 0, ТекстОшибки);
+ Утверждения.ПроверитьБольше(СтрНайти(ВРег(Результат.Представление), "MICROSOFT"), 0, ТекстОшибки);
КонецПроцедуры // ТестДолжен_ПолучитьВерсиюSQLServer()
&Тест
Процедура ТестДолжен_ПолучитьДоступностьФункционалаSQLServer() Экспорт
+ Лог.Информация("Тест: Получение доступного функционала MS SQL Server");
+
Результат = ПодключениеКСУБД.ДоступностьФункционалаСУБД("Компрессия");
ТекстОшибки = СтрШаблон("Ошибка получения доступности функционала MS SQL Server");
@@ -74,6 +77,8 @@
&Тест
Процедура ТестДолжен_ВыполнитьСценарийСУБДИзФайла() Экспорт
+ Лог.Информация("Тест: Выполнение сценария работы с MS SQL Server из файла");
+
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
ПутьКСкрипту = ОбъединитьПути(КаталогВременныхДанных, "test.sql");
Скрипт = Новый ТекстовыйДокумент();
@@ -93,6 +98,8 @@
&Тест
Процедура ТестДолжен_СоздатьБазуДанных() Экспорт
+ Лог.Информация("Тест: Создание базы данных на MS SQL Server");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -112,6 +119,8 @@
&Тест
Процедура ТестДолжен_ПроверитьОшибкуСозданияБазыДанных() Экспорт
+ Лог.Информация("Тест: Проверка возникновения ошибки создания базы данных на MS SQL Server");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -160,6 +169,8 @@
&Тест
Процедура ТестДолжен_УдалитьБазуДанных() Экспорт
+ Лог.Информация("Тест: Удаление базы данных на MS SQL Server");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -183,6 +194,8 @@
&Тест
Процедура ТестДолжен_ПроверитьОшибкуУдаленияБазыДанных() Экспорт
+ Лог.Информация("Тест: Проверка возникновения ошибки удаления базы данных на MS SQL Server");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ВозниклаОшибка = Неопределено;
@@ -202,6 +215,8 @@
&Тест
Процедура ТестДолжен_ПолучитьЛогическоеИмяФайлаВБазе() Экспорт
+ Лог.Информация("Тест: Получение логического имени файла базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -233,6 +248,8 @@
&Тест
Процедура ТестДолжен_ИзменитьЛогическиеИменаФайловВБазе() Экспорт
+ Лог.Информация("Тест: Изменение логического имени файла базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -271,6 +288,8 @@
&Тест
Процедура ТестДолжен_СоздатьРезервнуюКопиюБазы() Экспорт
+ Лог.Информация("Тест: Создание резервной копии базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -302,6 +321,8 @@
&Тест
Процедура ТестДолжен_ПолучитьОшибкуСозданияРезервнойКопииБазы() Экспорт
+ Лог.Информация("Тест: Проверка возникновения ошибки создания резервной копии базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 3);
ПутьКРезервнойКопии = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.bak", ИмяБД));
@@ -325,6 +346,8 @@
&Тест
Процедура ТестДолжен_ВосстановитьБазуИзРезервнойКопии() Экспорт
+ Лог.Информация("Тест: Восстановление базы данных из резервной копии");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -354,6 +377,8 @@
&Тест
Процедура ТестДолжен_ПолучитьОшибкуВосстановленияБазыИзРезервнойКопии() Экспорт
+ Лог.Информация("Тест: Проверка возникновения ошибки при восстановлении базы данных из резервной копии");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 2);
ПутьКРезервнойКопии = ОбъединитьПути(КаталогВременныхДанных, СтрШаблон("%1.bak", ИмяБД));
@@ -381,6 +406,8 @@
&Тест
Процедура ТестДолжен_ИзменитьВладельцаБазы() Экспорт
+ Лог.Информация("Тест: Изменение владельца базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ВладелецДо = ПодключениеКСУБД.Пользователь();
ВладелецПосле = "sa";
@@ -412,6 +439,8 @@
&Тест
Процедура ТестДолжен_ИзменитьМодельВосстановленияБазы() Экспорт
+ Лог.Информация("Тест: Изменение модели восстановления базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
МодельВосстановленияДо = "SIMPLE";
МодельВосстановленияПосле = "FULL";
@@ -443,6 +472,8 @@
&Тест
Процедура ТестДолжен_ПолучитьОшибкуИзмененияМоделиВосстановленияБазы() Экспорт
+ Лог.Информация("Тест: Проверка возникновения ошибки при изменении модели восстановления базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
МодельВосстановленияПосле = "WRONGMODEL";
@@ -473,6 +504,8 @@
&Тест
Процедура ТестДолжен_ВыполнитьКомпрессиюБазы() Экспорт
+ Лог.Информация("Тест: Компрессия таблиц базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -490,6 +523,8 @@
&Тест
Процедура ТестДолжен_СжатьБазу() Экспорт
+ Лог.Информация("Тест: Сжатие (shrink) базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
@@ -507,6 +542,8 @@
&Тест
Процедура ТестДолжен_СжатьФайлЖурналаТранзакций() Экспорт
+ Лог.Информация("Тест: Сжатие (shrink) журнала транзакций базы данных");
+
ИмяБД = СтрШаблон("%1%2", ПрефиксИмениБД, 1);
ФС.ОбеспечитьКаталог(КаталогВременныхДанных);
diff --git a/tests/ssh-tests.os b/tests/ssh-tests.os
new file mode 100644
index 0000000..542fc6f
--- /dev/null
+++ b/tests/ssh-tests.os
@@ -0,0 +1,227 @@
+#Использовать fs
+#Использовать "../src/core"
+#Использовать "../src/cmd"
+
+Перем ПутьКТестовомуФайлу; // - путь к файлу для тестов
+Перем КаталогВременныхДанных; // - путь к каталогу временных данных
+Перем Лог; // - логгер
+
+#Область ОбработчикиСобытий
+
+// Процедура выполняется после запуска теста
+//
+Процедура ПередЗапускомТеста() Экспорт
+
+ КаталогВременныхДанных = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "build", "tmpdata");
+ КаталогВременныхДанных = ФС.ПолныйПуть(КаталогВременныхДанных);
+
+ ПутьКТестовомуФайлу = ОбъединитьПути(КаталогВременныхДанных, "testFile1.tst");
+
+ Лог = ПараметрыСистемы.Лог();
+
+КонецПроцедуры // ПередЗапускомТеста()
+
+// Процедура выполняется после запуска теста
+//
+Процедура ПослеЗапускаТеста() Экспорт
+
+КонецПроцедуры // ПослеЗапускаТеста()
+
+#КонецОбласти // ОбработчикиСобытий
+
+#Область Тесты
+
+&Тест
+Процедура ТестДолжен_СоздатьФайл() Экспорт
+
+ Лог.Информация("Перед тестами: Создание тестового файла");
+
+ ФС.ОбеспечитьПустойКаталог(КаталогВременныхДанных);
+
+ РазмерФайла = 31457280;
+
+ СоздатьСлучайныйФайл(ПутьКТестовомуФайлу, РазмерФайла);
+
+ ТекстОшибки = СтрШаблон("Ошибка создания файла ""%1""", ПутьКТестовомуФайлу);
+
+ Утверждения.ПроверитьИстину(ФС.ФайлСуществует(ПутьКТестовомуФайлу), ТекстОшибки);
+
+КонецПроцедуры // ТестДолжен_СоздатьФайл()
+
+&Тест
+Процедура ТестДолжен_СоздатьПапкуНаSFTP() Экспорт
+
+ Лог.Информация("Тест: Создание каталога на SFTP-сервере");
+
+ АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS");
+ ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER");
+ ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD");
+
+ Клиент = Новый РаботаССерверомSSH(АдресСервера, ПользовательИмя, ПользовательПароль);
+
+ ИмяКаталога = "testFolder1";
+
+ Клиент.СоздатьКаталог(ИмяКаталога);
+
+ ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" на сервере ""%2"", для пользователя ""%3""",
+ ИмяКаталога,
+ АдресСервера,
+ ПользовательИмя);
+
+ Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки);
+
+ Клиент.УдалитьКаталог(ИмяКаталога);
+
+КонецПроцедуры // ТестДолжен_СоздатьПапкуНаSFTP()
+
+&Тест
+Процедура ТестДолжен_ОтправитьФайлНаSFTP() Экспорт
+
+ Лог.Информация("Тест: Отправка файла на SFTP-сервер");
+
+ АдресСервера = ПолучитьПеременнуюСреды("SFTP_TEST_ADDRESS");
+ ПользовательИмя = ПолучитьПеременнуюСреды("SFTP_TEST_USER");
+ ПользовательПароль = ПолучитьПеременнуюСреды("SFTP_TEST_PWD");
+
+ Клиент = Новый РаботаССерверомSSH(АдресСервера, ПользовательИмя, ПользовательПароль);
+
+ ИмяКаталога = "testFolder1";
+
+ ТестовыйФайл = Новый Файл(ПутьКТестовомуФайлу);
+
+ Клиент.СоздатьКаталог(ИмяКаталога);
+
+ ТекстОшибки = СтрШаблон("Ошибка создания каталога ""%1"" на сервере ""%2"", для пользователя ""%3""",
+ ИмяКаталога,
+ АдресСервера,
+ ПользовательИмя);
+
+ Утверждения.ПроверитьИстину(Клиент.Существует(ИмяКаталога), ТекстОшибки);
+
+ Клиент.ОтправитьФайл(ТестовыйФайл.ПолноеИмя, ИмяКаталога);
+
+ ТекстОшибки = СтрШаблон("Ошибка отправки файла ""%1"" на сервер ""%2"", для пользователя ""%3""",
+ ТестовыйФайл.ПолноеИмя,
+ АдресСервера,
+ ПользовательИмя);
+
+ ПутьКФайлу = СтрШаблон("%1/%2", ИмяКаталога, ТестовыйФайл.Имя);
+
+ Утверждения.ПроверитьИстину(Клиент.Существует(ПутьКФайлу), ТекстОшибки);
+
+ Клиент.УдалитьФайл(ПутьКФайлу);
+
+ Клиент.УдалитьКаталог(ИмяКаталога);
+
+КонецПроцедуры // ТестДолжен_ОтправитьФайлНаSFTP()
+
+&Тест
+Процедура ТестДолжен_ПолучитьФайлС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 Тогда
+ ЗаписьДанных.СброситьБуферы();
+ КонецЕсли;
+ КонецЦикла;
+
+ ЗаписьДанных.Закрыть();
+
+КонецПроцедуры // СоздатьФайл()
+
+#КонецОбласти // СлужебныеПроцедурыИФункции