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 Тогда + ЗаписьДанных.СброситьБуферы(); + КонецЕсли; + КонецЦикла; + + ЗаписьДанных.Закрыть(); + +КонецПроцедуры // СоздатьФайл() + +#КонецОбласти // СлужебныеПроцедурыИФункции