├── var └── log │ └── .gitkeep ├── settings ├── repo_connect_test.xml └── merge.xml ├── .gitignore ├── bat ├── close_config_BASE.bat ├── commands │ ├── close_config.yaml │ └── update_all.yaml └── update_all.bat ├── src ├── Модули │ ├── ПрообразованияТипов.os │ ├── РаботаСКомандами.os │ ├── Общий.os │ └── РаботаСФайлами.os ├── cli │ └── Классы │ │ ├── cli_ОписаниеПриложения.os │ │ └── cli_ЗапускПриложения.os ├── core │ └── Классы │ │ ├── Дуб_Соединитель.os │ │ ├── ФиксаторОшибок.os │ │ ├── ПервыйЗапуск.os │ │ ├── ПодставлятельМетодовВКоманды.os │ │ ├── Телеграм.os │ │ ├── УправлятельКластераАсинх.os │ │ ├── КонтрольРасписания.os │ │ ├── Завершатель.os │ │ ├── УправлятельКластера.os │ │ ├── УправлятельГит.os │ │ ├── УправлятельКонфигуратора.os │ │ ├── УправлятельХранилища.os │ │ ├── УправлятельSQL.os │ │ ├── Настройки.os │ │ ├── ОбработкаРезультатаSQL.os │ │ ├── Логирователь.os │ │ ├── Выполнитель.os │ │ ├── Запускатель.os │ │ └── ЗаполнительНастроек.os ├── commands │ └── Классы │ │ ├── КомандаПроверитьБлокировкуИБ.os │ │ ├── КомандаПоУмолчанию.os │ │ ├── КомандаПроверитьНаличиеАктивныхСеансовИБ.os │ │ ├── КомандаПоказатьНачало.os │ │ ├── КомандаУстановитьПаузу.os │ │ ├── КомандаВыполнитьКомандныйФайл.os │ │ ├── КомандаПоказатьЗавершение.os │ │ ├── КомандаВыполнитьРасширенныйСинтаксическийКонтроль.os │ │ ├── КомандаВыгрузитьКонфигурациюВФайл.os │ │ ├── КомандаВыполнитьСинтаксическийКонтроль.os │ │ ├── КомандаПолучитьВерсиюКонфигурацииИзХранилища.os │ │ ├── КомандаСнятьБлокировкуИБ.os │ │ ├── КомандаОбъединитьКонфигурациюСФайлом.os │ │ ├── КомандаОтключитьКонфигураторОтИнформационнойБазы.os │ │ ├── КомандаЗадатьВопрос.os │ │ ├── КомандаПоместитьИзмененияОбъектовВХранилище.os │ │ ├── КомандаВыполнитьСкриптSQL.os │ │ ├── КомандаВыполнитьЗапросSQL.os │ │ ├── КомандаЗапуститьВРежимеПредприятия.os │ │ ├── КомандаЗаблокироватьИБ.os │ │ ├── КомандаОтменитьЗахватОбъектовВХранилище.os │ │ ├── КомандаПоказатьПриветствие.os │ │ ├── КомандаЗагрузитьРасширениеИзФайла.os │ │ ├── КомандаЗагрузитьРасширениеВРежимеПредприятия.os │ │ ├── КомандаЗагрузитьКонфигурациюИзХранилища.os │ │ ├── КомандаЗахватитьОбъектыВХранилище.os │ │ ├── КомандаПодключитьсяКХранилищу.os │ │ ├── КомандаЗахватитьОбъектыВХранилищеПоСпискуИзФайла.os │ │ ├── КомандаЗапуститьВнешниеОбработкиИзРепозитория.os │ │ ├── КомандаОтключитьСеансыИнформационнойБазы.os │ │ └── КомандаОбновитьКонфигурациюБазыДанных.os ├── templates │ └── Классы │ │ ├── СкриптыSQL.os │ │ └── Emoji.os └── import │ └── Классы │ └── КомандныйФайлSR.os ├── .vscode ├── tasks.json └── launch.json ├── logos.cfg ├── sync_repo.os ├── autumn-properties_example.yml ├── .bsl-language-server.json ├── install.bat ├── config_example.yaml ├── Jenkinsfile └── README.md /var/log/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /settings/repo_connect_test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.cf 2 | *.log 3 | *.txt 4 | 5 | autumn-properties.yml 6 | metadata_merge.xml 7 | 8 | # example 9 | !settings/metadata_example.txt 10 | 11 | # config 12 | bat/config/*.yaml 13 | !bat/config/config_task.yaml 14 | -------------------------------------------------------------------------------- /bat/close_config_BASE.bat: -------------------------------------------------------------------------------- 1 | CHCP 65001 2 | @echo Off 3 | 4 | cd .. 5 | 6 | echo Работа с конфигуратором 7 | @set command=--Commands \bat\commands\close_config.yaml 8 | oscript "sync_repo.os" --ИдентификаторБазы "BASE1" %command% 9 | 10 | PAUSE -------------------------------------------------------------------------------- /src/Модули/ПрообразованияТипов.os: -------------------------------------------------------------------------------- 1 | Функция БулевоИзСтроки(Значение) Экспорт 2 | 3 | Если Значение <> Неопределено Тогда 4 | ЗначениеПреобразованное = Булево(Значение); 5 | Иначе 6 | ЗначениеПреобразованное = Ложь; 7 | КонецЕсли; 8 | 9 | Возврат ЗначениеПреобразованное; 10 | 11 | КонецФункции -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "bsl", 6 | "command": "oscript", 7 | "args": [ 8 | "${file}" 9 | ], 10 | "problemMatcher": [ 11 | "$OneScript Linter" 12 | ], 13 | "group": "build", 14 | "label": "oscript: OneScript: run" 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /logos.cfg: -------------------------------------------------------------------------------- 1 | logger.oscript.lib.stream=INFO, stream 2 | appender.stream=ВыводЛогаВФайл 3 | appender.stream.file=var\log\stream.log 4 | logger.oscript.lib.v8runner=INFO, v8runner 5 | appender.v8runner=ВыводЛогаВФайл 6 | appender.v8runner.file=var\log\v8runner.log 7 | logger.oscript.lib.gitrunner=INFO, gitrunner 8 | appender.gitrunner=ВыводЛогаВФайл 9 | appender.gitrunner.file=var\log\gitrunner.log -------------------------------------------------------------------------------- /sync_repo.os: -------------------------------------------------------------------------------- 1 | #Использовать autumn 2 | #Использовать autumn-cli 3 | #Использовать autumn-async 4 | 5 | #Использовать "src/core" 6 | #Использовать "src/commands" 7 | #Использовать "src/templates" 8 | #Использовать "src/cli" 9 | #Использовать "src/import" 10 | 11 | #Область Основной_блок 12 | 13 | Поделка = Новый Поделка(); 14 | Поделка.ЗапуститьПриложение(); 15 | 16 | #КонецОбласти 17 | -------------------------------------------------------------------------------- /src/cli/Классы/cli_ОписаниеПриложения.os: -------------------------------------------------------------------------------- 1 | Функция ИмяПриложения() Экспорт 2 | Возврат "sync_repo"; 3 | КонецФункции 4 | 5 | Функция ПолноеИмяПриложения() Экспорт 6 | Возврат "Автоматизация обновления конфигурации 1С"; 7 | КонецФункции 8 | 9 | Функция ВерсияПриложения() Экспорт 10 | Возврат "2.12.1"; 11 | КонецФункции 12 | 13 | &Желудь("ОписаниеКонсольногоПриложения") 14 | &Верховный 15 | Процедура ПриСозданииОбъекта() 16 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/Дуб_Соединитель.os: -------------------------------------------------------------------------------- 1 | &Завязь(Тип = "Массив") 2 | Функция КомандыПоКлючу(&Пластилин(Значение = "Команда", Тип = "Массив") Команды) Экспорт 3 | КомандыПоКлючу = Новый Соответствие(); 4 | Для Каждого Команда Из Команды Цикл 5 | КомандыПоКлючу.Вставить(ВРег(Команда.Ключ()), Команда); 6 | КонецЦикла; 7 | 8 | Возврат КомандыПоКлючу; 9 | КонецФункции 10 | 11 | &Дуб 12 | Процедура ПриСозданииОбъекта() 13 | 14 | КонецПроцедуры -------------------------------------------------------------------------------- /settings/merge.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ConfigurationsNotRelated 5 | true 6 | false 7 | 8 | -------------------------------------------------------------------------------- /src/Модули/РаботаСКомандами.os: -------------------------------------------------------------------------------- 1 | Функция ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, Желудь) Экспорт // BSLLS:Typo-off 2 | 3 | ДанныеРезультата = Новый Структура("Результат, ОписаниеОшибки, ПараметрыКоманды", 4 | Ложь, 5 | "", 6 | ПараметрыКоманды); 7 | 8 | Попытка 9 | ДанныеРезультата.Результат = Желудь.ВыполнитьКоманду(ПараметрыКоманды); 10 | Исключение 11 | ДанныеРезультата.ОписаниеОшибки = ОписаниеОшибки(); 12 | КонецПопытки; 13 | 14 | Возврат ДанныеРезультата; 15 | 16 | КонецФункции 17 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Отладка 1Script", 9 | "type": "oscript", 10 | "request": "launch", 11 | "program": "${file}", 12 | "args": [], 13 | "cwd": "${workspaceRoot}", 14 | "env": {}, 15 | "runtimeExecutable": null, 16 | "runtimeArgs": [], 17 | "debugPort": 2801 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПроверитьБлокировкуИБ.os: -------------------------------------------------------------------------------- 1 | // ПроверитьБлокировкуИБ 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем КомандаЗаблокироватьИБ; 6 | 7 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт 8 | ПараметрыКоманды.Вставить("Проверка", Истина); 9 | Возврат КомандаЗаблокироватьИБ.ВыполнитьКоманду(ПараметрыКоманды); 10 | КонецФункции 11 | 12 | &Асинх 13 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 14 | 15 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 16 | 17 | КонецФункции 18 | 19 | &Желудь 20 | &Прозвище("Команда") 21 | Процедура ПриСозданииОбъекта() 22 | 23 | КонецПроцедуры -------------------------------------------------------------------------------- /bat/commands/close_config.yaml: -------------------------------------------------------------------------------- 1 | Команды: &commands 2 | Команды: 3 | Параметры: 4 | ОтправлятьСообщенияВТелеграм: true 5 | Приветствие: "Закрываю конфигуратор #ИмяБазы через #Пауза" 6 | Окончание: "Конфигуратор базы #ИмяБазы закрыт" 7 | ТекстВопроса: "Закрыть конфигуратор базы #ИмяБазы?" 8 | Пауза: 300 9 | Команды: 10 | - ЗадатьВопрос 11 | - ПоказатьПриветствие 12 | - УстановитьПаузу 13 | - ОтключитьКонфигураторОтИнформационнойБазы 14 | - ПоказатьЗавершение 15 | BASE1: 16 | <<: *commands 17 | BASE2: 18 | <<: *commands 19 | -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПоУмолчанию.os: -------------------------------------------------------------------------------- 1 | // КомандаПоУмолчанию 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Логирователь; // BSLLS:Typo-off 6 | 7 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт 8 | 9 | ТекстСообщения = "Неизвестная команда - " + ПараметрыКоманды.Ключ; 10 | Логирователь.ВЛог(ТекстСообщения, Истина); 11 | Возврат Истина; 12 | 13 | КонецФункции 14 | 15 | &Асинх 16 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 17 | 18 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 19 | 20 | КонецФункции 21 | 22 | &Верховный 23 | &Желудь 24 | &Прозвище("Команда") 25 | Процедура ПриСозданииОбъекта() 26 | 27 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПроверитьНаличиеАктивныхСеансовИБ.os: -------------------------------------------------------------------------------- 1 | // ПроверитьНаличиеАктивныхСеансовИБ 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем КомандаОтключитьСеансыИнформационнойБазы; 6 | 7 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт 8 | ПараметрыКоманды.Вставить("Проверка", Истина); 9 | Возврат КомандаОтключитьСеансыИнформационнойБазы.ВыполнитьКоманду(ПараметрыКоманды); 10 | КонецФункции 11 | 12 | &Асинх 13 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 14 | 15 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 16 | 17 | КонецФункции 18 | 19 | &Желудь 20 | &Прозвище("Команда") 21 | Процедура ПриСозданииОбъекта() 22 | 23 | КонецПроцедуры -------------------------------------------------------------------------------- /autumn-properties_example.yml: -------------------------------------------------------------------------------- 1 | Общие: 2 | Ответственный: "Фамилия Имя" 3 | КаталогНастроек: settings 4 | ПутьККаталогуCF: "\\cf" 5 | ПутьККаталогуCFe: "\\cfe" 6 | Файлы: 7 | repo_test: repo_connect_test.xml 8 | merge: merge.xml 9 | metadata: metadata.txt 10 | metadata_merge: metadata_merge.xml 11 | Телеграм: 12 | BotID: "" 13 | Токен: "" 14 | Debug: 15 | ИдентификаторБазы: "REPO" 16 | ФайлНастроек: "tests\\config_debug.yaml" 17 | ФайлКоманд: "tests\\commands_debug.yaml" 18 | ИдентификаторКоманд: "Команды" 19 | # ФайлГрупповыхКоманд: "tests\\group_commands_debug.yaml" 20 | ИдентификаторГрупповыхКоманд: "Запуск" 21 | КаталогСкрипта: "sync_repo" -------------------------------------------------------------------------------- /src/core/Классы/ФиксаторОшибок.os: -------------------------------------------------------------------------------- 1 | #Использовать "..//../../src/Модули" 2 | 3 | Перем ПутьКФайлу; 4 | 5 | Процедура ЗафиксироватьОшибку(ТекстСообщения) Экспорт 6 | РаботаСФайлами.ДобавитьТекстВФайл(ТекстСообщения, ПутьКФайлу); 7 | КонецПроцедуры 8 | 9 | Процедура Инициализировать(Позиция) Экспорт 10 | ПутьКФайлуЛогов(Позиция); 11 | УдалитьФайлыЛогов(); 12 | КонецПроцедуры 13 | 14 | Процедура ПутьКФайлуЛогов(Позиция) 15 | 16 | ПутьКФайлу = ОбъединитьПути(ТекущийКаталог(), "var\errors\" + "error" + "_" + Строка(Позиция) + ".log"); 17 | 18 | КонецПроцедуры 19 | 20 | Процедура УдалитьФайлыЛогов() 21 | 22 | Если РаботаСФайлами.ФайлСуществует(ПутьКФайлу) Тогда 23 | УдалитьФайлы(ПутьКФайлу); 24 | КонецЕсли; 25 | 26 | КонецПроцедуры 27 | 28 | &Желудь 29 | Процедура ПриСозданииОбъекта() 30 | 31 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/ПервыйЗапуск.os: -------------------------------------------------------------------------------- 1 | #Использовать "..//../../src/Модули" 2 | // BSLLS:LatinAndCyrillicSymbolInWord-off 3 | 4 | Процедура Инициализация() Экспорт 5 | 6 | Инициализировать_Autumn_properties_example(); 7 | 8 | КонецПроцедуры 9 | 10 | Процедура Инициализировать_Autumn_properties_example() 11 | ИнициализироватьФайлОтБазового("autumn-properties.yml"); 12 | КонецПроцедуры 13 | 14 | Процедура ИнициализироватьФайлОтБазового(ИмяФайла) 15 | 16 | ПутьКФайлу = ОбъединитьПути(ТекущийКаталог(), ИмяФайла); 17 | 18 | Если РаботаСФайлами.ФайлСуществует(ПутьКФайлу) Тогда 19 | Возврат; 20 | КонецЕсли; 21 | 22 | БазовыйФайл = СтрЗаменить(ИмяФайла, ".y", "_example.y"); 23 | ПутьКБазовому = ОбъединитьПути(ТекущийКаталог(), БазовыйФайл); 24 | 25 | КопироватьФайл(ПутьКБазовому, ПутьКФайлу); 26 | 27 | КонецПроцедуры 28 | 29 | &Желудь 30 | Процедура ПриСозданииОбъекта() 31 | 32 | КонецПроцедуры -------------------------------------------------------------------------------- /.bsl-language-server.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://1c-syntax.github.io/bsl-language-server/configuration/schema.json", 3 | "language": "ru", 4 | "diagnostics": 5 | { 6 | "computeTrigger": "onType", 7 | "parameters": 8 | { 9 | "LineLength": 10 | { 11 | "maxLineLength": 120 12 | }, 13 | "NumberOfOptionalParams": 14 | { 15 | "maxOptionalParamsCount": 6 16 | }, 17 | "CommentedCode": 18 | { 19 | "threshold": 0.9, 20 | "exclusionPrefixes": "" 21 | }, 22 | "CognitiveComplexity": 23 | { 24 | "complexityThreshold": 20, 25 | "checkModuleBody": true 26 | }, 27 | "MissingVariablesDescription": false, 28 | "MethodSize": false, 29 | "MissingReturnedValueDescription": { 30 | "allowShortDescriptionReturnValues": true 31 | }, 32 | "MissingParameterDescription": false, 33 | "IfConditionComplexity": 34 | { 35 | "maxIfConditionComplexity": 5 36 | } 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /bat/update_all.bat: -------------------------------------------------------------------------------- 1 | @echo Off 2 | 3 | CHCP 65001 4 | set /p var=Запустить полное обновление?[Y/N]: 5 | if %var%== Y goto start 6 | if not %var%== Y exit 7 | 8 | :start 9 | 10 | cd .. 11 | 12 | 13 | CHCP 65001 14 | echo Обновление 15 | @set command_update=--Commands \bat\commands\update_all.yaml 16 | oscript "sync_repo.os" --ИдентификаторБазы "REPO" %command_update% --ИдентификаторКоманд "Уведомление" 17 | if ERRORLEVEL = 1 goto error 18 | oscript "sync_repo.os" --ИдентификаторБазы "REPO" %command_update% 19 | if ERRORLEVEL = 1 goto error 20 | oscript "sync_repo.os" --ИдентификаторБазы "BASE1" %command_update% 21 | if ERRORLEVEL = 1 goto error 22 | 23 | CHCP 866 24 | @set groupCommand=--GroupCommands \bat\commands\update_all.yaml 25 | oscript "sync_repo.os" %groupCommand% 26 | 27 | CHCP 65001 28 | goto end 29 | 30 | :error 31 | CHCP 65001 32 | echo ОШИБКА - Получен ненулевой код возврата %ERRORLEVEL%. Выполнение скрипта остановлено! 33 | 34 | :end 35 | PAUSE -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПоказатьНачало.os: -------------------------------------------------------------------------------- 1 | // ПоказатьНачало 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем Логирователь; // BSLLS:Typo-off 9 | 10 | &Пластилин 11 | Перем Emoji; 12 | 13 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 14 | 15 | Начало = ПараметрыКоманды.Параметры.Получить("Начало"); 16 | Если Начало = Неопределено Тогда 17 | Начало = Настройки.ПараметрыКоманд.Начало; 18 | КонецЕсли; 19 | 20 | Если Не ЗначениеЗаполнено(Начало) Тогда 21 | Логирователь.ВЛог("Не заполнен текст начала"); 22 | Возврат Ложь; 23 | КонецЕсли; 24 | 25 | Логирователь.ВЛог(Начало, , Истина, , Emoji.Начало()); 26 | Возврат Истина; 27 | 28 | КонецФункции 29 | 30 | &Асинх 31 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 32 | 33 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 34 | 35 | КонецФункции 36 | 37 | &Желудь 38 | &Прозвище("Команда") 39 | Процедура ПриСозданииОбъекта() 40 | 41 | КонецПроцедуры -------------------------------------------------------------------------------- /install.bat: -------------------------------------------------------------------------------- 1 | CHCP 65001 2 | @Echo Off 3 | 4 | @Set OneScript=c:\Program Files\OneScript\bin 5 | 6 | @If not Exist "%OneScript%\*.*" ( 7 | goto OneScript32 8 | ) Else ( 9 | goto opm_install 10 | ) 11 | 12 | :OneScript32 13 | @Set OneScript=c:\Program Files (x86)\OneScript\bin 14 | @If not Exist "%OneScript%\*.*" ( 15 | Echo Установи oscript - https://oscript.io/docs/page/install 16 | goto end 17 | ) 18 | 19 | :opm_install 20 | 21 | chdir /d %OneScript% 22 | 23 | start cmd /C opm update --all 24 | timeout 15 25 | 26 | start cmd /C opm install v8runner 27 | start cmd /C opm install cmdline 28 | start cmd /C opm install logos 29 | start cmd /C opm install v8rac 30 | start cmd /C opm install configor 31 | start cmd /C opm install messenger 32 | start cmd /C opm install 1commands 33 | start cmd /C opm install v8storage 34 | start cmd /C opm install gui 35 | start cmd /C opm install autumn 36 | start cmd /C opm install autumn-logos 37 | start cmd /C opm install autumn-cli 38 | start cmd /C opm install autumn-async 39 | start cmd /C opm install sql 40 | 41 | echo Пакеты установлены 42 | 43 | :end 44 | pause 45 | exit -------------------------------------------------------------------------------- /src/commands/Классы/КомандаУстановитьПаузу.os: -------------------------------------------------------------------------------- 1 | // УстановитьПаузу 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; // BSLLS:Typo-off 6 | 7 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 8 | 9 | СекундПаузы = ПараметрыКоманды.Параметры.Получить("Пауза"); 10 | Если СекундПаузы = Неопределено Тогда 11 | СекундПаузы = Настройки.ПаузаПередЗапуском; // переопределение настройки из окружения SYNC_REPO_PAUSE_PRED_BUILD 12 | КонецЕсли; 13 | Если СекундПаузы = 0 Тогда 14 | СекундПаузы = Настройки.ПараметрыКоманд.Пауза; 15 | КонецЕсли; 16 | 17 | 18 | Если ЗначениеЗаполнено(СекундПаузы) Тогда 19 | 20 | Миллисекунда = 1000; 21 | Приостановить(СекундПаузы * Миллисекунда); 22 | 23 | КонецЕсли; 24 | 25 | Возврат Истина; 26 | 27 | КонецФункции 28 | 29 | &Асинх 30 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 31 | 32 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 33 | 34 | КонецФункции 35 | 36 | &Желудь 37 | &Прозвище("Команда") 38 | Процедура ПриСозданииОбъекта() 39 | 40 | КонецПроцедуры -------------------------------------------------------------------------------- /src/templates/Классы/СкриптыSQL.os: -------------------------------------------------------------------------------- 1 | 2 | Функция Получить(Имя, Параметр1 = Неопределено) Экспорт 3 | 4 | Если Имя = "ЗапуститьЗадание" Тогда 5 | Возврат ЗапуститьЗадание(Параметр1); 6 | ИначеЕсли Имя = "АктивностьЗадания" Тогда 7 | Возврат АктивностьЗадания(Параметр1); 8 | ИначеЕсли Имя = "WhoIsActive" Тогда 9 | Возврат WhoIsActive(Параметр1); 10 | Иначе 11 | Возврат Неопределено; 12 | КонецЕсли; 13 | 14 | КонецФункции 15 | 16 | Функция ЗапуститьЗадание(ИмяЗадания) Экспорт 17 | 18 | Возврат "USE msdb 19 | |EXEC sp_start_job N'" + ИмяЗадания + "'"; 20 | 21 | КонецФункции 22 | 23 | Функция АктивностьЗадания(ИмяЗадания) Экспорт 24 | 25 | Возврат "USE msdb 26 | |EXEC sp_help_job 27 | |@job_name = N'" + ИмяЗадания + "', 28 | |@job_aspect = N'JOB', 29 | |@execution_status = 1"; 30 | 31 | КонецФункции 32 | 33 | Функция WhoIsActive(ИмяБД) Экспорт 34 | 35 | Возврат "exec sp_WhoIsActive 36 | |@filter_type = 'database', 37 | |@filter = '" + ИмяБД + "', 38 | |@output_column_list = '[sql_text][start_time][reads][writes]'"; 39 | 40 | КонецФункции 41 | 42 | &Желудь 43 | Процедура ПриСозданииОбъекта() 44 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/ПодставлятельМетодовВКоманды.os: -------------------------------------------------------------------------------- 1 | #Использовать autumn 2 | #Использовать decorator 3 | 4 | Функция ОбработатьЖелудь(Желудь, ОпределениеЖелудя) Экспорт 5 | 6 | Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода(); 7 | 8 | Аннотация = РаботаСАннотациями.ПолучитьАннотацию(Конструктор, "Прозвище"); 9 | Если Аннотация = Неопределено Тогда 10 | Возврат Желудь; 11 | КонецЕсли; 12 | 13 | Прозвище = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация); 14 | 15 | Если Прозвище <> "Команда" Тогда 16 | Возврат Желудь; 17 | КонецЕсли; 18 | 19 | Метод_Ключ = Метод_Ключ(ОпределениеЖелудя); 20 | 21 | НовыйЖелудь = Новый ПостроительДекоратора(Желудь) 22 | .Метод(Метод_Ключ) 23 | .Построить(); 24 | 25 | Возврат НовыйЖелудь; 26 | 27 | КонецФункции 28 | 29 | Функция Метод_Ключ(ОпределениеЖелудя) 30 | 31 | КлючКоманды = СтрЗаменить(ОпределениеЖелудя.Имя(), "Команда", ""); 32 | 33 | Метод = Новый Метод("Ключ") 34 | .Публичный() 35 | .ТелоМетода("Возврат """ + КлючКоманды + """;"); 36 | 37 | Возврат Метод; 38 | 39 | КонецФункции 40 | 41 | &Напильник 42 | Процедура ПриСозданииОбъекта() 43 | 44 | КонецПроцедуры -------------------------------------------------------------------------------- /config_example.yaml: -------------------------------------------------------------------------------- 1 | Общие: 2 | Идентификатор: "Проект" 3 | Ответственный: "Фамилия Имя" 4 | КаталогНастроек: settings 5 | ПутьККаталогуCF: "\\cf" 6 | Файлы: 7 | repo_test: repo_connect_test.xml 8 | merge: merge.xml 9 | metadata: metadata.txt 10 | metadata_merge: metadata_merge.xml 11 | Телеграм: 12 | BotID: "" 13 | Токен: "" 14 | Debug: 15 | ИдентификаторБазы: "" 16 | ИдентификаторКоманд: "" 17 | КаталогСкрипта: "sync_repo" 18 | Платформа: 19 | 1cv8: "C:\\Program Files\\1Cv8\\8.3.20.1838\\bin\\1cv8.exe" 20 | Версия: "8.3.20.1838" 21 | RAS: 22 | Сервер: "" 23 | Порт: "" 24 | Обновление: 25 | Сообщение: "Идет обновление" 26 | КодДоступа: "321" 27 | REPO: 28 | Сервер: "" 29 | Порт: "" 30 | ИмяБазы: "" 31 | Конфигуратор: 32 | Логин: "" 33 | Пароль: "" 34 | Хранилище: 35 | Путь: "" 36 | Логин: "" 37 | Пароль: "" 38 | BASE1: 39 | Сервер: "" 40 | Порт: "" 41 | ИмяБазы: "" 42 | Конфигуратор: 43 | Логин: "" 44 | Пароль: "" 45 | Хранилище: 46 | Путь: "" 47 | Логин: "" 48 | Пароль: "" -------------------------------------------------------------------------------- /src/core/Классы/Телеграм.os: -------------------------------------------------------------------------------- 1 | #Использовать messenger 2 | 3 | Перем Телеграм; 4 | 5 | &Пластилин 6 | Перем Настройки; 7 | 8 | &Пластилин 9 | Перем Emoji; 10 | 11 | Перем ПозицияСообщения; 12 | 13 | Процедура ВЛог(Знач ТекстСообщения, Ошибка = Ложь, Эмодзи = "") Экспорт 14 | 15 | Если Не Настройки.ПараметрыТелеграм.ОтправлятьСообщения Тогда 16 | Возврат; 17 | КонецЕсли; 18 | 19 | Если Ошибка Тогда 20 | Emoji.ДобавитьВНачалоСтроки(ТекстСообщения, Emoji.Ошибка()); 21 | Иначе 22 | Если ЗначениеЗаполнено(Эмодзи) Тогда 23 | Emoji.ДобавитьВНачалоСтроки(ТекстСообщения, Эмодзи); 24 | Иначе 25 | ПозицияСообщения = ПозицияСообщения + 1; 26 | Emoji.ДобавитьВНачалоСтроки(ТекстСообщения, Emoji.Цифра(ПозицияСообщения)); 27 | КонецЕсли; 28 | КонецЕсли; 29 | 30 | ТипСообщения = "html"; 31 | Телеграм.ОтправитьСообщение("telegram", 32 | Настройки.ПараметрыТелеграм.BotID, 33 | ТекстСообщения, , ТипСообщения); 34 | 35 | КонецПроцедуры 36 | 37 | Процедура УстановитьТокен(Токен) Экспорт 38 | Телеграм.ИнициализироватьТранспорт("telegram", Новый Структура("Логин", Токен)); 39 | КонецПроцедуры 40 | 41 | &Желудь 42 | Процедура ПриСозданииОбъекта() 43 | 44 | Телеграм = Новый Мессенджер(); 45 | ПозицияСообщения = 0; 46 | 47 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/УправлятельКластераАсинх.os: -------------------------------------------------------------------------------- 1 | Перем ПаузаМеждуВызовами; 2 | Перем КоличествоОперацийЗаВызов; 3 | 4 | &Пластилин 5 | Перем Логирователь; // BSLLS:Typo-off 6 | 7 | &Асинх 8 | Функция ОтключитьСеансыИнформационнойБазы(Кластер, Сеансы) Экспорт 9 | 10 | Для каждого Сеанс Из Сеансы Цикл 11 | 12 | Логирователь.Отладка("Отключаю сеанс %3 - <%1>, <%2>", Сеанс.Пользователь, Сеанс.Приложение, Сеанс.НомерСеанса); 13 | 14 | Идентификатор = Сеанс.Идентификатор; 15 | идКластера = Сеанс.Кластер; 16 | 17 | Попытка 18 | Кластер.ОтключитьСеанс(Идентификатор, идКластера); 19 | Исключение 20 | ОписаниеОшибки = ОписаниеОшибки(); 21 | Если СтрНайти(ОписаниеОшибки, "Сеанс с указанным идентификатором не найден") = 0 Тогда 22 | Логирователь.ВЛог(ОписаниеОшибки, Истина); 23 | Возврат Ложь; 24 | КонецЕсли; 25 | КонецПопытки; 26 | 27 | КонецЦикла; 28 | 29 | Возврат Истина; 30 | 31 | КонецФункции 32 | 33 | Функция ПаузаМеждуВызовами() Экспорт 34 | Возврат ПаузаМеждуВызовами; 35 | КонецФункции 36 | 37 | Функция КоличествоОперацийЗаВызов() Экспорт 38 | Возврат КоличествоОперацийЗаВызов; 39 | КонецФункции 40 | 41 | &Желудь 42 | Процедура ПриСозданииОбъекта() 43 | ПаузаМеждуВызовами = 1000; 44 | КоличествоОперацийЗаВызов = 10; 45 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/КонтрольРасписания.os: -------------------------------------------------------------------------------- 1 | Перем Настройки; 2 | 3 | // Проверяем попадание текущего времени в расписание 4 | // Расписание - Структура 5 | // ДеньНедели - Число 6 | // Время - Массив 7 | // Элемент - Структура 8 | // С - Час 9 | // По - Час 10 | 11 | Функция РазрешеноПоРасписанию() Экспорт 12 | 13 | Расписание = Настройки.Расписание; 14 | Если Расписание.Количество() = 0 Тогда 15 | Возврат Истина; 16 | КонецЕсли; 17 | 18 | Разрешен = Ложь; 19 | 20 | ТекущаяДата = ТекущаяДата(); 21 | 22 | ДеньНеделиТекущий = ДеньНедели(ТекущаяДата); 23 | ЧасТекущий = Час(ТекущаяДата); 24 | 25 | Для каждого ДанныеРасписания Из Расписание Цикл 26 | 27 | ДеньНедели = ДанныеРасписания.ДеньНедели; 28 | Если ДеньНедели <> 0 И ДеньНедели <> ДеньНеделиТекущий Тогда 29 | Продолжить; 30 | КонецЕсли; 31 | 32 | Для каждого Время Из ДанныеРасписания.Время Цикл 33 | 34 | ВремяС = Время.С; 35 | ВремяПо = Время.По; 36 | 37 | Если ВремяС <= ЧасТекущий И ВремяПо >= ЧасТекущий Тогда 38 | Разрешен = Истина; 39 | Возврат Разрешен; 40 | КонецЕсли; 41 | 42 | КонецЦикла; 43 | 44 | КонецЦикла; 45 | 46 | Возврат Разрешен; 47 | 48 | КонецФункции 49 | 50 | &Желудь 51 | Процедура ПриСозданииОбъекта(&Пластилин("Настройки") _Настройки) 52 | Настройки = _Настройки; 53 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаВыполнитьКомандныйФайл.os: -------------------------------------------------------------------------------- 1 | // ВыполнитьКомандныйФайл 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Выполнитель; // BSLLS:Typo-off 6 | 7 | &Пластилин 8 | Перем Логирователь; // BSLLS:Typo-off 9 | 10 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 11 | 12 | Параметры = ПараметрыКоманды.Параметры; 13 | 14 | Имя = Параметры.Получить("Имя"); 15 | СтрокаКоманды = Параметры.Получить("СтрокаКоманды"); 16 | 17 | Если Не ЗначениеЗаполнено(СтрокаКоманды) Тогда 18 | Логирователь.ВЛог("Не указан обязательный параметр ""СтрокаКоманды"" для команды ""ВыполнитьКомандныйФайл""", Истина); 19 | Возврат Ложь; 20 | КонецЕсли; 21 | 22 | Если Не ЗначениеЗаполнено(Имя) Тогда 23 | Имя = СтрокаКоманды; 24 | КонецЕсли; 25 | 26 | Позиция = 101; // чтобы не пересекались с фоновыми 27 | 28 | СтруктураВозврата = Выполнитель.ВыполнитьКомандныйФайл(СтрокаКоманды, Позиция, Ложь, Имя); 29 | Если СтруктураВозврата.КодВозврата <> 0 Тогда 30 | Возврат Ложь; 31 | Иначе 32 | Возврат Истина; 33 | КонецЕсли; 34 | 35 | КонецФункции 36 | 37 | &Асинх 38 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 39 | 40 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 41 | 42 | КонецФункции 43 | 44 | &Желудь 45 | &Прозвище("Команда") 46 | Процедура ПриСозданииОбъекта() 47 | 48 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПоказатьЗавершение.os: -------------------------------------------------------------------------------- 1 | // ПоказатьЗавершение 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем Логирователь; // BSLLS:Typo-off 9 | 10 | &Пластилин 11 | Перем УправлятельКонфигуратора; // BSLLS:Typo-off 12 | 13 | &Пластилин 14 | Перем Emoji; 15 | 16 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 17 | 18 | Окончание = ПараметрыКоманды.Параметры.Получить("Окончание"); 19 | Если Окончание = Неопределено Тогда 20 | Окончание = Настройки.ПараметрыКоманд.Окончание; 21 | КонецЕсли; 22 | 23 | Если НЕ ЗначениеЗаполнено(Окончание) Тогда 24 | Логирователь.ВЛог("Не заполнен текст окончания"); 25 | Возврат Ложь; 26 | КонецЕсли; 27 | 28 | ВремяОбновленияБазы = УправлятельКонфигуратора.ВремяОбновленияБазы(); 29 | Если ЗначениеЗаполнено(ВремяОбновленияБазы) Тогда 30 | Окончание = Окончание + " Время обновления: " + Формат(ВремяОбновленияБазы, "ЧДЦ=2") + " мин."; 31 | КонецЕсли; 32 | 33 | Логирователь.ВЛог(Окончание, , Истина, , Emoji.Конец()); 34 | 35 | Возврат Истина; 36 | 37 | КонецФункции 38 | 39 | &Асинх 40 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 41 | 42 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 43 | 44 | КонецФункции 45 | 46 | &Желудь 47 | &Прозвище("Команда") 48 | Процедура ПриСозданииОбъекта() 49 | 50 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/Завершатель.os: -------------------------------------------------------------------------------- 1 | #Использовать "..//../../src/Модули" 2 | 3 | &Пластилин 4 | Перем Настройки; 5 | 6 | &Пластилин 7 | Перем Логирователь; // BSLLS:Typo-off 8 | 9 | Процедура Завершить(КодВозврата = 0) Экспорт 10 | Деструктор(); 11 | ЗавершитьРаботу(КодВозврата); 12 | КонецПроцедуры 13 | 14 | Процедура ЗавершитьПоОшибке(ОписаниеОшибки = "", ВТелеграм = Ложь) Экспорт 15 | Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда 16 | Логирователь.ВЛог(ОписаниеОшибки, Истина, ВТелеграм); 17 | КонецЕсли; 18 | Завершить(1); 19 | КонецПроцедуры 20 | 21 | Процедура Деструктор() 22 | 23 | УдалитьФайлБлокировкиЗапуска(); 24 | УдалитьВременныеФайлы(); 25 | 26 | ВыполнитьСборкуМусора(); 27 | 28 | КонецПроцедуры 29 | 30 | Процедура УдалитьВременныеФайлы() 31 | 32 | Каталог = ТекущийКаталог(); 33 | 34 | Если Настройки.ПозицияВГрупповой = 0 Тогда 35 | 36 | Попытка 37 | УдалитьФайлы(Каталог, "*.txt"); 38 | Исключение 39 | Логирователь.ВЛог("Не удалось удалить временные файлы", Ложь, Ложь); 40 | КонецПопытки; 41 | КонецЕсли; 42 | 43 | КонецПроцедуры 44 | 45 | Процедура УдалитьФайлБлокировкиЗапуска() 46 | 47 | ПутьКФайлуБлокировки = Настройки.ПутьКФайлуБлокировкиЗапуска; 48 | Если ЗначениеЗаполнено(ПутьКФайлуБлокировки) Тогда 49 | РаботаСФайлами.УдалитьФайл(ПутьКФайлуБлокировки); 50 | КонецЕсли; 51 | 52 | КонецПроцедуры 53 | 54 | &Желудь 55 | Процедура ПриСозданииОбъекта() 56 | 57 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаВыполнитьРасширенныйСинтаксическийКонтроль.os: -------------------------------------------------------------------------------- 1 | // ВыполнитьРасширенныйСинтаксическийКонтроль 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем УправлятельКонфигуратора; 6 | &Пластилин 7 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 8 | 9 | &Пластилин 10 | Перем Логирователь; // BSLLS:Typo-off 11 | 12 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 13 | 14 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 15 | Возврат Ложь; 16 | КонецЕсли; 17 | 18 | Конфигуратор = УправлятельКонфигуратора.Получить(); 19 | Логирователь.ВЛог("Запускаю расширенный синтаксический контроль", , Ложь); 20 | 21 | Проверки = Новый Массив(); 22 | Проверки.Добавить("ТонкийКлиент"); 23 | Проверки.Добавить("Сервер"); 24 | Проверки.Добавить("РасширеннаяПроверка"); 25 | 26 | Попытка 27 | Конфигуратор.ПроверкаКонфигурации(Проверки); 28 | Исключение 29 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 30 | Возврат Ложь; 31 | КонецПопытки; 32 | 33 | Логирователь.ВЛог("Расширенный синтаксический контроль выполнен"); 34 | 35 | Возврат Истина; 36 | 37 | КонецФункции 38 | 39 | &Асинх 40 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 41 | 42 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 43 | 44 | КонецФункции 45 | 46 | &Желудь 47 | &Прозвище("Команда") 48 | Процедура ПриСозданииОбъекта() 49 | 50 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаВыгрузитьКонфигурациюВФайл.os: -------------------------------------------------------------------------------- 1 | // ВыгрузитьКонфигурациюВФайл 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельКонфигуратора; 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | &Пластилин 12 | 13 | &Пластилин 14 | Перем Логирователь; // BSLLS:Typo-off 15 | 16 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 17 | 18 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 19 | Возврат Ложь; 20 | КонецЕсли; 21 | 22 | Конфигуратор = УправлятельКонфигуратора.Получить(); 23 | 24 | Логирователь.ВЛог("Выгружаю конфигурацию в файл"); 25 | 26 | ФайлыНастроек = Настройки.ФайлыНастроек; 27 | 28 | ФайлКонечный = ФайлыНастроек.ПутьККаталогуCF 29 | + "\" 30 | + РаботаСФайлами.СформироватьИмяФайла(Настройки.Идентификатор, "cf"); 31 | 32 | Попытка 33 | Конфигуратор.ВыгрузитьКонфигурациюВФайл(ФайлКонечный); 34 | Исключение 35 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 36 | Возврат Ложь; 37 | КонецПопытки; 38 | 39 | Логирователь.ВЛог("Конфигурация в файл выгружена"); 40 | 41 | Возврат Истина; 42 | 43 | КонецФункции 44 | 45 | &Асинх 46 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 47 | 48 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 49 | 50 | КонецФункции 51 | 52 | &Желудь 53 | &Прозвище("Команда") 54 | Процедура ПриСозданииОбъекта() 55 | 56 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаВыполнитьСинтаксическийКонтроль.os: -------------------------------------------------------------------------------- 1 | // ВыполнитьСинтаксическийКонтроль 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем УправлятельКонфигуратора; 6 | &Пластилин 7 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 8 | 9 | &Пластилин 10 | Перем Логирователь; // BSLLS:Typo-off 11 | 12 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 13 | 14 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 15 | Возврат Ложь; 16 | КонецЕсли; 17 | 18 | Конфигуратор = УправлятельКонфигуратора.Получить(); 19 | 20 | Логирователь.ВЛог("Запускаю синтаксической контроль", , Ложь); 21 | 22 | ТонкийКлиент = Истина; 23 | ВебКлиент = Ложь; 24 | Сервер = Истина; 25 | ВнешнееСоединение = Ложь; 26 | ТолстыйКлиентОбычноеПриложение = Ложь; 27 | 28 | Попытка 29 | Конфигуратор.ВыполнитьСинтаксическийКонтроль(ТонкийКлиент, 30 | ВебКлиент, 31 | Сервер, 32 | ВнешнееСоединение, 33 | ТолстыйКлиентОбычноеПриложение); 34 | Исключение 35 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 36 | Возврат Ложь; 37 | КонецПопытки; 38 | 39 | Логирователь.ВЛог("Синтаксической контроль выполнен"); 40 | 41 | Возврат Истина; 42 | 43 | КонецФункции 44 | 45 | &Асинх 46 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 47 | 48 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 49 | 50 | КонецФункции 51 | 52 | &Желудь 53 | &Прозвище("Команда") 54 | Процедура ПриСозданииОбъекта() 55 | 56 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/УправлятельКластера.os: -------------------------------------------------------------------------------- 1 | #Использовать v8rac 2 | 3 | Перем Кластер; 4 | Перем ЗакрытКонфигуратор; 5 | 6 | &Пластилин 7 | Перем Настройки; 8 | 9 | &Пластилин 10 | Перем Логирователь; // BSLLS:Typo-off 11 | 12 | Функция Получить() Экспорт 13 | Если Кластер = Неопределено Тогда 14 | ИнициализироватьКластер(); 15 | КонецЕсли; 16 | Возврат Кластер; 17 | КонецФункции 18 | 19 | Процедура ЗакрытКонфигуратор_Установить() Экспорт 20 | ЗакрытКонфигуратор = Истина; 21 | КонецПроцедуры 22 | 23 | Функция ЗакрытКонфигуратор_Получить() Экспорт 24 | Возврат ЗакрытКонфигуратор; 25 | КонецФункции 26 | 27 | Процедура ИнициализироватьКластер() 28 | 29 | Логирователь.ВЛог("Подключение к кластеру"); 30 | 31 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 32 | 33 | Кластер = Новый УправлениеКластером; 34 | Кластер.УстановитьКластер(ПараметрыПодключения.СерверRAS + ":" + ПараметрыПодключения.ПортRAS); 35 | Кластер.ИспользоватьВерсию(ПараметрыПодключения.ВерсияПлатформы); 36 | 37 | Попытка 38 | Кластер.Подключить(); 39 | Исключение 40 | Кластер = Неопределено; 41 | ВызватьИсключение ОписаниеОшибки(); 42 | КонецПопытки; 43 | 44 | Кластер.УстановитьАвторизациюИнформационнойБазы(ПараметрыПодключения.ИмяБазы, 45 | ПараметрыПодключения.ЛогинККонфигуратору, 46 | ПараметрыПодключения.ПарольККонфигуратору); 47 | 48 | Логирователь.ВЛог("Подключение к кластеру выполнено"); 49 | 50 | КонецПроцедуры 51 | 52 | &Желудь 53 | Процедура ПриСозданииОбъекта() 54 | 55 | ЗакрытКонфигуратор = Ложь; 56 | 57 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПолучитьВерсиюКонфигурацииИзХранилища.os: -------------------------------------------------------------------------------- 1 | // ПолучитьВерсиюКонфигурацииИзХранилища 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельХранилища; // BSLLS:Typo-off 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | 12 | &Пластилин 13 | Перем Логирователь; // BSLLS:Typo-off 14 | 15 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 16 | 17 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 18 | Возврат Ложь; 19 | КонецЕсли; 20 | 21 | Хранилище = УправлятельХранилища.Получить(); 22 | 23 | Логирователь.ВЛог("Получение версии конфигурации из хранилища"); 24 | 25 | ФайлыНастроек = Настройки.ФайлыНастроек; 26 | 27 | ПутьКФайлу = ФайлыНастроек.ПутьККаталогуCF 28 | + "\" 29 | + РаботаСФайлами.СформироватьИмяФайла(Настройки.Идентификатор, "cf"); 30 | 31 | Попытка 32 | Хранилище.ПоследняяВерсияКонфигурацииВФайл(ПутьКФайлу); 33 | Исключение 34 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 35 | Возврат Ложь; 36 | КонецПопытки; 37 | 38 | Логирователь.ВЛог("Версия конфигурации из хранилища сохранена"); 39 | 40 | Возврат Истина; 41 | 42 | КонецФункции 43 | 44 | &Асинх 45 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 46 | 47 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 48 | 49 | КонецФункции 50 | 51 | &Желудь 52 | &Прозвище("Команда") 53 | Процедура ПриСозданииОбъекта() 54 | 55 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаСнятьБлокировкуИБ.os: -------------------------------------------------------------------------------- 1 | // СнятьБлокировкуИБ 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем УправлятельКластера; // BSLLS:Typo-off 6 | 7 | &Пластилин 8 | Перем Настройки; 9 | 10 | &Пластилин 11 | Перем Логирователь; // BSLLS:Typo-off 12 | 13 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 14 | 15 | Если НЕ ТребуетВыполнения() Тогда 16 | Возврат Истина; 17 | КонецЕсли; 18 | 19 | Кластер = УправлятельКластера.Получить(); 20 | 21 | Логирователь.ВЛог("Снятие блокировки информационной базы"); 22 | 23 | ПараметрыКоманд = Настройки.ПараметрыКоманд; 24 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 25 | 26 | ОставитьБлокировкуРеглЗаданий = НЕ Общий.ПризнакВключенияПараметра("СниматьБлокировкуРегламентныхЗаданий", 27 | ПараметрыКоманд); 28 | Попытка 29 | Кластер.СнятьБлокировкуИнформационнойБазы(ПараметрыПодключения.ИмяБазы, ОставитьБлокировкуРеглЗаданий); 30 | Исключение 31 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 32 | Возврат Ложь; 33 | КонецПопытки; 34 | 35 | Логирователь.ВЛог("Блокировка информационной базы снята"); 36 | 37 | Возврат Истина; 38 | 39 | КонецФункции 40 | 41 | &Асинх 42 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 43 | 44 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 45 | 46 | КонецФункции 47 | 48 | Функция ТребуетВыполнения() 49 | 50 | Если Настройки.ИспользоватьДинамическоеОбновление 51 | ИЛИ Настройки.ОставитьБлокировкуИБ Тогда 52 | Возврат Ложь; 53 | КонецЕсли; 54 | 55 | Возврат Истина; 56 | 57 | КонецФункции 58 | 59 | &Желудь 60 | &Прозвище("Команда") 61 | Процедура ПриСозданииОбъекта() 62 | 63 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/УправлятельГит.os: -------------------------------------------------------------------------------- 1 | #Использовать "..//../../src/Модули" 2 | #Использовать gitrunner 3 | 4 | &Пластилин 5 | Перем Логирователь; // BSLLS:Typo-off 6 | 7 | Функция КлонироватьИлиПолучитьИзмененияРепозитория(РабочийКаталог, ИмяРепозитория, АдресУдаленногоРепозитория) Экспорт 8 | 9 | Результат = Ложь; 10 | 11 | ПолныйПуть = ОбъединитьПути(РабочийКаталог, ИмяРепозитория); 12 | 13 | Если Не РаботаСФайлами.ФайлСуществует(ПолныйПуть) Тогда 14 | СоздатьКаталог(ПолныйПуть); 15 | КонецЕсли; 16 | 17 | ГитРепозиторий = Новый ГитРепозиторий(); 18 | ГитРепозиторий.УстановитьРабочийКаталог(ПолныйПуть); 19 | Если НайтиФайлы(ПолныйПуть, "*").Количество() > 0 Тогда 20 | Логирователь.ВЛог("Получаю изменения с удаленного репозитория " + ИмяРепозитория, , Ложь); 21 | Попытка 22 | ГитРепозиторий.Получить(); 23 | Исключение 24 | Логирователь.ВЛог(ОписаниеОшибки(), Истина); 25 | Результат = Ложь; 26 | КонецПопытки; 27 | Иначе 28 | Логирователь.ВЛог("Клонирую удаленный репозиторий " + ИмяРепозитория, , Ложь); 29 | Результат = КлонироватьРепозиторий(РабочийКаталог, ИмяРепозитория, АдресУдаленногоРепозитория); 30 | КонецЕсли; 31 | 32 | Возврат Результат; 33 | 34 | КонецФункции 35 | 36 | Функция КлонироватьРепозиторий(РабочийКаталог, ИмяРепозитория, АдресУдаленногоРепозитория) Экспорт 37 | 38 | ГитРепозиторий = Новый ГитРепозиторий(); 39 | ГитРепозиторий.УстановитьРабочийКаталог(РабочийКаталог); 40 | Попытка 41 | ГитРепозиторий.КлонироватьРепозиторий(АдресУдаленногоРепозитория, ИмяРепозитория); 42 | Исключение 43 | Логирователь.ВЛог(ОписаниеОшибки(), Истина); 44 | Возврат Ложь; 45 | КонецПопытки; 46 | 47 | Возврат Истина; 48 | 49 | КонецФункции 50 | 51 | &Желудь 52 | Процедура ПриСозданииОбъекта() 53 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаОбъединитьКонфигурациюСФайлом.os: -------------------------------------------------------------------------------- 1 | // ОбъединитьКонфигурациюСФайлом 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельКонфигуратора; 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | 12 | &Пластилин 13 | Перем Логирователь; // BSLLS:Typo-off 14 | 15 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 16 | 17 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 18 | Возврат Ложь; 19 | КонецЕсли; 20 | 21 | Конфигуратор = УправлятельКонфигуратора.Получить(); 22 | 23 | Логирователь.ВЛог("Начинаю объединение конфигурации с файлом"); 24 | 25 | ФайлыНастроек = Настройки.ФайлыНастроек; 26 | 27 | ФайлКонфигурации = ФайлыНастроек.ПутьККаталогуCF 28 | + "\" 29 | + РаботаСФайлами.СформироватьИмяФайла(Настройки.Идентификатор, "cf"); 30 | 31 | Если НЕ РаботаСФайлами.ФайлСуществует(ФайлКонфигурации) Тогда 32 | Логирователь.ВЛог("Не найден CF файл - " + ФайлКонфигурации, Истина); 33 | Возврат Ложь; 34 | КонецЕсли; 35 | 36 | ФайлMerge = Настройки.ПолныйПутьКФайлуНастроек(ФайлыНастроек.merge); 37 | 38 | Попытка 39 | Конфигуратор.ОбъединитьКонфигурациюСФайлом(ФайлКонфигурации, ФайлMerge); 40 | Исключение 41 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 42 | Возврат Ложь; 43 | КонецПопытки; 44 | 45 | Логирователь.ВЛог("Объединение конфигурации с файлом выполнено"); 46 | 47 | Возврат Истина; 48 | 49 | КонецФункции 50 | 51 | &Асинх 52 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 53 | 54 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 55 | 56 | КонецФункции 57 | 58 | &Желудь 59 | &Прозвище("Команда") 60 | Процедура ПриСозданииОбъекта() 61 | 62 | КонецПроцедуры -------------------------------------------------------------------------------- /src/templates/Классы/Emoji.os: -------------------------------------------------------------------------------- 1 | // https://emojidb.org/telegram-emojis 2 | // https://emojidb.org/jenkins-emojis 3 | Перем Цифры; 4 | 5 | Процедура ДобавитьВНачалоСтроки(ИсходнаяСтрока, Эмодзи) Экспорт 6 | 7 | Если НЕ ЗначениеЗаполнено(Эмодзи) Тогда 8 | Возврат; 9 | КонецЕсли; 10 | 11 | ИсходнаяСтрока = Эмодзи + " " + ИсходнаяСтрока; 12 | 13 | КонецПроцедуры 14 | 15 | Функция Инфо() Экспорт 16 | Возврат "⚠️"; 17 | КонецФункции 18 | 19 | Функция Начало() Экспорт 20 | Возврат "▶️"; 21 | КонецФункции 22 | 23 | Функция Конец() Экспорт 24 | Возврат "✅"; 25 | КонецФункции 26 | 27 | Функция Ошибка() Экспорт 28 | Возврат "🆘"; 29 | КонецФункции 30 | 31 | Функция Ошибка_v2() Экспорт // BSLLS:LatinAndCyrillicSymbolInWord-off 32 | Возврат "❌"; 33 | КонецФункции 34 | 35 | Функция Прервано() Экспорт 36 | Возврат "🛑"; 37 | КонецФункции 38 | 39 | Функция Упало() Экспорт 40 | Возврат "💩"; 41 | КонецФункции 42 | 43 | Функция Список() Экспорт 44 | Возврат "📰"; 45 | КонецФункции 46 | 47 | Функция Звезда() Экспорт 48 | Возврат "🌟"; 49 | КонецФункции 50 | 51 | Функция Цифра(Значение) Экспорт 52 | 53 | Эмодзи = Цифры.Получить(Значение); 54 | Если Эмодзи = Неопределено Тогда 55 | Возврат Строка(Значение); 56 | Иначе 57 | Возврат Эмодзи; 58 | КонецЕсли; 59 | 60 | Возврат ""; 61 | 62 | КонецФункции 63 | 64 | Процедура ИнициализироватьЦифры() 65 | 66 | Цифры = Новый Соответствие; 67 | Цифры.Вставить(1, "1️⃣"); 68 | Цифры.Вставить(2, "2️⃣"); 69 | Цифры.Вставить(3, "3️⃣"); 70 | Цифры.Вставить(4, "4️⃣"); 71 | Цифры.Вставить(5, "5️⃣"); 72 | Цифры.Вставить(6, "6️⃣"); 73 | Цифры.Вставить(7, "7️⃣"); 74 | Цифры.Вставить(8, "8️⃣"); 75 | Цифры.Вставить(9, "9️⃣"); 76 | Цифры.Вставить(10, "🔟"); 77 | 78 | КонецПроцедуры 79 | 80 | &Желудь 81 | Процедура ПриСозданииОбъекта() 82 | ИнициализироватьЦифры(); 83 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаОтключитьКонфигураторОтИнформационнойБазы.os: -------------------------------------------------------------------------------- 1 | // ОтключитьКонфигураторОтИнформационнойБазы 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельКластера; 9 | 10 | &Пластилин 11 | Перем Логирователь; // BSLLS:Typo-off 12 | 13 | Функция ВыполнитьКоманду(ПараметрыКоманды = Неопределено) Экспорт // BSLLS:UnusedParameters-off 14 | 15 | Если УправлятельКластера.ЗакрытКонфигуратор_Получить() = Истина Тогда 16 | Возврат Истина; 17 | КонецЕсли; 18 | 19 | Кластер = УправлятельКластера.Получить(); 20 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 21 | 22 | ИмяПриложения = "Designer"; 23 | 24 | Попытка 25 | ТаблицаСеансов = Кластер.СписокСеансовИнформационнойБазы(ПараметрыПодключения.ИмяБазы); 26 | Исключение 27 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 28 | Возврат Ложь; 29 | КонецПопытки; 30 | 31 | СтруктураПоиска = Новый Структура("Приложение", ИмяПриложения); 32 | Сеансы = ТаблицаСеансов.НайтиСтроки(СтруктураПоиска); 33 | Если Сеансы.Количество() <> 0 Тогда 34 | 35 | Логирователь.ВЛог("Закрытие конфигуратора в ИБ"); 36 | 37 | Для каждого Сеанс Из Сеансы Цикл 38 | Попытка 39 | Кластер.ОтключитьСеанс(Сеанс.Идентификатор, Сеанс.Кластер); 40 | Исключение 41 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 42 | Возврат Ложь; 43 | КонецПопытки; 44 | КонецЦикла; 45 | 46 | Логирователь.ВЛог("Конфигуратор закрыт"); 47 | 48 | КонецЕсли; 49 | 50 | УправлятельКластера.ЗакрытКонфигуратор_Установить(); 51 | Возврат Истина; 52 | 53 | КонецФункции 54 | 55 | &Асинх 56 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 57 | 58 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 59 | 60 | КонецФункции 61 | 62 | &Желудь 63 | &Прозвище("Команда") 64 | Процедура ПриСозданииОбъекта() 65 | 66 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗадатьВопрос.os: -------------------------------------------------------------------------------- 1 | // ЗадатьВопрос 2 | #Использовать gui 3 | #Использовать "..//../../src/Модули" 4 | 5 | &Пластилин 6 | Перем Настройки; 7 | 8 | &Пластилин 9 | Перем Завершатель; 10 | 11 | &Пластилин 12 | Перем Логирователь; // BSLLS:Typo-off 13 | 14 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 15 | 16 | Результат = Истина; 17 | Если Настройки.Фоново Тогда 18 | Возврат Результат; 19 | КонецЕсли; 20 | 21 | ПараметрыКоманд = Настройки.ПараметрыКоманд; 22 | ПараметрыОбщие = Настройки.ПараметрыОбщие; 23 | 24 | ТекстВопроса = ПараметрыКоманды.Параметры.Получить("ТекстВопроса"); 25 | Если ТекстВопроса = Неопределено Тогда 26 | ТекстВопроса = ПараметрыКоманд.ТекстВопроса; 27 | КонецЕсли; 28 | 29 | Если Не ЗначениеЗаполнено(ТекстВопроса) Тогда 30 | ТекстКоманд = ПараметрыОбщие.Получить("ПутьКФайлуCommands"); 31 | Если Не ЗначениеЗаполнено(ТекстКоманд) Тогда 32 | ТекстКоманд = ПараметрыОбщие.Получить("ИдентификаторКоманд"); 33 | КонецЕсли; 34 | ТекстВопроса = "Запустить " + ТекстКоманд + "?"; 35 | КонецЕсли; 36 | 37 | Логирователь.ЗаменитьПараметрыВТексте(ТекстВопроса); 38 | Логирователь.ДополнитьОсновныеПараметрыВТексте(ТекстВопроса); 39 | 40 | УправляемыйИнтерфейс = Новый УправляемыйИнтерфейс(); 41 | Диалоги = УправляемыйИнтерфейс.СтандартныеДиалоги; 42 | Ответ = Диалоги.Вопрос(ТекстВопроса, 43 | РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет , "sync_repo", КодВозвратаДиалога.Нет); 44 | Если Ответ <> КодВозвратаДиалога.Да Тогда 45 | Завершатель.ЗавершитьПоОшибке(); 46 | КонецЕсли; 47 | 48 | Возврат Истина; 49 | 50 | КонецФункции 51 | 52 | &Асинх 53 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 54 | 55 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 56 | 57 | КонецФункции 58 | 59 | &Желудь 60 | &Прозвище("Команда") 61 | Процедура ПриСозданииОбъекта() 62 | 63 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПоместитьИзмененияОбъектовВХранилище.os: -------------------------------------------------------------------------------- 1 | // ПоместитьИзмененияОбъектовВХранилище 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельКонфигуратора; 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | 12 | &Пластилин 13 | Перем Логирователь; // BSLLS:Typo-off 14 | 15 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 16 | 17 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 18 | Возврат Ложь; 19 | КонецЕсли; 20 | 21 | Логирователь.ВЛог("Помещаю изменения объектов в хранилище"); 22 | 23 | Конфигуратор = УправлятельКонфигуратора.Получить(); 24 | ПараметрыКоманд = Настройки.ПараметрыКоманд; 25 | 26 | Комментарий = ПараметрыКоманд.КомментарийПриПомещенииВХранилище; 27 | Логирователь.ЗаменитьПараметрыВТексте(Комментарий); 28 | 29 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 30 | 31 | ОставитьОбъектыЗахваченными = Ложь; 32 | ИгнорироватьУдаленные = Истина; 33 | 34 | Попытка 35 | Конфигуратор.ПоместитьИзмененияОбъектовВХранилище(ПараметрыПодключения.ПутьКХранилищу, 36 | ПараметрыПодключения.ЛогинКХранилищу, 37 | ПараметрыПодключения.ПарольКХранилищу, 38 | , 39 | Комментарий, 40 | ОставитьОбъектыЗахваченными, 41 | ИгнорироватьУдаленные); 42 | Исключение 43 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 44 | Возврат Ложь; 45 | КонецПопытки; 46 | 47 | Логирователь.ВЛог("Изменения объектов помещены в хранилище"); 48 | 49 | Возврат Истина; 50 | 51 | КонецФункции 52 | 53 | &Асинх 54 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 55 | 56 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 57 | 58 | КонецФункции 59 | 60 | &Желудь 61 | &Прозвище("Команда") 62 | Процедура ПриСозданииОбъекта() 63 | 64 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаВыполнитьСкриптSQL.os: -------------------------------------------------------------------------------- 1 | // ВыполнитьКомандуSQL 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем УправлятельSQL; // BSLLS:Typo-off 6 | 7 | &Пластилин 8 | Перем Логирователь; // BSLLS:Typo-off 9 | 10 | &Пластилин 11 | Перем СкриптыSQL; 12 | 13 | &Пластилин(Значение = "ОбработчикРезультатаSQL", Тип = "Массив") 14 | Перем ОбработчикиРезультата; 15 | 16 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 17 | 18 | ПараметрыСкрипта = ПараметрыКоманды.Параметры; 19 | ПропускатьПриОшибке = ПрообразованияТипов.БулевоИзСтроки(ПараметрыСкрипта.Получить("ПропускатьПриОшибке")); 20 | 21 | Имя = ПараметрыСкрипта.Получить("Имя"); 22 | 23 | Логирователь.ВЛог("Выполняю скрипт SQL: " + Имя); 24 | 25 | Параметр1 = ПараметрыСкрипта.Получить("Параметр1"); 26 | 27 | ТекстКоманды = СкриптыSQL.Получить(Имя, Параметр1); 28 | Если ТекстКоманды = Неопределено Тогда 29 | ТекстОшибки = "Не определен текст скрипта - " + Имя; 30 | Логирователь.ВЛог(ТекстОшибки, Истина); 31 | Возврат Ложь; 32 | КонецЕсли; 33 | 34 | Попытка 35 | Результат = УправлятельSQL.ВыполнитьКоманду(ТекстКоманды); 36 | Исключение 37 | Логирователь.ВЛог("Скрипт SQL не выполнен - " + Имя + "." + ОписаниеОшибки(), Истина); 38 | Возврат ПропускатьПриОшибке; 39 | КонецПопытки; 40 | 41 | Для каждого ОбработчикРезультата Из ОбработчикиРезультата Цикл 42 | РезультатОбработки = ОбработчикРезультата.Обработать(Результат, ЭтотОбъект, "Скрипт", ПараметрыКоманды); 43 | Если РезультатОбработки = Ложь Тогда 44 | Возврат ПропускатьПриОшибке; 45 | КонецЕсли; 46 | КонецЦикла; 47 | 48 | Возврат Истина; 49 | 50 | КонецФункции 51 | 52 | &Асинх 53 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 54 | 55 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 56 | 57 | КонецФункции 58 | 59 | &Желудь 60 | &Прозвище("Команда") 61 | Процедура ПриСозданииОбъекта() 62 | 63 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/УправлятельКонфигуратора.os: -------------------------------------------------------------------------------- 1 | #Использовать v8runner 2 | 3 | Перем Конфигуратор; 4 | Перем ВремяОбновленияБазы; // Время обновления базы в минутах 5 | 6 | &Пластилин 7 | Перем Настройки; 8 | 9 | Функция Получить() Экспорт 10 | Если Конфигуратор = Неопределено Тогда 11 | ИнициализироватьКонфигуратор(); 12 | КонецЕсли; 13 | Возврат Конфигуратор; 14 | КонецФункции 15 | 16 | Функция ВремяОбновленияБазы() Экспорт 17 | Возврат ВремяОбновленияБазы; 18 | КонецФункции 19 | 20 | Процедура ВремяОбновленияБазы_Установить(Время) Экспорт 21 | ВремяОбновленияБазы = Время; 22 | КонецПроцедуры 23 | 24 | Процедура УстановитьПутьКТонкомуКлиенту() Экспорт 25 | 26 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 27 | ПутьКПлатформе = ПараметрыПодключения.ПутьКПлатформе; 28 | 29 | ПутьКПлатформеТонкий = СтрЗаменить(ПутьКПлатформе, "1cv8.exe", "1cv8c.exe"); 30 | Конфигуратор.ПутьКПлатформе1С(ПутьКПлатформеТонкий); 31 | 32 | КонецПроцедуры 33 | 34 | Процедура УстановитьПутьКПлатформе() Экспорт 35 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 36 | Конфигуратор.ПутьКПлатформе1С(ПараметрыПодключения.ПутьКПлатформе); 37 | КонецПроцедуры 38 | 39 | Процедура ИнициализироватьКонфигуратор() 40 | 41 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 42 | 43 | Конфигуратор = Новый УправлениеКонфигуратором(); 44 | Конфигуратор.ПутьКПлатформе1С(ПараметрыПодключения.ПутьКПлатформе); 45 | Конфигуратор.УстановитьКлючРазрешенияЗапуска(ПараметрыПодключения.КодДоступаПриБлокировкиИБ); 46 | 47 | ПараметрыСтрокиСоединения = Конфигуратор.ПараметрыСтрокиСоединения(); 48 | ПараметрыСтрокиСоединения.Сервер = ПараметрыПодключения.СерверБазы; 49 | ПараметрыСтрокиСоединения.Порт = ПараметрыПодключения.ПортБазы; 50 | ПараметрыСтрокиСоединения.ИмяБазы = ПараметрыПодключения.ИмяБазы; 51 | 52 | Конфигуратор.УстановитьКонтекст(ПараметрыСтрокиСоединения, 53 | ПараметрыПодключения.ЛогинККонфигуратору, 54 | ПараметрыПодключения.ПарольККонфигуратору); 55 | 56 | КонецПроцедуры 57 | 58 | &Желудь 59 | Процедура ПриСозданииОбъекта() 60 | 61 | ВремяОбновленияБазы = Неопределено; 62 | Конфигуратор = Неопределено; 63 | 64 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/УправлятельХранилища.os: -------------------------------------------------------------------------------- 1 | #Использовать v8storage 2 | 3 | Перем сХранилища; 4 | 5 | &Пластилин 6 | Перем УправлятельКонфигуратора; // BSLLS:Typo-off 7 | 8 | &Пластилин 9 | Перем Настройки; 10 | 11 | Функция Получить(ИмяРасширения = Неопределено) Экспорт 12 | 13 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 14 | Имя = ИмяРасширения; 15 | Иначе 16 | Имя = ИмяОсновной(); 17 | КонецЕсли; 18 | 19 | Хранилище = сХранилища.Получить(Имя); 20 | Если Хранилище <> Неопределено Тогда 21 | Возврат Хранилище; 22 | КонецЕсли; 23 | 24 | Хранилище = Инициализировать(ИмяРасширения); 25 | сХранилища.Вставить(Имя, Хранилище); 26 | 27 | Возврат Хранилище; 28 | 29 | КонецФункции 30 | 31 | Функция Инициализировать(ИмяРасширения = Неопределено) 32 | 33 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 34 | НастройкиХранилища = НастройкиПоРасширению(ИмяРасширения); 35 | Иначе 36 | НастройкиХранилища = НастройкиОсновной(); 37 | КонецЕсли; 38 | 39 | Хранилище = Новый МенеджерХранилищаКонфигурации(); 40 | Хранилище.УстановитьПутьКХранилищу(НастройкиХранилища.ПутьКХранилищу); 41 | Хранилище.УстановитьПараметрыАвторизации(НастройкиХранилища.ЛогинКХранилищу, НастройкиХранилища.ПарольКХранилищу); 42 | 43 | Конфигуратор = УправлятельКонфигуратора.Получить(); 44 | Хранилище.УстановитьУправлениеКонфигуратором(Конфигуратор); 45 | 46 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 47 | Хранилище.УстановитьРасширениеХранилища(ИмяРасширения); 48 | КонецЕсли; 49 | 50 | Возврат Хранилище; 51 | 52 | КонецФункции 53 | 54 | Функция НастройкиОсновной() 55 | Возврат Настройки; 56 | КонецФункции 57 | 58 | Функция НастройкиПоРасширению(ИмяРасширения) 59 | НастройкиРасширения = Настройки.РасширенияКонфигурации.Получить(ИмяРасширения); 60 | Если НастройкиРасширения = Неопределено Тогда 61 | ВызватьИсключение "Нет настроек расширения - " + ИмяРасширения; 62 | КонецЕсли; 63 | Возврат НастройкиРасширения; 64 | КонецФункции 65 | 66 | Функция ИмяОсновной() 67 | Возврат "Осн"; 68 | КонецФункции 69 | 70 | &Желудь 71 | Процедура ПриСозданииОбъекта() 72 | сХранилища = Новый Соответствие; 73 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаВыполнитьЗапросSQL.os: -------------------------------------------------------------------------------- 1 | // ВыполнитьЗапросSQL 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем УправлятельSQL; // BSLLS:Typo-off 6 | 7 | &Пластилин 8 | Перем Логирователь; // BSLLS:Typo-off 9 | 10 | &Пластилин 11 | Перем СкриптыSQL; 12 | 13 | &Пластилин(Значение = "ОбработчикРезультатаSQL", Тип = "Массив") 14 | Перем ОбработчикиРезультата; 15 | 16 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 17 | 18 | ПараметрыСкрипта = ПараметрыКоманды.Параметры; 19 | 20 | ПовторноеВыполнение = ЗначениеЗаполнено(ПараметрыСкрипта.Получить("ПовторнаяОтправка")); 21 | 22 | ПропускатьПриОшибке = ПрообразованияТипов.БулевоИзСтроки(ПараметрыСкрипта.Получить("ПропускатьПриОшибке")); 23 | 24 | Имя = ПараметрыСкрипта.Получить("Имя"); 25 | 26 | ТекстСообщения = "Выполняю запрос SQL: " + Имя; 27 | Если ПовторноеВыполнение Тогда 28 | Логирователь.Отладка(ТекстСообщения); 29 | Иначе 30 | Логирователь.ВЛог(ТекстСообщения); 31 | КонецЕсли; 32 | 33 | Параметр1 = ПараметрыСкрипта.Получить("Параметр1"); 34 | 35 | ТекстЗапроса = СкриптыSQL.Получить(Имя, Параметр1); 36 | Если ТекстЗапроса = Неопределено Тогда 37 | ТекстОшибки = "Не определен текст запроса - " + Имя; 38 | Логирователь.ВЛог(ТекстОшибки, Истина); 39 | Возврат Ложь; 40 | КонецЕсли; 41 | 42 | Попытка 43 | Результат = УправлятельSQL.ВыполнитьЗапрос(ТекстЗапроса); 44 | Исключение 45 | Логирователь.ВЛог("Запрос SQL не выполнен - " + Имя + "." + ОписаниеОшибки(), Истина); 46 | Возврат ПропускатьПриОшибке; 47 | КонецПопытки; 48 | 49 | Для каждого ОбработчикРезультата Из ОбработчикиРезультата Цикл 50 | РезультатОбработки = ОбработчикРезультата.Обработать(Результат, ЭтотОбъект, "Запрос", ПараметрыКоманды); 51 | Если РезультатОбработки = Ложь Тогда 52 | Возврат ПропускатьПриОшибке; 53 | КонецЕсли; 54 | КонецЦикла; 55 | 56 | Возврат Истина; 57 | 58 | КонецФункции 59 | 60 | &Асинх 61 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 62 | 63 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 64 | 65 | КонецФункции 66 | 67 | &Желудь 68 | &Прозвище("Команда") 69 | Процедура ПриСозданииОбъекта() 70 | 71 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗапуститьВРежимеПредприятия.os: -------------------------------------------------------------------------------- 1 | // ЗапуститьВРежимеПредприятия 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельКонфигуратора; 9 | 10 | &Пластилин 11 | Перем Логирователь; // BSLLS:Typo-off 12 | 13 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 14 | 15 | Логирователь.ВЛог("Запускаю в режиме предприятия"); 16 | 17 | ПараметрыКоманд = Настройки.ПараметрыКоманд; 18 | ДополнительныеКлючи = ПараметрыКоманд.КлючиЗапускаПредприятия; 19 | 20 | Параметры = ПараметрыКоманды.Параметры; 21 | ОжидатьВыполнения = Параметры.Получить("ОжидатьВыполнения"); 22 | Если ЗначениеЗаполнено(ОжидатьВыполнения) Тогда 23 | ОжидатьВыполнения = Булево(ОжидатьВыполнения); 24 | Иначе 25 | ОжидатьВыполнения = Истина; 26 | КонецЕсли; 27 | 28 | Возврат ЗапуститьВРежимеПредприятия(ОжидатьВыполнения, ДополнительныеКлючи); 29 | 30 | КонецФункции 31 | 32 | Функция ЗапуститьВРежимеПредприятия(ОжидатьВыполнения = Истина, ДополнительныеКлючи = "") Экспорт 33 | 34 | Конфигуратор = УправлятельКонфигуратора.Получить(); 35 | 36 | ОтключенПризнакОжидания = Ложь; 37 | Если ОжидатьВыполнения = Ложь Тогда 38 | Конфигуратор.УстановитьПризнакОжиданияВыполненияПрограммы(Ложь); 39 | ОтключенПризнакОжидания = Истина; 40 | КонецЕсли; 41 | 42 | УправлятельКонфигуратора.УстановитьПутьКТонкомуКлиенту(); 43 | 44 | ЕстьОшибка = Ложь; 45 | УправляемыйРежим = Истина; 46 | Попытка 47 | Конфигуратор.ЗапуститьВРежимеПредприятия(, УправляемыйРежим, ДополнительныеКлючи); 48 | Исключение 49 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 50 | ЕстьОшибка = Истина; 51 | КонецПопытки; 52 | 53 | УправлятельКонфигуратора.УстановитьПутьКПлатформе(); 54 | 55 | Если ОтключенПризнакОжидания Тогда 56 | Конфигуратор.УстановитьПризнакОжиданияВыполненияПрограммы(Истина); 57 | КонецЕсли; 58 | 59 | Возврат НЕ ЕстьОшибка; 60 | 61 | КонецФункции 62 | 63 | &Асинх 64 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 65 | 66 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 67 | 68 | КонецФункции 69 | 70 | &Желудь 71 | &Прозвище("Команда") 72 | Процедура ПриСозданииОбъекта() 73 | 74 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗаблокироватьИБ.os: -------------------------------------------------------------------------------- 1 | // ЗаблокироватьИБ 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельКластера; // BSLLS:Typo-off 9 | 10 | &Пластилин 11 | Перем Логирователь; // BSLLS:Typo-off 12 | 13 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт 14 | 15 | Если НЕ ТребуетВыполнения() Тогда 16 | Возврат Истина; 17 | КонецЕсли; 18 | 19 | Проверка = Общий.СвойствоСтруктуры(ПараметрыКоманды, "Проверка", Ложь); 20 | Возврат ВыполнитьКомандуСПараметрами(Проверка, ПараметрыКоманды); 21 | 22 | КонецФункции 23 | 24 | &Асинх 25 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 26 | 27 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 28 | 29 | КонецФункции 30 | 31 | Функция ТребуетВыполнения() 32 | 33 | Если Настройки.ИспользоватьДинамическоеОбновление Тогда 34 | Возврат Ложь; 35 | КонецЕсли; 36 | 37 | Возврат Истина; 38 | 39 | КонецФункции 40 | 41 | Функция ВыполнитьКомандуСПараметрами(Проверка = Ложь, 42 | ПараметрыКоманды = Неопределено) Экспорт // BSLLS:UnusedParameters-off 43 | 44 | Кластер = УправлятельКластера.Получить(); 45 | 46 | Если Проверка Тогда 47 | // Периодически снимается сама блокировку, 48 | // поэтому приходится проверять несколько раз, тут просто устанавливаем её заного 49 | Логирователь.ВЛог("Проверяю блокировку информационной базы"); 50 | Иначе 51 | Логирователь.ВЛог("Устанавливаю блокировку информационной базы", , Истина); 52 | КонецЕсли; 53 | 54 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 55 | 56 | Попытка 57 | Кластер.БлокировкаИнформационнойБазы(ПараметрыПодключения.ИмяБазы, 58 | ПараметрыПодключения.СообщениеПриБлокировкиИБ, 59 | ПараметрыПодключения.КодДоступаПриБлокировкиИБ, , , Истина); 60 | Исключение 61 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 62 | Возврат Ложь; 63 | КонецПопытки; 64 | 65 | Если Проверка Тогда 66 | Логирователь.ВЛог("Проверка блокировки информационной базы выполнена"); 67 | Иначе 68 | Логирователь.ВЛог("Блокировка информационной базы установлена"); 69 | КонецЕсли; 70 | 71 | Возврат Истина; 72 | 73 | КонецФункции 74 | 75 | &Желудь 76 | &Прозвище("Команда") 77 | Процедура ПриСозданииОбъекта() 78 | 79 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаОтменитьЗахватОбъектовВХранилище.os: -------------------------------------------------------------------------------- 1 | // ОтменитьЗахватОбъектовВХранилище 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельХранилища; // BSLLS:Typo-off 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | 12 | &Пластилин 13 | Перем Логирователь; // BSLLS:Typo-off 14 | 15 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 16 | 17 | Возврат ВыполнитьКомандуСПараметрами(, , , ПараметрыКоманды); 18 | 19 | КонецФункции 20 | 21 | &Асинх 22 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 23 | 24 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 25 | 26 | КонецФункции 27 | 28 | Функция ВыполнитьКомандуСПараметрами(ПоФайлу = Ложь, ИмяФайла = "", 29 | ПроверкаПодключения = Ложь, ПараметрыКоманды = Неопределено) Экспорт // BSLLS:UnusedParameters-off 30 | 31 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 32 | Возврат Ложь; 33 | КонецЕсли; 34 | 35 | Если ПоФайлу Тогда 36 | Логирователь.ВЛог("Отменяю объекты в хранилище по файлу " + ИмяФайла); 37 | Иначе 38 | Логирователь.ВЛог("Отменяю захват объектов в хранилище"); 39 | КонецЕсли; 40 | 41 | ИгнорироватьИзменения = Истина; 42 | 43 | Если ПоФайлу Тогда 44 | ПутьКФайлуСоСпискомОбъектов = Настройки.ПолныйПутьКФайлуНастроек(ИмяФайла); 45 | Иначе 46 | ПутьКФайлуСоСпискомОбъектов = Неопределено; 47 | КонецЕсли; 48 | 49 | Хранилище = УправлятельХранилища.Получить(); 50 | 51 | Попытка 52 | Хранилище.ОтменитьЗахватОбъектовВХранилище(ПутьКФайлуСоСпискомОбъектов, 53 | ИгнорироватьИзменения); 54 | Исключение 55 | Если ПроверкаПодключения Тогда 56 | ВызватьИсключение ОписаниеОшибки(); 57 | Иначе 58 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 59 | Возврат Ложь; 60 | КонецЕсли; 61 | КонецПопытки; 62 | 63 | Если ПоФайлу Тогда 64 | Логирователь.ВЛог("Отмена захвата объектов в хранилище по файлу " + ИмяФайла + " выполнена"); 65 | Иначе 66 | Логирователь.ВЛог("Отмена захвата объектов в хранилище выполнена"); 67 | КонецЕсли; 68 | 69 | Возврат Истина; 70 | 71 | КонецФункции 72 | 73 | &Желудь 74 | &Прозвище("Команда") 75 | Процедура ПриСозданииОбъекта() 76 | 77 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПоказатьПриветствие.os: -------------------------------------------------------------------------------- 1 | // ПоказатьПриветствие 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем Логирователь; // BSLLS:Typo-off 9 | 10 | &Пластилин 11 | Перем Emoji; 12 | 13 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 14 | 15 | ТекстПриветствия = ПараметрыКоманды.Параметры.Получить("Приветствие"); 16 | Если ТекстПриветствия = Неопределено Тогда 17 | ТекстПриветствия = Настройки.ПараметрыКоманд.Приветствие; 18 | КонецЕсли; 19 | Если Не ЗначениеЗаполнено(ТекстПриветствия) Тогда 20 | Логирователь.ВЛог("Не заполнен текст приветствия"); 21 | Возврат Ложь; 22 | КонецЕсли; 23 | 24 | Если Общий.ПризнакВключенияПараметра("УстановитьПаузу", Настройки.КомандыВыполнения) Тогда 25 | ПаузаПередЗапуском = Настройки.ПаузаПередЗапуском; 26 | Если ЗначениеЗаполнено(ПаузаПередЗапуском) Тогда 27 | стрСекундПаузы = Строка(ПаузаПередЗапуском); 28 | Иначе 29 | стрСекундПаузы = Настройки.ПараметрыКоманд.Пауза; 30 | КонецЕсли; 31 | Иначе 32 | стрСекундПаузы = ""; 33 | КонецЕсли; 34 | 35 | Если СтрНайти(ТекстПриветствия, "Пауза") > 0 36 | И ЗначениеЗаполнено(стрСекундПаузы) Тогда 37 | 38 | СекундПаузы = Число(стрСекундПаузы); 39 | 40 | Минута = 60; 41 | МинутПаузы = Цел(СекундПаузы / Минута); 42 | 43 | Если МинутПаузы > 0 Тогда 44 | СтрокаПаузы = Строка(МинутПаузы) + " мин"; 45 | ИначеЕсли СекундПаузы > 0 Тогда 46 | СтрокаПаузы = Строка(СекундПаузы) + " сек"; 47 | Иначе 48 | СтрокаПаузы = ""; 49 | КонецЕсли; 50 | 51 | ТекстПриветствия = Логирователь.ЗаменитьПараметрВТексте(ТекстПриветствия, "Пауза", СтрокаПаузы); 52 | 53 | Иначе 54 | 55 | ТекстПриветствия = Логирователь.ЗаменитьПараметрВТексте(ТекстПриветствия, " через #Пауза", "", ""); 56 | 57 | КонецЕсли; 58 | 59 | Логирователь.ВЛог(ТекстПриветствия, , Истина, , Emoji.Инфо()); 60 | 61 | Возврат Истина; 62 | 63 | КонецФункции 64 | 65 | &Асинх 66 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 67 | 68 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 69 | 70 | КонецФункции 71 | 72 | &Желудь 73 | &Прозвище("Команда") 74 | Процедура ПриСозданииОбъекта() 75 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/УправлятельSQL.os: -------------------------------------------------------------------------------- 1 | #Использовать sql 2 | 3 | Перем Соединение; 4 | 5 | &Пластилин 6 | Перем Настройки; 7 | 8 | &Пластилин 9 | Перем Логирователь; // BSLLS:Typo-off 10 | 11 | &Пластилин 12 | Перем Завершатель; // BSLLS:Typo-off 13 | 14 | Функция ВыполнитьЗапрос(ТекстЗапроса) Экспорт 15 | 16 | Инициализировать(); 17 | 18 | Если Не ОткрытьСоединение() Тогда 19 | Возврат Неопределено; 20 | КонецЕсли; 21 | 22 | Запрос = Новый Запрос(); 23 | Запрос.УстановитьСоединение(Соединение); 24 | Запрос.Текст = ТекстЗапроса; 25 | 26 | Результат = Запрос.Выполнить().Выгрузить(); 27 | 28 | Соединение.Закрыть(); 29 | 30 | Возврат Результат; 31 | 32 | КонецФункции 33 | 34 | Функция ВыполнитьКоманду(ТекстКоманды) Экспорт 35 | 36 | Инициализировать(); 37 | 38 | Если Не ОткрытьСоединение() Тогда 39 | Возврат Неопределено; 40 | КонецЕсли; 41 | 42 | Запрос = Новый Запрос(); 43 | Запрос.УстановитьСоединение(Соединение); 44 | Запрос.Текст = ТекстКоманды; 45 | 46 | Результат = Запрос.ВыполнитьКоманду(); 47 | 48 | Соединение.Закрыть(); 49 | 50 | Возврат Результат; 51 | 52 | КонецФункции 53 | 54 | Функция Получить() Экспорт 55 | Инициализировать(); 56 | Возврат Соединение; 57 | КонецФункции 58 | 59 | Процедура Инициализировать() 60 | 61 | Если Соединение <> Неопределено Тогда 62 | Возврат; 63 | КонецЕсли; 64 | 65 | Соединение = Новый Соединение(); 66 | Соединение.ТипСУБД = ТипСУБД(Соединение); 67 | Соединение.Сервер = Настройки.СерверSQL; 68 | Соединение.ИмяБазы = Настройки.ИмяБазыSQL; 69 | Соединение.ИмяПользователя = Настройки.ИмяПользователяSQL; 70 | Соединение.Пароль = Настройки.ПарольSQL; 71 | 72 | КонецПроцедуры 73 | 74 | Функция ОткрытьСоединение() 75 | 76 | Соединение.Открыть(); 77 | 78 | Если Не Соединение.Открыто Тогда 79 | Логирователь.ВЛог("Не удалось установить соединение с СУБД", Истина); 80 | Возврат Ложь; 81 | КонецЕсли; 82 | 83 | Возврат Истина; 84 | 85 | КонецФункции 86 | 87 | Функция ТипСУБД(Соединение) 88 | 89 | ТипСУБД = Настройки.ТипСУБД; 90 | Если ТипСУБД = "MSSQLServer" Или Не ЗначениеЗаполнено(ТипСУБД) Тогда 91 | Возврат Соединение.ТипыСУБД.MSSQLServer; 92 | Иначе 93 | Завершатель.ЗавершитьПоОшибке("Не определен тип СУБД"); 94 | Возврат Неопределено; 95 | КонецЕсли; 96 | 97 | КонецФункции 98 | 99 | &Желудь 100 | Процедура ПриСозданииОбъекта() 101 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗагрузитьРасширениеИзФайла.os: -------------------------------------------------------------------------------- 1 | // ЗагрузитьРасширениеИзФайла 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельКонфигуратора; // BSLLS:Typo-off 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | &Пластилин 12 | 13 | &Пластилин 14 | Перем Логирователь; // BSLLS:Typo-off 15 | 16 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 17 | 18 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 19 | Возврат Ложь; 20 | КонецЕсли; 21 | 22 | Параметры = ПараметрыКоманды.Параметры; 23 | ИмяРасширения = Параметры.Получить("ИмяРасширения"); 24 | ИмяФайла = Параметры.Получить("ИмяФайла"); 25 | 26 | ОбновитьКонфигурациюИБ = Параметры.Получить("ОбновитьКонфигурациюИБ"); 27 | Если Не ТипЗнч(ОбновитьКонфигурациюИБ) = Тип("Булево") Тогда 28 | ОбновитьКонфигурациюИБ = Ложь; 29 | КонецЕсли; 30 | 31 | Если НЕ ЗначениеЗаполнено(ИмяФайла) Или Не ЗначениеЗаполнено(ИмяРасширения) Тогда 32 | ТекстСообщения = "Не могу выполнить команду ""ЗагрузитьРасширениеИзФайла""" 33 | + " - не переданы параметры ""ИмяФайла"" или ""ИмяРасширения"""; 34 | Логирователь.ВЛог(ТекстСообщения, Истина); 35 | Возврат Ложь; 36 | КонецЕсли; 37 | 38 | Конфигуратор = УправлятельКонфигуратора.Получить(); 39 | 40 | Логирователь.ВЛог("Загружаю расширение " + ИмяРасширения + " из файла " + ИмяФайла); 41 | 42 | ПутьККаталогуCFe = Настройки.ПутьККаталогуCFe; 43 | ПутьКФайлу = ОбъединитьПути(ПутьККаталогуCFe, ИмяФайла); 44 | 45 | Если Не РаботаСФайлами.ФайлСуществует(ПутьКФайлу) Тогда 46 | Логирователь.ВЛог("Файл расширения на найден - " + ПутьКФайлу); 47 | Возврат Ложь; 48 | КонецЕсли; 49 | 50 | Попытка 51 | Конфигуратор.ЗагрузитьРасширениеИзФайла(ПутьКФайлу, ИмяРасширения, ОбновитьКонфигурациюИБ); 52 | Исключение 53 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 54 | Возврат Ложь; 55 | КонецПопытки; 56 | 57 | Логирователь.ВЛог("Расширение " + ИмяРасширения + " из файла " + ИмяФайла + " загружено"); 58 | 59 | Возврат Истина; 60 | 61 | КонецФункции 62 | 63 | &Асинх 64 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 65 | 66 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 67 | 68 | КонецФункции 69 | 70 | &Желудь 71 | &Прозвище("Команда") 72 | Процедура ПриСозданииОбъекта() 73 | 74 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗагрузитьРасширениеВРежимеПредприятия.os: -------------------------------------------------------------------------------- 1 | // ЗагрузитьРасширениеВРежимеПредприятия 2 | #Использовать "..//../../src/Модули" 3 | 4 | Перем КомандаЗапуститьВРежимеПредприятия; 5 | Перем Логирователь; // BSLLS:Typo-off 6 | 7 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 8 | 9 | Параметры = ПараметрыКоманды.Параметры; 10 | 11 | ИмяРасширения = Параметры.Получить("ИмяРасширения"); 12 | Если Не ЗначениеЗаполнено(ИмяРасширения) Тогда 13 | Логирователь.ВЛог("Команда: ЗагрузитьРасширениеВРежимеПредприятия - не указано имя расширения", Истина); 14 | Возврат Ложь; 15 | КонецЕсли; 16 | 17 | Путь = Параметры.Получить("Путь"); 18 | Если Не ЗначениеЗаполнено(Путь) Тогда 19 | Путь = ПутьКФайлуРасширенияПоУмолчанию(); 20 | КонецЕсли; 21 | 22 | Логирователь.ВЛог("Начинаю загрузку расширения """ + ИмяРасширения + """ в режиме предприятия"); 23 | 24 | ОжидатьВыполнения = Истина; 25 | КлючиЗапуска = КлючЗапускаОбработки() + " " + КлючПараметровЗагрузкиРасширения(Путь, ИмяРасширения); 26 | КомандаЗапуститьВРежимеПредприятия.ЗапуститьВРежимеПредприятия(ОжидатьВыполнения, КлючиЗапуска); 27 | Возврат Истина; 28 | 29 | КонецФункции 30 | 31 | Функция КлючЗапускаОбработки() 32 | 33 | КлючЗапуска = СтрШаблон("/Execute ""%1\epf\ЗагрузитьРасширениеВРежимеПредприятия.epf""", ТекущийКаталог()); 34 | Возврат КлючЗапуска; 35 | 36 | КонецФункции 37 | 38 | Функция КлючПараметровЗагрузкиРасширения(Путь, ИмяРасширения) 39 | 40 | Разделитель = ";"; 41 | КлючЗапуска = СтрШаблон("Путь=%1%2", Путь, ИмяРасширения); 42 | КлючЗапуска = КлючЗапуска + Разделитель + "Перезаписывать"; 43 | КлючЗапуска = КлючЗапуска + ";" + "ЗавершитьРаботуСистемы"; 44 | 45 | КлючЗапуска = "/C " + """" + КлючЗапуска + """"; 46 | 47 | Возврат КлючЗапуска; 48 | 49 | КонецФункции 50 | 51 | Функция ПутьКФайлуРасширенияПоУмолчанию() 52 | Возврат "./cfe/"; 53 | КонецФункции 54 | 55 | &Асинх 56 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 57 | 58 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 59 | 60 | КонецФункции 61 | 62 | &Желудь 63 | &Прозвище("Команда") 64 | Процедура ПриСозданииОбъекта(&Пластилин("КомандаЗапуститьВРежимеПредприятия") _КомандаЗапуститьВРежимеПредприятия, 65 | &Пластилин("Логирователь") _Логирователь) 66 | 67 | КомандаЗапуститьВРежимеПредприятия = _КомандаЗапуститьВРежимеПредприятия; 68 | Логирователь = _Логирователь; 69 | 70 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗагрузитьКонфигурациюИзХранилища.os: -------------------------------------------------------------------------------- 1 | // ЗагрузитьКонфигурациюИзХранилища 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем УправлятельКонфигуратора; // BSLLS:Typo-off 6 | &Пластилин 7 | Перем УправлятельХранилища; // BSLLS:Typo-off 8 | 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | 12 | &Пластилин 13 | Перем Настройки; 14 | 15 | &Пластилин 16 | Перем Логирователь; // BSLLS:Typo-off 17 | 18 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 19 | 20 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 21 | Возврат Ложь; 22 | КонецЕсли; 23 | 24 | Параметры = ПараметрыКоманды.Параметры; 25 | ИмяРасширения = Параметры.Получить("ИмяРасширения"); 26 | Если Не ЗначениеЗаполнено(ИмяРасширения) Тогда 27 | ИмяРасширения = ""; 28 | КонецЕсли; 29 | 30 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 31 | ТекстДополнения = ". Расширение - " + ИмяРасширения; 32 | Иначе 33 | ТекстДополнения = ""; 34 | КонецЕсли; 35 | 36 | Логирователь.ВЛог("Загрузка конфигурации из хранилища" + ТекстДополнения); 37 | 38 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 39 | Возврат ЗагрузитьКонфигурациюИзХранилищаДляРасширения(ИмяРасширения); 40 | Иначе 41 | Возврат ЗагрузитьКонфигурациюИзХранилища(); 42 | КонецЕсли; 43 | 44 | КонецФункции 45 | 46 | Функция ЗагрузитьКонфигурациюИзХранилища() 47 | 48 | Конфигуратор = УправлятельКонфигуратора.Получить(); 49 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 50 | 51 | Попытка 52 | НомерВерсии = 0; 53 | Конфигуратор.ЗагрузитьКонфигурациюИзХранилища(ПараметрыПодключения.ПутьКХранилищу, 54 | ПараметрыПодключения.ЛогинКХранилищу, 55 | ПараметрыПодключения.ПарольКХранилищу, 56 | НомерВерсии); 57 | Исключение 58 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 59 | Возврат Ложь; 60 | КонецПопытки; 61 | 62 | Возврат Истина; 63 | 64 | КонецФункции 65 | 66 | Функция ЗагрузитьКонфигурациюИзХранилищаДляРасширения(ИмяРасширения) 67 | 68 | Хранилище = УправлятельХранилища.Получить(ИмяРасширения); 69 | 70 | Попытка 71 | НомерВерсии = ""; 72 | Хранилище.ОбновитьКонфигурациюНаВерсию(НомерВерсии); 73 | Исключение 74 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 75 | Возврат Ложь; 76 | КонецПопытки; 77 | 78 | Возврат Истина; 79 | 80 | КонецФункции 81 | 82 | &Асинх 83 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 84 | 85 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 86 | 87 | КонецФункции 88 | 89 | &Желудь 90 | &Прозвище("Команда") 91 | Процедура ПриСозданииОбъекта() 92 | 93 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Модули/Общий.os: -------------------------------------------------------------------------------- 1 | 2 | Функция СвойствоСтруктуры(пСтруктура, Ключ, ЗначениеПоУмолчанию = Неопределено) Экспорт 3 | 4 | Если ТипЗнч(пСтруктура) <> Тип("Структура") Тогда 5 | Возврат ЗначениеПоУмолчанию; 6 | КонецЕсли; 7 | 8 | Результат = ЗначениеПоУмолчанию; 9 | Если пСтруктура.Свойство(Ключ, Результат) Тогда 10 | Возврат Результат; 11 | Иначе 12 | Возврат ЗначениеПоУмолчанию; 13 | КонецЕсли; 14 | 15 | КонецФункции 16 | 17 | Процедура ОбъединитьСоответствия(Приемник, Источник) Экспорт 18 | 19 | Для каждого КлючЗначение Из Источник Цикл 20 | Приемник.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение); 21 | КонецЦикла; 22 | 23 | КонецПроцедуры 24 | 25 | Функция ПризнакВключенияПараметра(ИмяПарамета, ДанныеПараметров) Экспорт 26 | 27 | Если ТипЗнч(ДанныеПараметров) = Тип("Структура") Тогда 28 | Признак = ДанныеПараметров[ИмяПарамета]; 29 | ИначеЕсли ТипЗнч(ДанныеПараметров) = Тип("Массив") Тогда 30 | Признак = ДанныеПараметров.Найти(ИмяПарамета) <> Неопределено; 31 | Иначе 32 | Признак = ДанныеПараметров.Получить(ИмяПарамета); 33 | КонецЕсли; 34 | 35 | Если НЕ ЗначениеЗаполнено(Признак) Тогда 36 | Возврат Ложь; 37 | КонецЕсли; 38 | 39 | Возврат Булево(Признак); 40 | 41 | КонецФункции 42 | 43 | #Область Копирование_коллекций 44 | 45 | Функция СкопироватьРекурсивно(Источник) Экспорт 46 | 47 | Перем Приемник; 48 | 49 | ТипИсточника = ТипЗнч(Источник); 50 | Если ТипИсточника = Тип("Структура") Тогда 51 | Приемник = СкопироватьСтруктуру(Источник); 52 | ИначеЕсли ТипИсточника = Тип("Соответствие") Тогда 53 | Приемник = СкопироватьСоответствие(Источник); 54 | ИначеЕсли ТипИсточника = Тип("Массив") Тогда 55 | Приемник = СкопироватьМассив(Источник); 56 | Иначе 57 | Приемник = Источник; 58 | КонецЕсли; 59 | 60 | Возврат Приемник; 61 | 62 | КонецФункции 63 | 64 | Функция СкопироватьСтруктуру(СтруктураИсточник) Экспорт 65 | 66 | СтруктураРезультат = Новый Структура; 67 | 68 | Для Каждого КлючИЗначение Из СтруктураИсточник Цикл 69 | СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение)); 70 | КонецЦикла; 71 | 72 | Возврат СтруктураРезультат; 73 | 74 | КонецФункции 75 | 76 | Функция СкопироватьСоответствие(СоответствиеИсточник) Экспорт 77 | 78 | СоответствиеРезультат = Новый Соответствие; 79 | 80 | Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл 81 | СоответствиеРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение)); 82 | КонецЦикла; 83 | 84 | Возврат СоответствиеРезультат; 85 | 86 | КонецФункции 87 | 88 | Функция СкопироватьМассив(МассивИсточник) Экспорт 89 | 90 | МассивРезультат = Новый Массив; 91 | 92 | Для Каждого Элемент Из МассивИсточник Цикл 93 | МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент)); 94 | КонецЦикла; 95 | 96 | Возврат МассивРезультат; 97 | 98 | КонецФункции 99 | 100 | #КонецОбласти -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗахватитьОбъектыВХранилище.os: -------------------------------------------------------------------------------- 1 | // ЗахватитьОбъектыВХранилище 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельХранилища; // BSLLS:Typo-off 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | 12 | &Пластилин 13 | Перем Логирователь; // BSLLS:Typo-off 14 | 15 | &Пластилин 16 | Перем Emoji; 17 | 18 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт 19 | 20 | Возврат ВыполнитьКомандуСПараметрами(, , , ПараметрыКоманды); 21 | 22 | КонецФункции 23 | 24 | &Асинх 25 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 26 | 27 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 28 | 29 | КонецФункции 30 | 31 | Функция ВыполнитьКомандуСПараметрами(ПоФайлу = Ложь, ИмяФайла = "", 32 | ПроверкаПодключения = Ложь, ПараметрыКоманды = Неопределено) Экспорт // BSLLS:UnusedParameters-off 33 | 34 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 35 | Возврат Ложь; 36 | КонецЕсли; 37 | 38 | СписокМетаданных = Настройки.СписокМетаданных; 39 | Если ПоФайлу 40 | И ПроверкаПодключения = Ложь 41 | И ЗначениеЗаполнено(СписокМетаданных) 42 | И СокрЛП(СписокМетаданных) = "*" Тогда 43 | ПоФайлу = Ложь; 44 | КонецЕсли; 45 | 46 | Если НЕ ПоФайлу Тогда 47 | Логирователь.ВЛог("Захватываю объекты в хранилище"); 48 | Иначе 49 | 50 | ТекстСообщения = "Захватываю"; 51 | Если Настройки.ОбновлятьОбъектыРекурсивно Тогда 52 | ТекстСообщения = ТекстСообщения + " рекурсивно"; 53 | КонецЕсли; 54 | 55 | Если ЗначениеЗаполнено(СписокМетаданных) Тогда 56 | ТекстСообщения = ТекстСообщения + " объекты по списку метаданных: " + Символы.ПС + СписокМетаданных; 57 | Логирователь.ВЛог(ТекстСообщения, , Истина, , Emoji.Звезда()); 58 | Иначе 59 | ТекстСообщения = ТекстСообщения + " объекты в хранилище по файлу "; 60 | Логирователь.ВЛог(ТекстСообщения + ИмяФайла); 61 | КонецЕсли; 62 | 63 | КонецЕсли; 64 | 65 | Хранилище = УправлятельХранилища.Получить(); 66 | 67 | ПолучатьЗахваченныеОбъекты = Истина; 68 | 69 | Если ПоФайлу Тогда 70 | ПутьКФайлуСоСпискомОбъектов = Настройки.ПолныйПутьКФайлуНастроек(ИмяФайла); 71 | Иначе 72 | ПутьКФайлуСоСпискомОбъектов = ""; 73 | КонецЕсли; 74 | 75 | Попытка 76 | Хранилище.ЗахватитьОбъектыВХранилище(ПутьКФайлуСоСпискомОбъектов, 77 | ПолучатьЗахваченныеОбъекты); 78 | Исключение 79 | Если ПроверкаПодключения Тогда 80 | ВызватьИсключение ОписаниеОшибки(); 81 | Иначе 82 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 83 | Возврат Ложь; 84 | КонецЕсли; 85 | КонецПопытки; 86 | 87 | Если НЕ ПоФайлу Тогда 88 | Логирователь.ВЛог("Захват объектов в хранилище выполнен"); 89 | Иначе 90 | Логирователь.ВЛог("Захват объектов в хранилище по файлу " + ИмяФайла + " выполнен"); 91 | КонецЕсли; 92 | 93 | Возврат Истина; 94 | 95 | КонецФункции 96 | 97 | &Желудь 98 | &Прозвище("Команда") 99 | Процедура ПриСозданииОбъекта() 100 | 101 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаПодключитьсяКХранилищу.os: -------------------------------------------------------------------------------- 1 | // ПодключитьсяКХранилищу 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем УправлятельХранилища; // BSLLS:Typo-off 9 | &Пластилин 10 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 11 | &Пластилин 12 | Перем КомандаЗахватитьОбъектыВХранилище; 13 | &Пластилин 14 | Перем КомандаОтменитьЗахватОбъектовВХранилище; 15 | 16 | &Пластилин 17 | Перем Логирователь; // BSLLS:Typo-off 18 | 19 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 20 | 21 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 22 | Возврат Ложь; 23 | КонецЕсли; 24 | 25 | Параметры = ПараметрыКоманды.Параметры; 26 | ИмяРасширения = Параметры.Получить("ИмяРасширения"); 27 | Если Не ЗначениеЗаполнено(ИмяРасширения) Тогда 28 | ИмяРасширения = ""; 29 | КонецЕсли; 30 | 31 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 32 | 33 | ТекстДополнения = ". Расширение - " + ИмяРасширения; 34 | 35 | Иначе 36 | 37 | ТекстДополнения = ""; 38 | 39 | // Проверка что база уже поключена, так быстрее. 40 | Отказ = Ложь; 41 | Подключено = ПодключеноКХранилищу(Отказ); 42 | Если Отказ Тогда 43 | Возврат Ложь; 44 | КонецЕсли; 45 | 46 | Если Подключено Тогда 47 | Логирователь.ВЛог("База к хранилищу подключена"); 48 | Возврат Истина; 49 | КонецЕсли; 50 | 51 | КонецЕсли; 52 | 53 | ТекстСообщения = "Подключение к хранилищу"; 54 | Логирователь.ВЛог(ТекстСообщения + ТекстДополнения); 55 | 56 | Хранилище = УправлятельХранилища.Получить(ИмяРасширения); 57 | 58 | Попытка 59 | ИгнорироватьНаличиеПодключеннойБД = Истина; 60 | ЗаменитьКонфигурациюБД = Истина; 61 | Хранилище.ПодключитьсяКХранилищу(ИгнорироватьНаличиеПодключеннойБД, ЗаменитьКонфигурациюБД); 62 | Исключение 63 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 64 | Возврат Ложь; 65 | КонецПопытки; 66 | 67 | ТекстСообщения = "Подключение к хранилищу выполнено"; 68 | Логирователь.ВЛог(ТекстСообщения + ТекстДополнения); 69 | 70 | Возврат Истина; 71 | 72 | КонецФункции 73 | 74 | Функция ПодключеноКХранилищу(Отказ = Ложь) 75 | 76 | ФайлыНастроек = Настройки.ФайлыНастроек; 77 | 78 | Логирователь.ВЛог("Проверяю подключение базы к хранилищу"); 79 | 80 | ПоФайлу = Истина; 81 | ИмяФайлаОбъектов = ФайлыНастроек.repo_test; 82 | 83 | Подключено = Истина; 84 | 85 | Попытка 86 | КомандаЗахватитьОбъектыВХранилище.ВыполнитьКомандуСПараметрами(ПоФайлу, ИмяФайлаОбъектов, Истина); 87 | КомандаОтменитьЗахватОбъектовВХранилище.ВыполнитьКомандуСПараметрами(ПоФайлу, ИмяФайлаОбъектов, Истина); 88 | Исключение 89 | ОписаниеОшибки = ОписаниеОшибки(); 90 | Если СтрНайти(ОписаниеОшибки, "Ошибка захвата объектов в хранилище") > 0 Тогда 91 | Подключено = Ложь; 92 | Иначе 93 | Логирователь.ВЛог(ОписаниеОшибки, Истина, Истина); 94 | Отказ = Истина; 95 | Возврат Ложь; 96 | КонецЕсли; 97 | КонецПопытки; 98 | 99 | Возврат Подключено; 100 | 101 | КонецФункции 102 | 103 | &Асинх 104 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 105 | 106 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 107 | 108 | КонецФункции 109 | 110 | &Желудь 111 | &Прозвище("Команда") 112 | Процедура ПриСозданииОбъекта() 113 | 114 | КонецПроцедуры -------------------------------------------------------------------------------- /src/Модули/РаботаСФайлами.os: -------------------------------------------------------------------------------- 1 | Функция ПрочитатьYAMLФайл(Знач ПутьКФайлу) Экспорт // BSLLS:LatinAndCyrillicSymbolInWord-off 2 | 3 | Если СтрНачинаетсяС(ПутьКФайлу, "\") Тогда 4 | ПутьКФайлу = ТекущийКаталог() + ПутьКФайлу; 5 | КонецЕсли; 6 | 7 | МенеджерПараметров = Новый МенеджерПараметров(); 8 | МенеджерПараметров.ИспользоватьПровайдерYAML(); 9 | МенеджерПараметров.УстановитьФайлПараметров(ПутьКФайлу); 10 | 11 | МенеджерПараметров.Прочитать(); 12 | Если Не МенеджерПараметров.ЧтениеВыполнено() Тогда 13 | ВызватьИсключение "Файл с настройками не найден по пути: " + ПутьКФайлу; 14 | КонецЕсли; 15 | 16 | Возврат МенеджерПараметров; 17 | 18 | КонецФункции 19 | 20 | Функция ПрочитатьФайлВМассивСтрок(ПутьКФайлу, ВызыватьИсключение = Истина, 21 | Логирователь = Неопределено, Монопольно = Ложь) Экспорт 22 | 23 | СтрокиДанных = Новый Массив; 24 | 25 | Файл = Новый Файл(ПутьКФайлу); 26 | Если Не Файл.Существует() Тогда 27 | ТекстСообщения = "Файл не найден - " + ПутьКФайлу; 28 | ВЛог(ТекстСообщения, ВызыватьИсключение, Логирователь, Истина); 29 | Возврат СтрокиДанных; 30 | КонецЕсли; 31 | 32 | ЧтениеТекста = Новый ЧтениеТекста; 33 | 34 | Попытка 35 | ЧтениеТекста.Открыть(ПутьКФайлу, "UTF-8", , , Монопольно); 36 | Исключение 37 | ВЛог(ОписаниеОшибки(), ВызыватьИсключение, Логирователь, Истина); 38 | Возврат СтрокиДанных; 39 | КонецПопытки; 40 | 41 | СтрокаДанных = ЧтениеТекста.ПрочитатьСтроку(); 42 | Пока СтрокаДанных <> Неопределено Цикл 43 | Если ЗначениеЗаполнено(СтрокаДанных) Тогда 44 | СтрокиДанных.Добавить(СокрЛП(СтрокаДанных)); 45 | КонецЕсли; 46 | СтрокаДанных = ЧтениеТекста.ПрочитатьСтроку(); 47 | КонецЦикла; 48 | 49 | ЧтениеТекста.Закрыть(); 50 | 51 | Возврат СтрокиДанных; 52 | 53 | КонецФункции 54 | 55 | Функция СформироватьИмяФайла(Имя, Расширение, НаДату = Неопределено) Экспорт 56 | 57 | Если НаДату = Неопределено Тогда 58 | НаДату = ТекущаяДата(); 59 | КонецЕсли; 60 | 61 | Возврат Имя 62 | + "_" 63 | + Формат(НаДату, "ДФ=ггггММдд") 64 | + "." 65 | + СокрЛП(Расширение); 66 | 67 | КонецФункции 68 | 69 | Процедура ЗаписатьТекстовыйФайл(Текст, ПутьКФайлу) Экспорт 70 | 71 | ТекстовыйДокумент = Новый ТекстовыйДокумент; 72 | ТекстовыйДокумент.УстановитьТекст(Текст); 73 | 74 | ТекстовыйДокумент.Записать(ПутьКФайлу); 75 | 76 | КонецПроцедуры 77 | 78 | Процедура ДобавитьТекстВФайл(Текст, ПутьКФайлу) Экспорт 79 | 80 | Если НЕ ФайлСуществует(ПутьКФайлу) Тогда 81 | ЗаписатьТекстовыйФайл(Текст, ПутьКФайлу); 82 | Иначе 83 | 84 | ТекстовыйДокумент = Новый ТекстовыйДокумент; 85 | ТекстовыйДокумент.Прочитать(ПутьКФайлу); 86 | 87 | ТекстовыйДокумент.ДобавитьСтроку(Текст); 88 | ТекстовыйДокумент.Записать(ПутьКФайлу); 89 | 90 | КонецЕсли; 91 | 92 | КонецПроцедуры 93 | 94 | Процедура УдалитьФайл(ПутьКФайлу) Экспорт 95 | 96 | Если ФайлСуществует(ПутьКФайлу) Тогда 97 | УдалитьФайлы(ПутьКФайлу); 98 | КонецЕсли; 99 | 100 | КонецПроцедуры 101 | 102 | Функция ФайлСуществует(ПутьКФайлу) Экспорт 103 | 104 | ФайлПоиска = Новый Файл(ПутьКФайлу); 105 | Возврат ФайлПоиска.Существует(); 106 | 107 | КонецФункции 108 | 109 | Процедура ВЛог(ТекстСообщения, ВызыватьИсключение = Истина, Логирователь = Неопределено, Ошибка = Ложь) 110 | 111 | Если ВызыватьИсключение Тогда 112 | ВызватьИсключение ТекстСообщения; 113 | Иначе 114 | Если Логирователь <> Неопределено Тогда 115 | Логирователь.ВЛог(ТекстСообщения, Ошибка); 116 | КонецЕсли; 117 | КонецЕсли; 118 | 119 | КонецПроцедуры -------------------------------------------------------------------------------- /bat/commands/update_all.yaml: -------------------------------------------------------------------------------- 1 | Запуск: 2 | Параметры: 3 | sync_repo: "oscript sync_repo.os" 4 | command: "--Commands \\bat\\commands\\update_all.yaml" 5 | Команды: 6 | - "%sync_repo --ИдентификаторБазы BASE1 %command" 7 | - "%sync_repo --ИдентификаторБазы BASE2 %command" 8 | REPO: 9 | Уведомление: 10 | Параметры: 11 | ОтправлятьСообщенияВТелеграм: true 12 | Приветствие: "Забираю конфигурацию из хранилища через #Пауза. Ответственный #Ответственный #Nobase" 13 | Пауза: 180 14 | Команды: 15 | - ПоказатьПриветствие 16 | - УстановитьПаузу 17 | Команды: 18 | Параметры: 19 | ОтправлятьСообщенияВТелеграм: false 20 | Приветствие: "Работы с базой #ИмяБазы" 21 | Окончание: "Работы с базой #ИмяБазы завершены" 22 | КомментарийПриПомещенииВХранилище: "Обновление #Ответственный" 23 | КлючиЗапускаПредприятия: "/DisableStartupMessages /C ЗапуститьОбновлениеИнформационнойБазы,УдалитьРасширенияИнформационнойБазы" 24 | СниматьБлокировкуРегламентныхЗаданий: false 25 | Команды: 26 | - ПоказатьПриветствие 27 | - ПодключитьсяКХранилищу 28 | - ЗагрузитьКонфигурациюИзХранилища 29 | - ЗаблокироватьИБ 30 | - ОтключитьСеансыИнформационнойБазы 31 | - ОбновитьКонфигурациюБазыДанных 32 | - ПроверитьБлокировкуИБ 33 | - ПроверитьНаличиеАктивныйСеансовИБ 34 | - ЗапуститьВРежимеПредприятия 35 | - ПолучитьВерсиюКонфигурацииИзХранилища 36 | - СнятьБлокировкуИБ 37 | - ПоказатьЗавершение 38 | BASE1: 39 | Команды: 40 | Параметры: 41 | ОтправлятьСообщенияВТелеграм: true 42 | Приветствие: "Обновление базы #ИмяБазы через #Пауза. Ответственный #Ответственный" 43 | Начало: "Начинаю обновление базы #ИмяБазы" 44 | Окончание: "Обновление базы #ИмяБазы выполнено." 45 | Пауза: 0 46 | КлючиЗапускаПредприятия: "/DisableStartupMessages /C ЗапуститьОбновлениеИнформационнойБазы,УдалитьРасширенияИнформационнойБазы" 47 | СниматьБлокировкуРегламентныхЗаданий: true 48 | Команды: 49 | - ПоказатьНачало 50 | - ЗаблокироватьИБ 51 | - ОтключитьСеансыИнформационнойБазы 52 | - ЗагрузитьКонфигурациюИзХранилища 53 | - ОбновитьКонфигурациюБазыДанных 54 | - ПроверитьБлокировкуИБ 55 | - ПроверитьНаличиеАктивныйСеансовИБ 56 | - ЗапуститьВРежимеПредприятия 57 | - СнятьБлокировкуИБ 58 | - ПоказатьЗавершение 59 | BASE2: 60 | Команды: 61 | Параметры: 62 | ОтправлятьСообщенияВТелеграм: true 63 | Приветствие: "Обновление базы #ИмяБазы через #Пауза. Ответственный #Ответственный" 64 | Начало: "Начинаю обновление базы #ИмяБазы" 65 | Окончание: "Обновление базы #ИмяБазы выполнено." 66 | Пауза: 0 67 | КлючиЗапускаПредприятия: "/DisableStartupMessages /C ЗапуститьОбновлениеИнформационнойБазы,УдалитьРасширенияИнформационнойБазы" 68 | СниматьБлокировкуРегламентныхЗаданий: true 69 | Команды: 70 | - ПоказатьНачало 71 | - ЗаблокироватьИБ 72 | - ОтключитьСеансыИнформационнойБазы 73 | - ЗагрузитьКонфигурациюИзХранилища 74 | - ОбновитьКонфигурациюБазыДанных 75 | - ПроверитьБлокировкуИБ 76 | - ПроверитьНаличиеАктивныйСеансовИБ 77 | - ЗапуститьВРежимеПредприятия 78 | - СнятьБлокировкуИБ 79 | - ПоказатьЗавершение -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗахватитьОбъектыВХранилищеПоСпискуИзФайла.os: -------------------------------------------------------------------------------- 1 | // BSLLS:LatinAndCyrillicSymbolInWord-off 2 | // ЗахватитьОбъектыВХранилищеПоСпискуИзФайла 3 | #Использовать "..//../../src/Модули" 4 | 5 | &Пластилин 6 | Перем КомандаЗахватитьОбъектыВХранилище; 7 | 8 | &Пластилин 9 | Перем Настройки; 10 | 11 | Перем ТаблицаМетаданных; 12 | 13 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 14 | 15 | СписокМетаданных = СокрЛП(Настройки.СписокМетаданных); 16 | Если ЗначениеЗаполнено(СписокМетаданных) Тогда 17 | ПреобразоватьДанныеИзСпискаВТаблицуМетаданных(СписокМетаданных); 18 | Иначе 19 | ПутьКФайлу_meta = Настройки.ПолныйПутьКФайлуНастроек(Настройки.ФайлыНастроек.metadata); 20 | ПреобразоватьДанныеИзФайлаВТаблицуМетаданных(ПутьКФайлу_meta); 21 | КонецЕсли; 22 | 23 | ИмяФайлаMetadata_merge = Настройки.ФайлыНастроек.metadata_merge; 24 | ОбработатьТаблицуМетаданныхВXML(ИмяФайлаMetadata_merge); 25 | 26 | Возврат КомандаЗахватитьОбъектыВХранилище.ВыполнитьКомандуСПараметрами(Истина, ИмяФайлаMetadata_merge); 27 | 28 | КонецФункции 29 | 30 | Процедура ПреобразоватьДанныеИзФайлаВТаблицуМетаданных(ПутьКФайлу_meta) 31 | 32 | Метаданные = РаботаСФайлами.ПрочитатьФайлВМассивСтрок(ПутьКФайлу_meta); 33 | ПреобразоватьДанныеИзМассиваВТаблицуМетаданных(Метаданные); 34 | 35 | КонецПроцедуры 36 | 37 | Процедура ПреобразоватьДанныеИзСпискаВТаблицуМетаданных(СписокМетаданных) 38 | 39 | Метаданные = СтрРазделить(СписокМетаданных, Символы.ПС); 40 | ПреобразоватьДанныеИзМассиваВТаблицуМетаданных(Метаданные); 41 | 42 | КонецПроцедуры 43 | 44 | Процедура ПреобразоватьДанныеИзМассиваВТаблицуМетаданных(Метаданные) 45 | 46 | ИмяКонфигурации = Настройки.ИмяКонфигурации; 47 | 48 | Рекурсивно = Настройки.ОбновлятьОбъектыРекурсивно; 49 | 50 | ТаблицаМетаданных.Очистить(); 51 | Для каждого ПолноеИмя Из Метаданные Цикл 52 | 53 | Если НЕ ЗначениеЗаполнено(ПолноеИмя) Тогда 54 | Продолжить; 55 | КонецЕсли; 56 | 57 | НоваяСтрока = ТаблицаМетаданных.Добавить(); 58 | НоваяСтрока.ПолноеИмя = СокрЛП(ПолноеИмя); 59 | 60 | Если ПолноеИмя = ИмяКонфигурации Тогда 61 | НоваяСтрока.Рекурсивно = Ложь; 62 | Иначе 63 | НоваяСтрока.Рекурсивно = Рекурсивно; 64 | КонецЕсли; 65 | 66 | КонецЦикла; 67 | 68 | КонецПроцедуры 69 | 70 | Процедура ОбработатьТаблицуМетаданныхВXML(ИмяФайлаMetadata_merge) 71 | 72 | ПутьКФайлу_merge = Настройки.ПолныйПутьКФайлуНастроек(ИмяФайлаMetadata_merge); 73 | 74 | ЗаписьXML = Новый ЗаписьXML; 75 | ЗаписьXML.ОткрытьФайл(ПутьКФайлу_merge); 76 | 77 | ЗаписьXML.ЗаписатьНачалоЭлемента("Objects"); 78 | ЗаписьXML.ЗаписатьАтрибут("xmlns", XMLСтрока("http://v8.1c.ru/8.3/config/objects")); 79 | ЗаписьXML.ЗаписатьАтрибут("version", XMLСтрока("1.0")); 80 | 81 | Для каждого СтрокаТаблицы Из ТаблицаМетаданных Цикл 82 | 83 | ЗаписьXML.ЗаписатьНачалоЭлемента("Object"); 84 | 85 | ЗаписьXML.ЗаписатьАтрибут("fullName", СтрокаТаблицы.ПолноеИмя); 86 | 87 | Если СтрокаТаблицы.Рекурсивно = Истина Тогда 88 | includeChildObjects = "true"; 89 | Иначе 90 | includeChildObjects = "false"; 91 | КонецЕсли; 92 | ЗаписьXML.ЗаписатьАтрибут("includeChildObjects", includeChildObjects); 93 | 94 | ЗаписьXML.ЗаписатьКонецЭлемента(); 95 | 96 | КонецЦикла; 97 | 98 | ЗаписьXML.ЗаписатьКонецЭлемента(); 99 | ЗаписьXML.Закрыть(); 100 | 101 | КонецПроцедуры 102 | 103 | &Асинх 104 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 105 | 106 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 107 | 108 | КонецФункции 109 | 110 | &Желудь 111 | &Прозвище("Команда") 112 | Процедура ПриСозданииОбъекта() 113 | 114 | ТаблицаМетаданных = Новый ТаблицаЗначений(); 115 | ТаблицаМетаданных.Колонки.Добавить("ПолноеИмя"); 116 | ТаблицаМетаданных.Колонки.Добавить("Рекурсивно", Новый ОписаниеТипов("Булево")); 117 | 118 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаЗапуститьВнешниеОбработкиИзРепозитория.os: -------------------------------------------------------------------------------- 1 | // ЗапуститьВнешниеОбработкиИзРепозитория 2 | #Использовать "..//../../src/Модули" 3 | 4 | Перем КомандаЗапуститьВРежимеПредприятия; 5 | Перем УправлятельГит; // BSLLS:Typo-off 6 | Перем Логирователь; // BSLLS:Typo-off 7 | 8 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт // BSLLS:UnusedParameters-off 9 | 10 | Параметры = ПараметрыКоманды.Параметры; 11 | РабочийКаталог = Параметры.Получить("РабочийКаталог"); 12 | РабочийКаталогПолный = ОбъединитьПути(ТекущийКаталог(), РабочийКаталог); 13 | ИмяРепозитория = Параметры.Получить("ИмяРепозитория"); 14 | 15 | ПропускатьПриОшибке = ПрообразованияТипов.БулевоИзСтроки(Параметры.Получить("ПропускатьПриОшибке")); 16 | 17 | Логирователь.ВЛог("Начинаю запуск внешних обработок из репозитория", , Ложь); 18 | 19 | РезультатКлонирования = КлонироватьРепозиторий(РабочийКаталогПолный, ИмяРепозитория, Параметры); 20 | Если РезультатКлонирования = Ложь И ПропускатьПриОшибке <> Истина Тогда 21 | Возврат РезультатКлонирования; 22 | КонецЕсли; 23 | 24 | КаталогОбработокПолный = КаталогОбработокПолный(РабочийКаталогПолный, ИмяРепозитория); 25 | РезультатВыполнения = ЗапуститьОбработкиИзКаталога(КаталогОбработокПолный); 26 | 27 | Возврат РезультатВыполнения; 28 | 29 | КонецФункции 30 | 31 | Функция ЗапуститьОбработкиИзКаталога(КаталогПолный) 32 | 33 | НайденныеФайлы = НайтиФайлы(КаталогПолный, "*.epf"); 34 | Если НайденныеФайлы.Количество() > 0 Тогда 35 | 36 | Для каждого ИмяФайлаОбработки Из НайденныеФайлы Цикл 37 | 38 | Логирователь.ВЛог("Запускаю обработку: " + ИмяФайлаОбработки); 39 | 40 | ОжидатьВыполнения = Истина; 41 | КлючиЗапуска = КлючЗапускаОбработки(КаталогПолный, ИмяФайлаОбработки) 42 | + " " 43 | + КлючиПараметров(); 44 | КомандаЗапуститьВРежимеПредприятия.ЗапуститьВРежимеПредприятия(ОжидатьВыполнения, КлючиЗапуска); 45 | 46 | КонецЦикла; 47 | 48 | Иначе 49 | Логирователь.ВЛог("Обработок в каталоге: " + КаталогПолный + " не обнаружено"); 50 | КонецЕсли; 51 | 52 | Возврат Истина; 53 | 54 | КонецФункции 55 | 56 | Функция КлючЗапускаОбработки(КаталогОбработокПолный, ИмяФайлабработки) 57 | 58 | КлючЗапуска = СтрШаблон("/Execute ""%1\%2""", КаталогОбработокПолный, ИмяФайлабработки); 59 | Возврат КлючЗапуска; 60 | 61 | КонецФункции 62 | 63 | Функция КаталогОбработокПолный(РабочийКаталог, ИмяРепозитория) 64 | 65 | КаталогРепозитория = ОбъединитьПути(РабочийКаталог, ИмяРепозитория); 66 | 67 | // Пример: 20240701 68 | КаталогОбработок = Формат(ТекущаяДата(), "ДФ=ггММдд"); 69 | 70 | ПолныйПуть = ОбъединитьПути(КаталогРепозитория, КаталогОбработок); 71 | Возврат ПолныйПуть; 72 | 73 | КонецФункции 74 | 75 | Функция КлючиПараметров() 76 | 77 | КлючиПараметров = "ЗапуститьОбработчик;ЗавершитьРаботуСистемы"; 78 | КлючиПараметров = "/C " + """" + КлючиПараметров + """"; 79 | 80 | Возврат КлючиПараметров; 81 | 82 | КонецФункции 83 | Функция КлонироватьРепозиторий(РабочийКаталог, ИмяРепозитория, Параметры) 84 | 85 | АдресРепозитория = Параметры.Получить("АдресРепозитория"); 86 | Токен = Параметры.Получить("Токен"); 87 | 88 | ПутьРепозиторияСТокеном = "https://oauth2:" 89 | + Токен 90 | + "@" 91 | + АдресРепозитория 92 | + ".git"; 93 | 94 | Результат = УправлятельГит.КлонироватьИлиПолучитьИзмененияРепозитория(РабочийКаталог, 95 | ИмяРепозитория, 96 | ПутьРепозиторияСТокеном); 97 | Возврат Результат; 98 | 99 | КонецФункции 100 | 101 | &Асинх 102 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 103 | 104 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 105 | 106 | КонецФункции 107 | 108 | &Желудь 109 | &Прозвище("Команда") 110 | Процедура ПриСозданииОбъекта(&Пластилин("КомандаЗапуститьВРежимеПредприятия") _КомандаЗапуститьВРежимеПредприятия, 111 | &Пластилин("УправлятельГит") _УправлятельГит, 112 | &Пластилин("Логирователь") _Логирователь) 113 | 114 | КомандаЗапуститьВРежимеПредприятия = _КомандаЗапуститьВРежимеПредприятия; 115 | УправлятельГит = _УправлятельГит; 116 | Логирователь = _Логирователь; 117 | 118 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/Настройки.os: -------------------------------------------------------------------------------- 1 | // BSLLS:ExportVariables-off 2 | 3 | // Массивы данных 4 | Перем КомандыВыполнения Экспорт; // порядок выполнения команд 5 | Перем ГрупповыеКоманды Экспорт; 6 | 7 | // Соответствия параметров из конфига 8 | &Деталька("Общие") 9 | Перем ПараметрыОбщие Экспорт; 10 | Перем ПараметрыРасписания Экспорт; 11 | Перем ПараметрыПлатформы Экспорт; 12 | Перем ПараметрыБазы Экспорт; 13 | Перем ПараметрыКонфигурации Экспорт; 14 | 15 | // Структуры собранных параметров 16 | Перем ПараметрыПодключения Экспорт; 17 | Перем ПараметрыКоманд Экспорт; 18 | Перем ПараметрыТелеграм Экспорт; 19 | Перем ПараметрыDebug Экспорт; 20 | Перем ФайлыНастроек Экспорт; 21 | 22 | Перем Идентификатор Экспорт; 23 | Перем ИмяКонфигурации Экспорт; 24 | 25 | // Контроль расписания 26 | Перем Расписание Экспорт; 27 | 28 | // Платформа 29 | Перем ПутьКПлатформе Экспорт; 30 | Перем ВерсияПлатформы Экспорт; 31 | 32 | // База 33 | Перем ИмяБазы Экспорт; 34 | Перем СерверБазы Экспорт; 35 | Перем ПортБазы Экспорт; 36 | 37 | // RAS 38 | Перем СерверRAS Экспорт; 39 | Перем ПортRAS Экспорт; 40 | 41 | // Конфигуратор 42 | Перем ЛогинККонфигуратору Экспорт; 43 | Перем ПарольККонфигуратору Экспорт; 44 | 45 | // Хранилище 46 | Перем ПутьКХранилищу Экспорт; 47 | Перем ЛогинКХранилищу Экспорт; 48 | Перем ПарольКХранилищу Экспорт; 49 | 50 | // SQL 51 | Перем ТипСУБД Экспорт; 52 | Перем СерверSQL Экспорт; 53 | Перем ИмяБазыSQL Экспорт; 54 | Перем ИмяПользователяSQL Экспорт; 55 | Перем ПарольSQL Экспорт; 56 | 57 | // Блокировка 58 | Перем СообщениеПриБлокировкиИБ Экспорт; 59 | Перем КодДоступаПриБлокировкиИБ Экспорт; 60 | 61 | // Соответствие расширений конфигурации со структурой настроек 62 | // Имя 63 | // ПутьКХранилищу 64 | // ЛогинКХранилищу 65 | // ПарольКХранилищу 66 | Перем РасширенияКонфигурации Экспорт; 67 | 68 | // Каталоги 69 | Перем ПутьККаталогуCF Экспорт; 70 | Перем ПутьККаталогуCFe Экспорт; 71 | 72 | // Доп. параметры 73 | Перем ИдентификаторБазы Экспорт; 74 | Перем ИдентификаторГрупповыхКоманд Экспорт; 75 | Перем РежимDebug Экспорт; 76 | Перем ПозицияВГрупповой Экспорт; 77 | Перем ПутьКФайлуБлокировкиЗапуска Экспорт; 78 | Перем Фоново Экспорт; 79 | Перем ИспользоватьPowerShell Экспорт; 80 | Перем ПаузаПередЗапуском Экспорт; 81 | Перем СписокМетаданных Экспорт; 82 | Перем ОбновлятьОбъектыРекурсивно Экспорт; 83 | Перем ИспользоватьДинамическоеОбновление Экспорт; 84 | Перем ОставитьБлокировкуИБ Экспорт; 85 | 86 | // autumn-properties.yml; 87 | &Деталька("Общие.Ответственный") 88 | Перем Ответственный Экспорт; 89 | &Деталька("Общие.Debug.ФайлНастроек") 90 | Перем Debug_ФайлНастроек Экспорт; 91 | 92 | // Личные 93 | &Деталька("Личные.Конфигуратор.Логин") 94 | Перем ЛичныеЛогинККонфигуратору Экспорт; 95 | &Деталька("Личные.Конфигуратор.Пароль") 96 | Перем ЛичныеПарольККонфигуратору Экспорт; 97 | 98 | Функция ПолныйПутьКФайлуНастроек(ИмяФайла, КаталогНастроек = Неопределено) Экспорт 99 | 100 | Если КаталогНастроек = Неопределено Тогда 101 | КаталогНастроек = ФайлыНастроек.Каталог; 102 | КонецЕсли; 103 | 104 | Возврат ТекущийКаталог() 105 | + "\" 106 | + КаталогНастроек 107 | + "\" 108 | + ИмяФайла; 109 | 110 | КонецФункции 111 | 112 | Функция СформироватьПутьКФайлуБлокировкиЗапуска(Позиция) Экспорт 113 | 114 | стрПозиция = Формат(Позиция, "ЧН=; ЧГ="); 115 | ИмяФайла = "synclock_" + стрПозиция; 116 | ПутьКФайлу = ОбъединитьПути(ТекущийКаталог(), ИмяФайла); 117 | ПутьКФайлу = ПутьКФайлу + ".txt"; 118 | 119 | Возврат ПутьКФайлу; 120 | 121 | КонецФункции 122 | 123 | &Желудь 124 | Процедура ПриСозданииОбъекта() 125 | 126 | КомандыВыполнения = Новый Массив; 127 | ГрупповыеКоманды = Новый Массив; 128 | 129 | ПараметрыПодключения = Новый Структура; 130 | ПараметрыКоманд = Новый Структура; 131 | ПараметрыТелеграм = Новый Структура; 132 | ПараметрыDebug = Новый Структура; 133 | ФайлыНастроек = Новый Структура; 134 | 135 | ИдентификаторБазы = ""; 136 | ИдентификаторГрупповыхКоманд = ""; 137 | 138 | Расписание = Новый Массив; 139 | 140 | Фоново = Ложь; 141 | ИспользоватьPowerShell = Ложь; 142 | 143 | РежимDebug = Истина; 144 | ПозицияВГрупповой = 0; 145 | 146 | Идентификатор = ""; 147 | СписокМетаданных = ""; 148 | 149 | РасширенияКонфигурации = Новый Соответствие; 150 | ПаузаПередЗапуском = 0; 151 | 152 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаОтключитьСеансыИнформационнойБазы.os: -------------------------------------------------------------------------------- 1 | // ОтключитьСеансыИнформационнойБазы 2 | #Использовать "..//../../src/Модули" 3 | #Использовать async 4 | 5 | &Пластилин 6 | Перем Настройки; 7 | 8 | &Пластилин 9 | Перем УправлятельКластера; // BSLLS:Typo-off 10 | &Пластилин 11 | Перем УправлятельКластераАсинх; // BSLLS:Typo-off 12 | 13 | &Пластилин 14 | Перем Логирователь; // BSLLS:Typo-off 15 | 16 | Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт 17 | 18 | Если НЕ ТребуетВыполнения() Тогда 19 | Возврат Истина; 20 | КонецЕсли; 21 | 22 | Проверка = Общий.СвойствоСтруктуры(ПараметрыКоманды, "Проверка", Ложь); 23 | Возврат ВыполнитьКомандуСПараметрами(, , , Проверка, ПараметрыКоманды); 24 | 25 | КонецФункции 26 | 27 | &Асинх 28 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 29 | 30 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 31 | 32 | КонецФункции 33 | 34 | Функция ТребуетВыполнения() 35 | 36 | Если Настройки.ИспользоватьДинамическоеОбновление Тогда 37 | Возврат Ложь; 38 | КонецЕсли; 39 | 40 | Возврат Истина; 41 | 42 | КонецФункции 43 | 44 | Функция ВыполнитьКомандуСПараметрами(ПопыткаОтключения = 1, 45 | КоличествоПопыток = 10, 46 | ВыводитьЛог = Истина, 47 | Проверка = Ложь, 48 | ПараметрыКоманды = Неопределено) // BSLLS:UnusedParameters-off 49 | 50 | 51 | Параметры = ПараметрыКоманды.Параметры; 52 | 53 | ПриложенияИсключения = Параметры.Получить("ПриложенияИсключения"); 54 | Если ПриложенияИсключения = Неопределено Тогда 55 | ПриложенияИсключения = ""; 56 | КонецЕсли; 57 | 58 | Кластер = УправлятельКластера.Получить(); 59 | 60 | ВТелеграм = НЕ Проверка; 61 | 62 | Если ВыводитьЛог Тогда 63 | Если Проверка Тогда 64 | Логирователь.ВЛог("Проверяю наличие активных сеансов ИБ", , Ложь); 65 | Иначе 66 | Если ПопыткаОтключения = 1 Тогда 67 | Логирователь.ВЛог("Отключаю сеансы и соединения ИБ", , ВТелеграм); 68 | КонецЕсли; 69 | Логирователь.ВЛог("Попытка №" + Строка(ПопыткаОтключения) + " отключения сеансов и соединений ИБ"); 70 | КонецЕсли; 71 | КонецЕсли; 72 | 73 | ПараметрыПодключения = Настройки.ПараметрыПодключения; 74 | ИмяБазы = ПараметрыПодключения.ИмяБазы; 75 | 76 | КоличествоИсключений = 0; 77 | 78 | Попытка 79 | ОтключитьСеансыИнформационнойБазы(ИмяБазы, Кластер, ПриложенияИсключения, КоличествоИсключений); 80 | Исключение 81 | Логирователь.ВЛог(ОписаниеОшибки(), Ложь, Истина); // не уходим, пытаемся повторно запустить 82 | КонецПопытки; 83 | 84 | Попытка 85 | ТаблицаСеансов = Кластер.СписокСеансовИнформационнойБазы(ИмяБазы); 86 | Исключение 87 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 88 | Возврат Ложь; 89 | КонецПопытки; 90 | 91 | Если ТаблицаСеансов.Количество() - КоличествоИсключений > 0 Тогда 92 | 93 | ПопыткаОтключения = ПопыткаОтключения + 1; 94 | Если ПопыткаОтключения > КоличествоПопыток Тогда 95 | Логирователь.ВЛог("Не удалось отключить соединения ИБ", Истина, ВТелеграм); 96 | Возврат Ложь; 97 | Иначе 98 | ВыполнитьКомандуСПараметрами(ПопыткаОтключения, КоличествоПопыток, ВыводитьЛог, Проверка, ПараметрыКоманды); 99 | КонецЕсли; 100 | 101 | ПопыткаОтключения = ПопыткаОтключения + 1; 102 | 103 | КонецЕсли; 104 | 105 | Если ВыводитьЛог Тогда 106 | Если Проверка Тогда 107 | Логирователь.ВЛог("Проверка наличие активных сеансов выполнена"); 108 | Иначе 109 | Логирователь.ВЛог("Сеансы и соединения ИБ отключены"); 110 | КонецЕсли; 111 | КонецЕсли; 112 | 113 | Возврат Истина; 114 | 115 | КонецФункции 116 | 117 | Функция ОтключитьСеансыИнформационнойБазы(ИмяБазы, Кластер, ПриложенияИсключения = "", КоличествоИсключений = 0) 118 | 119 | Ждем = Новый Массив(); 120 | 121 | СеансыБазы = Кластер.СписокСеансовИнформационнойБазы(ИмяБазы); 122 | 123 | ПаузаМеждуВызовами = УправлятельКластераАсинх.ПаузаМеждуВызовами(); 124 | КоличествоОперацийЗаВызов = УправлятельКластераАсинх.КоличествоОперацийЗаВызов(); 125 | 126 | КоличествоСеансов = СеансыБазы.Количество(); 127 | СеансыКОтключению = Новый Массив; 128 | ПозицияСеанса = 0; 129 | 130 | Для Каждого Сеанс Из СеансыБазы Цикл 131 | 132 | ПозицияСеанса = ПозицияСеанса + 1; 133 | 134 | Если ЗначениеЗаполнено(ПриложенияИсключения) 135 | И СтрНайти(ПриложенияИсключения, Сеанс.Приложение) > 0 Тогда 136 | 137 | КоличествоИсключений = КоличествоИсключений + 1; 138 | Продолжить; 139 | 140 | КонецЕсли; 141 | 142 | СеансыКОтключению.Добавить(Сеанс); 143 | Если СеансыКОтключению.Количество() >= КоличествоОперацийЗаВызов 144 | Или ПозицияСеанса = КоличествоСеансов Тогда 145 | 146 | СеансыКОтключениюКопия = Общий.СкопироватьМассив(СеансыКОтключению); 147 | Обещание = УправлятельКластераАсинх.ОтключитьСеансыИнформационнойБазы(Кластер, СеансыКОтключениюКопия); 148 | Ждем.Добавить(Обещание); 149 | 150 | СеансыКОтключению.Очистить(); 151 | 152 | Если ПозицияСеанса < КоличествоСеансов Тогда 153 | Приостановить(ПаузаМеждуВызовами); 154 | КонецЕсли; 155 | 156 | КонецЕсли; 157 | 158 | КонецЦикла; 159 | 160 | Если Ждем.Количество() = 0 Тогда 161 | Возврат Истина; 162 | КонецЕсли; 163 | 164 | Обещания.ОжидатьВсе(Ждем); 165 | 166 | Для каждого Обещание Из Ждем Цикл 167 | 168 | Результат = Обещание.Получить(); 169 | Если Результат <> Истина Тогда 170 | Возврат Ложь; 171 | КонецЕсли; 172 | 173 | КонецЦикла; 174 | 175 | Возврат Истина; 176 | 177 | КонецФункции 178 | 179 | &Желудь 180 | &Прозвище("Команда") 181 | Процедура ПриСозданииОбъекта() 182 | 183 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/ОбработкаРезультатаSQL.os: -------------------------------------------------------------------------------- 1 | &Пластилин 2 | Перем Логирователь; // BSLLS:Typo-off 3 | 4 | Функция Обработать(Результат, Команда, ТипКоманды, ПараметрыКоманды) Экспорт 5 | 6 | ПараметрыСкрипта = ПараметрыКоманды.Параметры; 7 | Имя = ПараметрыСкрипта.Получить("Имя"); 8 | 9 | Если ЭтоЗапрос(ТипКоманды) Тогда 10 | ЭтоЗапрос = Истина; 11 | ПредставлениеКоманды = "Запрос " + Имя; 12 | Иначе 13 | ЭтоЗапрос = Ложь; 14 | ПредставлениеКоманды = "Скрипт " + Имя; 15 | КонецЕсли; 16 | 17 | Если Результат = Неопределено Тогда 18 | Логирователь.ВЛог("Не удалось выполнить - " + ПредставлениеКоманды + " СУБД"); 19 | Возврат Ложь; 20 | КонецЕсли; 21 | 22 | Если ЭтоЗапрос Тогда 23 | Возврат ОбработатьРезультатЗапроса(Результат, Команда, Имя, ПараметрыКоманды); 24 | Иначе 25 | Возврат ОбработатьРезультатВыполненияСкрипта(Результат, Команда, Имя, ПараметрыКоманды); 26 | КонецЕсли; 27 | 28 | КонецФункции 29 | 30 | Функция ОбработатьРезультатВыполненияСкрипта(Результат, Команда, Имя, ПараметрыКоманды) // BSLLS:UnusedParameters-off 31 | 32 | ПараметрыСкрипта = ПараметрыКоманды.Параметры; 33 | ОжидатьРезультат = ПараметрыСкрипта.Получить("ОжидатьРезультат"); 34 | Если ОжидатьРезультат = Неопределено Тогда 35 | ОжидатьРезультат = 1; 36 | Иначе 37 | ОжидатьРезультат = Число(ОжидатьРезультат); 38 | КонецЕсли; 39 | 40 | Если Результат = ОжидатьРезультат Тогда 41 | Возврат Истина; 42 | Иначе 43 | ТекстОшибки = " 44 | |Не верный результат выполнения скрипта " + Имя + ". 45 | | Результат: " + Строка(Результат) + " 46 | | Ожидаем: " + Строка(ОжидатьРезультат); 47 | Логирователь.ВЛог(ТекстОшибки, Истина, , , , Ложь); 48 | Возврат Ложь; 49 | КонецЕсли; 50 | 51 | КонецФункции 52 | 53 | Функция ОбработатьРезультатЗапроса(Результат, Команда, Имя, ПараметрыКоманды) // BSLLS:UnusedParameters-off 54 | 55 | ТипРезультата = ТипЗнч(Результат); 56 | Если ТипРезультата <> Тип("ТаблицаЗначений") Тогда 57 | Логирователь.ВЛог("Не определен тип результата запроса - " + Имя + ", тип: " + Строка(ТипРезультата)); 58 | Возврат Ложь; 59 | КонецЕсли; 60 | 61 | ПараметрыСкрипта = ПараметрыКоманды.Параметры; 62 | ОжидатьКоличествоСтрок = ПараметрыСкрипта.Получить("ОжидатьКоличествоСтрок"); 63 | Если ОжидатьКоличествоСтрок <> Неопределено Тогда 64 | Возврат ОбработатьРезультатЗапросаПоКоличествуСтрок(Результат, ОжидатьКоличествоСтрок, 65 | Команда, Имя, ПараметрыКоманды); 66 | Иначе 67 | Возврат ВывестиРезультатЗапроса(Результат, Команда, Имя, ПараметрыКоманды); 68 | КонецЕсли; 69 | 70 | КонецФункции 71 | 72 | Функция ОбработатьРезультатЗапросаПоКоличествуСтрок(Результат, ОжидатьКоличествоСтрок, Команда, Имя, ПараметрыКоманды) 73 | 74 | ОжидатьКоличествоСтрок = Число(ОжидатьКоличествоСтрок); 75 | 76 | КоличествоСтрок = Результат.Количество(); 77 | 78 | Если КоличествоСтрок = ОжидатьКоличествоСтрок Тогда 79 | Возврат Истина; 80 | КонецЕсли; 81 | 82 | ПараметрыСкрипта = ПараметрыКоманды.Параметры; 83 | 84 | ПовторныхОтправок = ПараметрыСкрипта.Получить("ПовторныхОтправок"); 85 | Если ПовторныхОтправок = Неопределено Тогда 86 | ПовторныхОтправок = 0; 87 | Иначе 88 | ПовторныхОтправок = Число(ПовторныхОтправок); 89 | КонецЕсли; 90 | 91 | ПовторнаяОтправка = ПараметрыСкрипта.Получить("ПовторнаяОтправка"); 92 | Если ПовторнаяОтправка = Неопределено Тогда 93 | ПовторнаяОтправка = 0; 94 | Иначе 95 | ПовторнаяОтправка = Число(ПовторнаяОтправка); 96 | КонецЕсли; 97 | 98 | ПовторнаяОтправка = ПовторнаяОтправка + 1; 99 | 100 | ТекстСообщения = " 101 | |Результат выполнения запроса - " + Имя + " 102 | | Количество строк: " + Строка(КоличествоСтрок) + " 103 | | Ожидаемых: " + Строка(ОжидатьКоличествоСтрок); 104 | 105 | Если ПовторнаяОтправка > ПовторныхОтправок Тогда 106 | Логирователь.ВЛог(ТекстСообщения, Истина, , , , Ложь); 107 | Возврат Ложь; 108 | КонецЕсли; 109 | 110 | СекундаМлс = 1000; 111 | ПаузаСекунд = ПараметрыСкрипта.Получить("Пауза"); 112 | Если ПаузаСекунд <> Неопределено Тогда 113 | ПаузаСекунд = Число(ПаузаСекунд); 114 | Приостановить(ПаузаСекунд * СекундаМлс); 115 | КонецЕсли; 116 | 117 | ПараметрыСкрипта.Вставить("ПовторнаяОтправка", ПовторнаяОтправка); 118 | ПараметрыКоманды.Вставить("Параметры", ПараметрыСкрипта); 119 | 120 | ТекстСообщения = ТекстСообщения + " 121 | |Повторное выполнение запроса - " + Имя 122 | + ". Попытка №" + Строка(ПовторнаяОтправка); 123 | Логирователь.Отладка(ТекстСообщения); 124 | 125 | Возврат Команда.ВыполнитьКоманду(ПараметрыКоманды); 126 | 127 | КонецФункции 128 | 129 | Функция ВывестиРезультатЗапроса(ТаблицаРезультата, Команда, Имя, ПараметрыКоманды) // BSLLS:UnusedParameters-off 130 | 131 | ТекстНачало = "Результат запроса: " + Имя; 132 | Если ТаблицаРезультата.Количество() = 0 Тогда 133 | Логирователь.ВЛог(ТекстНачало + " - Пусто"); 134 | Возврат Истина; 135 | КонецЕсли; 136 | 137 | ТекстРезультата = ТекстНачало + Символы.ПС; 138 | НомерПП = 0; 139 | Для каждого СтрокаТаблицы Из ТаблицаРезультата Цикл 140 | НомерПП = НомерПП + 1; 141 | ТекстРезультата = " Строка №" + Строка(НомерПП); 142 | Для каждого Колонка Из ТаблицаРезультата.Колонки Цикл 143 | ИмяКолонки = Колонка.Имя; 144 | 145 | Значение = СокрЛП(СтрокаТаблицы[ИмяКолонки]); 146 | ТекстРезультата = ТекстРезультата + Символы.ПС + " " + ИмяКолонки + ": " + Значение; 147 | 148 | КонецЦикла; 149 | Логирователь.ВЛог(Символы.ПС + ТекстРезультата, , , , , Ложь); 150 | КонецЦикла; 151 | 152 | РезультатВозврата = Истина; 153 | Возврат РезультатВозврата; 154 | 155 | КонецФункции 156 | 157 | Функция ЭтоЗапрос(ТипКоманды) 158 | Возврат ТипКоманды = "Запрос"; 159 | КонецФункции 160 | 161 | &Желудь 162 | &Прозвище("ОбработчикРезультатаSQL") 163 | Процедура ПриСозданииОбъекта() 164 | КонецПроцедуры -------------------------------------------------------------------------------- /src/commands/Классы/КомандаОбновитьКонфигурациюБазыДанных.os: -------------------------------------------------------------------------------- 1 | // ОбновитьКонфигурациюБазыДанных 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем УправлятельКонфигуратора; 6 | &Пластилин 7 | Перем КомандаОтключитьКонфигураторОтИнформационнойБазы; 8 | 9 | &Пластилин 10 | Перем Логирователь; // BSLLS:Typo-off 11 | 12 | &Пластилин 13 | Перем Настройки; // BSLLS:Typo-off 14 | 15 | // Параметры 16 | // РежимРеструктуризации - Первый или Второй 17 | Функция ВыполнитьКоманду(ПараметрыКоманды, // BSLLS:MissingReturnedValueDescription-off 18 | Знач РежимРеструктуризации = Неопределено) Экспорт 19 | 20 | Если Не КомандаОтключитьКонфигураторОтИнформационнойБазы.ВыполнитьКоманду() Тогда 21 | Возврат Ложь; 22 | КонецЕсли; 23 | 24 | Параметры = ПараметрыКоманды.Параметры; 25 | 26 | Если РежимРеструктуризации = Неопределено Тогда 27 | РежимРеструктуризации = Параметры.Получить("РежимРеструктуризации"); 28 | КонецЕсли; 29 | 30 | ИмяРасширения = Параметры.Получить("ИмяРасширения"); 31 | Если Не ЗначениеЗаполнено(ИмяРасширения) Тогда 32 | ИмяРасширения = ""; 33 | КонецЕсли; 34 | 35 | Конфигуратор = УправлятельКонфигуратора.Получить(); 36 | 37 | ДинамическоеОбновление = Настройки.ИспользоватьДинамическоеОбновление; 38 | 39 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 40 | ТекстДополнения = ". Расширение - " + ИмяРасширения; 41 | РежимРеструктуризации = Неопределено; 42 | ВТелеграм = Ложь; 43 | Иначе 44 | 45 | ТекстДополнения = ""; 46 | ВТелеграм = Истина; 47 | 48 | Если ДинамическоеОбновление Тогда 49 | РежимРеструктуризации = Неопределено; 50 | Иначе 51 | РежимРеструктуризации = ОпределитьРежимРеструктуризации(РежимРеструктуризации, Конфигуратор); 52 | КонецЕсли; 53 | 54 | КонецЕсли; 55 | 56 | ТекстСообщения = "Начинаю обновление конфигурации базы данных" + ТекстДополнения; 57 | Если ДинамическоеОбновление Тогда 58 | ТекстСообщения = СтрЗаменить(ТекстСообщения, "обновление", "динамическое обновление"); 59 | КонецЕсли; 60 | Если ЗначениеЗаполнено(РежимРеструктуризации) Тогда 61 | ТекстСообщения = ТекстСообщения + ". Режим реструктуризации: " + РежимРеструктуризации; 62 | КонецЕсли; 63 | Логирователь.ВЛог(ТекстСообщения, , ВТелеграм); 64 | 65 | Начало = ТекущаяУниверсальнаяДатаВМиллисекундах(); 66 | 67 | ПредупрежденияКакОшибки = Ложь; 68 | ДинамическоеОбновление = Настройки.ИспользоватьДинамическоеОбновление; 69 | 70 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 71 | 72 | НаСервере = Ложь; // Расширения обновляются только на клиенте 73 | 74 | Попытка 75 | Конфигуратор.ОбновитьКонфигурациюБазыДанных(ПредупрежденияКакОшибки, 76 | НаСервере, 77 | ДинамическоеОбновление, 78 | ИмяРасширения); 79 | Исключение 80 | Логирователь.ВЛог(ОписаниеОшибки(), Истина, Истина); 81 | Возврат Ложь; 82 | КонецПопытки; 83 | 84 | Иначе 85 | 86 | ЕстьОшибка = Ложь; 87 | ОписаниеОшибки = ""; 88 | 89 | Попытка 90 | Конфигуратор.ОбновитьКонфигурациюБазыДанныхНаСервере(ПредупрежденияКакОшибки, 91 | ДинамическоеОбновление, 92 | РежимРеструктуризации); 93 | Исключение 94 | ЕстьОшибка = Истина; 95 | ОписаниеОшибки = ОписаниеОшибки(); 96 | Логирователь.ВЛог(ОписаниеОшибки, Истина, Истина); 97 | КонецПопытки; 98 | 99 | Если ЕстьОшибка Тогда 100 | Возврат ОбработчикОшибокОбновления(ОписаниеОшибки, ПараметрыКоманды, ВТелеграм); 101 | КонецЕсли; 102 | 103 | КонецЕсли; 104 | 105 | Конец = ТекущаяУниверсальнаяДатаВМиллисекундах(); 106 | 107 | ВремяОбновления = Конец - Начало; 108 | Логирователь.ВЛог("Конфигурация базы данных обновлена" + ТекстДополнения); 109 | 110 | Если НЕ ЗначениеЗаполнено(ИмяРасширения) Тогда 111 | ЗафиксироватьВремяОбновления(ВремяОбновления); 112 | КонецЕсли; 113 | 114 | Возврат Истина; 115 | 116 | КонецФункции 117 | 118 | Функция ОбработчикОшибокОбновления(ОписаниеОшибки, ПараметрыКоманды, ВТелеграм = Ложь) 119 | 120 | Если Не ЕстьЗначениеВСтрокеИзМассиваСтрок(ОписаниеОшибки, ОшибкиОбновления()) 121 | И ЕстьЗначениеВСтрокеИзМассиваСтрок(ОписаниеОшибки, ОшибкиПереходаНаПервыйРежим()) Тогда 122 | 123 | Логирователь.ВЛог("Повторное обновление в первом режиме реструктуризации", , ВТелеграм); 124 | 125 | РежимРеструктуризации = "Первый"; 126 | Возврат ВыполнитьКоманду(ПараметрыКоманды, РежимРеструктуризации); 127 | 128 | Иначе 129 | Возврат Ложь; // Фиксируем ошибку 130 | КонецЕсли; 131 | 132 | КонецФункции 133 | 134 | Функция ОшибкиОбновления() 135 | 136 | мОшибки = Новый Массив(); 137 | мОшибки.Добавить("Записи регистра сведений стали неуникальными"); 138 | Возврат мОшибки; 139 | 140 | КонецФункции 141 | 142 | Функция ОшибкиПереходаНаПервыйРежим() 143 | 144 | мОшибки = Новый Массив(); 145 | мОшибки.Добавить("оптимизированного механизма обновления"); 146 | мОшибки.Добавить("Не определен путь до каталога установки Java"); 147 | Возврат мОшибки; 148 | 149 | КонецФункции 150 | 151 | Функция ЕстьЗначениеВСтрокеИзМассиваСтрок(ЗначениеСтроки, мСтроки) 152 | 153 | Для каждого СтрокаПоика Из мСтроки Цикл 154 | Если СтрНайти(ЗначениеСтроки, СтрокаПоика) > 0 Тогда 155 | Возврат Истина; 156 | КонецЕсли; 157 | КонецЦикла; 158 | 159 | Возврат Ложь; 160 | 161 | КонецФункции 162 | 163 | Функция ОпределитьРежимРеструктуризации(Режим, Конфигуратор) 164 | 165 | Если Режим = "Первый" Тогда 166 | Возврат Конфигуратор.РежимыРеструктуризации().Первый; 167 | ИначеЕсли Режим = "Второй" Тогда 168 | Возврат Конфигуратор.РежимыРеструктуризации().Второй; 169 | Иначе 170 | Возврат Неопределено; 171 | КонецЕсли; 172 | 173 | КонецФункции 174 | 175 | Процедура ЗафиксироватьВремяОбновления(ВремяОбновления) 176 | 177 | Миллисекунда = 1000; 178 | Минута = 60; 179 | ВремяОбновленияБазыВМинутах = ВремяОбновления / Миллисекунда / Минута; 180 | УправлятельКонфигуратора.ВремяОбновленияБазы_Установить(ВремяОбновленияБазыВМинутах); 181 | 182 | КонецПроцедуры 183 | &Асинх 184 | Функция ВыполнитьКомандуАсинх(ПараметрыКоманды) Экспорт // BSLLS:Typo-off 185 | 186 | Возврат РаботаСКомандами.ПереопределитьВыполнитьКомандуАсинх(ПараметрыКоманды, ЭтотОбъект); 187 | 188 | КонецФункции 189 | 190 | &Желудь 191 | &Прозвище("Команда") 192 | Процедура ПриСозданииОбъекта() 193 | 194 | КонецПроцедуры -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | @Library("shared-libraries") 2 | 3 | import io.libs.Utils 4 | import io.libs.Telegram 5 | import groovy.transform.Field 6 | 7 | def utils = new Utils() 8 | 9 | @Field 10 | List jenkinsAgent_values = ['DEV-1C-UPD', 'DEV-1C', 'v_silchenkov'] 11 | 12 | @Field 13 | List command_file_values = ['update_PP' 14 | ] 15 | 16 | pipeline { 17 | 18 | parameters { 19 | 20 | choice(name: 'command_file', 21 | choices: (params.command_file ? [params.command_file] : []) + 22 | (command_file_values - 23 | (params.command_file ? [params.command_file] : [])), 24 | description: 'Сценарий') 25 | 26 | choice(name: 'jenkinsAgent', 27 | choices: (params.jenkinsAgent ? [params.jenkinsAgent] : []) + 28 | (jenkinsAgent_values - 29 | (params.jenkinsAgent ? [params.jenkinsAgent] : [])), 30 | description: 'Нода дженкинса, на которой запускать пайплайн. По умолчанию master') 31 | 32 | text(defaultValue: "${env.listMetadataBuild}", description: 'Список метаданных, которые требуется обновить. Используется в сценариях с префиксом \"meta_\".' + '\n' +'Напишите символ *, чтобы обновить полностью все метаданные.', name: 'listMetadataBuild') 33 | booleanParam(defaultValue: "${env.includeChildObjects}", description: 'Обновлять объекты из списка метаданных рекурсивно', name: 'includeChildObjects') 34 | booleanParam(defaultValue: false, description: 'Использовать динамическое обновление', name: 'dynamicUpdate') 35 | booleanParam(defaultValue: false, description: 'Оставить блокировку ИБ', name: 'keepLockIB') 36 | string(defaultValue: "${env.pausePredBuild}", description: 'Пауза после отправки уведомления и запуском сценария (в секундах). Позволяет переопределить паузу из настроек по умолчанию (5 мин), если она включена в сценарии. (0 - оставить по умолчанию)', name: 'pausePredBuild') 37 | string(defaultValue: "1", description: 'Начать с указанной позиции. Использовать, если при обновлении вышла ошибка и нужно после исправления продолжить сценарий', name: 'startFromPosition') 38 | string(defaultValue: "${env.baseID}", description: 'Идентификатор базы. Используется в сценариях с постфиксом base_ID', name: 'baseID') 39 | string(defaultValue: "${env.platformID}", description: 'Идентификатор используемой платформы для базы base_ID. Используется в сценариях с постфиксом base_ID', name: 'platformID') 40 | booleanParam(defaultValue: "${env.sendMessageStatusJob}", description: 'Отправлять сообщение о статусе задания Jenkins', name: 'sendMessageStatusJob') 41 | booleanParam(defaultValue: "${env.debug}", description: 'Отладка', name: 'debug') 42 | } 43 | 44 | agent { 45 | label "${(env.jenkinsAgent == null || env.jenkinsAgent == 'null') ? "master" : env.jenkinsAgent}" 46 | } 47 | environment { 48 | LOGOS_LEVEL = logos_level() 49 | SYNC_REPO_BUILD_USER = build_user() 50 | SYNC_REPO_UPDATE_DYNAMIC = dynamicUpdate() 51 | SYNC_REPO_KEEP_LOCK_IB = keepLockIB() 52 | SYNC_REPO_BACKGROUND = true 53 | SYNC_REPO_USEPOWERSHELL = true 54 | SYNC_REPO_PAUSE_PRED_BUILD = pausePredBuildToInt() 55 | SYNC_REPO_BUILD_STARTFROMPOSITION = startFromPositionToInt() 56 | SYNC_REPO_BUILD_LISTMETADATA = "${listMetadataBuild}" 57 | SYNC_REPO_BUILD_LISTMETADATA_INCLUDECHILDOBJECTS = includeChildObjects() 58 | BASE_ID = "${baseID}" 59 | PLATFORM_ID = "${platformID}" 60 | } 61 | options { 62 | timeout(time: 8, unit: 'HOURS') 63 | buildDiscarder(logRotator(numToKeepStr:'10')) 64 | } 65 | stages { 66 | stage("Pre-Build") { 67 | steps { 68 | timestamps { 69 | script { 70 | returnCode = utils.cmd("oscript init.os") 71 | if (returnCode != 0) { 72 | utils.raiseError("Возникла ошибка при запуске скрипта init.os") 73 | } 74 | } 75 | } 76 | } 77 | } 78 | stage("Запуск") { 79 | steps { 80 | timestamps { 81 | script { 82 | 83 | sendTelegramMessage("▶️ Jenkins is start ${JOB_NAME} - ${command_file}") 84 | 85 | command_folder = command_file != "debug" ? "bat" : "tests" 86 | 87 | returnCode = utils.cmd("cd ${command_folder} \n ${command_file}.bat") 88 | if (returnCode != 0) { 89 | 90 | def pathFileErrors = "${WORKSPACE}/var/errors/error_0.log" 91 | def exists = fileExists pathFileErrors 92 | if (exists) { 93 | message = readFile pathFileErrors 94 | } else { 95 | message = "Возникла ошибка при запуске" 96 | } 97 | utils.raiseError(message) 98 | 99 | } 100 | } 101 | } 102 | } 103 | } 104 | } 105 | post { 106 | success{ 107 | script { 108 | sendTelegramMessage("✅ ${JOB_NAME} - ${command_file} is Success") 109 | } 110 | } 111 | unstable{ 112 | script { 113 | sendTelegramMessage("⚠️ ${JOB_NAME} - ${command_file} is Alarm") 114 | } 115 | } 116 | failure{ 117 | script { 118 | sendTelegramMessage("🆘 ${JOB_NAME} - ${command_file} is Failure") 119 | } 120 | } 121 | } 122 | 123 | } 124 | 125 | def build_user() { 126 | 127 | wrap([$class: 'BuildUser']) { 128 | user = "${BUILD_USER}" 129 | } 130 | 131 | if (user == "") { 132 | user = "Jenkins" 133 | } 134 | 135 | return user 136 | } 137 | 138 | def logos_level() { 139 | 140 | return params.debug ? "DEBUG" : "" 141 | 142 | } 143 | 144 | def dynamicUpdate() { 145 | 146 | return params.dynamicUpdate 147 | 148 | } 149 | 150 | def includeChildObjects() { 151 | 152 | return params.includeChildObjects 153 | 154 | } 155 | 156 | def keepLockIB() { 157 | 158 | return params.keepLockIB 159 | 160 | } 161 | 162 | def pausePredBuildToInt() { 163 | 164 | value = 0 165 | value = params.pausePredBuild 166 | return value 167 | 168 | } 169 | 170 | def startFromPositionToInt() { 171 | 172 | value = 1 173 | value = params.startFromPosition 174 | return value 175 | 176 | } 177 | 178 | def sendTelegramMessage(message) { 179 | 180 | if (params.sendMessageStatusJob) { 181 | def telegram = new Telegram() 182 | telegram.sendTelegramMessage(message) 183 | } 184 | 185 | } 186 | -------------------------------------------------------------------------------- /src/core/Классы/Логирователь.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем Телеграм; 9 | 10 | &Пластилин 11 | Перем ФиксаторОшибок; 12 | 13 | Перем Лог; 14 | 15 | Процедура ВЛог(Знач ТекстСообщения, Ошибка = Ложь, ВТелеграм = Ложь, 16 | Знач ТекстСообщенияТелеграм = "", Эмодзи = "", ДополнятОсновныеПараметры = Истина) Экспорт 17 | 18 | УбратьвИсключенииСтокуКодаИзСтороннихКлассов(ТекстСообщения); 19 | ЗаменитьПараметрыВТексте(ТекстСообщения); 20 | 21 | Если ДополнятОсновныеПараметры Тогда 22 | ДополнитьОсновныеПараметрыВТексте(ТекстСообщения); 23 | КонецЕсли; 24 | 25 | Начало = ТекущаяДата(); 26 | ТекстСообщенияПолный = Строка(Формат(Начало, "ДФ=ЧЧ:мм:сс")) + ": " + ТекстСообщения; 27 | 28 | Если Ошибка = Истина Тогда 29 | Лог.Ошибка(ТекстСообщенияПолный); 30 | ФиксаторОшибок.ЗафиксироватьОшибку(ТекстСообщенияПолный); 31 | Иначе 32 | Лог.Информация(ТекстСообщенияПолный); 33 | КонецЕсли; 34 | 35 | Если ВТелеграм Тогда 36 | Если ЗначениеЗаполнено(ТекстСообщенияТелеграм) Тогда 37 | УбратьвИсключенииСтокуКодаИзСтороннихКлассов(ТекстСообщенияТелеграм); 38 | ЗаменитьПараметрыВТексте(ТекстСообщенияТелеграм); 39 | ДополнитьОсновныеПараметрыВТексте(ТекстСообщенияТелеграм); 40 | Иначе 41 | ТекстСообщенияТелеграм = ТекстСообщения; 42 | КонецЕсли; 43 | Телеграм.ВЛог(ТекстСообщенияТелеграм, Ошибка, Эмодзи); 44 | КонецЕсли; 45 | 46 | КонецПроцедуры 47 | 48 | Процедура Отладка(ТекстСообщения, 49 | Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 50 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено) Экспорт 51 | 52 | Лог.Отладка(ТекстСообщения, 53 | Параметр1, Параметр2, Параметр3, 54 | Параметр4, Параметр5, Параметр6); 55 | 56 | КонецПроцедуры 57 | 58 | Процедура ВывестиЛогИзФайла(ПутьКФайлу, Выведенные = Неопределено, Позиция = 0) Экспорт 59 | 60 | Если Выведенные = Неопределено Тогда 61 | Выведенные = Новый Массив(); 62 | КонецЕсли; 63 | 64 | Сообщения = РаботаСФайлами.ПрочитатьФайлВМассивСтрок(ПутьКФайлу, Ложь); 65 | 66 | Для каждого ИсходноеСообщение Из Сообщения Цикл 67 | 68 | Если Выведенные.Найти(ИсходноеСообщение) <> Неопределено Тогда 69 | Продолжить; 70 | КонецЕсли; 71 | 72 | Если СтрНайти(ИсходноеСообщение, "ОШИБКА -") > 0 Тогда 73 | Статус = СтатусСообщения.Важное; 74 | Иначе 75 | Статус = СтатусСообщения.БезСтатуса; 76 | КонецЕсли; 77 | 78 | Если Позиция > 0 Тогда 79 | ТекстСообщения = "Команда №" + Строка(Позиция) + " " + ИсходноеСообщение; 80 | Иначе 81 | ТекстСообщения = ИсходноеСообщение; 82 | КонецЕсли; 83 | 84 | Сообщить(ТекстСообщения, Статус); 85 | Выведенные.Добавить(ИсходноеСообщение); 86 | 87 | КонецЦикла; 88 | 89 | КонецПроцедуры 90 | 91 | Процедура ЗаменитьПараметрыВТексте(Текст, Разделитель = "#") Экспорт 92 | 93 | Если СтрНайти(Текст, Разделитель) = 0 Тогда 94 | Возврат; 95 | КонецЕсли; 96 | 97 | Для Каждого КлючЗначение Из Настройки.ПараметрыПодключения Цикл 98 | Ключ = КлючЗначение.Ключ; 99 | Если СтрНайти(Текст, Ключ) > 0 Тогда 100 | Текст = ЗаменитьПараметрВТексте(Текст, Ключ, КлючЗначение.Значение); 101 | КонецЕсли; 102 | 103 | КонецЦикла; 104 | 105 | КонецПроцедуры 106 | 107 | Функция ЗаменитьПараметрВТексте(Текст, ИмяПараметра, Знач ЗначениеПараметра, Разделитель = "#") Экспорт 108 | 109 | Если ИмяПараметра = "ИмяБазы" Тогда 110 | ЗначениеПараметра = """" + ЗначениеПараметра + """"; 111 | КонецЕсли; 112 | 113 | Возврат СтрЗаменить(Текст, Разделитель + ИмяПараметра, ЗначениеПараметра); 114 | 115 | КонецФункции 116 | 117 | Процедура ДополнитьОсновныеПараметрыВТексте(Текст) Экспорт 118 | 119 | Если Не ТипЗнч(Настройки.ПараметрыПодключения) = Тип("Структура") Тогда 120 | Возврат; 121 | КонецЕсли; 122 | 123 | ПараметрNobase = "#Nobase"; // если установлен в тексте, то имя базы прибавляем 124 | 125 | ИмяБазы = Общий.СвойствоСтруктуры(Настройки.ПараметрыПодключения, "ИмяБазы", ""); 126 | Если ЗначениеЗаполнено(ИмяБазы) И СтрНайти(Текст, ИмяБазы) = 0 Тогда 127 | Если СтрНайти(Текст, ПараметрNobase) = 0 Тогда 128 | 129 | Если СтрНайти(Текст, Символы.ПС) Тогда 130 | Разделитель = Символы.ПС; 131 | Иначе 132 | Разделитель = " "; 133 | КонецЕсли; 134 | 135 | Текст = Текст + Разделитель + """" + ИмяБазы + """"; 136 | 137 | Иначе 138 | Текст = СтрЗаменить(Текст, ПараметрNobase, ""); 139 | КонецЕсли; 140 | КонецЕсли; 141 | 142 | КонецПроцедуры 143 | 144 | Процедура УбратьвИсключенииСтокуКодаИзСтороннихКлассов(ОписаниеОшибки) 145 | 146 | УбратьВИсключенииСтрокуКода(ОписаниеОшибки, "v8runner"); 147 | УбратьВИсключенииСтрокуКода(ОписаниеОшибки, "ГитРепозиторий"); 148 | 149 | КонецПроцедуры 150 | 151 | Процедура УбратьВИсключенииСтрокуКода(ОписаниеОшибки, ИмяКласса) 152 | 153 | Если СтрНайти(ОписаниеОшибки, ИмяКласса) = 0 Тогда 154 | Возврат; 155 | КонецЕсли; 156 | 157 | СтрокаГотовая = ""; 158 | Для каждого СтрокаРазделенная Из СтрРазделить(ОписаниеОшибки, "/") Цикл 159 | Если СтрНайти(СтрокаРазделенная, ИмяКласса) > 0 Тогда 160 | Продолжить; 161 | КонецЕсли; 162 | Если СтрНайти(СтрокаРазделенная, "Ошибка в строке") > 0 Тогда 163 | Продолжить; 164 | КонецЕсли; 165 | Если Не ПустаяСтрока(СтрокаГотовая) Тогда 166 | СтрокаГотовая = СтрокаГотовая + " "; 167 | КонецЕсли; 168 | СтрокаГотовая = СтрокаГотовая + СокрЛП(СтрокаРазделенная); 169 | КонецЦикла; 170 | 171 | // Удалим последний символ }, т.к. он уже в первой строке удален 172 | Если Прав(СтрокаГотовая, 1) = "}" Тогда 173 | СтрокаГотовая = Лев(СтрокаГотовая, СтрДлина(СтрокаГотовая)-1); 174 | КонецЕсли; 175 | 176 | ОписаниеОшибки = СтрокаГотовая; 177 | 178 | КонецПроцедуры 179 | 180 | Функция ПутьКФайлуЛога(ИмяКласса, Позиция, УдалитьСуществующий = Ложь) Экспорт 181 | 182 | ПутьКФайлу = ОбъединитьПути(ТекущийКаталог(), "var\log\" + ИмяКласса + "_" + Строка(Позиция) + ".log"); 183 | 184 | Если УдалитьСуществующий И РаботаСФайлами.ФайлСуществует(ПутьКФайлу) Тогда 185 | УдалитьФайлы(ПутьКФайлу); 186 | КонецЕсли; 187 | 188 | Возврат ПутьКФайлу; 189 | 190 | КонецФункции 191 | 192 | Функция LOGOS_CONFIG(Позиция = 0, 193 | sync_repo_ВФайл = Ложь, // BSLLS:LatinAndCyrillicSymbolInWord-off 194 | ИзPowerShell = Ложь) Экспорт // BSLLS:LatinAndCyrillicSymbolInWord-off 195 | 196 | Если ИзPowerShell Тогда 197 | СтрокаКоманды = "$Env:LOGOS_CONFIG = '"; 198 | Иначе 199 | СтрокаКоманды = "set LOGOS_CONFIG="; 200 | КонецЕсли; 201 | 202 | СтрокаКоманды = СтрокаКоманды + "logger.oscript.lib.stream=INFO, stream;" 203 | + "appender.stream=ВыводЛогаВФайл;" 204 | + "appender.stream.file=var\log\stream#Позиция.log;" 205 | + "logger.oscript.lib.v8runner=INFO, v8runner;" 206 | + "appender.v8runner=ВыводЛогаВФайл;" 207 | + "appender.v8runner.file=var\log\v8runner#Позиция.log;" 208 | + "logger.oscript.lib.gitrunner=INFO, gitrunner;" 209 | + "appender.gitrunner=ВыводЛогаВФайл;" 210 | + "appender.gitrunner.file=var\log\gitrunner#Позиция.log;"; 211 | 212 | Если sync_repo_ВФайл Тогда 213 | СтрокаКоманды = СтрокаКоманды 214 | + "logger.oscript.lib.sync_repo=INFO, sync_repo;" 215 | + "appender.sync_repo=ВыводЛогаВФайл;" 216 | + "appender.sync_repo.file=var\log\sync_repo#Позиция.log;"; 217 | КонецЕсли; 218 | 219 | Если Позиция = 0 Тогда 220 | ЗначениеПозиции = ""; 221 | Иначе 222 | ЗначениеПозиции = "_" + Строка(Позиция); 223 | КонецЕсли; 224 | 225 | СтрокаКоманды = ЗаменитьПараметрВТексте(СтрокаКоманды, "Позиция", ЗначениеПозиции); 226 | 227 | Если ИзPowerShell Тогда 228 | СтрокаКоманды = СтрокаКоманды + "'"; 229 | КонецЕсли; 230 | 231 | Возврат СтрокаКоманды; 232 | 233 | КонецФункции 234 | 235 | &Желудь 236 | Процедура ПриСозданииОбъекта() 237 | Лог = Логирование.ПолучитьЛог("oscript.lib.sync_repo"); 238 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/Выполнитель.os: -------------------------------------------------------------------------------- 1 | #Использовать "..//../../src/Модули" 2 | 3 | Перем Поделка; 4 | 5 | &Пластилин 6 | Перем Настройки; // BSLLS:Typo-off 7 | 8 | &Пластилин 9 | Перем Логирователь; // BSLLS:Typo-off 10 | 11 | &Пластилин 12 | Перем Завершатель; // BSLLS:Typo-off 13 | 14 | Функция ВыполнитьКомандныйФайл(СтрокаКоманды, Позиция = 1, Фоново = Истина, Знач Имя = "") Экспорт 15 | 16 | Если Не ЗначениеЗаполнено(Имя) Тогда 17 | Имя = СтрокаКоманды; 18 | КонецЕсли; 19 | 20 | ТекстСообщения = "Выполняю команду"; 21 | Если Позиция > 0 И Фоново Тогда 22 | стрПозиция = Строка(Позиция); 23 | ТекстСообщения = ТекстСообщения + " №" + стрПозиция; 24 | КонецЕсли; 25 | 26 | Логирователь.ВЛог(ТекстСообщения + ": " + Имя); 27 | 28 | ИспользоватьPowerShell = Настройки.ИспользоватьPowerShell; 29 | 30 | КомандныйФайл = Поделка.НайтиЖелудь("КомандныйФайлSR"); 31 | 32 | Если ИспользоватьPowerShell Тогда 33 | КомандныйФайл.УстановитьПриложениеPowerShell(); 34 | КомандныйФайл.СоздатьPowerShell(); 35 | КомандныйФайл.УстановитьКодировкуВывода(КодировкаТекста.UTF8); 36 | Иначе 37 | КомандныйФайл.ДобавитьКоманду("@echo off"); 38 | КонецЕсли; 39 | 40 | Попытка 41 | 42 | КомандныйФайл.ДобавитьКоманду(Логирователь.LOGOS_CONFIG(Позиция, Истина, ИспользоватьPowerShell)); 43 | КомандныйФайл.ДобавитьКоманду(СтрокаКоманды); 44 | 45 | КодВозврата = КомандныйФайл.Исполнить(); 46 | СтрокаВывода = КомандныйФайл.ПолучитьВывод(); 47 | 48 | Исключение 49 | КодВозврата = 1; 50 | СтрокаВывода = ОписаниеОшибки(); 51 | КонецПопытки; 52 | 53 | СтруктураВозврата = Новый Структура("КодВозврата, Вывод, Позиция", 54 | КодВозврата, 55 | СтрокаВывода, 56 | Позиция); 57 | 58 | 59 | ТекстРезультата = "Результат команды №" + стрПозиция + ": Код возврата " + КодВозврата; 60 | ТекстВывода = "Вывод команды №" + стрПозиция + Символы.ПС + СтрокаВывода; 61 | 62 | Если КодВозврата <> 0 Тогда 63 | Логирователь.ВЛог(ТекстРезультата, Истина); 64 | Логирователь.ВЛог(ТекстВывода, Истина); 65 | Иначе 66 | 67 | Логирователь.Отладка(ТекстРезультата); 68 | Логирователь.Отладка(ТекстВывода); 69 | 70 | Если НЕ Фоново Тогда 71 | Логирователь.ВЛог("Команда: " + Имя + " - выполнена"); 72 | КонецЕсли; 73 | 74 | КонецЕсли; 75 | 76 | Возврат СтруктураВозврата; 77 | 78 | КонецФункции 79 | 80 | Процедура СледитьЗаЛогомЗадания(Задание, ПутьКФайлу, Позиция) Экспорт 81 | 82 | Выведенные = Новый Массив(); 83 | 84 | ПоследняяПопытка = Ложь; 85 | 86 | Пока Истина Цикл 87 | 88 | Если Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда 89 | 90 | Если ПоследняяПопытка Тогда 91 | Прервать; 92 | КонецЕсли; 93 | 94 | ПоследняяПопытка = Истина; 95 | 96 | КонецЕсли; 97 | 98 | Логирователь.ВывестиЛогИзФайла(ПутьКФайлу, Выведенные, Позиция); 99 | 100 | Если Не ПоследняяПопытка Тогда 101 | Приостановить(1000); 102 | КонецЕсли; 103 | 104 | КонецЦикла; 105 | 106 | КонецПроцедуры 107 | 108 | Процедура ВыполнитьКомандыМногопоточно(Команды) Экспорт // BSLLS:Typo-off 109 | 110 | Задания = Новый Массив(); 111 | 112 | Позиция = 0; 113 | Для каждого ДанныеКоманды Из Команды Цикл 114 | 115 | ТипДанныхКоманды = ТипЗнч(ДанныеКоманды); 116 | Если ТипДанныхКоманды = Тип("Строка") Тогда 117 | Позиция = Позиция + 1; 118 | ЗапуститьФоновуюКоманду(Задания, ДанныеКоманды, Позиция); 119 | ИначеЕсли ТипДанныхКоманды = Тип("Массив") Тогда 120 | 121 | // Последовательное выполнение 122 | ИДБлокирующегоЗадания = Неопределено; 123 | Для каждого ДанныеВложенной Из ДанныеКоманды Цикл 124 | Позиция = Позиция + 1; 125 | ЗапуститьФоновуюКоманду(Задания, ДанныеВложенной, Позиция, ИДБлокирующегоЗадания); 126 | ИДБлокирующегоЗадания = Позиция; // передаем в следующее задание 127 | КонецЦикла; 128 | 129 | Иначе 130 | Продолжить; 131 | КонецЕсли; 132 | 133 | КонецЦикла; 134 | 135 | ОжидатьФоновыеКоманды(Задания); 136 | 137 | ПроверитьРезультатВыполнения(Задания); 138 | 139 | КонецПроцедуры 140 | 141 | Процедура ЗапуститьФоновуюКоманду(Задания, СтрокаКоманды, Позиция, 142 | ИДБлокирующегоЗадания = Неопределено, ПаузаПередСледующим = 5000) 143 | 144 | Если ТипЗнч(СтрокаКоманды) <> Тип("Строка") Тогда 145 | ВызватьИсключение "Не верно переданы параметры групповой команды - " + Строка(СтрокаКоманды); 146 | КонецЕсли; 147 | 148 | Если Позиция > 1 Тогда 149 | Приостановить(ПаузаПередСледующим); // 5 секунд ожидаем пока запустится предудущее 150 | КонецЕсли; 151 | 152 | ИмяКласса = "sync_repo"; 153 | Если СтрНайти(СтрокаКоманды, ИмяКласса) > 0 Тогда 154 | ПутьКФайлуЛога = Логирователь.ПутьКФайлуЛога(ИмяКласса, Позиция, Истина); 155 | СтрокаКоманды = СтрокаКоманды + " --GroupPosition " + Строка(Позиция); 156 | Если ЗначениеЗаполнено(ИДБлокирующегоЗадания) Тогда 157 | СтрокаКоманды = СтрокаКоманды + " --Lock " + Формат(ИДБлокирующегоЗадания, "ЧН=; ЧГ="); 158 | КонецЕсли; 159 | Иначе 160 | ПутьКФайлуЛога = Неопределено; 161 | КонецЕсли; 162 | 163 | // Основное задание 164 | Параметры = Новый Массив(2); 165 | Параметры[0] = СтрокаКоманды; 166 | Параметры[1] = Позиция; 167 | 168 | ОсновноеЗадание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ВыполнитьКомандныйФайл", Параметры); 169 | Задания.Добавить(ОсновноеЗадание); 170 | 171 | // Следитель 172 | Если ПутьКФайлуЛога <> Неопределено Тогда 173 | 174 | Параметры = Новый Массив(3); 175 | Параметры[0] = ОсновноеЗадание; 176 | Параметры[1] = ПутьКФайлуЛога; 177 | Параметры[2] = Позиция; 178 | 179 | Следитель = ФоновыеЗадания.Выполнить(ЭтотОбъект, "СледитьЗаЛогомЗадания", Параметры); // BSLLS:Typo-off 180 | Задания.Добавить(Следитель); 181 | 182 | КонецЕсли; 183 | 184 | КонецПроцедуры 185 | 186 | Процедура ОжидатьФоновыеКоманды(Задания) 187 | 188 | Попытка 189 | ФоновыеЗадания.ОжидатьВсе(Задания); 190 | Исключение 191 | 192 | МассивЗаданий = ИнформацияОбОшибке().Параметры; 193 | 194 | Если МассивЗаданий <> Неопределено Тогда 195 | 196 | ШаблонТекстаОшибки = 197 | "Ошибки при выполнении команд: 198 | |%1"; 199 | 200 | Для Каждого Задание Из МассивЗаданий Цикл 201 | 202 | МассивОшибок = Новый Массив(); 203 | МассивОшибок.Добавить(Задание.ИнформацияОбОшибке.ПодробноеОписаниеОшибки()); 204 | 205 | КонецЦикла; 206 | 207 | ВызватьИсключение СтрШаблон( 208 | ШаблонТекстаОшибки, 209 | СтрСоединить(МассивОшибок, Символы.ПС)); 210 | 211 | КонецЕсли; 212 | 213 | КонецПопытки; 214 | 215 | КонецПроцедуры 216 | 217 | Процедура ПроверитьРезультатВыполнения(Задания) // BSLLS:CognitiveComplexity-off 218 | 219 | БылиОшибки = Ложь; 220 | 221 | Для каждого Задание Из Задания Цикл 222 | 223 | Состояние = Задание.Состояние; 224 | Если Состояние = СостояниеФоновогоЗадания.Завершено Тогда 225 | 226 | Результат = Задание.Результат; 227 | 228 | Если ТипЗнч(Результат) = Тип("Структура") Тогда 229 | 230 | ТекстСообщения = ""; 231 | 232 | КодВозврата = Результат.КодВозврата; 233 | Если КодВозврата <> 0 Тогда 234 | БылиОшибки = Истина; 235 | ТекстСообщения = " 236 | |Код возврата команды №" + Результат.Позиция + ": " + Строка(КодВозврата); 237 | КонецЕсли; 238 | 239 | СтрокаВывода = Результат.Вывод; 240 | Если ЗначениеЗаполнено(СтрокаВывода) Тогда 241 | БылиОшибки = Истина; 242 | ТекстСообщения = ТекстСообщения + " 243 | |Вывод команды №" + Результат.Позиция + ": " + Строка(СтрокаВывода); 244 | КонецЕсли; 245 | 246 | Если ЗначениеЗаполнено(ТекстСообщения) Тогда 247 | Логирователь.ВЛог(ТекстСообщения); 248 | КонецЕсли; 249 | 250 | КонецЕсли; 251 | 252 | ИначеЕсли Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда 253 | БылиОшибки = Истина; 254 | Завершатель.ЗавершитьПоОшибке(Задание.ИнформацияОбОшибке.Описание); 255 | Иначе 256 | Продолжить; 257 | КонецЕсли; 258 | 259 | КонецЦикла; 260 | 261 | Если БылиОшибки Тогда 262 | Завершатель.ЗавершитьПоОшибке(); 263 | КонецЕсли; 264 | 265 | КонецПроцедуры 266 | 267 | &Желудь 268 | Процедура ПриСозданииОбъекта(&Пластилин("Поделка") _Поделка) 269 | Поделка = _Поделка; 270 | КонецПроцедуры -------------------------------------------------------------------------------- /src/cli/Классы/cli_ЗапускПриложения.os: -------------------------------------------------------------------------------- 1 | &Опция(Имя = "ИдентификаторБазы", Описание = "Идентификатор базы") 2 | &ВОкружении("SYNC_REPO_ID_BASE") 3 | Перем ИдентификаторБазы; 4 | 5 | &Опция(Имя = "ID", Описание = "Идентификатор базы (англ)") 6 | Перем ID; 7 | 8 | &Опция(Имя = "ИдентификаторКоманд", Описание = "Идентификатор на список команд, которые следует запускать") 9 | &ВОкружении("SYNC_REPO_ID_COMMAND") 10 | &ПоУмолчанию("Команды") 11 | Перем ИдентификаторКоманд; 12 | 13 | &Опция(Имя = "IDCommand", Описание = "Идентификатор на список команд, которые следует запускать (англ)") 14 | Перем IDCommand; 15 | 16 | &Опция(Имя = "ИдентификаторГрупповыхКоманд", Описание = "Идентификатор на список команд в групповом файле команд") 17 | &ВОкружении("SYNC_REPO_ID_GROUP_COMMAND") 18 | Перем ИдентификаторГрупповыхКоманд; 19 | 20 | &Опция(Имя = "IDCommandGroup", Описание = "Идентификатор на список команд в групповом файле команд (англ)") 21 | Перем IDCommandGroup; 22 | 23 | &Опция(Имя = "Config", Описание = "Имя или путь к файлу настроек, по умолчанию onfig.yaml") 24 | &ВОкружении("SYNC_REPO_CONFIG") 25 | &ПоУмолчанию("config.yaml") 26 | Перем Config; 27 | 28 | &Опция(Имя = "Platform", Описание = "Группа команд на указание платформы") 29 | &ВОкружении("SYNC_REPO_V8VERSION") 30 | &ПоУмолчанию("Платформа") 31 | Перем Platform; 32 | 33 | &Опция(Имя = "Commands", Описание = "Имя или путь к файлу с командами, если файл не передан, то команды будут искаться в файле config") // BSLLS:LineLength-off 34 | &ВОкружении("SYNC_REPO_COMMANDS") 35 | Перем Commands; 36 | 37 | &Опция(Имя = "GroupCommands", Описание = "Имя файла с групповыми командами, если файл передан, то будут запускаться групповые команды") // BSLLS:LineLength-off 38 | &ВОкружении("SYNC_REPO_GROUPCOMMANDS") 39 | Перем GroupCommands; 40 | 41 | &Опция(Имя = "BuildUser", Описание = "Ответственный, переопределение ответственного в настройках") 42 | &ВОкружении("SYNC_REPO_BUILD_USER") 43 | Перем BuildUser; 44 | 45 | &Опция(Имя = "PausePredBuild", Описание = "Переопределение параметра Пауза в настройках по умолчанию, имеет приоритет перед настройками") // BSLLS:LineLength-off 46 | &ВОкружении("SYNC_REPO_PAUSE_PRED_BUILD") 47 | Перем PausePredBuild; 48 | 49 | &Опция(Имя = "ListMetadata", Описание = "Список метаданных, которые требуется обновить, переопределение файла metadata.txt") // BSLLS:LineLength-off 50 | &ВОкружении("SYNC_REPO_BUILD_LISTMETADATA") 51 | Перем ListMetadata; 52 | 53 | &Опция(Имя = "IncludeChildObjects", Описание = "Обновлять объекты из списка метаданных рекурсивно") // BSLLS:LineLength-off 54 | &ВОкружении("SYNC_REPO_BUILD_LISTMETADATA_INCLUDECHILDOBJECTS") 55 | &ТБулево 56 | &ПоУмолчанию(Истина) 57 | Перем IncludeChildObjects; 58 | 59 | &Опция(Имя = "StartFromPosition", Описание = "Начать с указанной позиции") // BSLLS:LineLength-off 60 | &ВОкружении("SYNC_REPO_BUILD_STARTFROMPOSITION") 61 | Перем StartFromPosition; 62 | 63 | &Опция(Имя = "DynamicUpdate", Описание = "Использовать динамическое обновление") 64 | &ВОкружении("SYNC_REPO_UPDATE_DYNAMIC") 65 | &ТБулево 66 | &ПоУмолчанию(Ложь) 67 | Перем DynamicUpdate; 68 | 69 | &Опция(Имя = "KeepLockIB", Описание = "Оставить блокировку ИБ") 70 | &ВОкружении("SYNC_REPO_KEEP_LOCK_IB") 71 | &ТБулево 72 | &ПоУмолчанию(Ложь) 73 | Перем KeepLockIB; 74 | 75 | &Опция(Имя = "Background", Описание = "Фоновый запуск, отключает все диалоги, при ошибки сразу завершается") // BSLLS:LineLength-off 76 | &ВОкружении("SYNC_REPO_BACKGROUND") 77 | &ТБулево 78 | &ПоУмолчанию(Ложь) 79 | Перем Background; 80 | 81 | &Опция(Имя = "UsePowerShell", Описание = "Использовать PowerShell для запуска параллельных команд, вместо cmd") // BSLLS:LineLength-off 82 | &ВОкружении("SYNC_REPO_USEPOWERSHELL") 83 | &ТБулево 84 | &ПоУмолчанию(Ложь) 85 | Перем UsePowerShell; 86 | 87 | &Опция(Имя = "GroupPosition", Описание = "Служебный параметр для передачи порядка вызова групповых команд") 88 | &ТЧисло 89 | &ПоУмолчанию(0) 90 | Перем GroupPosition; 91 | 92 | &Опция(Имя = "Lock", Описание = "Служебный параметр для ожидания выполнения предыдущего задания") 93 | Перем Lock; 94 | 95 | &Опция(Имя = "Debug", Описание = "Включить режим debug (1)") 96 | &ВОкружении("SYNC_REPO_DEBUG") 97 | &ТЧисло 98 | &ПоУмолчанию(0) 99 | Перем РежимDebug; 100 | 101 | Перем Запускатель; 102 | Перем Лог; 103 | 104 | &КомандаПриложения(Имя = "run r", Описание = "Выполнение команд") 105 | Процедура ПриСозданииОбъекта(&Пластилин("Запускатель") _Запускатель, 106 | &Лог("oscript.lib.sync_repo_start") _Лог) 107 | 108 | Запускатель = _Запускатель; 109 | Лог = _Лог; 110 | 111 | КонецПроцедуры 112 | 113 | &ВыполнениеКоманды 114 | Процедура Запустить() Экспорт 115 | 116 | Если ЗначениеЗаполнено(ID) Тогда 117 | ИдентификаторБазы = ID; 118 | КонецЕсли; 119 | 120 | Если ЗначениеЗаполнено(IDCommand) Тогда 121 | ИдентификаторКоманд = IDCommand; 122 | КонецЕсли; 123 | 124 | Если ЗначениеЗаполнено(IDCommandGroup) Тогда 125 | ИдентификаторГрупповыхКоманд = IDCommandGroup; 126 | КонецЕсли; 127 | 128 | ПаузаПередЗапуском = ПривестиЗначениеВЧисло("PausePredBuild", PausePredBuild, 0); 129 | НачатьСПозиции = ПривестиЗначениеВЧисло("StartFromPosition", StartFromPosition, 1, 0); 130 | 131 | ОбновлятьОбъектыРекурсивно = ПривестиЗначениеВБулево("IncludeChildObjects", IncludeChildObjects, 1); 132 | 133 | Опции = Новый Структура(); 134 | Опции.Вставить("ИдентификаторБазы", ИдентификаторБазы); 135 | Опции.Вставить("ИдентификаторКоманд", ИдентификаторКоманд); 136 | Опции.Вставить("Config", Config); 137 | Опции.Вставить("Commands", Commands); 138 | Опции.Вставить("Platform", Platform); 139 | Опции.Вставить("ИдентификаторГрупповыхКоманд", ИдентификаторГрупповыхКоманд); 140 | Опции.Вставить("СписокМетаданных", ListMetadata); 141 | Опции.Вставить("ОбновлятьОбъектыРекурсивно", ОбновлятьОбъектыРекурсивно); 142 | Опции.Вставить("НачатьСПозиции", НачатьСПозиции); 143 | Опции.Вставить("GroupCommands", GroupCommands); 144 | Опции.Вставить("Ответственный", BuildUser); 145 | Опции.Вставить("ПаузаПередЗапуском", ПаузаПередЗапуском); 146 | Опции.Вставить("Фоново", Background); 147 | Опции.Вставить("ИспользоватьДинамическоеОбновление", DynamicUpdate); 148 | Опции.Вставить("ОставитьБлокировкуИБ", KeepLockIB); 149 | Опции.Вставить("ИспользоватьPowerShell", UsePowerShell); 150 | Опции.Вставить("GroupPosition", GroupPosition); 151 | Опции.Вставить("Lock", Lock); 152 | Опции.Вставить("РежимDebug", РежимDebug); 153 | 154 | Запускатель.Запустить(Опции); 155 | 156 | КонецПроцедуры 157 | 158 | Функция ПривестиЗначениеВЧисло(Имя, Значение, ЗначениеПоУмолчанию = 0, ЗначениеИсключаемое = Неопределено) 159 | 160 | Лог.Отладка("Параметр: %1, Значение: %2", Имя, Значение); 161 | Лог.Отладка("Параметр: %1, Тип значения: %2", Имя, ТипЗнч(Значение)); 162 | 163 | ТипЗначения = ТипЗнч(Значение); 164 | 165 | Если ТипЗначения = Тип("Число") Тогда 166 | Возврат Значение; 167 | КонецЕсли; 168 | 169 | Если ЗначениеЗаполнено(Значение) И ТипЗнч(Значение) = Тип("Строка") Тогда 170 | 171 | ОписаниеТипа = Новый ОписаниеТипов("Число"); 172 | ЗначениеПриведенное = ОписаниеТипа.ПривестиЗначение(Значение); 173 | 174 | Если ЗначениеИсключаемое <> Неопределено И ЗначениеПриведенное = ЗначениеИсключаемое Тогда 175 | ЗначениеПриведенное = ЗначениеПоУмолчанию; 176 | КонецЕсли; 177 | 178 | Иначе 179 | ЗначениеПриведенное = ЗначениеПоУмолчанию; 180 | КонецЕсли; 181 | 182 | Лог.Отладка("Параметр: %1, Приведенное значение: %2", Имя, ЗначениеПриведенное); 183 | 184 | Возврат ЗначениеПриведенное; 185 | 186 | КонецФункции 187 | 188 | Функция ПривестиЗначениеВБулево(Имя, Значение, ЗначениеПоУмолчанию) 189 | 190 | Лог.Отладка("Параметр: %1, Значение: %2", Имя, Значение); 191 | Лог.Отладка("Параметр: %1, Тип значения: %2", Имя, ТипЗнч(Значение)); 192 | 193 | ТипЗначения = ТипЗнч(Значение); 194 | Если ТипЗначения = Тип("Булево") Тогда 195 | Возврат Значение; 196 | КонецЕсли; 197 | 198 | Если ТипЗначения = Тип("Число") Тогда 199 | ЗначениеПриведенное = Значение = Истина; 200 | Лог.Отладка("Параметр: %1, Приведенное значение: %2", Имя, ЗначениеПриведенное); 201 | Возврат ЗначениеПриведенное; 202 | Иначе 203 | Возврат ЗначениеПоУмолчанию; 204 | КонецЕсли; 205 | 206 | КонецФункции -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Автоматизация обновления конфигурации 1С 2 | 3 | - 4 | 5 | ## Clone 6 | 7 | - Установить Git - 8 | - Склонировать репозиторий с помощью команды `git clone `, где токен указать из настроек в профиле пользователя. 9 | - Для получения изменений использовать команду `git pull` 10 | 11 | ## Установка 12 | 13 | - Установить OneScript - , перезагурзиться. 14 | - Запустить ```install.bat``` под полными правами. 15 | 16 | ## Настройка 17 | 18 | - Скопировать файл `autumn-properties_example.yml` и переименовать его в `autumn-properties.yml`. 19 | - В файле `autumn-properties.yml` в секции `Ответсвенный` указать свое имя. 20 | 21 | ## Настроенные скрипты в папке "bat" 22 | 23 | - `update_all.bat` - полное обновление всех тестовых баз из хранилища 24 | - `meta_update_all.bat` - выборочное обновление тестовых баз 25 | - `close_config_ИД` - скрипты закрытия конфигуратора под каждую базу 26 | - `update_ИД` - скрипты обновления конфигурации базы данных под каждую базу 27 | 28 | ## Контроль запуска по расписанию 29 | 30 | Будет разрешен запуск только в указанное время. 31 | 32 | ### Настройки 33 | 34 | ```yaml 35 | Расписание: 36 | - ДеньНедели: 7 37 | Параметры: 38 | - ВремяС: 9 39 | - ВремяПо: 10 40 | ``` 41 | 42 | ## Возможные команды 43 | 44 | ### GUI 45 | 46 | - `ЗадатьВопрос` (Параметры: `ТекстВопроса`) 47 | - `ПоказатьПриветствие` (Параметры: `Приветствие`) 48 | - `УстановитьПаузу` (Параметры: `Пауза`) 49 | - `ПоказатьНачало` (Параметры: `Начало`) 50 | - `ПоказатьЗавершение` (Параметры: `Окончание`) 51 | 52 | ### Конфигуратор 53 | 54 | #### Настройки 55 | 56 | ```yaml 57 | Конфигуратор: 58 | Логин: "Логин" 59 | Пароль: "Пароль" 60 | ``` 61 | 62 | #### Команды 63 | 64 | - `ОтключитьКонфигураторОтИнформационнойБазы` 65 | - `ВыгрузитьКонфигурациюВФайл` 66 | - `ОбъединитьКонфигурациюСФайлом` 67 | - `ВыполнитьСинтаксическийКонтроль` 68 | - `ВыполнитьРасширенныйСинтаксическийКонтроль` 69 | - `ОбновитьКонфигурациюБазыДанных` (Параметры: `РежимРеструктуризации` - Первый или Второй (по умолчанию "Первый"), `ИмяРасширения` - будет обновляться указанное расширение). При установки переменной окружения `SYNC_REPO_UPDATE_DYNAMIC`, будет попытка обновиться динамически. 70 | 71 | ### Хранилище 72 | 73 | #### Настройки: 74 | 75 | ```yaml 76 | Хранилище: 77 | Путь: "Путь" 78 | Логин: "Логин" 79 | Пароль: "Пароль" 80 | ``` 81 | 82 | #### Команды 83 | 84 | - `ПодключитьсяКХранилищу` (Параметры: `ИмяРасширения` - будет подключаться указанное расширение по параметрам указанным в самом расширении) 85 | - `ПолучитьВерсиюКонфигурацииИзХранилища` 86 | - `ЗагрузитьКонфигурациюИзХранилища` (Параметры: `ИмяРасширения` - если указано, то будет загружать конфигурацию для расширения) 87 | - `ЗахватитьОбъектыВХранилище` 88 | - `ЗахватитьОбъектыВХранилищеПоСпискуИзФайла` - список объектов необходимо указать в файле ```settings/metadata.txt``` или передать в переменную окружения `listMetadataBuild` (если будет передана `*`, то будет выпоплняться команда `ЗахватитьОбъектыВХранилище` на все объекты). Необходимо передавать каждый объект на новой строке, объекты по умолчанию захватываются рекурсивно. Если установить переменную окружения `SYNC_REPO_BUILD_LISTMETADATA_INCLUDECHILDOBJECTS` в истина, то объекты будут захватываться рекурсивно. 89 | - `ОтменитьЗахватОбъектовВХранилище` 90 | - `ПоместитьИзмененияОбъектовВХранилище` (Параметры: `КомментарийПриПомещенииВХранилище`) 91 | 92 | ### Расширения 93 | 94 | #### Настройки: 95 | 96 | ```yaml 97 | Расширения: 98 | - Имя: "Имя" 99 | Хранилище: 100 | Путь: "Путь" 101 | Логин: "Логин" 102 | Пароль: "Пароль" 103 | ``` 104 | 105 | #### Команды 106 | 107 | - `ЗагрузитьРасширениеВРежимеПредприятия` (Параметры команды: `ИмяРасширения` (обязательный) - имя файла расширения, `Путь` - путь к файлу расширения, если не указан, то будет осуществляться поиск файла в каталоге `cfe`) 108 | 109 | - `ЗагрузитьРасширениеИзФайла` (Устарела) (Параметры команды: `Имя` (обязательный), `ИмяФайла` (обязательный), `ОбновитьКонфигурациюИБ` (по умолчанию `Ложь`)) 110 | По умолчнию поиск файлов осуществляться в каталоге `cfe`, но его можно переопределить в настройка `autumn-properties.yml` 111 | 112 | ```yaml 113 | Общие 114 | ПутьККаталогуCFe: "\\cfe" 115 | ``` 116 | 117 | ### RAS 118 | 119 | #### Настройки: 120 | 121 | ```yaml 122 | RAS: 123 | Сервер: "Сервер" 124 | Порт: "Порт" 125 | ``` 126 | 127 | #### Команды 128 | 129 | - `ЗаблокироватьИБ` 130 | - `ОтключитьСеансыИнформационнойБазы` (Параметры: `ПриложенияИсключения` - возможность указать имена приложений, которые не нужно отключать.) 131 | - `ПроверитьБлокировкуИБ` 132 | - `ПроверитьНаличиеАктивныхСеансовИБ` 133 | - `СнятьБлокировкуИБ` (Параметры: `СниматьБлокировкуРегламентныхЗаданий`). При установки переменной окружения `SYNC_REPO_KEEP_LOCK_IB` блокирова ИБ не будет снята. 134 | 135 | ### Предприятие 136 | 137 | - `ЗапуститьВРежимеПредприятия` (Параметры: `КлючиЗапускаПредприятия`, `ОжидатьВыполнения` - при установки false, не будет ожидать завершения) 138 | 139 | ### SQL 140 | 141 | #### Настройки: 142 | 143 | ```yaml 144 | SQL: 145 | ТипСУБД: "MSSQLServer" 146 | Сервер: "Имя сервера" 147 | ИмяБазы: "Имя базы" 148 | ИмяПользователя: "" 149 | Пароль: "" 150 | ``` 151 | 152 | Если, не передан пользователь, то будет выполняться windows аудентификация. 153 | Возможные скрипты нужно добавлять в файл ```src/templates/Классы/СкриптыSQL.os``` отдельной функцией 154 | 155 | #### Команды 156 | 157 | ```yaml 158 | - Команда: ВыполнитьСкриптSQL # Выполняет скрипт SQL с проверкой результата 159 | Параметры: 160 | - Имя: "ЗапуститьЗадание" 161 | - Параметр1: "Имя" 162 | - ОжидатьРезультат: 1 163 | - Команда: ВыполнитьЗапросSQL # Выполняет запрос SQL на выборку с выгрузкой его в таблицу значений 164 | Параметры: 165 | - Имя: "АктивностьЗадания" 166 | - Параметр1: "Имя" 167 | - ОжидатьКоличествоСтрок: 0 168 | - Пауза: 3 169 | - ПовторныхОтправок: 5 170 | - Команда: ВыполнитьЗапросSQL # Показывает активные запросы в БД, при ошибки соединения к БД скрипт не останавливается 171 | Параметры: # Должна быть установлена в БД хранимая процедура https://whoisactive.com 172 | - Имя: "WhoIsActive" 173 | - Параметр1: "ИмяБД" 174 | - ПропускатьПриОшибке: Да 175 | ``` 176 | 177 | ### CMD 178 | 179 | - `ВыполнитьКомандныйФайл` (Параметры: `СтрокаКоманды`(обязательный) ,`Имя`) 180 | 181 | ## Переопределение общих параметров команд 182 | 183 | В команде можно указать параметры, которые будет приоритетнее общих параметров 184 | 185 | ```yaml 186 | - Команда: ЗадатьВопрос 187 | Параметры: 188 | - ТекстВопроса: "Вопрос из команды" 189 | ``` 190 | 191 | ## Асинхронное выполнение нескольних команд 192 | 193 | Скрипт пойдет далее, после того как будут выполнены все команды. 194 | 195 | ```yaml 196 | - Группа команд: 197 | - УстановитьПаузу 198 | - Команда: ПоказатьНачало 199 | Параметры: 200 | - Начало: "Начало в Асинх" 201 | ``` 202 | 203 | ## Паралельное выполнение нескольких команд 204 | 205 | В строке запуске передать параметр ```groupCommand``` с именем файла настроек групповых команд. 206 | 207 | ```bat 208 | @set groupCommand=--GroupCommands \bat\commands\connect_repo.yaml 209 | oscript "sync_repo.os" run %groupCommand% 210 | ``` 211 | 212 | При добавлении группы `Последовательно` - команды в группе будут выполняться последовательно. 213 | 214 | Пример файла настроек: 215 | 216 | ```yaml 217 | Запуск: 218 | Параметры: 219 | sync_repo: "oscript sync_repo.os run" 220 | command: "--Commands \\bat\\commands\\connect_repo.yaml" 221 | Команды: 222 | - "%sync_repo --ИдентификаторБазы PP %command" 223 | - "%sync_repo --ИдентификаторБазы QA %command" 224 | - Последовательно: 225 | - "%sync_repo --ИдентификаторБазы QP %command" 226 | - "%sync_repo --ИдентификаторБазы QV %command" 227 | ``` 228 | 229 | ## Каталоги по умолчания 230 | 231 | - cf - Каталог для сохранения/загрузки конфигурации. 232 | - cfe - Каталог для загрузки расширений из файлов. 233 | -------------------------------------------------------------------------------- /src/import/Классы/КомандныйФайлSR.os: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////// 2 | // Работа с командными файлами 3 | 4 | #Использовать tempfiles 5 | 6 | Перем ЗаписьТекста; 7 | Перем ПутьКоманды; 8 | Перем Команда; 9 | Перем ТекстФайла; 10 | Перем Приложение; 11 | 12 | Перем ЭтоWindows; 13 | Перем Лог; 14 | Перем НемедленныйВывод; 15 | Перем КодировкаВывода; 16 | 17 | // Получить имя лога продукта 18 | // 19 | // Возвращаемое значение: 20 | // Строка - имя лога продукта 21 | // 22 | Функция ИмяЛога() Экспорт 23 | Возврат "oscript.lib.sync_repo"; 24 | КонецФункции 25 | 26 | // Установить путь к приложению. 27 | // 28 | // Параметры: 29 | // ПутьПриложения - Путь приложения (Строка) 30 | // Например для запуска скриптов PowerShell 31 | // Для 64bit PowerShell если стоит 64 битная система или 32bit PowerShell, если стоит 32 битная система 32 | // "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" 33 | // Для 32bit PowerShell на 64 битных системах находится в папке: 34 | // "C:\Windows\syswow64\Windowspowershell\v1.0\powershell.exe" 35 | // 36 | Процедура УстановитьПриложение(Знач ПутьПриложения) Экспорт 37 | Приложение = ПутьПриложения; 38 | КонецПроцедуры // УстановитьПриложение() 39 | 40 | // Получить путь командного файла 41 | // 42 | // Возвращаемое значение: 43 | // Строка - путь командного файла 44 | // 45 | Функция ПолучитьПуть() Экспорт 46 | Возврат ПутьКоманды; 47 | КонецФункции 48 | 49 | // Получить вывод выполненной команды. 50 | // 51 | // Возвращаемое значение: 52 | // Строка - Вывод команды 53 | // 54 | Функция ПолучитьВывод() Экспорт 55 | ПроверитьЧтоКомандаВыполнена(); 56 | Возврат Команда.ПолучитьВывод(); 57 | КонецФункции 58 | 59 | // Установить кодировку вывода для выполнения команды. 60 | // 61 | // Параметры: 62 | // Строка, Неопределено - кодировка вывода 63 | // Если Неопределено, кодировка сбрасывается и используется значение по умолчанию от операционной системы 64 | // 65 | Процедура УстановитьКодировкуВывода(Знач НоваяКодировкаВывода) Экспорт 66 | КодировкаВывода = НоваяКодировкаВывода; 67 | КонецПроцедуры 68 | 69 | // Получить кодировка вывода выполняемой команды. 70 | // 71 | // Возвращаемое значение: 72 | // Строка - кодировка вывода команды 73 | // 74 | Функция ПолучитьКодировкуВывода() Экспорт 75 | Возврат КодировкаВывода; 76 | КонецФункции 77 | 78 | // Получить код возврата выполненной команды. 79 | // 80 | // Возвращаемое значение: 81 | // Число - код возврата команды 82 | // 83 | Функция ПолучитьКодВозврата() Экспорт 84 | ПроверитьЧтоКомандаВыполнена(); 85 | Возврат Команда.ПолучитьКодВозврата(); 86 | КонецФункции 87 | 88 | // Создать новый командный файл по переданному пути или создать новый временный файл 89 | // 90 | // Параметры: 91 | // Путь - Строка - путь создаваемого файла. Необязательное значение. 92 | // Если не задан, создается временный файл в каталоге временных файлов 93 | // Расширение - Строка - расширение исполняемого командного файла. 94 | // Если не задано, подставляется ".bat" для Windows или ".sh" для Linux. 95 | // 96 | // Возвращаемое значение: 97 | // Строка - Путь созданного файла 98 | // 99 | Функция Создать(Знач Путь = "", Знач Расширение = "", Кодировка = Неопределено) Экспорт 100 | 101 | Если ПустаяСтрока(Расширение) Тогда 102 | Расширение = ?(ЭтоWindows, ".bat", ".sh"); 103 | КонецЕсли; 104 | Если ПустаяСтрока(Путь) Тогда 105 | ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(Расширение); 106 | Лог.Отладка("КомандныйФайл: задаю временный путь командного файла <%1>.", ПутьКоманды); 107 | Иначе 108 | ПутьКоманды = Путь; 109 | Лог.Отладка("КомандныйФайл: использую путь командного файла <%1>.", ПутьКоманды); 110 | КонецЕсли; 111 | 112 | Если Кодировка = Неопределено Тогда 113 | Кодировка = ?(ЭтоWindows, "cp866", КодировкаТекста.UTF8NoBOM); 114 | КонецЕсли; 115 | 116 | Если ЭтоWindows Тогда 117 | ЗаписьТекста = Новый ЗаписьТекста(ПутьКоманды, Кодировка); 118 | Иначе 119 | ЗаписьТекста = Новый ЗаписьТекста(ПутьКоманды, Кодировка, , , Символы.ПС); 120 | КонецЕсли; 121 | 122 | ТекстФайла = ""; 123 | 124 | Возврат ПутьКоманды; 125 | 126 | КонецФункции 127 | 128 | // Добавить очередную команду в командный файл 129 | // 130 | // Параметры: 131 | // Команда - Строка - очередная команда 132 | // 133 | Процедура ДобавитьКоманду(Знач Команда) Экспорт 134 | ПроверитьЧтоФайлОткрыт(); 135 | ЗаписьТекста.ЗаписатьСтроку(Команда); 136 | ТекстФайла = ТекстФайла + Команда + Символы.ПС; 137 | КонецПроцедуры 138 | 139 | // Выполнить командный файл и вернуть код возврата 140 | // 141 | // Возвращаемое значение: 142 | // Число - код возврата 143 | // 144 | Функция Исполнить() Экспорт 145 | 146 | Закрыть(); 147 | 148 | Команда = Новый Команда; 149 | Команда.УстановитьКодировкуВывода(КодировкаВывода); 150 | Команда.ПоказыватьВыводНемедленно(НемедленныйВывод); 151 | 152 | Если ЗначениеЗаполнено(Приложение) Тогда 153 | СтрокаЗапуска = """%1"""; 154 | ИначеЕсли ЭтоWindows Тогда 155 | Приложение = "cmd.exe"; 156 | СтрокаЗапуска = "/C ""%1"""; 157 | Иначе 158 | Приложение = "sh"; 159 | СтрокаЗапуска = "'%1'"; 160 | КонецЕсли; 161 | Команда.УстановитьКоманду(Приложение); 162 | Команда.ДобавитьПараметр(СтрШаблон(СтрокаЗапуска, ПутьКоманды)); 163 | 164 | КодВозврата = Команда.Исполнить(); 165 | 166 | Возврат КодВозврата; 167 | 168 | КонецФункции 169 | 170 | // Завершает запись командного файла 171 | // 172 | // Возвращаемое значение: 173 | // Строка - путь командного файла 174 | // 175 | Функция Закрыть() Экспорт 176 | 177 | Если ЗаписьТекста <> Неопределено Тогда 178 | ЗаписьТекста.Закрыть(); 179 | ЗаписьТекста = Неопределено; 180 | КонецЕсли; 181 | 182 | Возврат ПутьКоманды; 183 | 184 | КонецФункции 185 | 186 | // Получить текст командного файла 187 | // 188 | // Возвращаемое значение: 189 | // Строка - текст командного файла 190 | // 191 | Функция ПолучитьТекстФайла() Экспорт 192 | Возврат ТекстФайла; 193 | КонецФункции 194 | 195 | // Управляет мгновенным выводом лога команды 196 | // 197 | // Параметры: 198 | // НемедленныйПоказ - Булево 199 | // Ложь: показывает вывод только после завершения выполнения команды 200 | // Истина: показ вывода выполняется почти сразу, после появления очередной порции сообщений от команды 201 | // 202 | Процедура ПоказыватьВыводНемедленно(Знач НемедленныйПоказ) Экспорт 203 | НемедленныйВывод = НемедленныйПоказ; 204 | КонецПроцедуры 205 | 206 | // Получить строку перенаправления ввода-вывода "> файл" 207 | // 208 | // Параметры: 209 | // ИмяФайлаПриемника - Строка - имя файла для перенаправления вывода 210 | // УчитыватьStdErr - Булево - Если Истина, писать ошибки в этот же файл 211 | // ПерезаписыватьФайл - Булево - Если Истина, файл предварительно очищается 212 | // 213 | // Возвращаемое значение: 214 | // Строка - строка перенаправления ввода-вывода "> файл" 215 | // 216 | Функция СуффиксПеренаправленияВывода(Знач ИмяФайлаПриемника, 217 | Знач УчитыватьStdErr = Истина, 218 | Знач ПерезаписыватьФайл = Истина) Экспорт 219 | Рез = "> """ + ИмяФайлаПриемника + """" + ?(УчитыватьStdErr, " 2>&1", ""); 220 | Если Не ПерезаписыватьФайл Тогда 221 | Рез = ">" + Рез; 222 | КонецЕсли; 223 | Возврат Рез; 224 | КонецФункции 225 | 226 | ////////////////////////////////////////////////////////////////////////// 227 | // Служебные процедуры и функции 228 | 229 | Процедура ПроверитьЧтоФайлОткрыт() 230 | Если ЗаписьТекста = Неопределено Тогда 231 | Создать(); 232 | КонецЕсли; 233 | КонецПроцедуры 234 | 235 | Процедура ПроверитьЧтоКомандаВыполнена() 236 | Если Не ЗначениеЗаполнено(Команда) Тогда 237 | ВызватьИсключение СтрШаблон("Команда еще не выполнялась. <%1>", ПутьКоманды); 238 | КонецЕсли; 239 | КонецПроцедуры 240 | 241 | Процедура УстановитьПриложениеPowerShell() Экспорт 242 | УстановитьПриложение(ПутьДоPowerShell()); 243 | КонецПроцедуры 244 | 245 | Процедура СоздатьPowerShell(Кодировка = Неопределено) Экспорт 246 | Если Кодировка = Неопределено Тогда 247 | Кодировка = КодировкаТекста.UTF8; 248 | КонецЕсли; 249 | Создать("", РасширениеPowerShell(), Кодировка); 250 | КонецПроцедуры 251 | 252 | Функция ПутьДоPowerShell() // BSLLS:UnusedLocalMethod-off 253 | Возврат "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"; 254 | КонецФункции 255 | 256 | Функция РасширениеPowerShell() // BSLLS:UnusedLocalMethod-off 257 | Возврат "ps1"; 258 | КонецФункции 259 | 260 | // Инициализация работы библиотеки. 261 | // Задает минимальные настройки. 262 | // 263 | Процедура Инициализация() 264 | 265 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 266 | 267 | СистемнаяИнформация = Новый СистемнаяИнформация; 268 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 269 | 270 | ТекстФайла = ""; 271 | НемедленныйВывод = Ложь; 272 | КодировкаВывода = КодировкаТекста.OEM; 273 | 274 | КонецПроцедуры 275 | 276 | &Желудь 277 | &Характер("Компанейский") 278 | Процедура ПриСозданииОбъекта() 279 | Инициализация(); 280 | КонецПроцедуры -------------------------------------------------------------------------------- /src/core/Классы/Запускатель.os: -------------------------------------------------------------------------------- 1 | #Использовать "..//../../src/Модули" 2 | #Использовать async 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем Выполнитель; // BSLLS:Typo-off 9 | 10 | &Пластилин 11 | Перем Логирователь; // BSLLS:Typo-off 12 | 13 | &Пластилин 14 | Перем Завершатель; // BSLLS:Typo-off 15 | 16 | &Пластилин 17 | Перем Emoji; // BSLLS:Typo-off 18 | 19 | &Пластилин 20 | Перем КомандыПоКлючу; 21 | 22 | &Пластилин("Команда") 23 | Перем КомандаПоУмолчанию; 24 | 25 | Перем Опции; 26 | Перем ЗаполнительНастроек; 27 | Перем КонтрольРасписания; 28 | 29 | Процедура ВыполнитьКоманды(Позиция = 1) // BSLLS:CognitiveComplexity-off 30 | 31 | КомандыВыполнения = Настройки.КомандыВыполнения; 32 | КоличествоКоманд = КомандыВыполнения.Количество(); 33 | 34 | Пока Позиция <= КоличествоКоманд Цикл 35 | 36 | ДанныеКоманды = КомандыВыполнения[Позиция - 1]; 37 | 38 | Если ТипЗнч(ДанныеКоманды) = Тип("Соответствие") Тогда 39 | КлючКоманды = ДанныеКоманды.Получить("Команда"); 40 | Если КлючКоманды = Неопределено Тогда 41 | Результат = ВыполнитьГруппуКоманд(ДанныеКоманды, Позиция); // Асинх 42 | Иначе 43 | ПараметрыКоманды = ДанныеКоманды.Получить("Параметры"); 44 | Результат = ВыполнитьОдиночнуюКоманду(КлючКоманды, Позиция, ПараметрыКоманды); 45 | КонецЕсли; 46 | Иначе 47 | КлючКоманды = ДанныеКоманды; 48 | ПараметрыКоманды = Неопределено; 49 | Результат = ВыполнитьОдиночнуюКоманду(КлючКоманды, Позиция ); 50 | КонецЕсли; 51 | 52 | Если Результат = Ложь Тогда 53 | Возврат; 54 | КонецЕсли; 55 | 56 | Позиция = Позиция + 1; 57 | 58 | КонецЦикла; 59 | 60 | КонецПроцедуры 61 | 62 | Функция ВыполнитьОдиночнуюКоманду(КлючКоманды, Позиция, ПараметрыКоманды = Неопределено) 63 | Результат = ВыполнитьКоманду(КлючКоманды, Позиция, , , ПараметрыКоманды); 64 | ПроверитьРезультатВыполненияКоманды(КлючКоманды, Результат, Позиция); 65 | Возврат Результат; 66 | КонецФункции 67 | 68 | Функция ВыполнитьГруппуКоманд(ГруппаКоманд, Позиция) // BSLLS:CognitiveComplexity-off 69 | 70 | Ждем = Новый Массив(); 71 | 72 | ПозицияВГруппе = 1; 73 | 74 | Для каждого КлючЗначениеГруппы Из ГруппаКоманд Цикл 75 | 76 | КлючГруппы = КлючЗначениеГруппы.Ключ; 77 | 78 | КомандыГруппы = КлючЗначениеГруппы.Значение; 79 | Если ТипЗнч(КомандыГруппы) <> Тип("Массив") Тогда 80 | Продолжить; 81 | КонецЕсли; 82 | 83 | Для каждого ДанныеКоманды Из КомандыГруппы Цикл 84 | 85 | Если ТипЗнч(ДанныеКоманды) = Тип("Соответствие") Тогда 86 | КлючКоманды = ДанныеКоманды.Получить("Команда"); 87 | ПараметрыКоманды = ДанныеКоманды.Получить("Параметры"); 88 | Иначе 89 | КлючКоманды = ДанныеКоманды; 90 | ПараметрыКоманды = Неопределено; 91 | КонецЕсли; 92 | 93 | Если ПозицияВГруппе <> 1 Тогда 94 | Секунд = 1000; 95 | Приостановить(Секунд); 96 | КонецЕсли; 97 | 98 | Обещание = ВыполнитьКоманду(КлючКоманды, Позиция, ПозицияВГруппе, Истина, ПараметрыКоманды); 99 | Если ТипЗнч(Обещание) <> Тип("Обещание") Тогда 100 | СтрокаСообщения = "Задание не отрабатывает асинхронно. 101 | | Группа: " + Строка(КлючГруппы) + " 102 | | Ключ команды: " + КлючКоманды; 103 | Логирователь.ВЛог(СтрокаСообщения, Истина); 104 | ПроверитьРезультатВыполненияКоманды(КлючКоманды, Ложь, Позиция); 105 | Возврат Ложь; 106 | КонецЕсли; 107 | 108 | ПозицияВГруппе = ПозицияВГруппе + 1; 109 | 110 | Ждем.Добавить(Обещание); 111 | 112 | КонецЦикла; 113 | 114 | Если Ждем.Количество() = 0 Тогда 115 | Возврат Истина; 116 | КонецЕсли; 117 | 118 | Обещания.ОжидатьВсе(Ждем); 119 | 120 | ПозицияВГруппе = 0; 121 | Для каждого Обещание Из Ждем Цикл 122 | ПозицияВГруппе = ПозицияВГруппе + 1; 123 | Результат = ПроверитьРезультатОбещания(Обещание, КлючГруппы, ПозицияВГруппе); 124 | ПроверитьРезультатВыполненияКоманды(КлючКоманды, Результат, Позиция); 125 | Если Результат = Ложь Тогда 126 | Возврат Результат; 127 | КонецЕсли; 128 | КонецЦикла; 129 | КонецЦикла; 130 | 131 | Возврат Истина; 132 | 133 | КонецФункции 134 | 135 | Функция ВыполнитьКоманду(КлючКоманды, Позиция, ПозицияВГруппе = 0, ВызовАсинх = Ложь, Знач Параметры = Неопределено) 136 | 137 | ПараметрыКоманды = Новый Структура("Ключ, Позиция, ПозицияВГруппе, Параметры", "", 0, 0); 138 | 139 | ПараметрыКоманды.Ключ = КлючКоманды; 140 | ПараметрыКоманды.Позиция = Позиция; 141 | ПараметрыКоманды.ПозицияВГруппе = ПозицияВГруппе; 142 | 143 | ПараметрыКоманды.Параметры = ОбработатьВходящиеПараметрыКоманды(Параметры); 144 | 145 | Команда = КомандыПоКлючу[ВРег(КлючКоманды)]; 146 | Если Команда = Неопределено Тогда 147 | Команда = КомандаПоУмолчанию; 148 | КонецЕсли; 149 | 150 | Попытка 151 | Если ВызовАсинх Тогда 152 | Обещание = Команда.ВыполнитьКомандуАсинх(ПараметрыКоманды); 153 | Возврат Обещание; 154 | Иначе 155 | Результат = Команда.ВыполнитьКоманду(ПараметрыКоманды); 156 | КонецЕсли; 157 | Исключение 158 | Логирователь.ВЛог(ОписаниеОшибки(), Истина); 159 | Результат = Ложь; 160 | КонецПопытки; 161 | 162 | Возврат Результат; 163 | 164 | КонецФункции 165 | 166 | Функция ОбработатьВходящиеПараметрыКоманды(Параметры) 167 | 168 | Полученные = Новый Соответствие; 169 | 170 | Если ТипЗнч(Параметры) = Тип("Массив") Тогда 171 | Для каждого ПараметрыВМассиве Из Параметры Цикл 172 | Входящие = ОбработатьВходящиеПараметрыКоманды(ПараметрыВМассиве); 173 | Общий.ОбъединитьСоответствия(Полученные, Входящие); 174 | КонецЦикла; 175 | Возврат Полученные; 176 | ИначеЕсли ТипЗнч(Параметры) <> Тип("Соответствие") Тогда 177 | Возврат Полученные; 178 | Иначе 179 | Возврат Параметры; 180 | КонецЕсли; 181 | 182 | КонецФункции 183 | 184 | Процедура ПроверитьРезультатВыполненияКоманды(КлючКоманды, Результат, Позиция) 185 | 186 | Если Результат = Истина Тогда 187 | Возврат; 188 | КонецЕсли; 189 | 190 | Если Настройки.РежимDebug = Истина 191 | Или Настройки.Фоново = Истина Тогда 192 | 193 | УведомитьИЗавершить = Истина; 194 | ТекстСообщения = "Прервано на команде: """ + Строка(КлючКоманды) + """" 195 | + ", позиция: " + Позиция; 196 | Логирователь.ВЛог(ТекстСообщения, , Истина, , Emoji.Прервано(), Ложь); 197 | 198 | Иначе 199 | УведомитьИЗавершить = Ложь; 200 | КонецЕсли; 201 | 202 | Если УведомитьИЗавершить 203 | Или Настройки.ПозицияВГрупповой > 0 Тогда 204 | 205 | Завершатель.ЗавершитьПоОшибке(); 206 | 207 | КонецЕсли; 208 | 209 | СтрокаВвода = ""; 210 | Подсказка = "Для продолжения набери команду" 211 | + Символы.ПС 212 | + "1 - запустить повторно этап: " + Строка(КлючКоманды) 213 | + Символы.ПС 214 | + "2 - запустить сначала сценарий: " + Настройки.ИдентификаторБазы 215 | + Символы.ПС 216 | + "0 - выйти" 217 | + Символы.ПС; 218 | 219 | Пока ВвестиСтроку(СтрокаВвода, Подсказка, 1, Ложь) Цикл 220 | 221 | Если СтрокаВвода = "1" Тогда 222 | ВыполнитьКомандыПовторно(Позиция); 223 | Прервать; 224 | ИначеЕсли СтрокаВвода = "2" Тогда 225 | ВыполнитьКомандыПовторно(1); 226 | Прервать; 227 | ИначеЕсли СтрокаВвода = "0" Тогда 228 | Завершатель.ЗавершитьПоОшибке(); 229 | Иначе 230 | Сообщить("Введено неизвестное значение"); 231 | СтрокаВвода = ""; 232 | Продолжить; 233 | КонецЕсли; 234 | 235 | КонецЦикла; 236 | 237 | КонецПроцедуры 238 | 239 | Функция ПроверитьРезультатОбещания(Обещание, КлючГруппы, ПозицияВГруппе) 240 | 241 | Состояние = Обещание.Состояние(); 242 | 243 | Если Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно 244 | Или Состояние = СостояниеФоновогоЗадания.НеВыполнялось Тогда 245 | 246 | ТекстСообщения = "Задание завершено аварийно."; 247 | ПоказатьСообщениеВыполненияЗадания(ТекстСообщения, КлючГруппы, , ПозицияВГруппе, , Истина); 248 | Возврат Ложь; 249 | 250 | Иначе 251 | 252 | ДанныеРезультата = Обещание.Получить(); 253 | Если Не ТипЗнч(ДанныеРезультата) = Тип("Структура") Тогда 254 | 255 | ТекстСообщения = "Задание вернуло не структуру."; 256 | ПоказатьСообщениеВыполненияЗадания(ТекстСообщения, КлючГруппы, , ПозицияВГруппе, , Истина); 257 | Возврат Ложь; 258 | 259 | КонецЕсли; 260 | 261 | Результат = ДанныеРезультата.Результат; 262 | Если Результат = Ложь Тогда 263 | 264 | ТекстСообщения = "Задание не выполнено."; 265 | ПоказатьСообщениеВыполненияЗадания(ТекстСообщения, КлючГруппы, ДанныеРезультата.ПараметрыКоманды.Ключ, , 266 | ДанныеРезультата.ОписаниеОшибки, Истина); 267 | 268 | КонецЕсли; 269 | 270 | Возврат Результат; 271 | 272 | КонецЕсли; 273 | 274 | КонецФункции 275 | 276 | Процедура ПоказатьСообщениеВыполненияЗадания(ТекстСообщения, КлючГруппы, КлючКоманды = "", 277 | ПозицияВГруппе = 0, ОписаниеОшибки = "", Ошибка = Ложь) 278 | 279 | СтрокаСообщения = ТекстСообщения + " 280 | | Группа: " + Строка(КлючГруппы); 281 | 282 | Если ЗначениеЗаполнено(КлючКоманды) Тогда 283 | СтрокаСообщения = СтрокаСообщения + " 284 | | Команда: " + Строка(КлючКоманды); 285 | Иначе 286 | СтрокаСообщения = СтрокаСообщения + " 287 | | Позиция в группе: " + Строка(ПозицияВГруппе); 288 | КонецЕсли; 289 | 290 | Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда 291 | СтрокаСообщения = СтрокаСообщения + Символы.ПС + ОписаниеОшибки; 292 | КонецЕсли; 293 | 294 | Логирователь.ВЛог(СтрокаСообщения, Ошибка); 295 | 296 | КонецПроцедуры 297 | 298 | Процедура ВыполнитьКомандыПовторно(Позиция) 299 | ЗаполнительНастроек.ЗаполнитьНачальныеНастройки(Опции, Истина); 300 | ВыполнитьКоманды(Позиция); 301 | КонецПроцедуры 302 | 303 | Процедура ВыполнитьГрупповыеКоманды() 304 | Выполнитель.ВыполнитьКомандыМногопоточно(Настройки.ГрупповыеКоманды); 305 | КонецПроцедуры 306 | 307 | Процедура ЗаписатьФайлБлокировкиЗапуска() 308 | 309 | стрПозиция = Формат(Настройки.ПозицияВГрупповой, "ЧН=; ЧГ="); 310 | Инфо = "Выполнения команд №" + стрПозиция; 311 | ПутьКФайлу = Настройки.СформироватьПутьКФайлуБлокировкиЗапуска(Настройки.ПозицияВГрупповой); 312 | 313 | РаботаСФайлами.ЗаписатьТекстовыйФайл(Инфо, ПутьКФайлу); 314 | Настройки.ПутьКФайлуБлокировкиЗапуска = ПутьКФайлу; 315 | 316 | КонецПроцедуры 317 | 318 | Процедура БлокировкаОжиданияПредыдущегоЗадания(Опции) 319 | 320 | идБлокировки = Опции.Lock; 321 | Если Не ЗначениеЗаполнено(идБлокировки) Тогда 322 | Возврат; 323 | КонецЕсли; 324 | 325 | ПутьКФайлуБлокировки = Настройки.СформироватьПутьКФайлуБлокировкиЗапуска(идБлокировки); 326 | Пока РаботаСФайлами.ФайлСуществует(ПутьКФайлуБлокировки) Цикл 327 | Логирователь.Отладка("Ожидание выполнения задания №" + идБлокировки); 328 | Секунд = 3000; 329 | Приостановить(Секунд); 330 | КонецЦикла; 331 | 332 | КонецПроцедуры 333 | 334 | Процедура Запустить(_Опции) Экспорт 335 | 336 | Опции = _Опции; 337 | ЗаполнительНастроек.ЗаполнитьНачальныеНастройки(Опции); 338 | 339 | Если Не КонтрольРасписания.РазрешеноПоРасписанию() Тогда 340 | Завершатель.ЗавершитьПоОшибке("Запрещен запуск сценария по расписанию", Истина); 341 | КонецЕсли; 342 | 343 | Если Настройки.ГрупповыеКоманды.Количество() > 0 Тогда 344 | ВыполнитьГрупповыеКоманды(); 345 | Иначе 346 | БлокировкаОжиданияПредыдущегоЗадания(Опции); 347 | ЗаписатьФайлБлокировкиЗапуска(); 348 | ВыполнитьКоманды(Опции.НачатьСПозиции); 349 | КонецЕсли; 350 | 351 | Завершатель.Завершить(); 352 | 353 | КонецПроцедуры 354 | 355 | &Желудь 356 | Процедура ПриСозданииОбъекта(&Пластилин("ЗаполнительНастроек") _ЗаполнительНастроек, 357 | &Пластилин("КонтрольРасписания") _КонтрольРасписания) 358 | 359 | ЗаполнительНастроек = _ЗаполнительНастроек; 360 | КонтрольРасписания = _КонтрольРасписания; 361 | 362 | КонецПроцедуры 363 | -------------------------------------------------------------------------------- /src/core/Классы/ЗаполнительНастроек.os: -------------------------------------------------------------------------------- 1 | #Использовать configor 2 | #Использовать "..//../../src/Модули" 3 | 4 | &Пластилин 5 | Перем Настройки; 6 | 7 | &Пластилин 8 | Перем Логирователь; // BSLLS:Typo-off 9 | 10 | &Пластилин 11 | Перем ФиксаторОшибок; 12 | 13 | &Пластилин 14 | Перем Телеграм; 15 | 16 | &Пластилин 17 | Перем Завершатель; // BSLLS:Typo-off 18 | 19 | // BSLLS:CyclomaticComplexity-off 20 | // BSLLS:CognitiveComplexity-off 21 | 22 | Процедура ЗаполнитьНачальныеНастройки(Опции, Повторно = Ложь) Экспорт // BSLLS:MissingParameterDescription-off 23 | 24 | Если Не ПроверитьОбязательныеОпции(Опции) Тогда 25 | Возврат; 26 | КонецЕсли; 27 | 28 | ПутьКФайлуConfig = Опции.Config; 29 | 30 | УказательПлатформы = Опции.Platform; 31 | УказательПлатформыПоУмолчанию = "Платформа"; 32 | 33 | Настройки.ИдентификаторБазы = Опции.ИдентификаторБазы; 34 | 35 | ПутьКФайлуCommands = Опции.Commands; 36 | ПутьКФайлуGroupCommands = Опции.GroupCommands; 37 | ПозицияВГрупповой = Опции.GroupPosition; 38 | 39 | ИдентификаторКоманд = Опции.ИдентификаторКоманд; 40 | ИдентификаторГрупповыхКоманд = Опции.ИдентификаторГрупповыхКоманд; 41 | 42 | Ответственный = Опции.Ответственный; 43 | Если ЗначениеЗаполнено(Ответственный) Тогда 44 | Настройки.Ответственный = Ответственный; 45 | КонецЕсли; 46 | 47 | Настройки.Фоново = Опции.Фоново = Истина; 48 | Настройки.ИспользоватьPowerShell = Опции.ИспользоватьPowerShell = Истина; 49 | Настройки.ИспользоватьДинамическоеОбновление = Опции.ИспользоватьДинамическоеОбновление = Истина; 50 | Настройки.ОставитьБлокировкуИБ = Опции.ОставитьБлокировкуИБ = Истина; 51 | 52 | Настройки.ПаузаПередЗапуском = Опции.ПаузаПередЗапуском; 53 | Настройки.СписокМетаданных = Опции.СписокМетаданных; 54 | Настройки.ОбновлятьОбъектыРекурсивно = Опции.ОбновлятьОбъектыРекурсивно = Истина; 55 | 56 | РежимDebug = Опции.РежимDebug = Истина; 57 | Настройки.РежимDebug = РежимDebug; 58 | 59 | Если РежимDebug = Истина Тогда 60 | ПутьКФайлуConfig = Настройки.Debug_ФайлНастроек; 61 | КонецЕсли; 62 | 63 | Настройки.ПараметрыDebug = Новый Структура("КаталогСкрипта", ""); 64 | Настройки.ПозицияВГрупповой = ПозицияВГрупповой; 65 | ФиксаторОшибок.Инициализировать(ПозицияВГрупповой); 66 | 67 | Если НЕ ЗначениеЗаполнено(ПутьКФайлуGroupCommands) Тогда 68 | 69 | МенеджерПараметров = РаботаСФайлами.ПрочитатьYAMLФайл(ПутьКФайлуConfig); 70 | 71 | ПараметрыОбщие = МенеджерПараметров.Параметр("Общие"); 72 | Настройки.Идентификатор = ПараметрыОбщие.Получить("Идентификатор"); 73 | 74 | Настройки.ПараметрыРасписания = МенеджерПараметров.Параметр("Расписание"); 75 | Настройки.ПараметрыКонфигурации = МенеджерПараметров.Параметр("Конфигурация"); 76 | 77 | Настройки.ПараметрыПлатформы = МенеджерПараметров.Параметр(УказательПлатформы); 78 | 79 | Если Настройки.РежимDebug Тогда 80 | ПереопределитьПараметрыDebug(МенеджерПараметров, ИдентификаторКоманд, ПутьКФайлуCommands, 81 | ПутьКФайлуGroupCommands, ИдентификаторГрупповыхКоманд); 82 | КонецЕсли; 83 | 84 | Если Настройки.ПараметрыПлатформы = Неопределено Тогда 85 | Завершатель.ЗавершитьПоОшибке("Группа команд - " + УказательПлатформы 86 | + " в файле настроек " + ПутьКФайлуConfig + " не найдена"); 87 | КонецЕсли; 88 | 89 | Настройки.ПараметрыБазы = МенеджерПараметров.Параметр(Настройки.ИдентификаторБазы); 90 | 91 | Если НЕ ЗначениеЗаполнено(ИдентификаторКоманд) Тогда 92 | Если Не ЗначениеЗаполнено(ПутьКФайлуCommands) Тогда 93 | Логирователь.ВЛог("Не передан параметр ""ИдентификаторКоманд"" - для базы " + Настройки.ИдентификаторБазы, Истина); 94 | Завершатель.ЗавершитьПоОшибке(); 95 | Иначе 96 | // по умолчанию 97 | ИдентификаторКоманд = "Команды"; 98 | КонецЕсли; 99 | КонецЕсли; 100 | 101 | Если Не ЗначениеЗаполнено(ПутьКФайлуCommands) Тогда 102 | КорневыеПараметрыКоманд = Настройки.ПараметрыБазы; 103 | Иначе 104 | МенеджерПараметров = РаботаСФайлами.ПрочитатьYAMLФайл(ПутьКФайлуCommands); 105 | КорневыеПараметрыКоманд = МенеджерПараметров.Параметр(Настройки.ИдентификаторБазы); 106 | КонецЕсли; 107 | 108 | Иначе 109 | Настройки.ПараметрыОбщие = Новый Соответствие(); 110 | Настройки.ПараметрыРасписания = Новый Массив; 111 | Настройки.ПараметрыПлатформы = Новый Соответствие(); 112 | Настройки.ПараметрыБазы = Новый Соответствие(); 113 | КонецЕсли; 114 | 115 | Если ЗначениеЗаполнено(ПутьКФайлуGroupCommands) Тогда 116 | Если НЕ ЗначениеЗаполнено(ИдентификаторГрупповыхКоманд) Тогда 117 | ИдентификаторГрупповыхКоманд = "Запуск"; // по умолчанию 118 | КонецЕсли; 119 | Настройки.ИдентификаторГрупповыхКоманд = ИдентификаторГрупповыхКоманд; 120 | КонецЕсли; 121 | 122 | Если Не Повторно Тогда 123 | 124 | ТекстОписанияНастроек = Символы.ПС; 125 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "-----------------------------"); 126 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Текущий каталог: " + ТекущийКаталог()); 127 | Если ЗначениеЗаполнено(ПутьКФайлуGroupCommands) Тогда 128 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Идентификатор групповых команд: " + ИдентификаторГрупповыхКоманд); 129 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Файл групповых команд: " + ПутьКФайлуGroupCommands); 130 | Иначе 131 | 132 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Файл настроек: " + ПутьКФайлуConfig); 133 | Если УказательПлатформы <> УказательПлатформыПоУмолчанию Тогда 134 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Группа настроек платформы: " + УказательПлатформы); 135 | КонецЕсли; 136 | Если ЗначениеЗаполнено(ПутьКФайлуCommands) Тогда 137 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Файл команд: " + ПутьКФайлуCommands); 138 | КонецЕсли; 139 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "ИдентификаторБазы: " + Настройки.ИдентификаторБазы); 140 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "ИдентификаторКоманд: " + ИдентификаторКоманд); 141 | 142 | НачатьСПозиции = Опции.НачатьСПозиции; 143 | Если ЗначениеЗаполнено(НачатьСПозиции) И НачатьСПозиции <> 1 Тогда 144 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Запуск команд с позиции: " + Строка(НачатьСПозиции)); 145 | КонецЕсли; 146 | 147 | КонецЕсли; 148 | Если Настройки.ПаузаПередЗапуском <> 0 Тогда 149 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, 150 | "Установлена пауза перед запуском: " + Строка(Настройки.ПаузаПередЗапуском)); 151 | КонецЕсли; 152 | Если Настройки.ИспользоватьДинамическоеОбновление Тогда 153 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Обновляемся динамически"); 154 | КонецЕсли; 155 | Если Настройки.ОставитьБлокировкуИБ Тогда 156 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Оставляем блокировку ИБ"); 157 | КонецЕсли; 158 | Если Настройки.Фоново Тогда 159 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Включен фоновый запуск"); 160 | КонецЕсли; 161 | Если Настройки.РежимDebug Тогда 162 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Режим Debug"); 163 | КонецЕсли; 164 | Если Настройки.ИспользоватьPowerShell Тогда 165 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "Использую PowerShell"); 166 | КонецЕсли; 167 | ДобавитьСтрокуЧерезПС(ТекстОписанияНастроек, "-----------------------------"); 168 | Логирователь.ВЛог(ТекстОписанияНастроек); 169 | 170 | КонецЕсли; 171 | 172 | Настройки.ГрупповыеКоманды = Новый Массив; 173 | Если ЗначениеЗаполнено(ПутьКФайлуGroupCommands) Тогда 174 | ЗаполнитьГрупповыеКоманды(ИдентификаторГрупповыхКоманд, ПутьКФайлуGroupCommands); 175 | Иначе 176 | ЗаполнитьКоманды(ИдентификаторКоманд, КорневыеПараметрыКоманд); 177 | ЗаполнитьОбщиеПараметры(); 178 | ЗаполнитьРасписание(); 179 | ЗаполнитьПараметрыПодключения(); 180 | ЗаполнитьДанныеФайловНастроек(); 181 | КонецЕсли; 182 | 183 | Настройки.ПараметрыОбщие.Вставить("ПутьКФайлуConfig", ПутьКФайлуConfig); 184 | Настройки.ПараметрыОбщие.Вставить("ПутьКФайлуCommands", ПутьКФайлуCommands); 185 | Настройки.ПараметрыОбщие.Вставить("ПутьКФайлуGroupCommands", ПутьКФайлуGroupCommands); 186 | Настройки.ПараметрыОбщие.Вставить("ИдентификаторКоманд", ИдентификаторКоманд); 187 | 188 | Если ТипЗнч(Настройки.ПараметрыБазы) <> Тип("Соответствие") Тогда 189 | Логирователь.ВЛог("Нет настроек для базы - " + Настройки.ИдентификаторБазы, Истина); 190 | Завершатель.ЗавершитьПоОшибке(); 191 | КонецЕсли; 192 | 193 | КонецПроцедуры 194 | 195 | Процедура ЗаполнитьКоманды(ИдентификаторКоманд, КорневыеПараметры) 196 | 197 | ТипСоответствие = Тип("Соответствие"); 198 | Если Не ТипЗнч(КорневыеПараметры) = ТипСоответствие Тогда 199 | Завершатель.ЗавершитьПоОшибке("Не найдены команды в файле команд"); 200 | Возврат; 201 | КонецЕсли; 202 | 203 | ДанныеКоманд = КорневыеПараметры.Получить(ИдентификаторКоманд); 204 | Если ТипЗнч(ДанныеКоманд) <> ТипСоответствие Тогда 205 | 206 | // Проверим якорь 207 | Якорь = КорневыеПараметры.Получить("<<"); 208 | Если Якорь <> Неопределено Тогда 209 | ДанныеКоманд = Якорь.Получить(ИдентификаторКоманд); 210 | КонецЕсли; 211 | 212 | Если ТипЗнч(ДанныеКоманд) <> ТипСоответствие Тогда 213 | Логирователь.ВЛог("Не найдены команды - " + ИдентификаторКоманд, Истина); 214 | Завершатель.ЗавершитьПоОшибке(); 215 | КонецЕсли; 216 | 217 | КонецЕсли; 218 | 219 | Настройки.КомандыВыполнения = ДанныеКоманд.Получить("Команды"); 220 | Если ТипЗнч(Настройки.КомандыВыполнения) <> Тип("Массив") Тогда 221 | Логирователь.ВЛог("Нет списка команд - " + ИдентификаторКоманд, Истина); 222 | Завершатель.ЗавершитьПоОшибке(); 223 | КонецЕсли; 224 | 225 | ЗаполнитьПараметрыКоманд(ДанныеКоманд); 226 | 227 | КонецПроцедуры 228 | 229 | Процедура ЗаполнитьПараметрыКоманд(ДанныеКоманд) 230 | 231 | // Параметры команд 232 | Настройки.ПараметрыКоманд = Новый Структура(); 233 | 234 | ДанныеПараметров = ДанныеКоманд.Получить("Параметры"); 235 | Если ДанныеПараметров <> Неопределено Тогда 236 | 237 | Приветствие = ДанныеПараметров.Получить("Приветствие"); 238 | Начало = ДанныеПараметров.Получить("Начало"); 239 | Окончание = ДанныеПараметров.Получить("Окончание"); 240 | 241 | Пауза = ДанныеПараметров.Получить("Пауза"); 242 | КлючиЗапускаПредприятия = ДанныеПараметров.Получить("КлючиЗапускаПредприятия"); 243 | КомментарийПриПомещенииВХранилище = ДанныеПараметров.Получить("КомментарийПриПомещенииВХранилище"); 244 | СниматьБлокировкуРегламентныхЗаданий = ДанныеПараметров.Получить("СниматьБлокировкуРегламентныхЗаданий"); 245 | ОтправлятьСообщенияВТелеграм = ДанныеПараметров.Получить("ОтправлятьСообщенияВТелеграм"); 246 | ТекстВопроса = ДанныеПараметров.Получить("ТекстВопроса"); 247 | 248 | Иначе 249 | Приветствие = ""; 250 | Начало = ""; 251 | Окончание = ""; 252 | Пауза = "0"; 253 | КлючиЗапускаПредприятия = ""; 254 | КомментарийПриПомещенииВХранилище = ""; 255 | СниматьБлокировкуРегламентныхЗаданий = Ложь; 256 | ОтправлятьСообщенияВТелеграм = Ложь; 257 | ТекстВопроса = ""; 258 | КонецЕсли; 259 | 260 | Настройки.ПараметрыКоманд.Вставить("Приветствие", Приветствие); 261 | Настройки.ПараметрыКоманд.Вставить("Начало", Начало); 262 | Настройки.ПараметрыКоманд.Вставить("Окончание", Окончание); 263 | Настройки.ПараметрыКоманд.Вставить("Пауза", Пауза); 264 | Настройки.ПараметрыКоманд.Вставить("КлючиЗапускаПредприятия", КлючиЗапускаПредприятия); 265 | Настройки.ПараметрыКоманд.Вставить("КомментарийПриПомещенииВХранилище", КомментарийПриПомещенииВХранилище); 266 | Настройки.ПараметрыКоманд.Вставить("СниматьБлокировкуРегламентныхЗаданий", СниматьБлокировкуРегламентныхЗаданий); 267 | Настройки.ПараметрыКоманд.Вставить("ОтправлятьСообщенияВТелеграм", ОтправлятьСообщенияВТелеграм); 268 | Настройки.ПараметрыКоманд.Вставить("ТекстВопроса", ТекстВопроса); 269 | 270 | КонецПроцедуры 271 | 272 | Процедура ЗаполнитьГрупповыеКоманды(ИдентификаторГрупповыхКоманд, ПутьКФайлу) 273 | 274 | МенеджерПараметров = РаботаСФайлами.ПрочитатьYAMLФайл(ПутьКФайлу); 275 | 276 | ТипСоответствие = Тип("Соответствие"); 277 | КорневыеПараметрыКоманд = МенеджерПараметров.Параметр(ИдентификаторГрупповыхКоманд); 278 | Если НЕ ТипЗнч(КорневыеПараметрыКоманд) = ТипСоответствие Тогда 279 | ВызватьИсключение "Не найдены групповые команды - " + ИдентификаторГрупповыхКоманд; 280 | КонецЕсли; 281 | 282 | ДанныеПараметров = КорневыеПараметрыКоманд.Получить("Параметры"); 283 | ДанныеКоманд = КорневыеПараметрыКоманд.Получить("Команды"); 284 | 285 | Если Не ТипЗнч(ДанныеКоманд) = Тип("Массив") Тогда 286 | ВызватьИсключение "Не найден список команд для - " + ИдентификаторГрупповыхКоманд; 287 | КонецЕсли; 288 | 289 | Если НЕ ТипЗнч(ДанныеПараметров) = ТипСоответствие Тогда 290 | ДанныеПараметров = Новый Соответствие; 291 | КонецЕсли; 292 | 293 | Для каждого ДанныеГрупповой Из ДанныеКоманд Цикл 294 | 295 | ТипДанныхГрупповой = ТипЗнч(ДанныеГрупповой); 296 | Если ТипДанныхГрупповой = Тип("Соответствие") Тогда 297 | 298 | ГруппаПоследовательной = Новый Массив; 299 | КомандыПоследовательные = ДанныеГрупповой.Получить("Последовательно"); 300 | Если ТипЗнч(КомандыПоследовательные) = Тип("Массив") Тогда 301 | Для каждого ДанныеПоследовательной Из КомандыПоследовательные Цикл 302 | ДобавитьГрупповуюКоманду(ДанныеПоследовательной, ДанныеПараметров, ГруппаПоследовательной); 303 | КонецЦикла; 304 | КонецЕсли; 305 | Если ГруппаПоследовательной.Количество() > 0 Тогда 306 | Настройки.ГрупповыеКоманды.Добавить(ГруппаПоследовательной); 307 | КонецЕсли; 308 | 309 | Иначе 310 | ДобавитьГрупповуюКоманду(ДанныеГрупповой, ДанныеПараметров); 311 | КонецЕсли; 312 | 313 | КонецЦикла; 314 | 315 | КонецПроцедуры 316 | 317 | Процедура ДобавитьГрупповуюКоманду(СтрокаКоманды, ДанныеПараметров, Знач ГрупповыеКоманды = Неопределено) 318 | 319 | Если ТипЗнч(СтрокаКоманды) <> Тип("Строка") Тогда 320 | ВызватьИсключение "Не определена групповая команда - " + Строка(СтрокаКоманды); 321 | КонецЕсли; 322 | 323 | Если ГрупповыеКоманды = Неопределено Тогда 324 | ГрупповыеКоманды = Настройки.ГрупповыеКоманды; 325 | КонецЕсли; 326 | 327 | Разделитель = "%"; 328 | 329 | Для каждого КлючЗначение Из ДанныеПараметров Цикл 330 | ИмяПараметра = КлючЗначение.Ключ; 331 | ЗначениеПараметра = КлючЗначение.Значение; 332 | СтрокаКоманды = Логирователь.ЗаменитьПараметрВТексте(СтрокаКоманды, ИмяПараметра, ЗначениеПараметра, Разделитель); 333 | КонецЦикла; 334 | 335 | СтрокаКоманды = Логирователь.ЗаменитьПараметрВТексте(СтрокаКоманды, "ПС", Символы.ПС, Разделитель); 336 | ГрупповыеКоманды.Добавить(СтрокаКоманды); 337 | 338 | КонецПроцедуры 339 | 340 | Процедура ЗаполнитьОбщиеПараметры() 341 | 342 | Настройки.ПараметрыТелеграм = Новый Структура(); 343 | 344 | ЗаполнитьПараметрыТелеграм(); 345 | 346 | КонецПроцедуры 347 | 348 | Процедура ЗаполнитьПараметрыТелеграм() 349 | 350 | // Телеграм 351 | ДанныеПараметров = Настройки.ПараметрыОбщие.Получить("Телеграм"); 352 | Если ТипЗнч(ДанныеПараметров) <> Тип("Соответствие") Тогда 353 | ДанныеПараметров = Новый Соответствие(); 354 | КонецЕсли; 355 | 356 | ОтправлятьСообщения = Общий.ПризнакВключенияПараметра("ОтправлятьСообщенияВТелеграм", Настройки.ПараметрыКоманд); 357 | Настройки.ПараметрыТелеграм.Вставить("ОтправлятьСообщения", ОтправлятьСообщения); 358 | Настройки.ПараметрыТелеграм.Вставить("BotID", Строка(ДанныеПараметров.Получить("BotID"))); 359 | Настройки.ПараметрыТелеграм.Вставить("Токен", Строка(ДанныеПараметров.Получить("Токен"))); 360 | 361 | Если Настройки.РежимDebug = Истина Тогда 362 | 363 | Настройки.ПараметрыТелеграм.ОтправлятьСообщения = Ложь; 364 | 365 | Иначе 366 | 367 | Телеграм.УстановитьТокен(Настройки.ПараметрыТелеграм.Токен); 368 | 369 | КонецЕсли; 370 | 371 | КонецПроцедуры 372 | 373 | Процедура ЗаполнитьРасписание() 374 | 375 | // Конфигурация 376 | ПараметрыРасписания = Настройки.ПараметрыРасписания; 377 | ПривестиМассивПараметр(ПараметрыРасписания); 378 | 379 | Для каждого Элемент Из ПараметрыРасписания Цикл 380 | 381 | ДеньНедели = Элемент.Получить("ДеньНедели"); 382 | ПривестиЧисловойПараметр(ДеньНедели); 383 | 384 | ПараметрыВремени = Элемент.Получить("Параметры"); 385 | ПривестиМассивПараметр(ПараметрыВремени); 386 | 387 | ВремяКэш = Новый Соответствие(); 388 | ВремяКэш.Вставить("ВремяС", 0); 389 | ВремяКэш.Вставить("ВремяПо", 0); 390 | 391 | Для каждого ЭлементВремени Из ПараметрыВремени Цикл 392 | 393 | Для каждого ЭлементПараметра Из Общий.СкопироватьСоответствие(ВремяКэш) Цикл 394 | Ключ = ЭлементПараметра.Ключ; 395 | Значение = ЭлементВремени.Получить(ЭлементПараметра.Ключ); 396 | Если Значение <> Неопределено Тогда 397 | ПривестиЧисловойПараметр(Значение); 398 | ВремяКэш.Вставить(Ключ, Значение); 399 | КонецЕсли; 400 | КонецЦикла; 401 | 402 | КонецЦикла; 403 | 404 | ЭлементРасписания = Новый Структура("ДеньНедели", ДеньНедели); 405 | Время = Новый Массив; 406 | СтруктураВремени = Новый Структура("С, По", 407 | ВремяКэш.Получить("ВремяС"), 408 | ВремяКэш.Получить("ВремяПо")); 409 | Время.Добавить(СтруктураВремени); 410 | ЭлементРасписания.Вставить("Время", Время); 411 | 412 | Настройки.Расписание.Добавить(ЭлементРасписания); 413 | 414 | КонецЦикла; 415 | 416 | КонецПроцедуры 417 | 418 | Процедура ЗаполнитьПараметрыПодключения() 419 | 420 | Настройки.ПараметрыПодключения = Новый Структура(); 421 | 422 | // BSLLS:DuplicateStringLiteral-off 423 | 424 | // Общие 425 | Настройки.ПараметрыПодключения.Вставить("Идентификатор", Строка(Настройки.Идентификатор)); 426 | 427 | // Конфигурация 428 | ПараметрыКонфигурации = Настройки.ПараметрыКонфигурации; 429 | ПривестиПустыеПараметры(ПараметрыКонфигурации); 430 | Настройки.ПараметрыПодключения.Вставить("ИмяКонфигурации", ПараметрыКонфигурации.Получить("Имя")); 431 | 432 | Ответственный = Настройки.Ответственный; 433 | Если НЕ ЗначениеЗаполнено(Ответственный) Или Ответственный = "Фамилия Имя" Тогда 434 | Завершатель.ЗавершитьПоОшибке("Заполни ответственного в файле autumn-properties.yml"); 435 | Возврат; 436 | КонецЕсли; 437 | 438 | Настройки.ПараметрыПодключения.Вставить("Ответственный", Ответственный); 439 | 440 | // Платформа 441 | Настройки.ПараметрыПодключения.Вставить("ПутьКПлатформе", Настройки.ПараметрыПлатформы.Получить("1cv8")); 442 | Настройки.ПараметрыПодключения.Вставить("ВерсияПлатформы", Настройки.ПараметрыПлатформы.Получить("Версия")); 443 | 444 | // RAS 445 | ПараметрыRAS = Настройки.ПараметрыПлатформы.Получить("RAS"); 446 | ПривестиПустыеПараметры(ПараметрыRAS); 447 | Настройки.ПараметрыПодключения.Вставить("СерверRAS", ПараметрыRAS.Получить("Сервер")); 448 | Настройки.ПараметрыПодключения.Вставить("ПортRAS", ПараметрыRAS.Получить("Порт")); 449 | 450 | // Обновление 451 | ПараметрыОбновления = Настройки.ПараметрыПлатформы.Получить("Обновление"); 452 | ПривестиПустыеПараметры(ПараметрыОбновления); 453 | Настройки.ПараметрыПодключения.Вставить("СообщениеПриБлокировкиИБ", ПараметрыОбновления.Получить("Сообщение")); 454 | Настройки.ПараметрыПодключения.Вставить("КодДоступаПриБлокировкиИБ", ПараметрыОбновления.Получить("КодДоступа")); 455 | 456 | // База 457 | ПараметрыБазы = Настройки.ПараметрыБазы; 458 | ПривестиПустыеПараметры(ПараметрыБазы); 459 | Настройки.ПараметрыПодключения.Вставить("ИмяБазы", ПараметрыБазы.Получить("ИмяБазы")); 460 | Настройки.ПараметрыПодключения.Вставить("СерверБазы", ПараметрыБазы.Получить("Сервер")); 461 | Настройки.ПараметрыПодключения.Вставить("ПортБазы", ПараметрыБазы.Получить("Порт")); 462 | 463 | // Конфигуратор 464 | ПараметрыКонфигуратора = ПараметрыБазы.Получить("Конфигуратор"); 465 | ПривестиПустыеПараметры(ПараметрыКонфигуратора); 466 | 467 | Если Настройки.ЛичныеЛогинККонфигуратору <> Неопределено Тогда 468 | ЛогинККонфигуратору = Строка(Настройки.ЛичныеЛогинККонфигуратору); 469 | ПарольККонфигуратору = Строка(Настройки.ЛичныеПарольККонфигуратору); 470 | Иначе 471 | ЛогинККонфигуратору = ПараметрыКонфигуратора.Получить("Логин"); 472 | ПарольККонфигуратору = ПараметрыКонфигуратора.Получить("Пароль"); 473 | КонецЕсли; 474 | 475 | Настройки.ПараметрыПодключения.Вставить("ЛогинККонфигуратору", ЛогинККонфигуратору); 476 | Настройки.ПараметрыПодключения.Вставить("ПарольККонфигуратору", ПарольККонфигуратору); 477 | 478 | // Хранилище 479 | ПараметрыХранилища = ПараметрыБазы.Получить("Хранилище"); 480 | ПривестиПустыеПараметры(ПараметрыХранилища); 481 | Настройки.ПараметрыПодключения.Вставить("ПутьКХранилищу", ПараметрыХранилища.Получить("Путь")); 482 | Настройки.ПараметрыПодключения.Вставить("ЛогинКХранилищу", ПараметрыХранилища.Получить("Логин")); 483 | Настройки.ПараметрыПодключения.Вставить("ПарольКХранилищу", ПараметрыХранилища.Получить("Пароль")); 484 | 485 | // SQL Хранилище 486 | ПараметрыSQL = ПараметрыБазы.Получить("SQL"); 487 | ПривестиПустыеПараметры(ПараметрыSQL); 488 | Настройки.ПараметрыПодключения.Вставить("ТипСУБД", ПараметрыSQL.Получить("ТипСУБД")); 489 | Настройки.ПараметрыПодключения.Вставить("СерверSQL", ПараметрыSQL.Получить("Сервер")); 490 | Настройки.ПараметрыПодключения.Вставить("ИмяБазыSQL", ПараметрыSQL.Получить("ИмяБазы")); 491 | Настройки.ПараметрыПодключения.Вставить("ИмяПользователяSQL", ПараметрыSQL.Получить("ИмяПользователя")); 492 | Настройки.ПараметрыПодключения.Вставить("ПарольSQL", ПараметрыSQL.Получить("Пароль")); 493 | 494 | ЗаполнитьЗначенияСвойств(Настройки, Настройки.ПараметрыПодключения); 495 | 496 | ЗаполнитьПараметрыРасширенийКонфигурации(ПараметрыБазы); 497 | КонецПроцедуры 498 | 499 | Процедура ЗаполнитьПараметрыРасширенийКонфигурации(ПараметрыБазы) 500 | 501 | Расширения = ПараметрыБазы.Получить("Расширения"); 502 | Если Не ТипЗнч(Расширения) = Тип("Массив") Тогда 503 | Возврат; 504 | КонецЕсли; 505 | 506 | Для каждого НастройкиРасширения Из Расширения Цикл 507 | 508 | Имя = НастройкиРасширения.Получить("Имя"); 509 | 510 | ДанныеРасширения = Новый Структура; 511 | ДанныеРасширения.Вставить("Имя", Имя); 512 | 513 | ПараметрыХранилища = НастройкиРасширения.Получить("Хранилище"); 514 | ПривестиПустыеПараметры(ПараметрыХранилища); 515 | ДанныеРасширения.Вставить("ПутьКХранилищу", ПараметрыХранилища.Получить("Путь")); 516 | ДанныеРасширения.Вставить("ЛогинКХранилищу", ПараметрыХранилища.Получить("Логин")); 517 | ДанныеРасширения.Вставить("ПарольКХранилищу", ПараметрыХранилища.Получить("Пароль")); 518 | 519 | Настройки.РасширенияКонфигурации.Вставить(Имя, ДанныеРасширения); 520 | 521 | КонецЦикла; 522 | 523 | КонецПроцедуры 524 | 525 | Процедура ЗаполнитьДанныеФайловНастроек() 526 | 527 | Настройки.ФайлыНастроек = Новый Структура(); 528 | Настройки.ФайлыНастроек.Вставить("Каталог", Настройки.ПараметрыОбщие.Получить("КаталогНастроек")); 529 | 530 | ИменаФайлов = Настройки.ПараметрыОбщие.Получить("Файлы"); 531 | Если ТипЗнч(ИменаФайлов) <> Тип("Соответствие") Тогда 532 | ВызватьИсключение "Не найдена секция ""Файлы"" в группе ""Общие"" в файле настроек"; 533 | КонецЕсли; 534 | 535 | Настройки.ФайлыНастроек.Вставить("repo_test", ИменаФайлов.Получить("repo_test")); 536 | Настройки.ФайлыНастроек.Вставить("merge", ИменаФайлов.Получить("merge")); 537 | 538 | metadata_name = ИменаФайлов.Получить("metadata"); 539 | Если Не ЗначениеЗаполнено(metadata_name) Тогда 540 | metadata_name = "metadata.txt"; 541 | КонецЕсли; 542 | Настройки.ФайлыНастроек.Вставить("metadata", metadata_name); 543 | 544 | metadata_merge = ИменаФайлов.Получить("metadata_merge"); 545 | Если Не ЗначениеЗаполнено(metadata_merge) Тогда 546 | metadata_merge = "metadata_merge.xml"; 547 | КонецЕсли; 548 | Настройки.ФайлыНастроек.Вставить("metadata_merge", metadata_merge); 549 | 550 | ИмяКаталогаПоУмолчанию = "cf"; 551 | ПутьВНастройках = "ПутьККаталогуCF"; 552 | УстановитьКаталогФайловНастроек(ИмяКаталогаПоУмолчанию, ПутьВНастройках); 553 | 554 | ИмяКаталогаПоУмолчанию = "cfe"; 555 | ПутьВНастройках = "ПутьККаталогуCFe"; 556 | УстановитьКаталогФайловНастроек(ИмяКаталогаПоУмолчанию, ПутьВНастройках); 557 | 558 | ЗаполнитьЗначенияСвойств(Настройки, Настройки.ФайлыНастроек); 559 | 560 | КонецПроцедуры 561 | 562 | Процедура ПереопределитьПараметрыDebug(МенеджерПараметров, ИдентификаторКоманд, ПутьКФайлуCommands, 563 | ПутьКФайлуGroupCommands, ИдентификаторГрупповыхКоманд) 564 | 565 | ДанныеПараметров = Настройки.ПараметрыОбщие.Получить("Debug"); 566 | Настройки.ИдентификаторБазы = ДанныеПараметров.Получить("ИдентификаторБазы"); 567 | ИдентификаторКоманд = ДанныеПараметров.Получить("ИдентификаторКоманд"); 568 | ПутьКФайлуCommands = ДанныеПараметров.Получить("ФайлКоманд"); 569 | ПутьКФайлуGroupCommands = ДанныеПараметров.Получить("ФайлГрупповыхКоманд"); 570 | ИдентификаторГрупповыхКоманд = ДанныеПараметров.Получить("ИдентификаторГрупповыхКоманд"); 571 | 572 | УказательПлатформы = ДанныеПараметров.Получить("УказательГруппыПлатформы"); 573 | Если ЗначениеЗаполнено(УказательПлатформы) Тогда 574 | Настройки.ПараметрыПлатформы = МенеджерПараметров.Параметр(УказательПлатформы); 575 | КонецЕсли; 576 | 577 | Настройки.ПараметрыDebug.Вставить("КаталогСкрипта", ДанныеПараметров.Получить("КаталогСкрипта")); 578 | 579 | КонецПроцедуры 580 | 581 | Процедура УстановитьКаталогФайловНастроек(ИмяКаталога, ПутьВНастройках, ПоУмолчанию = Ложь) 582 | 583 | Если ПоУмолчанию Тогда 584 | ПутьККаталогу = "\" + ИмяКаталога; 585 | Иначе 586 | ПутьККаталогу = Настройки.ПараметрыОбщие.Получить(ПутьВНастройках); 587 | Если Не ЗначениеЗаполнено(ПутьККаталогу) Тогда 588 | УстановитьКаталогФайловНастроек(ИмяКаталога, ПутьВНастройках, Истина); 589 | Возврат; 590 | КонецЕсли; 591 | КонецЕсли; 592 | 593 | Если СтрНайти(ПутьККаталогу, ":\") = 0 Тогда 594 | // Относительный путь 595 | ПутьККаталогу = ТекущийКаталог() + ПутьККаталогу; 596 | КонецЕсли; 597 | 598 | Если Не РаботаСФайлами.ФайлСуществует(ПутьККаталогу) Тогда 599 | 600 | Попытка 601 | СоздатьКаталог(ПутьККаталогу); 602 | Исключение 603 | ТекстСообщения = "Не удаётся создать каталог " 604 | + ИмяКаталога + " по пути в настройках" + Символы.ПС + ОписаниеОшибки(); 605 | Логирователь.ВЛог(ТекстСообщения, Истина); 606 | Если Не ПоУмолчанию Тогда 607 | УстановитьКаталогФайловНастроек(ИмяКаталога, ПутьВНастройках, Истина); 608 | Иначе 609 | ВызватьИсключение; 610 | КонецЕсли; 611 | 612 | КонецПопытки; 613 | 614 | КонецЕсли; 615 | Настройки.ФайлыНастроек.Вставить(ПутьВНастройках, ПутьККаталогу); 616 | 617 | КонецПроцедуры 618 | 619 | Процедура ДобавитьСтрокуЧерезПС(СтрокаИсходная, Текст) 620 | 621 | Если Не ПустаяСтрока(СтрокаИсходная) Тогда 622 | СтрокаИсходная = СтрокаИсходная + Символы.ПС; 623 | КонецЕсли; 624 | 625 | СтрокаИсходная = СтрокаИсходная + Текст; 626 | 627 | КонецПроцедуры 628 | 629 | Функция ПроверитьОбязательныеОпции(Опции) 630 | 631 | ИдентификаторБазы = Опции.ИдентификаторБазы; 632 | GroupCommands = Опции.GroupCommands; 633 | 634 | Если Не ЗначениеЗаполнено(ИдентификаторБазы) И Не ЗначениеЗаполнено(GroupCommands) Тогда 635 | 636 | ТекстСообщения = "Необходимо передать один из обязательных параметров: 637 | |--ИдентификаторБазы 638 | |--GroupCommands"; 639 | 640 | Завершатель.ЗавершитьПоОшибке(ТекстСообщения); 641 | 642 | Возврат Ложь; 643 | 644 | КонецЕсли; 645 | 646 | Возврат Истина; 647 | 648 | КонецФункции 649 | 650 | #Область Приведение_типов 651 | 652 | Процедура ПривестиПустыеПараметры(ПолученныеПараметры) 653 | Если ТипЗнч(ПолученныеПараметры) <> Тип("Соответствие") Тогда 654 | ПолученныеПараметры = Новый Соответствие; 655 | КонецЕсли; 656 | КонецПроцедуры 657 | 658 | Процедура ПривестиЧисловойПараметр(Значение) 659 | Если ТипЗнч(Значение) <> Тип("Число") Тогда 660 | ОписаниеТипа = Новый ОписаниеТипов("Число"); 661 | Значение = ОписаниеТипа.ПривестиЗначение(Значение); 662 | КонецЕсли; 663 | КонецПроцедуры 664 | 665 | Процедура ПривестиМассивПараметр(Значение) 666 | Если ТипЗнч(Значение) <> Тип("Массив") Тогда 667 | Значение = Новый Массив; 668 | КонецЕсли; 669 | КонецПроцедуры 670 | 671 | #КонецОбласти 672 | 673 | &Желудь 674 | Процедура ПриСозданииОбъекта(&Пластилин ПервыйЗапуск) 675 | ПервыйЗапуск.Инициализация(); 676 | КонецПроцедуры --------------------------------------------------------------------------------