From 3a44fca82b0dafc65bfdc3ed0e15c5da972c98ee Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Mon, 31 Aug 2026 19:24:43 +0300 Subject: [PATCH 1/9] =?UTF-8?q?=D0=92=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=89=D0=B8=D0=B9=20=D1=81=D0=BB=D1=83=D0=B6?= =?UTF-8?q?=D0=B5=D0=B1=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D1=8C,=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=20=D0=A3=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=98=D0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Новый модуль СлужебныйIbcmdRunner: общие функции трёх классов (сравнение версий, кавычки, yes/no-конверсии, проверка имён 1С, шаблоны переменных среды) — устранено дублирование между классами. - УправлениеИБ: выделены повторяющиеся блоки (проверка минимальной версии платформы, подготовка команды создания ИБ, параметры фоновой выгрузки, добавление массивов параметров, секретные параметры). - Подробное отладочное логирование всех операций: командная строка, длительность, код возврата; значения паролей в лог не попадают. - Сообщения об ошибках дополнены контекстом: команда, код возврата, ожидавшиеся коды, текущая версия платформы, подсказки по исправлению. - Разбор списка расширений выделен в тестируемый метод РазобратьСписокРасширений и устойчив к свойствам без значений. - Неявные проверки версии вида 'Если СравнитьВерсии(...) Тогда' заменены на явные '<> 0' с сохранением исторического поведения. Co-Authored-By: Claude Fable 5 --- lib.config | 3 +- .../ibcmdrunner.os" | 1163 +++++++++-------- ...261\320\275\321\213\320\271IbcmdRunner.os" | 242 ++++ 3 files changed, 865 insertions(+), 543 deletions(-) create mode 100644 "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" diff --git a/lib.config b/lib.config index 140688f..cb3767e 100644 --- a/lib.config +++ b/lib.config @@ -1,4 +1,5 @@ - + + diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" index da49a38..7287efd 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" @@ -4,21 +4,21 @@ #Использовать logos #Использовать v8find #Использовать asserts -#Использовать 1commands +#Использовать 1commands #Область ОписаниеПеременных -Перем Лог; +Перем Лог; Перем ПутьКПриложению; // Строка - путь к приложению ibcmd Перем ЭтоWindows; // Булево - Это ОС Windows Перем ПараметрыЗапуска; // Массив параметров запуска команды -Перем ПараметрыСервернойИБ; // Массив параметров серверной информационной базы +Перем ПараметрыСервернойИБ; // Массив параметров серверной информационной базы Перем ПараметрыКонфигурацииАС; // Массив параметров конфигурационного файла автономного сервера Перем ПараметрыФайловойИБ; // Массив параметров файловой информационной базы Перем ПараметрыАвторизацииИБ; // Массив параметров авторизации информационной базы Перем ПараметрыАвтономногоСервера; // Массив параметров автономного сервера Перем ПеременныеСредыКоманды; // Соответствие - переменные среды команды - + Перем Версия; // Версия платформы 1С Перем Команда; // Команда исполнения вызова ibcmd @@ -31,14 +31,16 @@ // СнятьСПоддержки // Снимает с поддержки конфигурацию // Параметры: -// +// // Возвращаемое значение: // Процедура СнятьСПоддержки() Экспорт - - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + + Лог.Информация("Снятие конфигурации с поддержки"); НачатьЗаполнениеПараметровЗапуска("infobase config support disable"); - + ВыполнитьКоманду(); КонецПроцедуры @@ -48,39 +50,45 @@ // Параметры: // ЗавершитьОперацию - Булево - завершить незавершенную операцию. // ВосстановитьМетаданные - Булево - выполнить восстановление структуры метаданных конфигурации. -// +// // Возвращаемое значение: // Процедура ТестированиеИИсправление( Знач ЗавершитьОперацию, Знач ВосстановитьМетаданные ) Экспорт - - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); Ожидаем.Что(ЗавершитьОперацию).ИмеетТип("Булево"); Ожидаем.Что(ВосстановитьМетаданные).ИмеетТип("Булево"); + + Лог.Информация("Тестирование и исправление информационной базы (ЗавершитьОперацию: %1, ВосстановитьМетаданные: %2)", + ЗавершитьОперацию, ВосстановитьМетаданные); + НачатьЗаполнениеПараметровЗапуска("infobase config repair"); Если ЗавершитьОперацию Тогда ПараметрыЗапуска.Добавить("--commit"); Иначе ПараметрыЗапуска.Добавить("--rollback"); КонецЕсли; - ДобавитьПараметрЕслиЗаполнен("--fix-metadata", Ложь); - + ДобавитьПараметрЕслиЗаполнен("--fix-metadata", Ложь); + ВыполнитьКоманду(); КонецПроцедуры // СписокОбщихРеквизитов // Получение списка имен общих реквизитов прикладного решения. // Параметры: -// +// // Возвращаемое значение: // Строка - список имен общих реквизитов конфигурации. Функция СписокОбщихРеквизитов() Экспорт - - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + + Лог.Отладка("Получение списка общих реквизитов"); НачатьЗаполнениеПараметровЗапуска("infobase config data-separation list"); - + Результат = ВыполнитьКоманду(); Возврат Результат; КонецФункции @@ -92,11 +100,13 @@ // Возвращаемое значение: // Строка - идентификатор. Функция ИДПоколенияДанных(Знач ИмяРасширения = "") Экспорт - - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + + Лог.Отладка("Получение идентификатора поколения данных (расширение: '%1')", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config generation-id"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения, ""); - + Результат = ВыполнитьКоманду(); Возврат Результат; КонецФункции @@ -104,7 +114,7 @@ // #Область Работа с расширениями // СоздатьРасширение -// Создать расширение +// Создать расширение // Параметры: // ИмяРасширения - Строка - Имя расширения (обязательный). Строка должна удовлетворять требованиям 1С к именам // ПрефиксИмен - Строка - Префикс имен (обязательный). Должен удовлетворять правилам формирования имени. @@ -112,25 +122,24 @@ // Синоним - Строка - Синоним в формате функции NStr() // НазначениеРасширения - строка - должно быть одним из следующих слов: customization, add-on, patch // Возвращаемое значение: -// +// Процедура СоздатьРасширение( Знач ИмяРасширения, Знач ПрефиксИмен, Знач Синоним = "", Знач НазначениеРасширения = "add-on" ) Экспорт - - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, - "Версия платформы 1С должна быть старше, чем 8.3.20") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ИмяРасширения), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ПрефиксИмен), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); + + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + ПроверитьИмя(ИмяРасширения); + ПроверитьИмя(ПрефиксИмен); Ожидаем.Что(СтрНайти("customization,add-on,patch", НРег(НазначениеРасширения)) > 0, - "Назначение расширения может быть одним из customization, add-on, patch").ЭтоИстина(); + СтрШаблон("Назначение расширения может быть одним из customization, add-on, patch, получено: '%1'", + НазначениеРасширения)) + .ЭтоИстина(); + + Лог.Информация("Создание расширения '%1' (префикс: '%2', назначение: %3)", + ИмяРасширения, ПрефиксИмен, НазначениеРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config extension create"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); @@ -142,12 +151,12 @@ УспешныеКодыВозврата.Добавить(0); УспешныеКодыВозврата.Добавить(102); // это костыль, но команда падает с таким кодом. При этом расширение создается. - ВыполнитьКоманду(УспешныеКодыВозврата); + ВыполнитьКоманду(УспешныеКодыВозврата); -КонецПроцедуры +КонецПроцедуры // ИнформацияОРасширении -// Получить информацию о расширении +// Получить информацию о расширении // Параметры: // ИмяРасширения - Строка - должна удовлетворять требованиям 1С к именам // Возвращаемое значение: @@ -164,13 +173,10 @@ // hash-sum : "DH5A+FGtydy+dZ9jsjV2ZBuskfE="
Функция ИнформацияОРасширении(Знач ИмяРасширения) Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, - "Версия платформы 1С должна быть старше, чем 8.3.20") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ИмяРасширения), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + ПроверитьИмя(ИмяРасширения); + + Лог.Отладка("Получение информации о расширении '%1'", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config extension info"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); @@ -179,22 +185,25 @@ КонецФункции // СписокРасширений -// Получить список расширений, подключенных к конфигурации автономного сервера +// Получить список расширений, подключенных к конфигурации автономного сервера // Параметры: // Возвращаемое значение: -// Строка - Список расширений +// Строка - Список расширений Функция СписокРасширений() Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + + Лог.Отладка("Получение списка расширений"); НачатьЗаполнениеПараметровЗапуска("infobase config extension list"); - + Результат = ВыполнитьКоманду(); Возврат Результат; КонецФункции // ИзменитьСвойстваРасширения -// Изменить свойства расширения +// Изменить свойства расширения. +// Параметры со значением Неопределено (для имени профиля безопасности - с пустой строкой) +// не изменяются. // Параметры: // ИмяРасширения - Строка - Имя расширения, у которого будем изменять свойства // Активность - Булево, Неопределено - Активность @@ -214,94 +223,77 @@ Знач ЗащитаОтОпасныхДействий = Неопределено, Знач ИспользуетсяВ_РИБ = Неопределено, Знач ОбластьДействия_ИБ = Неопределено) Экспорт - - ТипБулево = "Булево"; - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, - "Версия платформы 1С должна быть старше, чем 8.3.20") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ИмяРасширения), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); - + + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + ПроверитьИмя(ИмяРасширения); + Ожидаем.Что(ИмяПрофиляБезопасности).ИмеетТип("Строка"); + + Лог.Информация("Изменение свойств расширения '%1'", ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config extension update"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); - - Если Активность <> Неопределено Тогда - Ожидаем.Что(Активность).ИмеетТип(ТипБулево); - ПараметрыЗапуска.Добавить("--active=" + БулевоВСтроку(Активность)); - КонецЕсли; - - Если БезопасныйРежим <> Неопределено Тогда - Ожидаем.Что(БезопасныйРежим).ИмеетТип(ТипБулево); - ПараметрыЗапуска.Добавить("--safe-mode=" + БулевоВСтроку(БезопасныйРежим)); - КонецЕсли; - - Ожидаем.Что(ИмяПрофиляБезопасности).ИмеетТип("Строка"); + + ДобавитьПараметрБулевоЕслиЗадан("--active", Активность); + ДобавитьПараметрБулевоЕслиЗадан("--safe-mode", БезопасныйРежим); + Если НЕ ПустаяСтрока(ИмяПрофиляБезопасности) Тогда ПараметрыЗапуска.Добавить("--security-profile-name=" + ОбернутьВКавычки(ИмяПрофиляБезопасности)); КонецЕсли; - - Если ЗащитаОтОпасныхДействий <> Неопределено Тогда - Ожидаем.Что(ЗащитаОтОпасныхДействий).ИмеетТип(ТипБулево); - ПараметрыЗапуска.Добавить("--unsafe-action-protection=" + БулевоВСтроку(ЗащитаОтОпасныхДействий)); - КонецЕсли; - - Если ИспользуетсяВ_РИБ <> Неопределено Тогда - Ожидаем.Что(ИспользуетсяВ_РИБ).ИмеетТип(ТипБулево); - ПараметрыЗапуска.Добавить("--used-in-distributed-infobase=" + БулевоВСтроку(ИспользуетсяВ_РИБ)); - КонецЕсли; - + + ДобавитьПараметрБулевоЕслиЗадан("--unsafe-action-protection", ЗащитаОтОпасныхДействий); + ДобавитьПараметрБулевоЕслиЗадан("--used-in-distributed-infobase", ИспользуетсяВ_РИБ); + Если ОбластьДействия_ИБ <> Неопределено Тогда - Ожидаем.Что(ОбластьДействия_ИБ).ИмеетТип(ТипБулево); - + Ожидаем.Что(ОбластьДействия_ИБ).ИмеетТип("Булево"); + Если ОбластьДействия_ИБ Тогда ПараметрыЗапуска.Добавить("--scope=infobase"); Иначе ПараметрыЗапуска.Добавить("--scope=data-separation"); КонецЕсли; - + КонецЕсли; - + ВыполнитьКоманду(); - + КонецПроцедуры // УдалитьРасширение -// Удалить расширение +// Удалить расширение // Параметры: // ИмяРасширения - Строка - Имя расширения, у которого будем изменять свойства // Возвращаемое значение: -// +// Процедура УдалитьРасширение( Знач ИмяРасширения ) Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, - "Версия платформы 1С должна быть старше, чем 8.3.20") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ИмяРасширения), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + ПроверитьИмя(ИмяРасширения); + + Лог.Информация("Удаление расширения '%1'", ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config extension delete"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); - + ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // УдалитьВсеРасширения -// Удалить все расширения +// Удалить все расширения // Параметры: // Возвращаемое значение: -// +// Процедура УдалитьВсеРасширения() Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + + Лог.Информация("Удаление всех расширений"); + НачатьЗаполнениеПараметровЗапуска("infobase config extension delete --all"); - + ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // #КонецОбласти @@ -316,14 +308,15 @@ // Строка - текущий путь к приложению // Функция ПутьКПриложению(Знач Путь = Неопределено) Экспорт - + Если Путь <> Неопределено Тогда Ожидаем.Что(Путь).ИмеетТип("Строка"); + Лог.Отладка("Установка пути к приложению ibcmd: %1", Путь); ПутьКПриложению = Путь; Версия(); - КонецЕсли; + КонецЕсли; Возврат ПутьКПриложению; -КонецФункции +КонецФункции // УстановитьПараметрыСервернойИБ // Установить параметры запуска для клиент-серверной информационной базы @@ -333,41 +326,32 @@ // PostgreSQL - PostgreSQL; // IBMDB2 - IBM DB2; // OracleDatabase - Oracle Database. -// +// // СерверСУБД - строка - Имя сервера СУБД; // ИмяБД - Строка - Имя базы данных в СУБД; // ПользовательБД - Строка - Имя пользователя СУБД; // ПарольБД - Строка - Пароль пользователя в БД; Процедура УстановитьПараметрыСервернойИБ(Знач ТипСУБД,Знач СерверСУБД,Знач ИмяБД,Знач ПользовательБД,Знач ПарольБД) Экспорт - - ПараметрыФайловойИБ.Очистить(); - ПараметрыСервернойИБ.Очистить(); - ПараметрыКонфигурацииАС.Очистить(); - - ПеременнаяСредыПользовательБД = "IBCMD_DB_USR"; - ПеременнаяСредыПарольБД = "IBCMD_DB_PSW"; Ожидаем.Что(СтрНайти("mssqlserver,postgresql,ibmdb2,oracledatabase", НРег(ТипСУБД)) > 0, - "Тип СУБД должен быть один из MSSQLServer, PostgreSQL,IBMDB2,OracleDatabase").ЭтоИстина(); + СтрШаблон("Тип СУБД должен быть один из MSSQLServer, PostgreSQL,IBMDB2,OracleDatabase, получено: '%1'", ТипСУБД)) + .ЭтоИстина(); + ОчиститьОбщиеПараметрыИБ(); - - + Лог.Отладка("Установлены параметры серверной ИБ (СУБД: %1, сервер: %2, база: %3, пользователь и пароль передаются через переменные среды)", + ТипСУБД, СерверСУБД, ИмяБД); + + ПеременнаяСредыПользовательБД = "IBCMD_DB_USR"; + ПеременнаяСредыПарольБД = "IBCMD_DB_PSW"; ПараметрыСервернойИБ.Добавить(СтрШаблон("--dbms=%1", ТипСУБД)); ПараметрыСервернойИБ.Добавить(СтрШаблон("--db-server=%1", СерверСУБД)); ПараметрыСервернойИБ.Добавить(СтрШаблон("--db-name=%1", ИмяБД)); - - Если ЗначениеЗаполнено(ПользовательБД) Тогда - ПеременныеСредыКоманды.Вставить(ПеременнаяСредыПользовательБД, ПользовательБД); - ПараметрыСервернойИБ.Добавить(СтрШаблон("--db-user=%1", ШаблонПеременнойСреды(ПеременнаяСредыПользовательБД))); - КонецЕсли; - Если ЗначениеЗаполнено(ПарольБД) Тогда - ПеременныеСредыКоманды.Вставить(ПеременнаяСредыПарольБД, ПарольБД); - ПараметрыСервернойИБ.Добавить(СтрШаблон("--db-pwd=%1", ШаблонПеременнойСреды(ПеременнаяСредыПарольБД))); - КонецЕсли; + ДобавитьСекретныйПараметр(ПараметрыСервернойИБ, "--db-user", ПеременнаяСредыПользовательБД, ПользовательБД); + ДобавитьСекретныйПараметр(ПараметрыСервернойИБ, "--db-pwd", ПеременнаяСредыПарольБД, ПарольБД); КонецПроцедуры @@ -377,27 +361,27 @@ // КаталогИБ - Строка - Путь к файловой информационной базе; Процедура УстановитьПараметрыФайловойИБ(Знач КаталогИБ) Экспорт - ПараметрыСервернойИБ.Очистить(); - ПараметрыФайловойИБ.Очистить(); - ПараметрыКонфигурацииАС.Очистить(); + ОчиститьОбщиеПараметрыИБ(); + + Лог.Отладка("Установлены параметры файловой ИБ (каталог: %1)", КаталогИБ); ПараметрыФайловойИБ.Добавить("--db-path=" + ОбернутьВКавычки(КаталогИБ)); - -КонецПроцедуры + +КонецПроцедуры // УстановитьКонфигурационныйФайл -// Установить конфигурационный файл автономного сервера +// Установить конфигурационный файл автономного сервера // Параметры: // ИмяФайла - Строка - Полный путь к файлу конфигурации автономного сервера (yml); Процедура УстановитьКонфигурационныйФайл(Знач ИмяФайла) Экспорт - ПараметрыСервернойИБ.Очистить(); - ПараметрыФайловойИБ.Очистить(); - ПараметрыКонфигурацииАС.Очистить(); - + ОчиститьОбщиеПараметрыИБ(); + + Лог.Отладка("Установлен конфигурационный файл автономного сервера: %1", ИмяФайла); + ПараметрыКонфигурацииАС.Добавить("--config=" + ОбернутьВКавычки(ИмяФайла)); - -КонецПроцедуры + +КонецПроцедуры // УстановитьПараметрыАвторизацииИБ // Установить параметры авторизации информационной базы @@ -415,18 +399,16 @@ Если СравнитьВерсии(Версия, "8.3.18.1563") > 0 Тогда - Если ЗначениеЗаполнено(ПользовательИБ) Тогда - ПеременныеСредыКоманды.Вставить(ПеременнаяСредыПользовательИБ, ПользовательИБ); - ПараметрыАвторизацииИБ.Добавить(СтрШаблон("--user=%1", ШаблонПеременнойСреды(ПеременнаяСредыПользовательИБ))); - КонецЕсли; + Лог.Отладка("Установлены параметры авторизации ИБ (пользователь: %1, пароль передается через переменную среды)", + ПользовательИБ); - Если ЗначениеЗаполнено(ПарольИБ) Тогда - ПеременныеСредыКоманды.Вставить(ПеременнаяСредыПарольИБ, ПарольИБ); - ПараметрыАвторизацииИБ.Добавить(СтрШаблон("--password=%1", ШаблонПеременнойСреды(ПеременнаяСредыПарольИБ))); - КонецЕсли; + ДобавитьСекретныйПараметр(ПараметрыАвторизацииИБ, "--user", ПеременнаяСредыПользовательИБ, ПользовательИБ); + ДобавитьСекретныйПараметр(ПараметрыАвторизацииИБ, "--password", ПеременнаяСредыПарольИБ, ПарольИБ); + Иначе + Лог.Отладка("Параметры авторизации ИБ не установлены: версия платформы %1 не старше 8.3.18.1563", Версия); КонецЕсли; -КонецПроцедуры +КонецПроцедуры // УстановитьПараметрыАвтономногоСервера // Установить параметры автономного сервера @@ -438,30 +420,28 @@ ПараметрыАвтономногоСервера.Очистить(); Ожидаем.Что(КаталогДанныхАС).ИмеетТип("Строка"); Если СравнитьВерсии(Версия, "8.3.20") > 0 Тогда + Лог.Отладка("Установлен каталог данных автономного сервера: %1", КаталогДанныхАС); ПараметрыАвтономногоСервера.Добавить("--data=" + ОбернутьВКавычки(КаталогДанныхАС)); + Иначе + Лог.Отладка("Каталог данных автономного сервера не установлен: версия платформы %1 не старше 8.3.20", Версия); КонецЕсли; -КонецПроцедуры +КонецПроцедуры // СоздатьИБ // Создать пустую информационную базу без данных и конфигурации. // Для команды автоматом устанавливаются параметры "--create-database" и "--force" // Параметры: -// Локаль - Строка - имя локали +// Локаль - Строка - имя локали // СмещениеДат - Число - Смещение дат в годах (имеет смысл только для MSSQL) Процедура СоздатьИБ( - Знач Локаль = Неопределено, + Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт - НачатьЗаполнениеПараметровЗапуска("infobase create"); + Лог.Информация("Создание пустой информационной базы"); + + ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат); - ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); - ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); - - ПараметрыЗапуска.Добавить("--create-database"); - - ПараметрыЗапуска.Добавить("--force"); - ВыполнитьКоманду(); КонецПроцедуры @@ -472,23 +452,17 @@ // Параметр "--apply" не устанавливается, предполагается использование отдельной команды // Параметры: // ПутьКФайлуВыгрузки - Строка - Путь к файлу выгрузки информационной базы -// Локаль - Строка - имя локали +// Локаль - Строка - имя локали // СмещениеДат - Число - Смещение дат в годах (имеет смысл только для MSSQL) Процедура СоздатьИБИзФайлаВыгрузки( Знач ПутьКФайлуВыгрузки, Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт - - НачатьЗаполнениеПараметровЗапуска("infobase create"); - - ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); - ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); - ПараметрыЗапуска.Добавить("--create-database"); - - ДобавитьПараметрЕслиЗаполнен("--restore", ПутьКФайлуВыгрузки, ""); - - ПараметрыЗапуска.Добавить("--force"); - + + Лог.Информация("Создание информационной базы из файла выгрузки %1", ПутьКФайлуВыгрузки); + + ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--restore", ПутьКФайлуВыгрузки); + ВыполнитьКоманду(); КонецПроцедуры @@ -498,23 +472,17 @@ // Параметр "--apply" не устанавливается, предполагается использование отдельной команды // Параметры: // ПутьКФайлуКонфигурации - Строка - Путь к файлу конфигурации информационной базы -// Локаль - Строка - имя локали +// Локаль - Строка - имя локали // СмещениеДат - Число - Смещение дат в годах (имеет смысл только для MSSQL) Процедура СоздатьИБИзФайлаКонфигурации( Знач ПутьКФайлуКонфигурации, Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт - - НачатьЗаполнениеПараметровЗапуска("infobase create"); - - ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); - ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); - ПараметрыЗапуска.Добавить("--create-database"); - - ДобавитьПараметрЕслиЗаполнен("--load", ПутьКФайлуКонфигурации, ""); - - ПараметрыЗапуска.Добавить("--force"); - + + Лог.Информация("Создание информационной базы из файла конфигурации %1", ПутьКФайлуКонфигурации); + + ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--load", ПутьКФайлуКонфигурации); + ВыполнитьКоманду(); КонецПроцедуры @@ -524,24 +492,18 @@ // Параметр "--apply" не устанавливается, предполагается использование отдельной команды // Параметры: // ПутьККаталогуВыгрузки - Строка - Путь к каталогу выгрузки конфигурации в файлы -// Локаль - Строка - имя локали +// Локаль - Строка - имя локали // СмещениеДат - Число - Смещение дат в годах (имеет смысл только для MSSQL) Процедура СоздатьИБИзФайловКонфигурации( Знач ПутьККаталогуВыгрузки, Знач Локаль = Неопределено, Знач СмещениеДат = 2000 ) Экспорт - - НачатьЗаполнениеПараметровЗапуска("infobase create"); - - ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); - ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); - ПараметрыЗапуска.Добавить("--create-database"); - - ДобавитьПараметрЕслиЗаполнен("--import", ПутьККаталогуВыгрузки, ""); - - ПараметрыЗапуска.Добавить("--force"); - + + Лог.Информация("Создание информационной базы из файлов конфигурации (каталог: %1)", ПутьККаталогуВыгрузки); + + ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--import", ПутьККаталогуВыгрузки); + ВыполнитьКоманду(); КонецПроцедуры @@ -550,9 +512,11 @@ // Параметры: // ПутьКФайлуВыгрузки - Строка - Путь к файлу выгрузки Процедура ВыгрузитьДанныеИБ(Знач ПутьКФайлуВыгрузки) Экспорт - + + Лог.Информация("Выгрузка данных информационной базы в файл %1", ПутьКФайлуВыгрузки); + НачатьЗаполнениеПараметровЗапуска("infobase dump"); - + ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуВыгрузки)); ВыполнитьКоманду(); @@ -564,24 +528,17 @@ // Параметры: // ПутьКФайлуВыгрузки - Строка - Путь к файлу выгрузки Процедура ЗагрузитьДанныеИБ(Знач ПутьКФайлуВыгрузки) Экспорт - + + Лог.Информация("Загрузка данных информационной базы из файла %1", ПутьКФайлуВыгрузки); + НачатьЗаполнениеПараметровЗапуска("infobase restore"); - + ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуВыгрузки)); ВыполнитьКоманду(); КонецПроцедуры -// // Очистить информационную базу -// Процедура ОчиститьИБ() Экспорт - -// НачатьЗаполнениеПараметровЗапуска("infobase clear"); - -// ВыполнитьКоманду(); - -// КонецПроцедуры - // ЗагрузитьКонфигурацию // Загрузить конфигурацию из файла // Параметры: @@ -590,8 +547,10 @@ // основная конфигурация Процедура ЗагрузитьКонфигурацию(Знач ПутьКФайлуКонфигурации, Знач ИмяРасширения = "") Экспорт + Лог.Информация("Загрузка конфигурации из файла %1 (расширение: '%2')", ПутьКФайлуКонфигурации, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config load"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуКонфигурации)); @@ -612,17 +571,20 @@ Знач ИмяРасширения = "", Знач ВыгружатьОсновнуюКонфигурацию = ЛОЖЬ) Экспорт + Лог.Информация("Выгрузка конфигурации в файл %1 (расширение: '%2')", ПутьКФайлуКонфигурации, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config save"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - // ПараметрыЗапуска.Добавить("--force"); Если ВыгружатьОсновнуюКонфигурацию Тогда - Если СравнитьВерсии(Версия, "8.3.20") Тогда + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда ПараметрыЗапуска.Добавить("--db"); - Иначе + Иначе ПараметрыЗапуска.Добавить("--staging"); - КонецЕсли; - КонецЕсли; + КонецЕсли; + КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуКонфигурации)); ВыполнитьКоманду(); @@ -633,16 +595,18 @@ // Параметры: // ИмяРасширения - Строка - имя расширения // Возвращаемое значение: -// Строка - строка консольного вывода команды +// Строка - строка консольного вывода команды Функция ПроверитьКонфигурацию(Знач ИмяРасширения = "") Экспорт - + + Лог.Отладка("Проверка конфигурации (расширение: '%1')", ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config check"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); - Рез = ВыполнитьКоманду(); - Возврат Рез; -КонецФункции + Результат = ВыполнитьКоманду(); + Возврат Результат; +КонецФункции // ОбновитьКонфигурациюБазыДанных // Обновить конфигурацию @@ -665,19 +629,26 @@ Знач ДинамическоеОбновление = "auto", Знач ЗавершатьСеансы = "auto") Экспорт + Лог.Информация("Обновление конфигурации базы данных (расширение: '%1', динамическое обновление: %2, завершение сеансов: %3)", + ИмяРасширения, ДинамическоеОбновление, ЗавершатьСеансы); + НачатьЗаполнениеПараметровЗапуска("infobase config apply"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); - Если СравнитьВерсии(Версия, "8.3.20") Тогда - Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ДинамическоеОбновление) > 0, - "Должно быть одно из auto, disable, prompt, force").ЭтоИстина(); - Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ЗавершатьСеансы) > 0, - "Должно быть одно из auto, disable, prompt, force").ЭтоИстина(); + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда + Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ДинамическоеОбновление) > 0, + СтрШаблон("Должно быть одно из auto, disable, prompt, force, получено: '%1'", ДинамическоеОбновление)) + .ЭтоИстина(); + Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ЗавершатьСеансы) > 0, + СтрШаблон("Должно быть одно из auto, disable, prompt, force, получено: '%1'", ЗавершатьСеансы)) + .ЭтоИстина(); ДобавитьПараметрЕслиЗаполнен("--dynamic", ДинамическоеОбновление, "auto"); - ДобавитьПараметрЕслиЗаполнен("--session-terminate", ЗавершатьСеансы, "auto"); - КонецЕсли; - + ДобавитьПараметрЕслиЗаполнен("--session-terminate", ЗавершатьСеансы, "auto"); + КонецЕсли; + ВыполнитьКоманду(); КонецПроцедуры @@ -687,9 +658,11 @@ // Параметры: // ИмяРасширения - Строка - имя расширения Процедура ВозвратитьсяККонфигурацииБазыДанных(Знач ИмяРасширения = "") Экспорт - + + Лог.Информация("Возврат к конфигурации базы данных (расширение: '%1')", ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config reset"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); ВыполнитьКоманду(); @@ -701,14 +674,16 @@ // ПутьКФайлуXML - Строка - Путь к файлу состояния конфигурации (ConfigDumpInfo) // ИмяРасширения - Строка - Имя расширения Процедура ВыгрузитьВФайлСостояниеКонфигурации(Знач ПутьКФайлуXML, Знач ИмяРасширения = "") Экспорт - + + Лог.Информация("Выгрузка состояния конфигурации в файл %1 (расширение: '%2')", ПутьКФайлуXML, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config export info"); - + ДобавитьПараметрЕслиЗаполнен("--out", ОбернутьВКавычки(ПутьКФайлуXML)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - + ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // ВыгрузитьВФайлИзмененияКонфигурации // Вывести информацию о изменениях конфигурации относительно переданного состояния (ConfigDumpInfo) @@ -724,22 +699,23 @@ Знач ИмяРасширения = "", Знач ВыводитьВКраткомФормате = ЛОЖЬ ) Экспорт - + + Лог.Информация("Выгрузка изменений конфигурации в файл %1 (базовый файл: %2, расширение: '%3')", + ПутьКФайлуXMLИзменений, ПутьКФайлуXMLВыгрузки, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config export status"); - + ДобавитьПараметрЕслиЗаполнен("--out", ПутьКФайлуXMLИзменений); ДобавитьПараметрЕслиЗаполнен("--base", ПутьКФайлуXMLВыгрузки); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если ВыводитьВКраткомФормате Тогда - ПараметрыЗапуска.Добавить("--short"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--short", ВыводитьВКраткомФормате); ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // ВыгрузитьОбъектыКонфигурацииВФайлы // Экспорт выбранных объектов конфигурации в XML // Параметры: -// КаталогВыгрузки - Строка - Каталог для экспорта +// КаталогВыгрузки - Строка - Каталог для экспорта // ВыгружатьРекурсивно - Булево - Выполнять экспорт дочерних объектов. // Объекты - Массив - Список строк - имен объектов конфигурации для экспорта. // ИмяРасширения - Строка - Имя расширения @@ -747,7 +723,7 @@ // !!! При версии платформы < 8.3.21 параметр игнорируется !!! // НаСервере - Булево - если Истина, то выгружать на сервере.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! -// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, +// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, // по количеству ядер процессоров.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! Процедура ВыгрузитьОбъектыКонфигурацииВФайлы( @@ -761,31 +737,23 @@ Ожидаем.Что(Объекты).ИмеетТип("Массив"); + Лог.Информация("Выгрузка объектов конфигурации в файлы (каталог: %1, объектов: %2, расширение: '%3')", + КаталогВыгрузки, Объекты.Количество(), ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config export objects"); - + ДобавитьПараметрЕслиЗаполнен("--out", ОбернутьВКавычки(КаталогВыгрузки)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если ВыгружатьРекурсивно Тогда - ПараметрыЗапуска.Добавить("--recursive"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--recursive", ВыгружатьРекурсивно); Если Объекты.Количество() > 0 Тогда - Для Каждого Объект Из Объекты Цикл - ПараметрыЗапуска.Добавить(Объект); - КонецЦикла; + ДобавитьМассивПараметров(Объекты); Иначе - ВызватьИсключение "Не заданы объекты конфигурации для экспорта в файлы!"; - КонецЕсли; + ВызватьИсключение "Не заданы объекты конфигурации для экспорта в файлы!"; + КонецЕсли; Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда - Если ВАрхив Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; - Если НаСервере Тогда - ПараметрыЗапуска.Добавить("--server"); - КонецЕсли; - ДобавитьПараметрЕслиЗаполнен("--threads", КоличествоПотоков, 0); - - КонецЕсли; + ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); + КонецЕсли; ВыполнитьКоманду(); КонецПроцедуры @@ -797,7 +765,7 @@ // !!! При версии платформы < 8.3.21 параметр игнорируется !!! // НаСервере - Булево - если Истина, то выгружать на сервере.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! -// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, +// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, // по количеству ядер процессоров.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! Процедура ВыгрузитьВсеРасширенияВФайлы( @@ -805,19 +773,14 @@ Знач ВАрхив = Ложь, Знач НаСервере = Ложь, Знач КоличествоПотоков = 0) Экспорт - + + Лог.Информация("Выгрузка всех расширений в файлы (каталог: %1)", КаталогВыгрузки); + НачатьЗаполнениеПараметровЗапуска("infobase config export all-extensions"); - + Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда - Если ВАрхив Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; - Если НаСервере Тогда - ПараметрыЗапуска.Добавить("--server"); - КонецЕсли; - ДобавитьПараметрЕслиЗаполнен("--threads", КоличествоПотоков, 0); - - КонецЕсли; + ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); + КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); @@ -835,7 +798,7 @@ // !!! При версии платформы < 8.3.21 параметр игнорируется !!! // НаСервере - Булево - если Истина, то выгружать на сервере.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! -// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, +// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, // по количеству ядер процессоров.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! // НеВыгружатьНеСуществующиеОбъекты - Булево - если Истина, запрещает выгрузку в XML-файлы ссылок на @@ -852,25 +815,17 @@ Знач НеВыгружатьНеСуществующиеОбъекты = Ложь ) Экспорт + Лог.Информация("Выгрузка конфигурации в файлы (каталог: %1, расширение: '%2')", КаталогВыгрузки, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config export"); - + ДобавитьПараметрЕслиЗаполнен("--base", ОбернутьВКавычки(ПутьКФайлуXMLВыгрузки), """"""); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если Синхронизировать Тогда - ПараметрыЗапуска.Добавить("--sync"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--sync", Синхронизировать); Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда - Если ВАрхив Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; - Если НаСервере Тогда - ПараметрыЗапуска.Добавить("--server"); - КонецЕсли; - ДобавитьПараметрЕслиЗаполнен("--threads", КоличествоПотоков, 0); - Если НеВыгружатьНеСуществующиеОбъекты Тогда - ПараметрыЗапуска.Добавить("--ignore-unresolved-refs"); - КонецЕсли; - КонецЕсли; + ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); + ДобавитьФлагЕслиИстина("--ignore-unresolved-refs", НеВыгружатьНеСуществующиеОбъекты); + КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); КонецПроцедуры @@ -888,18 +843,20 @@ Знач ОтключитьПроверку = Ложь ) Экспорт + Лог.Информация("Загрузка конфигурации из файлов (каталог: %1, расширение: '%2')", КаталогВыгрузки, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config import"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если СравнитьВерсии(Версия,"8.3.20") Тогда + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда Ожидаем.Что(ОтключитьПроверку).ИмеетТип("Булево"); - Если ОтключитьПроверку Тогда - ПараметрыЗапуска.Добавить("--no-check"); - КонецЕсли; - КонецЕсли; - - ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); + ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); + КонецЕсли; + + ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); КонецПроцедуры @@ -922,40 +879,30 @@ Ожидаем.Что(ВыбранныеФайлы).ИмеетТип("Массив"); Ожидаем.Что(ВыбранныеФайлы, "Не заданы файлы конфигурации для импорта в объекты метаданных!").Заполнено(); + Лог.Информация("Загрузка выбранных файлов конфигурации (каталог: %1, файлов: %2, расширение: '%3')", + КаталогВыгрузки, ВыбранныеФайлы.Количество(), ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config import files"); - + ДобавитьПараметрЕслиЗаполнен("--base-dir", ОбернутьВКавычки(КаталогВыгрузки)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если СравнитьВерсии(Версия,"8.3.20") Тогда + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда Ожидаем.Что(ОтключитьПроверку).ИмеетТип("Булево"); Ожидаем.Что(ИзАрхива).ИмеетТип("Булево"); - Если ОтключитьПроверку Тогда - ПараметрыЗапуска.Добавить("--no-check"); - КонецЕсли; - Если ИзАрхива Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; - КонецЕсли; + ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); + ДобавитьФлагЕслиИстина("--archive", ИзАрхива); + КонецЕсли; ИмяФайлаПараметров = ВременныеФайлы.НовоеИмяФайла("txt"); Если ВыбранныеФайлы.Количество() = 1 Тогда ВыбранныйФайл = ВыбранныеФайлы[0]; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ВыбранныйФайл)); - + Иначе - СтрокаДляЗаписи = ""; - Если ЭтоWindows Тогда - Кодировка = КодировкаТекста.ANSI; - Иначе - Кодировка = КодировкаТекста.UTF8NoBOM; - КонецЕсли; - ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаПараметров, Кодировка); - Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл - СтрокаДляЗаписи = ?(СтрокаДляЗаписи="", "", Символы.ПС)+ СокрЛП(ВыбранныйФайл); - КонецЦикла; - ЗаписьТекста.ЗаписатьСтроку(СокрЛП(СтрокаДляЗаписи),""); - ЗаписьТекста.Закрыть(); + ЗаписатьСписокФайловВФайлПараметров(ИмяФайлаПараметров, ВыбранныеФайлы); ПараметрыЗапуска.Добавить("<"); ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ИмяФайлаПараметров)); @@ -966,7 +913,7 @@ ВременныеФайлы.УдалитьФайл(ИмяФайлаПараметров); -КонецПроцедуры +КонецПроцедуры // ЗагрузитьВсеРасширенияИзФайлов // Импорт всех расширений конфигурации из XML @@ -979,23 +926,23 @@ Знач ОтключитьПроверку = Ложь, Знач ИзАрхива = Ложь ) Экспорт - + + Лог.Информация("Загрузка всех расширений из файлов (каталог: %1)", КаталогВыгрузки); + НачатьЗаполнениеПараметровЗапуска("infobase config import all-extensions"); - - Если СравнитьВерсии(Версия,"8.3.20") Тогда + + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда Ожидаем.Что(ОтключитьПроверку).ИмеетТип("Булево"); Ожидаем.Что(ИзАрхива).ИмеетТип("Булево"); - Если ОтключитьПроверку Тогда - ПараметрыЗапуска.Добавить("--no-check"); - КонецЕсли; - Если ИзАрхива Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; - КонецЕсли; - + ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); + ДобавитьФлагЕслиИстина("--archive", ИзАрхива); + КонецЕсли; + ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // Версия // Получить версию платформы 1С @@ -1049,53 +996,9 @@ // Функция ОписанияРасширений() Экспорт - ОписанияРасширений = Новый Массив; - СписокРасширений = СписокРасширений(); - Если Не ЗначениеЗаполнено(СписокРасширений) Тогда - Возврат ОписанияРасширений; - КонецЕсли; - - ИндикаторБлока = "name :"; - - Для Каждого БлокТекста Из СтроковыеФункции.РазложитьСтрокуВМассивПодстрок(СписокРасширений, ИндикаторБлока, Истина, Истина) Цикл - - СтрокиБлока = СтрРазделить(БлокТекста, Символы.ПС); - Если Не ЗначениеЗаполнено(СтрокиБлока) Тогда - Продолжить; - КонецЕсли; - - СтрокаСИменем = СтрокиБлока[0]; - СтрокаСИменем = СтрЗаменить(СтрокаСИменем, """", ""); - СтрокаСИменем = СтрЗаменить(СтрокаСИменем, символы.ВК, ""); - - СтрокиБлока.Удалить(0); - - ОписаниеРасширения = НовыйОписаниеРасширения(); - - ОписаниеРасширения.Вставить("name", СтрокаСИменем); - - Для Каждого СтрокаСвойства Из СтрокиБлока Цикл - - ИмяЗначение = СтрРазделить(СтрокаСвойства, ":", Ложь); - - ИмяСвойства = СокрЛП(ИмяЗначение[0]); - ЗначениеСвойства = СтрЗаменить(СокрЛП(ИмяЗначение[1]), """", ""); - - Если ТипЗнч(ОписаниеРасширения.Получить(ИмяСвойства)) = Тип("Булево") Тогда - ЗначениеСвойства = СтрокаВБулево(ЗначениеСвойства); - КонецЕсли; - - ОписаниеРасширения.Вставить(ИмяСвойства, ЗначениеСвойства); - - КонецЦикла; - - ОписанияРасширений.Добавить(ОписаниеРасширения); - - КонецЦикла; - - Возврат ОписанияРасширений; + Возврат РазобратьСписокРасширений(СписокРасширений); КонецФункции @@ -1109,59 +1012,63 @@ // Примеры использования смотрите в тестах. // // Параметры: -// ЭтаВерсия - Строка - номер версии +// ЭтаВерсия - Строка - номер версии // БольшеЧемВерсия - Строка - второй сравниваемый номер версии. // // Возвращаемое значение: -// Число - больше 0, если ЭтаВерсия > БольшеЧемВерсия; +// Число - больше 0, если ЭтаВерсия > БольшеЧемВерсия; // 0, если версии равны. // число меньше 0, если ЭтаВерсия < БольшеЧемВерсия. // Функция СравнитьВерсии(Знач ЭтаВерсия, Знач БольшеЧемВерсия) Экспорт - - Ожидаем.Что(ЭтаВерсия).ИмеетТип("Строка"); - Ожидаем.Что(БольшеЧемВерсия).ИмеетТип("Строка"); - - компонентыЭтойВерсии = МассивКомпонентВерсии( ЭтаВерсия ); - компонентыДругойВерсии = МассивКомпонентВерсии( БольшеЧемВерсия ); - // Выравниваем количество компонент + Возврат СлужебныйIbcmdRunner.СравнитьВерсии(ЭтаВерсия, БольшеЧемВерсия); + +КонецФункции + +// Получить имя лога продукта +// +// Возвращаемое значение: +// Строка - имя лога продукта +// +Функция ИмяЛога() Экспорт + Возврат СлужебныйIbcmdRunner.ИмяЛога(); +КонецФункции - вГраница = Макс( компонентыЭтойВерсии.Количество(), компонентыДругойВерсии.Количество() ) - 1; +// РазобратьСписокРасширений +// Разбирает текстовый вывод команды "extension list" в массив описаний расширений. +// Выделен в отдельный метод для возможности модульного тестирования разбора. +// +// Параметры: +// ТекстСпискаРасширений - Строка - вывод команды ibcmd infobase config extension list +// +// Возвращаемое значение: +// Массив - массив соответствий, см. НовыйОписаниеРасширения() +// +Функция РазобратьСписокРасширений(Знач ТекстСпискаРасширений) Экспорт - Для ц = компонентыЭтойВерсии.Количество() - 1 По ВГраница Цикл - компонентыЭтойВерсии.Добавить(0); - КонецЦикла; + ОписанияРасширений = Новый Массив; - Для ц = компонентыДругойВерсии.Количество() - 1 По ВГраница Цикл - компонентыДругойВерсии.Добавить(0); - КонецЦикла; + Если Не ЗначениеЗаполнено(ТекстСпискаРасширений) Тогда + Возврат ОписанияРасширений; + КонецЕсли; - результат = 0; + ИндикаторБлока = "name :"; - Для ц = 0 По вГраница Цикл + БлокиТекста = СтроковыеФункции.РазложитьСтрокуВМассивПодстрок(ТекстСпискаРасширений, ИндикаторБлока, Истина, Истина); + Для Каждого БлокТекста Из БлокиТекста Цикл - Если компонентыЭтойВерсии[ц] > компонентыДругойВерсии[ц] Тогда - результат = 1; - Прервать; - ИначеЕсли компонентыЭтойВерсии[ц] < компонентыДругойВерсии[ц] Тогда - результат = -1; - Прервать; + ОписаниеРасширения = РазобратьБлокОписанияРасширения(БлокТекста); + Если ОписаниеРасширения <> Неопределено Тогда + ОписанияРасширений.Добавить(ОписаниеРасширения); КонецЕсли; - КонецЦикла; + КонецЦикла; - Возврат результат; + Лог.Отладка("Разобрано описаний расширений: %1", ОписанияРасширений.Количество()); -КонецФункции + Возврат ОписанияРасширений; -// Получить имя лога продукта -// -// Возвращаемое значение: -// Строка - имя лога продукта -// -Функция ИмяЛога() Экспорт - Возврат "oscript.lib.ibcmdrunner"; КонецФункции #КонецОбласти @@ -1178,8 +1085,8 @@ // Строка - результат выполнения команды на кластере 1С // Функция ВыполнитьКоманду(УстановленныйКодВозврата = 0) - - Если ТипЗнч(УстановленныйКодВозврата) = Тип("Массив") Тогда + + Если ТипЗнч(УстановленныйКодВозврата) = Тип("Массив") Тогда УспешныеКодыВозврата = УстановленныйКодВозврата; Иначе УспешныеКодыВозврата = Новый Массив; @@ -1187,7 +1094,15 @@ КонецЕсли; КомандаВыполнения = ПутьКПриложению; - + + Лог.Отладка("Запуск: %1 %2", КомандаВыполнения, СтрСоединить(ПараметрыЗапуска, " ")); + Если ПеременныеСредыКоманды.Количество() > 0 Тогда + Лог.Отладка("Переменные среды команды: %1 (значения не выводятся в лог)", + СтрСоединить(ИменаПеременныхСредыКоманды(), ", ")); + КонецЕсли; + + НачалоВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах(); + Команда = Новый Команда(); Команда.УстановитьПеременныеСреды(Новый Соответствие); Команда.УстановитьПеременныеСреды(ПеременныеСредыКоманды); @@ -1198,12 +1113,24 @@ КодВозврата = Команда.Исполнить(); + ДлительностьМс = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоВыполнения; + Лог.Отладка("Команда завершена за %1 мс с кодом возврата %2", ДлительностьМс, КодВозврата); + Если УспешныеКодыВозврата.Найти(КодВозврата) = Неопределено Тогда - ВызватьИсключение Команда.ПолучитьВывод(); + ТекстОшибки = СтрШаблон("%1 + |Команда ibcmd завершилась с недопустимым кодом возврата %2 (ожидались коды: %3). + |Команда: %4 %5", + Команда.ПолучитьВывод(), + КодВозврата, + СтрСоединить(ПредставленияКодовВозврата(УспешныеКодыВозврата), ", "), + КомандаВыполнения, + СтрСоединить(ПараметрыЗапуска, " ")); + Лог.Ошибка(ТекстОшибки); + ВызватьИсключение ТекстОшибки; КонецЕсли; Возврат Команда.ПолучитьВывод(); - + КонецФункции // Начать заполнение параметров запуска. @@ -1216,7 +1143,7 @@ ПараметрыЗапуска.Добавить(СтрокаКоманды); ДобавитьОбщиеПараметрыИБ(); -КонецПроцедуры +КонецПроцедуры // Обернуть строку в кавычки, если это не сделано ранее // Параметры: @@ -1224,15 +1151,8 @@ // Возвращаемое значение: // - Строка - обернутая в кавычки строка Функция ОбернутьВКавычки(Знач Строка) - - Если Сред(Строка,1,1) = """" И - Сред(Строка, СтрДлина(Строка), 1) = """" Тогда - Результат = Строка; - Иначе - Результат = """" + Строка + """"; - КонецЕсли; - Возврат Результат; + Возврат СлужебныйIbcmdRunner.ОбернутьВКавычки(Строка); КонецФункции @@ -1241,67 +1161,241 @@ Процедура ДобавитьОбщиеПараметрыИБ() Если ПараметрыСервернойИБ.Количество() > 0 Тогда - Для Каждого Элемент Из ПараметрыСервернойИБ Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; + ДобавитьМассивПараметров(ПараметрыСервернойИБ); ИначеЕсли ПараметрыФайловойИБ.Количество() > 0 Тогда - Для Каждого Элемент Из ПараметрыФайловойИБ Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; + ДобавитьМассивПараметров(ПараметрыФайловойИБ); ИначеЕсли ПараметрыКонфигурацииАС.Количество() > 0 Тогда - Для Каждого Элемент Из ПараметрыКонфигурацииАС Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; - Иначе - ВызватьИсключение "Необходимо установить общие параметры информационной базы!"; + ДобавитьМассивПараметров(ПараметрыКонфигурацииАС); + Иначе + ВызватьИсключение СтрШаблон( + "Необходимо установить общие параметры информационной базы! + |Перед выполнением команды '%1' вызовите один из методов: + |УстановитьПараметрыФайловойИБ, УстановитьПараметрыСервернойИБ или УстановитьКонфигурационныйФайл.", + ПараметрыЗапуска[0]); КонецЕсли; Если ПараметрыЗапуска.Найти("infobase create") = Неопределено Тогда - Если ПараметрыАвторизацииИБ.Количество() > 0 Тогда - Для каждого Элемент Из ПараметрыАвторизацииИБ Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; - КонецЕсли; + ДобавитьМассивПараметров(ПараметрыАвторизацииИБ); КонецЕсли; - Если ПараметрыАвтономногоСервера.Количество() > 0 Тогда - Для каждого Элемент Из ПараметрыАвтономногоСервера Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; - КонецЕсли; + ДобавитьМассивПараметров(ПараметрыАвтономногоСервера); + +КонецПроцедуры -КонецПроцедуры +// Очистить массивы взаимоисключающих общих параметров информационной базы. +// Вызывается перед установкой одного из вариантов подключения к ИБ: +// файлового, серверного или через конфигурационный файл автономного сервера. +Процедура ОчиститьОбщиеПараметрыИБ() -// Раскладывает строку с версией на компоненты + ПараметрыСервернойИБ.Очистить(); + ПараметрыФайловойИБ.Очистить(); + ПараметрыКонфигурацииАС.Очистить(); + +КонецПроцедуры + +// Добавить все элементы массива в параметры запуска // Параметры: -// пВерсия - Строка - Версия -// Возвращаемое значение: -// Массив - массив чисел +// МассивПараметров - Массив - добавляемые параметры +Процедура ДобавитьМассивПараметров(Знач МассивПараметров) + + Для Каждого Элемент Из МассивПараметров Цикл + ПараметрыЗапуска.Добавить(Элемент); + КонецЦикла; + +КонецПроцедуры + +// Добавить в массив параметр, значение которого передается через переменную среды +// (имя пользователя, пароль). В командную строку попадает только подстановка +// переменной среды, само значение в параметрах и логах не появляется. +// Параметры: +// МассивПараметров - Массив - массив, в который добавляется параметр +// ИмяПараметра - Строка - имя параметра командной строки (например, "--db-pwd") +// ИмяПеременнойСреды - Строка - имя переменной среды для передачи значения +// Значение - Строка - секретное значение параметра +Процедура ДобавитьСекретныйПараметр(МассивПараметров, Знач ИмяПараметра, Знач ИмяПеременнойСреды, Знач Значение) + + Если Не ЗначениеЗаполнено(Значение) Тогда + Возврат; + КонецЕсли; + + ПеременныеСредыКоманды.Вставить(ИмяПеременнойСреды, Значение); + МассивПараметров.Добавить(СтрШаблон("%1=%2", ИмяПараметра, + СлужебныйIbcmdRunner.ШаблонПеременнойСреды(ИмяПеременнойСреды, ЭтоWindows))); + +КонецПроцедуры + +// Подготовить параметры запуска команды создания информационной базы. +// Общая часть всех методов СоздатьИБ*: команда "infobase create", +// локаль, смещение дат, флаги "--create-database" и "--force" и, +// при необходимости, параметр источника данных. +// Параметры: +// Локаль - Строка - имя локали +// СмещениеДат - Число - смещение дат в годах +// ИмяПараметраИсточника - Строка - имя параметра источника данных +// ("--restore", "--load", "--import") или пустая строка +// ЗначениеИсточника - Строка - путь к источнику данных +Процедура ПодготовитьКомандуСозданияИБ( + Знач Локаль, + Знач СмещениеДат, + Знач ИмяПараметраИсточника = "", + Знач ЗначениеИсточника = "") + + НачатьЗаполнениеПараметровЗапуска("infobase create"); + + ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); + ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); + ПараметрыЗапуска.Добавить("--create-database"); + + Если ЗначениеЗаполнено(ИмяПараметраИсточника) Тогда + ДобавитьПараметрЕслиЗаполнен(ИмяПараметраИсточника, ЗначениеИсточника, ""); + КонецЕсли; + + ПараметрыЗапуска.Добавить("--force"); + +КонецПроцедуры + +// Добавить параметры фоновой (серверной) выгрузки, доступные с версии 8.3.21: +// выгрузка в архив, выгрузка на сервере, количество потоков. +// Параметры: +// ВАрхив - Булево - выгружать в zip-архив +// НаСервере - Булево - выгружать на сервере +// КоличествоПотоков - Число - количество потоков выгрузки +Процедура ДобавитьПараметрыФоновойВыгрузки(Знач ВАрхив, Знач НаСервере, Знач КоличествоПотоков) + + ДобавитьФлагЕслиИстина("--archive", ВАрхив); + ДобавитьФлагЕслиИстина("--server", НаСервере); + ДобавитьПараметрЕслиЗаполнен("--threads", КоличествоПотоков, 0); + +КонецПроцедуры + +// Добавить параметр запуска, если заполнено его значение +// Параметры: +// ИмяПараметра - Строка - Имя добавляемого параметра; +// ЗначениеПараметра - Строка - Значение добавляемого параметра; +// ЗначениеПоУмолчанию - Любой - Значение по умолчанию добавляемого параметра; // -Функция МассивКомпонентВерсии( Знач пВерсия ) +Процедура ДобавитьПараметрЕслиЗаполнен( + Знач ИмяПараметра, + Знач ЗначениеПараметра, + Знач ЗначениеПоУмолчанию = Неопределено) - // Убираем все пробелы. Считаем "1 002" = 1002 + Ожидаем.Что(ИмяПараметра).ИмеетТип("Строка"); + Если ЗначениеПараметра <> ЗначениеПоУмолчанию Тогда + Ожидаем.Что(ЗначениеПараметра).ИмеетТип("Строка"); + ПараметрыЗапуска.Добавить(СтрШаблон(ИмяПараметра + "=%1", ЗначениеПараметра)); + КонецЕсли; + +КонецПроцедуры + +// Добавить флаг в параметры запуска, если условие истинно +// Параметры: +// Флаг - Строка - добавляемый флаг командной строки +// Условие - Булево - добавлять ли флаг +Процедура ДобавитьФлагЕслиИстина(Знач Флаг, Знач Условие) + + Если Условие Тогда + ПараметрыЗапуска.Добавить(Флаг); + КонецЕсли; + +КонецПроцедуры + +// Добавить параметр с булевым значением в формате имя=yes/no +// Параметры: +// ИмяПараметра - Строка - имя параметра командной строки +// Значение - Булево - значение параметра +Процедура ДобавитьПараметрБулево(Знач ИмяПараметра, Знач Значение) + + ПараметрыЗапуска.Добавить(СтрШаблон("%1=%2", ИмяПараметра, БулевоВСтроку(Значение))); + +КонецПроцедуры + +// Добавить параметр с булевым значением, если значение задано (не Неопределено) +// Параметры: +// ИмяПараметра - Строка - имя параметра командной строки +// Значение - Булево, Неопределено - значение параметра +Процедура ДобавитьПараметрБулевоЕслиЗадан(Знач ИмяПараметра, Знач Значение) + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Ожидаем.Что(Значение).ИмеетТип("Булево"); + ДобавитьПараметрБулево(ИмяПараметра, Значение); + +КонецПроцедуры - регулярноеВыражение = Новый РегулярноеВыражение( "\s" ); - строкаБезПробелов = регулярноеВыражение.Заменить( пВерсия, "" ); +// Записать список файлов в файл параметров для передачи через stdin +// Параметры: +// ИмяФайлаПараметров - Строка - путь к создаваемому файлу параметров +// ВыбранныеФайлы - Массив - список путей к файлам +Процедура ЗаписатьСписокФайловВФайлПараметров(Знач ИмяФайлаПараметров, Знач ВыбранныеФайлы) - // Вырезаем все числа. Считаем, что любой разделитель является именно - // разделителем между компонентами, а не дробным числом, например - регулярноеВыражение = Новый РегулярноеВыражение( "(\d+)" ); + Если ЭтоWindows Тогда + Кодировка = КодировкаТекста.ANSI; + Иначе + Кодировка = КодировкаТекста.UTF8NoBOM; + КонецЕсли; + + Лог.Отладка("Запись списка из %1 файлов в файл параметров %2", ВыбранныеФайлы.Количество(), ИмяФайлаПараметров); + + СтрокаДляЗаписи = ""; + ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаПараметров, Кодировка); + Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл + СтрокаДляЗаписи = ?(СтрокаДляЗаписи = "", "", Символы.ПС) + СокрЛП(ВыбранныйФайл); + КонецЦикла; + ЗаписьТекста.ЗаписатьСтроку(СокрЛП(СтрокаДляЗаписи), ""); + ЗаписьТекста.Закрыть(); - массивСовпадений = регулярноеВыражение.НайтиСовпадения( строкаБезПробелов ); +КонецПроцедуры + +// Разложить один текстовый блок вывода команды "extension list" +// в соответствие свойств расширения +// Параметры: +// БлокТекста - Строка - блок текста с описанием одного расширения +// Возвращаемое значение: +// Соответствие, Неопределено - описание расширения, см. НовыйОписаниеРасширения() +Функция РазобратьБлокОписанияРасширения(Знач БлокТекста) + + СтрокиБлока = СтрРазделить(БлокТекста, Символы.ПС); + Если Не ЗначениеЗаполнено(СтрокиБлока) Тогда + Возврат Неопределено; + КонецЕсли; - массивКомпонент = Новый Массив; -// !!! Следующие параметры при версии платформы < 8.3.21 игнорируются !!! -// ВАрхив - Булево - выгьружать в zip-архив XML-файлов. Параметр КаталогВыгрузки должен быть именем файла. -// НаСервере - Булево - если Истина, то выгружать на сервере. -// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, -// по количеству ядер процессоров. - Для каждого цЭлемент Из массивСовпадений Цикл - массивКомпонент.Добавить( Число( цЭлемент.Значение ) ); - КонецЦикла; + СтрокаСИменем = СтрокиБлока[0]; + СтрокаСИменем = СтрЗаменить(СтрокаСИменем, """", ""); + СтрокаСИменем = СтрЗаменить(СтрокаСИменем, Символы.ВК, ""); - Возврат массивКомпонент; + СтрокиБлока.Удалить(0); + + ОписаниеРасширения = НовыйОписаниеРасширения(); + + ОписаниеРасширения.Вставить("name", СтрокаСИменем); + + Для Каждого СтрокаСвойства Из СтрокиБлока Цикл + + ИмяЗначение = СтрРазделить(СтрокаСвойства, ":", Ложь); + + Если ИмяЗначение.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ИмяСвойства = СокрЛП(ИмяЗначение[0]); + Если ИмяЗначение.Количество() > 1 Тогда + ЗначениеСвойства = СтрЗаменить(СокрЛП(ИмяЗначение[1]), """", ""); + Иначе + // Свойство без значения (например, "version :" без хвостового пробела) + ЗначениеСвойства = ""; + КонецЕсли; + + Если ТипЗнч(ОписаниеРасширения.Получить(ИмяСвойства)) = Тип("Булево") Тогда + ЗначениеСвойства = СтрокаВБулево(ЗначениеСвойства); + КонецЕсли; + + ОписаниеРасширения.Вставить(ИмяСвойства, ЗначениеСвойства); + + КонецЦикла; + + Возврат ОписаниеРасширения; КонецФункции @@ -1312,13 +1406,8 @@ // Строка - yes или no // Функция БулевоВСтроку(Значение) - Ожидаем.Что(Значение).ИмеетТип("Булево"); - Рез = "no"; - Если Значение Тогда - Рез = "yes"; - КонецЕсли; - Возврат Рез; -КонецФункции + Возврат СлужебныйIbcmdRunner.БулевоВСтрокуYesNo(Значение); +КонецФункции // Для строки yes или no возвращает Булево // Параметры: @@ -1327,76 +1416,60 @@ // Булево // Функция СтрокаВБулево(Значение) - Ожидаем.Что(Значение).ИмеетТип("Строка"); - Результат = Ложь; - Если Значение = "yes" Тогда - Результат = Истина; - ИначеЕсли Значение = "no" Тогда - Результат = Ложь; - Иначе - ВызватьИсключение "Значение для преобразования в тип Булево должно быть только 'yes' или 'no'"; - КонецЕсли; - Возврат Результат; + Возврат СлужебныйIbcmdRunner.СтрокаYesNoВБулево(Значение); КонецФункции -// Проверяет, что переданная строка удовлетворяет требованиям для имен 1С +// Проверить, что версия платформы 1С строго больше указанной. +// При невыполнении условия вызывается исключение с текстом, +// содержащим требуемую и текущую версии. // Параметры: -// Стр - Строка - проверяемая строка -// Возвращаемое значение: -// Булево - удовлетворяет требованиям к именам 1С или нет -// -Функция ЯвляетсяИменем(Стр) - - Рез = Истина; - РазрешенныйПервыйСимвол = "_абвгдеёжзийклмнопрстуфхцчшщьыъэюяabcdefghijklmnopqrstuvwxyz"; - РазрешенныйСимвол = "_абвгдеёжзийклмнопрстуфхцчшщьыъэюяabcdefghijklmnopqrstuvwxyz0123456789"; - ДлинаСтр = СтрДлина(Стр); - Если ДлинаСтр = 0 Тогда - Рез = Ложь; - КонецЕсли; - Для ъ = 1 По ДлинаСтр Цикл - Симв = НРег(Сред(Стр, ъ, 1)); - Если ъ = 1 Тогда - Если СтрНайти(РазрешенныйПервыйСимвол, Симв) = 0 Тогда - Рез = Ложь; - Прервать; - КонецЕсли; - Иначе - Если СтрНайти(РазрешенныйСимвол, Симв) = 0 Тогда - Рез = Ложь; - Прервать; - КонецЕсли; - КонецЕсли; - КонецЦикла; - Возврат Рез; +// МинимальнаяВерсия - Строка - минимальная версия платформы +Процедура ПроверитьМинимальнуюВерсиюПлатформы(Знач МинимальнаяВерсия) -КонецФункции + Ожидаем.Что(СравнитьВерсии(Версия, МинимальнаяВерсия) > 0, + СтрШаблон("Версия платформы 1С должна быть старше, чем %1 (текущая версия: %2)", МинимальнаяВерсия, Версия)) + .ЭтоИстина(); -// Добавить параметр запуска, если заполнено его значение +КонецПроцедуры + +// Проверить, что строка удовлетворяет требованиям к именам 1С. +// При невыполнении условия вызывается исключение. // Параметры: -// ИмяПараметра - Строка - Имя добавляемого параметра; -// ЗначениеПараметра - Строка - Значение добавляемого параметра; -// ЗначениеПоУмолчанию - Любой - Значение по умолчанию добавляемого параметра; -// -Процедура ДобавитьПараметрЕслиЗаполнен( - Знач ИмяПараметра, - Знач ЗначениеПараметра, - Знач ЗначениеПоУмолчанию = Неопределено) - Ожидаем.Что(ИмяПараметра).ИмеетТип("Строка"); - Если ЗначениеПараметра <> ЗначениеПоУмолчанию Тогда - Ожидаем.Что(ЗначениеПараметра).ИмеетТип("Строка"); - Параметр = ИмяПараметра + "=%1"; - ПараметрыЗапуска.Добавить(СтрШаблон(Параметр, ЗначениеПараметра)); - КонецЕсли; -КонецПроцедуры +// ПроверяемоеИмя - Строка - проверяемая строка +Процедура ПроверитьИмя(Знач ПроверяемоеИмя) -Функция ШаблонПеременнойСреды(ИмяПеременной) + Ожидаем.Что(СлужебныйIbcmdRunner.ЯвляетсяИменем(ПроверяемоеИмя), + СтрШаблон("Параметром должна быть строка, удовлетворяющая требованиям к имени переменной, получено: '%1'", + ПроверяемоеИмя)) + .ЭтоИстина(); - Если ЭтоWindows Тогда - Возврат СтрШаблон("%%%1%%", ИмяПеременной); - Иначе - Возврат СтрШаблон("$%1", ИмяПеременной); - КонецЕсли; +КонецПроцедуры + +// Возвращает массив имен переменных среды команды (без значений) +// Возвращаемое значение: +// Массив - имена переменных среды +Функция ИменаПеременныхСредыКоманды() + + Имена = Новый Массив; + Для Каждого КлючИЗначение Из ПеременныеСредыКоманды Цикл + Имена.Добавить(КлючИЗначение.Ключ); + КонецЦикла; + Возврат Имена; + +КонецФункции + +// Возвращает массив строковых представлений кодов возврата +// Параметры: +// КодыВозврата - Массив - коды возврата +// Возвращаемое значение: +// Массив - строковые представления кодов +Функция ПредставленияКодовВозврата(Знач КодыВозврата) + + Представления = Новый Массив; + Для Каждого Код Из КодыВозврата Цикл + Представления.Добавить(XMLСтрока(Код)); + КонецЦикла; + Возврат Представления; КонецФункции @@ -1408,7 +1481,7 @@ Лог = Логирование.ПолучитьЛог(ИмяЛога()); СистемнаяИнформация = Новый СистемнаяИнформация; - ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + ЭтоWindows = СтрНайти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; ПараметрыЗапуска = Новый Массив; ПараметрыСервернойИБ = Новый Массив; @@ -1421,16 +1494,22 @@ ПутьКПриложению = Платформа1С.ПутьКIBCMD(ВерсияПлатформы, Разрядность); Если Не ЗначениеЗаполнено(ПутьКПриложению) Тогда - ВызватьИсключение "Приложение ibcmd не обнаружено!"; + ВызватьИсключение СтрШаблон( + "Приложение ibcmd не обнаружено! Версия платформы: '%1', разрядность: '%2'. + |Убедитесь, что платформа 1С требуемой версии установлена.", + ВерсияПлатформы, Разрядность); КонецЕсли; - + Версия(); + + Лог.Отладка("Инициализирован УправлениеИБ (путь к ibcmd: %1, версия платформы: %2)", ПутьКПриложению, Версия); + КонецПроцедуры Функция НовыйОписаниеРасширения() ОписаниеРасширения = Новый Соответствие(); - + ОписаниеРасширения.Вставить("version", ""); ОписаниеРасширения.Вставить("active", Ложь); ОписаниеРасширения.Вставить("purpose", ""); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" new file mode 100644 index 0000000..0e08f53 --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" @@ -0,0 +1,242 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +#Использовать asserts + +// Общие служебные функции библиотеки ibcmdrunner. +// Модуль устраняет дублирование кода между классами УправлениеИБ, УправлениеАС и КонфигурационныйФайлАС. +// Не предназначен для использования за пределами библиотеки, но экспортируется +// для возможности модульного тестирования. + +#Область ПрограммныйИнтерфейс + +// ИмяЛога +// Возвращает имя лога библиотеки. +// +// Возвращаемое значение: +// Строка - имя лога библиотеки +// +Функция ИмяЛога() Экспорт + Возврат "oscript.lib.ibcmdrunner"; +КонецФункции + +// ОбернутьВКавычки +// Оборачивает строку в двойные кавычки, если это не сделано ранее. +// +// Параметры: +// Строка - Строка - исходная строка +// +// Возвращаемое значение: +// Строка - обернутая в кавычки строка +// +Функция ОбернутьВКавычки(Знач Строка) Экспорт + + Если Сред(Строка, 1, 1) = """" + И Сред(Строка, СтрДлина(Строка), 1) = """" + И СтрДлина(Строка) > 1 Тогда + Результат = Строка; + Иначе + Результат = """" + Строка + """"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// СравнитьВерсии +// Сравнивает две строки версий по числовым компонентам. +// +// Параметры: +// ЭтаВерсия - Строка - первый сравниваемый номер версии +// ДругаяВерсия - Строка - второй сравниваемый номер версии +// +// Возвращаемое значение: +// Число - больше 0, если ЭтаВерсия > ДругаяВерсия; +// 0, если версии равны; +// меньше 0, если ЭтаВерсия < ДругаяВерсия. +// +Функция СравнитьВерсии(Знач ЭтаВерсия, Знач ДругаяВерсия) Экспорт + + Ожидаем.Что(ЭтаВерсия).ИмеетТип("Строка"); + Ожидаем.Что(ДругаяВерсия).ИмеетТип("Строка"); + + КомпонентыЭтойВерсии = МассивКомпонентВерсии(ЭтаВерсия); + КомпонентыДругойВерсии = МассивКомпонентВерсии(ДругаяВерсия); + + // Выравниваем количество компонент + + ВерхняяГраница = Макс(КомпонентыЭтойВерсии.Количество(), КомпонентыДругойВерсии.Количество()) - 1; + + Для Счетчик = КомпонентыЭтойВерсии.Количество() - 1 По ВерхняяГраница Цикл + КомпонентыЭтойВерсии.Добавить(0); + КонецЦикла; + + Для Счетчик = КомпонентыДругойВерсии.Количество() - 1 По ВерхняяГраница Цикл + КомпонентыДругойВерсии.Добавить(0); + КонецЦикла; + + Результат = 0; + + Для Счетчик = 0 По ВерхняяГраница Цикл + + Если КомпонентыЭтойВерсии[Счетчик] > КомпонентыДругойВерсии[Счетчик] Тогда + Результат = 1; + Прервать; + ИначеЕсли КомпонентыЭтойВерсии[Счетчик] < КомпонентыДругойВерсии[Счетчик] Тогда + Результат = -1; + Прервать; + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// МассивКомпонентВерсии +// Раскладывает строку с версией на числовые компоненты. +// Пробелы игнорируются ("1 002" читается как 1002), любой нечисловой +// символ считается разделителем компонент. +// +// Параметры: +// Версия - Строка - строка с номером версии +// +// Возвращаемое значение: +// Массив - массив чисел - компонент версии +// +Функция МассивКомпонентВерсии(Знач Версия) Экспорт + + РегулярноеВыражение = Новый РегулярноеВыражение("\s"); + СтрокаБезПробелов = РегулярноеВыражение.Заменить(Версия, ""); + + РегулярноеВыражение = Новый РегулярноеВыражение("(\d+)"); + МассивСовпадений = РегулярноеВыражение.НайтиСовпадения(СтрокаБезПробелов); + + МассивКомпонент = Новый Массив; + Для Каждого Совпадение Из МассивСовпадений Цикл + МассивКомпонент.Добавить(Число(Совпадение.Значение)); + КонецЦикла; + + Возврат МассивКомпонент; + +КонецФункции + +// БулевоВСтрокуYesNo +// Преобразует Булево в строку "yes" или "no" (формат параметров ibcmd). +// +// Параметры: +// Значение - Булево - преобразуемое значение +// +// Возвращаемое значение: +// Строка - "yes" или "no" +// +Функция БулевоВСтрокуYesNo(Знач Значение) Экспорт + + Ожидаем.Что(Значение).ИмеетТип("Булево"); + Возврат ?(Значение, "yes", "no"); + +КонецФункции + +// СтрокаYesNoВБулево +// Преобразует строку "yes" или "no" в Булево. +// Для любого другого значения вызывает исключение. +// +// Параметры: +// Значение - Строка - "yes" или "no" +// +// Возвращаемое значение: +// Булево +// +Функция СтрокаYesNoВБулево(Знач Значение) Экспорт + + Ожидаем.Что(Значение).ИмеетТип("Строка"); + + Если Значение = "yes" Тогда + Результат = Истина; + ИначеЕсли Значение = "no" Тогда + Результат = Ложь; + Иначе + ВызватьИсключение СтрШаблон( + "Значение для преобразования в тип Булево должно быть только 'yes' или 'no', получено: '%1'", Значение); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// БулевоВСтрокуTrueFalse +// Преобразует Булево в строку "true" или "false" (формат YAML). +// +// Параметры: +// Значение - Булево - преобразуемое значение +// +// Возвращаемое значение: +// Строка - "true" или "false" +// +Функция БулевоВСтрокуTrueFalse(Знач Значение) Экспорт + + Ожидаем.Что(Значение, "Значение должно иметь тип Булево.").ИмеетТип("Булево"); + Возврат ?(Значение, "true", "false"); + +КонецФункции + +// ЯвляетсяИменем +// Проверяет, что переданная строка удовлетворяет требованиям к именам 1С: +// состоит из одного слова, начинается с буквы или "_" и не содержит +// специальных символов, кроме "_". +// +// Параметры: +// ПроверяемаяСтрока - Строка - проверяемая строка +// +// Возвращаемое значение: +// Булево - Истина, если строка удовлетворяет требованиям к именам 1С +// +Функция ЯвляетсяИменем(Знач ПроверяемаяСтрока) Экспорт + + РазрешенныйПервыйСимвол = "_абвгдеёжзийклмнопрстуфхцчшщьыъэюяabcdefghijklmnopqrstuvwxyz"; + РазрешенныйСимвол = РазрешенныйПервыйСимвол + "0123456789"; + + ДлинаСтроки = СтрДлина(ПроверяемаяСтрока); + Если ДлинаСтроки = 0 Тогда + Возврат Ложь; + КонецЕсли; + + Результат = Истина; + + Для НомерСимвола = 1 По ДлинаСтроки Цикл + + Символ = НРег(Сред(ПроверяемаяСтрока, НомерСимвола, 1)); + ДопустимыеСимволы = ?(НомерСимвола = 1, РазрешенныйПервыйСимвол, РазрешенныйСимвол); + + Если СтрНайти(ДопустимыеСимволы, Символ) = 0 Тогда + Результат = Ложь; + Прервать; + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// ШаблонПеременнойСреды +// Возвращает подстановку переменной среды в синтаксисе командной оболочки +// текущей ОС: %ИМЯ% для Windows, $ИМЯ для остальных ОС. +// +// Параметры: +// ИмяПеременной - Строка - имя переменной среды +// ЭтоWindows - Булево - Истина, если текущая ОС - Windows +// +// Возвращаемое значение: +// Строка - подстановка переменной среды +// +Функция ШаблонПеременнойСреды(Знач ИмяПеременной, Знач ЭтоWindows) Экспорт + + Если ЭтоWindows Тогда + Возврат СтрШаблон("%%%1%%", ИмяПеременной); + Иначе + Возврат СтрШаблон("$%1", ИмяПеременной); + КонецЕсли; + +КонецФункции + +#КонецОбласти From 180a44fe797133444fe3965f66c10c60232558eb Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Mon, 31 Aug 2026 19:25:00 +0300 Subject: [PATCH 2/9] =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=D0=A4?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=90=D0=A1:=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BE=D0=BA=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20YAML,=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправленные ошибки: - опечатка 'Вставмит' роняла ПараметрыВеб_ПубликацияOData при передаче параметров повторного использования сеансов; - параметры http-сервисов добавлялись в массив веб-сервисов и публиковались в чужой подсекции; - секция application (ПараметрыВеб_Приложение) вообще не записывалась в конфигурационный файл; - рассинхрон ключей: 'allow-standart'/'allow-standard' — запрет стандартной аутентификации никогда не записывался; 'reuse-sessions'/'reuse-session' — параметры сеансов OData никогда не записывались; - все элементы массива разделителей ссылались на одно соответствие и получали значения последнего добавленного разделителя; - массивы разделителей и сервисов инициализировались как Соответствие; - незаполненные параметры (Неопределено) роняли запись секции — теперь пропускаются, сервер использует значения по умолчанию. Рефакторинг и логирование: - записи однотипных секций сведены к общим процедурам (ЗаписатьСекциюВерхнегоУровня, ЗаписатьПараметрыВеб_Сервисов, ЗаписатьПодсекциюВеб); - добавлено отладочное логирование установки параметров и записи секций; пароли в лог не выводятся; - текст ошибки о неизвестном типе значения дополнен именем параметра и списком допустимых типов. Co-Authored-By: Claude Fable 5 --- .../configfile_as.os" | 445 ++++++++++-------- 1 file changed, 237 insertions(+), 208 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" index 6599cf7..5ae56c0 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" @@ -1,5 +1,10 @@ // BSLLS:NumberOfOptionalParams-off // BSLLS:MagicNumber-off +// BSLLS:LatinAndCyrillicSymbolInWord-off + +#Использовать logos + +Перем Лог; // Экземпляр логгера Перем ПараметрыСервера; // Соответствие - параметры секции server Перем ПараметрыСервернойБазыДанных; // Соответствие - параметры секции database @@ -38,13 +43,15 @@ Порт = 8314, ИмяХоста = Неопределено) Экспорт - ПараметрыСервера. Очистить(); + Лог.Отладка("Установка параметров сервера (адрес: %1, порт: %2, имя хоста: %3)", Адрес, Порт, ИмяХоста); + + ПараметрыСервера.Очистить(); ПараметрыСервера.Вставить("port", Порт); ПараметрыСервера.Вставить("address", Адрес); - + Если ЗначениеЗаполнено(ИмяХоста) Тогда ПараметрыСервера.Вставить("host", ИмяХоста); - КонецЕсли; + КонецЕсли; КонецПроцедуры @@ -62,6 +69,9 @@ ИмяПользователя, Пароль) Экспорт + Лог.Отладка("Установка параметров серверной БД (СУБД: %1, сервер: %2, база: %3, пользователь: %4, пароль не выводится в лог)", + ТипСУБД, Сервер, ИмяДБ, ИмяПользователя); + ПараметрыСервернойБазыДанных.Очистить(); ПараметрыФайловойБазыДанных.Очистить(); ПараметрыСервернойБазыДанных.Вставить("dbms", ТипСУБД); @@ -69,7 +79,7 @@ ПараметрыСервернойБазыДанных.Вставить("name", ИмяДБ); ПараметрыСервернойБазыДанных.Вставить("user", ИмяПользователя); ПараметрыСервернойБазыДанных.Вставить("password", Пароль); - + КонецПроцедуры // ПараметрыФайловойБД @@ -79,8 +89,10 @@ // Процедура ПараметрыФайловойБД(ПутьКФайлуИБ) Экспорт + Лог.Отладка("Установка параметров файловой БД (путь: %1)", ПутьКФайлуИБ); + ПараметрыФайловойБазыДанных.Вставить("path", ПутьКФайлуИБ); - + КонецПроцедуры // ПараметрыИБ @@ -90,12 +102,14 @@ // ВыдаватьКлиентскиеЛицензии - Булево - разрешить выдавать клиентские лицензии автономному серверу // РазрешитьРегламентныеЗадания - Булево - разрешить выполнение регламентных заданий // ИД - Строка - уникальный идентификатор информационной базы. По умолчанию - значение unique, то есть -// каждый раз при перезапуске будет генерироваться новый уникальный идентификатор. +// каждый раз при перезапуске будет генерироваться новый уникальный идентификатор. Процедура ПараметрыИБ(ИмяИБ, ВыдаватьКлиентскиеЛицензии, РазрешитьРегламентныеЗадания, ИД = "unique") Экспорт + Лог.Отладка("Установка параметров ИБ (имя: %1, ИД: %2)", ИмяИБ, ИД); + ПараметрыИБ.Очистить(); ПараметрыИБ.Вставить("id", ИД); ПараметрыИБ.Вставить("name", ИмяИБ); @@ -113,9 +127,11 @@ // Значение по умолчанию:/. Процедура ПараметрыХТТП(БазовыйУРЛ = "/") Экспорт + Лог.Отладка("Установка параметров веб-доступа (базовый УРЛ: %1)", БазовыйУРЛ); + ПараметрыХТТП.Очистить(); ПараметрыХТТП.Вставить("base", БазовыйУРЛ); -КонецПроцедуры +КонецПроцедуры // ПараметрыВеб_Аутентификация // Установка параметров веб-аутентификации OpenId (секции rely и provider) @@ -131,19 +147,21 @@ // Описание представляет собой массив объектов, каждый из которых описывает одного // OpenID-провайдера. Массив представлен в виде JSON-сериализации. // Подробнее см. https://its.1c.ru/db/v8314doc#bookmark:adm:TI000000847 -// РазрешитьАутентификацию1С - Булево -указывает возможность применения аутентификации «1С:Предприятия». +// РазрешитьАутентификацию1С - Булево -указывает возможность применения аутентификации «1С:Предприятия». Процедура ПараметрыВеб_Аутентификация(УРИПровайдера, ВремяЖизни = 86400, МаскаРазрешенныхИмен = Неопределено, ПровайдерыOpenIDConnect = Неопределено, РазрешитьАутентификацию1С = Истина) Экспорт + Лог.Отладка("Установка параметров веб-аутентификации (провайдер: %1)", УРИПровайдера); + ПараметрыВеб_Аутентификация.Очистить(); ПараметрыВеб_Аутентификация.Вставить("url", УРИПровайдера); ПараметрыВеб_Аутентификация.Вставить("lifetime", ВремяЖизни); ПараметрыВеб_Аутентификация.Вставить("return-to", МаскаРазрешенныхИмен); ПараметрыВеб_Аутентификация.Вставить("providers", ПровайдерыOpenIDConnect); - ПараметрыВеб_Аутентификация.Вставить("allow-standart", РазрешитьАутентификацию1С); + ПараметрыВеб_Аутентификация.Вставить("allow-standard", РазрешитьАутентификацию1С); КонецПроцедуры @@ -165,14 +183,16 @@ ДобавлятьЗначениеВАдрес = Ложь, ЭтоПервоеЗначениеРазделителя = Истина) Экспорт - ПараметрыВеб_Разделители.Очистить(); + Лог.Отладка("Добавление параметров разделителя (значение: %1)", Разделитель); + + ПараметрыВеб_Разделители = Новый Соответствие; ПараметрыВеб_Разделители.Вставить("value", Разделитель); ПараметрыВеб_Разделители.Вставить("safe", РазрешитьИзменение); ПараметрыВеб_Разделители.Вставить("specify", ДобавлятьЗначениеВАдрес); - + Если ЭтоПервоеЗначениеРазделителя Тогда мсвПараметрыВеб_Разделители = Новый Массив; - КонецЕсли; + КонецЕсли; мсвПараметрыВеб_Разделители.Добавить(ПараметрыВеб_Разделители); КонецПроцедуры @@ -181,13 +201,17 @@ // Установка параметров публикации управляемого приложения (application) // Параметры: // УРИВозврата - Строка - адрес (URL), по которому будет выполнен переход после завершения работы веб-клиента. -// Публиковать - Булево - Определяет возможность использовать клиентское приложение для доступа +// Публиковать - Булево - Определяет возможность использовать клиентское приложение для доступа // к информационной базе. Процедура ПараметрыВеб_Приложение(УРИВозврата, Публиковать = Истина) Экспорт + + Лог.Отладка("Установка параметров публикации приложения (УРИ возврата: %1, публиковать: %2)", + УРИВозврата, Публиковать); + ПараметрыВеб_Приложение = Новый Соответствие; ПараметрыВеб_Приложение.Вставить("publish", Публиковать); ПараметрыВеб_Приложение.Вставить("exit-url", УРИВозврата); -КонецПроцедуры +КонецПроцедуры // ПараметрыВеб_ПубликацияOData // Установка параметров публикации интерфейса OData @@ -198,13 +222,15 @@ Процедура ПараметрыВеб_ПубликацияOData(Публиковать = Ложь, ПараметрыРежимаПовторногоИспользованияСеансов = Неопределено) Экспорт + Лог.Отладка("Установка параметров публикации OData (публиковать: %1)", Публиковать); + ПараметрыВеб_ПубликацияOData.Очистить(); ПараметрыВеб_ПубликацияOData.Вставить("publish", Публиковать); Если ПараметрыРежимаПовторногоИспользованияСеансов <> Неопределено Тогда - ПараметрыВеб_ПубликацияOData.Вставмит("reuse-sessions", ПараметрыРежимаПовторногоИспользованияСеансов); + ПараметрыВеб_ПубликацияOData.Вставить("reuse-sessions", ПараметрыРежимаПовторногоИспользованияСеансов); КонецЕсли; -КонецПроцедуры +КонецПроцедуры // ПараметрыВеб_РежимПовторногоИспользованияСеансов // Устанавливает параметры повторного использования сеансов @@ -212,14 +238,16 @@ // Режим - Строка - AutoUse, DontUse, Use // ВремяБездействия - Число -Время бездействия сеанса, после которого он завершается принудительно (в секундах). // МаксимальноеКоличествоСеансов - Число - Максимальное количество сеансов, которые могут быть созданы при -// автоматическом управлении сеансами. +// автоматическом управлении сеансами. // ТаймаутОжиданияСвободногоСеанса - Число - Время ожидания появления свободного сеанса после заполнения // пула сеансов (в секундах). -Процедура ПараметрыВеб_РежимПовторногоИспользованияСеансов(Режим = "AutoUse", - ВремяБездействия = 20, +Процедура ПараметрыВеб_РежимПовторногоИспользованияСеансов(Режим = "AutoUse", + ВремяБездействия = 20, МаксимальноеКоличествоСеансов = 10, ТаймаутОжиданияСвободногоСеанса = 5) Экспорт + Лог.Отладка("Установка параметров повторного использования сеансов (режим: %1)", Режим); + ПараметрыВеб_РежимПовторногоИспользованияСеансов.Очистить(); ПараметрыВеб_РежимПовторногоИспользованияСеансов.Вставить("mode", Режим); ПараметрыВеб_РежимПовторногоИспользованияСеансов.Вставить("max-age", ВремяБездействия); @@ -236,6 +264,9 @@ Процедура ПараметрыВебСервисовОбщие(ПубликоватьВебСервисы = Истина, ПубликоватьВебСервисыРасширений = Ложь) Экспорт + Лог.Отладка("Установка общих параметров веб-сервисов (публиковать: %1, публиковать расширения: %2)", + ПубликоватьВебСервисы, ПубликоватьВебСервисыРасширений); + ПараметрыВебСервисовОбщие.Очистить(); ПараметрыВебСервисовОбщие.Вставить("publish-by-default", ПубликоватьВебСервисы); ПараметрыВебСервисовОбщие.Вставить("publish-extensions-by-default", ПубликоватьВебСервисыРасширений); @@ -256,18 +287,23 @@ // pool-size: 10 // pool-timeout: 5s // Подробности: https://its.1c.ru/db/v8314doc#bookmark:adm:TI000000940 -// ЭтоПервыйСервис - Булево - флаг для инициализации массива web-сервисов +// ЭтоПервыйСервис - Булево - флаг для инициализации массива web-сервисов Процедура ДобавитьПараметрыВебСервиса(Публиковать, Имя, Синоним, ПараметрыПовторногоИспользования, ЭтоПервыйСервис) Экспорт + Лог.Отладка("Добавление параметров веб-сервиса (имя: %1, синоним: %2, публиковать: %3)", + Имя, Синоним, Публиковать); + ПараметрыВебСервисов = Новый Соответствие; ПараметрыВебСервисов.Вставить("publish", Публиковать); ПараметрыВебСервисов.Вставить("name", Имя); ПараметрыВебСервисов.Вставить("alias", Синоним); - ПараметрыВебСервисов.Вставить("reuse-sessions", ПараметрыПовторногоИспользования); + Если ЗначениеЗаполнено(ПараметрыПовторногоИспользования) Тогда + ПараметрыВебСервисов.Вставить("reuse-sessions", ПараметрыПовторногоИспользования); + КонецЕсли; Если ЭтоПервыйСервис Тогда мсвПараметрыВебСервисов = Новый Массив; @@ -284,6 +320,9 @@ Процедура ПараметрыХТТПСервисовОбщие(ПубликоватьХТТПСервисы = Истина, ПубликоватьХТТПСервисыРасширений = Ложь) Экспорт + Лог.Отладка("Установка общих параметров http-сервисов (публиковать: %1, публиковать расширения: %2)", + ПубликоватьХТТПСервисы, ПубликоватьХТТПСервисыРасширений); + ПараметрыХТТПСервисовОбщие.Очистить(); ПараметрыХТТПСервисовОбщие.Вставить("publish-by-default", ПубликоватьХТТПСервисы); ПараметрыХТТПСервисовОбщие.Вставить("publish-extensions-by-default", ПубликоватьХТТПСервисыРасширений); @@ -304,23 +343,28 @@ // pool-size: 10 // pool-timeout: 5s // Подробности: https://its.1c.ru/db/v8314doc#bookmark:adm:TI000000940 -// ЭтоПервыйСервис - Булево - флаг для инициализации массива http-сервисов +// ЭтоПервыйСервис - Булево - флаг для инициализации массива http-сервисов Процедура ДобавитьПараметрыХТТПСервиса(Публиковать, Имя, КорневойУРЛ, ПараметрыПовторногоИспользования = Неопределено, ЭтоПервыйСервис = Ложь) Экспорт + Лог.Отладка("Добавление параметров http-сервиса (имя: %1, корневой УРЛ: %2, публиковать: %3)", + Имя, КорневойУРЛ, Публиковать); + ПараметрыХТТПСервисов = Новый Соответствие; ПараметрыХТТПСервисов.Вставить("publish", Публиковать); ПараметрыХТТПСервисов.Вставить("name", Имя); ПараметрыХТТПСервисов.Вставить("root", КорневойУРЛ); - ПараметрыХТТПСервисов.Вставить("reuse-sessions", ПараметрыПовторногоИспользования); + Если ЗначениеЗаполнено(ПараметрыПовторногоИспользования) Тогда + ПараметрыХТТПСервисов.Вставить("reuse-sessions", ПараметрыПовторногоИспользования); + КонецЕсли; Если ЭтоПервыйСервис Тогда мсвПараметрыХТТПСервисов = Новый Массив; КонецЕсли; - мсвПараметрыВебСервисов.Добавить(ПараметрыХТТПСервисов); + мсвПараметрыХТТПСервисов.Добавить(ПараметрыХТТПСервисов); КонецПроцедуры @@ -328,13 +372,15 @@ // Устанавливает параметры публикации клиентских дистрибутивов (pubdst) // Параметры: // ПутьКФайлуВин32 - Строка - Полное имя файла с архивом дистрибутива -// 32-разрядного клиентского приложения для ОС Windows. +// 32-разрядного клиентского приложения для ОС Windows. // ПутьКФайлуВин64 - Строка - Полное имя файла с архивом дистрибутива // 64-разрядного клиентского приложения для ОС Windows. // ПутьКФайлуМак64 - Строка - Полное имя файла с архивом дистрибутива // 64-разрядного клиентского приложения для ОС macOS. Процедура ПараметрыПубликацииДистрибутивов(ПутьКФайлуВин32, ПутьКФайлуВин64, ПутьКФайлуМак64) Экспорт + Лог.Отладка("Установка параметров публикации дистрибутивов"); + ПараметрыПубликацииДистрибутивов.Очистить(); ПараметрыПубликацииДистрибутивов.Вставить("win32", ПутьКФайлуВин32); ПараметрыПубликацииДистрибутивов.Вставить("win64", ПутьКФайлуВин64); @@ -350,14 +396,16 @@ // МаксимальныйПортПодключения - Число - Верхняя граница диапазона портов для установки соединения // УровеньБезопасности - Число - Уровень безопасности прямого соединения с сервером // -Процедура ПараметрыШлюзаПрямогоДоступа(ОсновнойПорт = 1541, - МинимальныйПортПодключения = 1560, - МаксимальныйПортПодключения = 1591, +Процедура ПараметрыШлюзаПрямогоДоступа(ОсновнойПорт = 1541, + МинимальныйПортПодключения = 1560, + МаксимальныйПортПодключения = 1591, УровеньБезопасности = 0) Экспорт + Лог.Отладка("Установка параметров шлюза прямого доступа (основной порт: %1)", ОсновнойПорт); + ПараметрыШлюза = Новый Соответствие; ПараметрыШлюза.Вставить("regport", XMLСтрока(ОсновнойПорт)); - ПараметрыШлюза.Вставить("range", + ПараметрыШлюза.Вставить("range", СтрШаблон("%1:%2", XMLСтрока(МинимальныйПортПодключения), XMLСтрока(МаксимальныйПортПодключения))); ПараметрыШлюза.Вставить("seclevel", XMLСтрока(УровеньБезопасности)); @@ -372,27 +420,29 @@ // ПутьКЗакрытомуКлючу - Строка - Путь к закрытому ключу хоста. // ПортПодключения - Число - Порт, обслуживаемый данным шлюзом. // -Процедура ПараметрыШлюзаSSH(СетевойИнтерфейс = "localhost", - ПутьКЗакрытомуКлючу = "auto", +Процедура ПараметрыШлюзаSSH(СетевойИнтерфейс = "localhost", + ПутьКЗакрытомуКлючу = "auto", ПортПодключения = 8282) Экспорт + Лог.Отладка("Установка параметров шлюза SSH (интерфейс: %1, порт: %2)", СетевойИнтерфейс, ПортПодключения); + ПараметрыШлюза = Новый Соответствие; ПараметрыШлюза.Вставить("address", СетевойИнтерфейс); ПараметрыШлюза.Вставить("host-key", ПутьКЗакрытомуКлючу); ПараметрыШлюза.Вставить("port", XMLСтрока(ПортПодключения)); ПараметрыСпособовДоступаКСерверу.Вставить("ssh", ПараметрыШлюза); - + КонецПроцедуры // Параметры функциональных характеристик автономного сервера. // // Параметры: -// ИспользоватьШлюзПрямогоДоступа - Булево, Неопределено - использовать доступ +// ИспользоватьШлюзПрямогоДоступа - Булево, Неопределено - использовать доступ // по протоколу TCP/IP (прямое подключение). // ИспользоватьШлюзHTTP - Булево, Неопределено - использовать доступ к автономному серверу по протоколу HTTP. // ИспользоватьШлюзSSH - Булево, Неопределено - использовать доступ к автономному серверу по протоколу SSH. -// ИспользоватьРасширеннуюФункциональностьКонифгуратора - Булево, Неопределено - использовать расширенную +// ИспользоватьРасширеннуюФункциональностьКонифгуратора - Булево, Неопределено - использовать расширенную // функциональность Конфигуратора. // Процедура ПараметрыФункциональностиСервера(ИспользоватьШлюзПрямогоДоступа = Неопределено, @@ -400,25 +450,14 @@ ИспользоватьШлюзSSH = Неопределено, ИспользоватьРасширеннуюФункциональностьКонифгуратора = Неопределено) Экспорт - ТипБулево = Тип("Булево"); - - Если ТипЗнч(ИспользоватьШлюзПрямогоДоступа) = ТипБулево Тогда - ПараметрыФункциональностиСервера.Вставить("direct-gate", ИспользоватьШлюзПрямогоДоступа); - КонецЕсли; - - Если ТипЗнч(ИспользоватьШлюзHTTP) = ТипБулево Тогда - ПараметрыФункциональностиСервера.Вставить("http-gate", ИспользоватьШлюзHTTP); - КонецЕсли; + Лог.Отладка("Установка параметров функциональности сервера"); - Если ТипЗнч(ИспользоватьШлюзSSH) = ТипБулево Тогда - ПараметрыФункциональностиСервера.Вставить("ssh-gate", ИспользоватьШлюзSSH); - КонецЕсли; + ВставитьЕслиБулево(ПараметрыФункциональностиСервера, "direct-gate", ИспользоватьШлюзПрямогоДоступа); + ВставитьЕслиБулево(ПараметрыФункциональностиСервера, "http-gate", ИспользоватьШлюзHTTP); + ВставитьЕслиБулево(ПараметрыФункциональностиСервера, "ssh-gate", ИспользоватьШлюзSSH); + ВставитьЕслиБулево(ПараметрыФункциональностиСервера, "extended-designer-features", + ИспользоватьРасширеннуюФункциональностьКонифгуратора); - Если ТипЗнч(ИспользоватьРасширеннуюФункциональностьКонифгуратора) = ТипБулево Тогда - ПараметрыФункциональностиСервера.Вставить("extended-designer-features", - ИспользоватьРасширеннуюФункциональностьКонифгуратора); - КонецЕсли; - КонецПроцедуры // Параметры отладки текущего экземпляра автономномного сервера @@ -434,6 +473,9 @@ СетевойИнтерфейс = "localhost", ПарольОтладки = "") Экспорт + Лог.Отладка("Установка параметров отладки сервера (тип: %1, порт: %2, интерфейс: %3, пароль не выводится в лог)", + ТипОтладки, ПортОтладки, СетевойИнтерфейс); + ПараметрыОтладкиСервера.Вставить("type", ТипОтладки); ПараметрыОтладкиСервера.Вставить("port", XMLСтрока(ПортОтладки)); ПараметрыОтладкиСервера.Вставить("address", СетевойИнтерфейс); @@ -450,10 +492,12 @@ // АдресВнешнегоСервераОтладки - Строка - Адрес внешнего сервера отладки. // Процедура ПараметрыВнешнегоСервераОтладки(АдресВнешнегоСервераОтладки) Экспорт - + + Лог.Отладка("Установка параметров внешнего сервера отладки (адрес: %1)", АдресВнешнегоСервераОтладки); + ПараметрыВнешнегоСервера = Новый Соответствие; ПараметрыВнешнегоСервера.Вставить("url", АдресВнешнегоСервераОтладки); - + ПараметрыОтладкиСервера.Вставить("type", "server"); ПараметрыОтладкиСервера.Вставить("server", ПараметрыВнешнегоСервера); @@ -465,18 +509,22 @@ // ПутьКФайлу - Строка - полный путь к конфигурационному файлу Процедура СоздатьКонфигурационныйФайл(ПутьКФайлу) Экспорт + Лог.Информация("Создание конфигурационного файла автономного сервера: %1", ПутьКФайлу); + Конфиг = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8"); - - ЗаписатьПараметрыСервера(Конфиг); + + ЗаписатьСекциюВерхнегоУровня(Конфиг, "server", ПараметрыСервера); ЗаписатьПараметрыБазыДанных(Конфиг); - ЗаписатьПараметрыИнформационнойБазы(Конфиг); + ЗаписатьСекциюВерхнегоУровня(Конфиг, "infobase", ПараметрыИБ); ЗаписатьПараметрыВебДоступа(Конфиг); - ЗаписатьПараметрыСпособовДоступаКСерверу(Конфиг); - ЗаписатьПараметрыФункциональностиСервера(Конфиг); - ЗаписатьПараметрыОтладкиСервера(Конфиг); + ЗаписатьСекциюВерхнегоУровня(Конфиг, "gates", ПараметрыСпособовДоступаКСерверу); + ЗаписатьСекциюВерхнегоУровня(Конфиг, "features", ПараметрыФункциональностиСервера); + ЗаписатьСекциюВерхнегоУровня(Конфиг, "debug", ПараметрыОтладкиСервера); Конфиг.Закрыть(); - + + Лог.Отладка("Конфигурационный файл %1 записан", ПутьКФайлу); + КонецПроцедуры #КонецОбласти @@ -485,12 +533,15 @@ Процедура ПриСозданииОбъекта() + Лог = Логирование.ПолучитьЛог(СлужебныйIbcmdRunner.ИмяЛога()); + ПараметрыСервера = Новый Соответствие; ПараметрыСервернойБазыДанных = Новый Соответствие; ПараметрыФайловойБазыДанных = Новый Соответствие; ПараметрыИБ = Новый Соответствие; ПараметрыВеб_Аутентификация = Новый Соответствие; ПараметрыВеб_Разделители = Новый Соответствие; + ПараметрыВеб_Приложение = Новый Соответствие; ПараметрыВеб_ПубликацияOData = Новый Соответствие; ПараметрыВеб_РежимПовторногоИспользованияСеансов = Новый Соответствие; ПараметрыВебСервисовОбщие = Новый Соответствие; @@ -499,9 +550,9 @@ ПараметрыХТТПСервисовОбщие = Новый Соответствие; ПараметрыХТТПСервисов = Новый Соответствие; ПараметрыПубликацииДистрибутивов = Новый Соответствие; - мсвПараметрыВеб_Разделители = Новый Соответствие; - мсвПараметрыВебСервисов = Новый Соответствие; - мсвПараметрыХТТПСервисов = Новый Соответствие; + мсвПараметрыВеб_Разделители = Новый Массив; + мсвПараметрыВебСервисов = Новый Массив; + мсвПараметрыХТТПСервисов = Новый Массив; ПараметрыСпособовДоступаКСерверу = Новый Соответствие; ПараметрыФункциональностиСервера = Новый Соответствие; ПараметрыОтладкиСервера = Новый Соответствие; @@ -513,11 +564,11 @@ #Область СлужебныеПроцедурыИФункции Процедура ЗаполнитьСекцию(КонфигФайл, Параметры, Уровень = 1) - + Если Параметры.Количество() = 0 Тогда Возврат; КонецЕсли; - + Отступ = ""; Для Счетчик = 1 По Уровень Цикл // BSLLS:UnusedLocalVariable-off Отступ = Отступ + " "; @@ -526,11 +577,16 @@ Для Каждого Параметр Из Параметры Цикл ТипЗнчПараметра = ТипЗнч(Параметр.Значение); - Если ТипЗнчПараметра = Тип("Число") ИЛИ + Если Параметр.Значение = Неопределено Тогда + // Незаполненный параметр не попадает в конфигурационный файл - + // автономный сервер использует значение по умолчанию. + Продолжить; + + ИначеЕсли ТипЗнчПараметра = Тип("Число") ИЛИ ТипЗнчПараметра = Тип("Строка") Тогда Значение = Параметр.Значение; ИначеЕсли ТипЗнчПараметра = Тип("Булево") Тогда - Значение = БулевоВСтроку(Параметр.Значение); + Значение = БулевоВСтроку(Параметр.Значение); ИначеЕсли ТипЗнчПараметра = Тип("Соответствие") Тогда КонфигФайл.ЗаписатьСтроку(СтрШаблон("%1%2:", Отступ, Параметр.Ключ)); @@ -538,74 +594,75 @@ Продолжить; Иначе - ВызватьИсключение "Значение параметра имеет неизвестный тип"; - КонецЕсли; + ВызватьИсключение СтрШаблон( + "Значение параметра '%1' имеет неизвестный тип: %2. Допустимые типы: Число, Строка, Булево, Соответствие.", + Параметр.Ключ, ТипЗнчПараметра); + КонецЕсли; Строка = СтрШаблон("%1%2: %3", Отступ, Параметр.Ключ, Значение); КонфигФайл.ЗаписатьСтроку(Строка); - - КонецЦикла; - -КонецПроцедуры + + КонецЦикла; + +КонецПроцедуры Функция БулевоВСтроку(Значение) - Если Значение = Истина Тогда - Рез = "true"; - ИначеЕсли Значение = Ложь Тогда - Рез = "false"; - Иначе - ВызватьИсключение "Значение должно иметь тип Булево."; - КонецЕсли; - Возврат Рез; -КонецФункции + Возврат СлужебныйIbcmdRunner.БулевоВСтрокуTrueFalse(Значение); +КонецФункции -Процедура ЗаписатьПараметрыСервера(Конфиг) +// Записать секцию верхнего уровня конфигурационного файла, +// если параметры секции заполнены +// Параметры: +// Конфиг - ЗаписьТекста - файл конфигурации +// ИмяСекции - Строка - имя секции верхнего уровня (без двоеточия) +// Параметры - Соответствие - параметры секции +Процедура ЗаписатьСекциюВерхнегоУровня(Конфиг, Знач ИмяСекции, Знач Параметры) - Если ПараметрыСервера.Количество() = 0 Тогда + Если Параметры.Количество() = 0 Тогда Возврат; КонецЕсли; - Конфиг.ЗаписатьСтроку("server:"); - ЗаполнитьСекцию(Конфиг, ПараметрыСервера); + Лог.Отладка("Запись секции '%1' конфигурационного файла", ИмяСекции); + + Конфиг.ЗаписатьСтроку(ИмяСекции + ":"); + ЗаполнитьСекцию(Конфиг, Параметры); КонецПроцедуры -Процедура ЗаписатьПараметрыБазыДанных(Конфиг) +// Вставить значение в соответствие только если значение имеет тип Булево +// Параметры: +// Параметры - Соответствие - целевое соответствие +// Ключ - Строка - ключ +// Значение - Произвольный - значение +Процедура ВставитьЕслиБулево(Параметры, Знач Ключ, Знач Значение) - Если ПараметрыСервернойБазыДанных.Количество() = 0 И ПараметрыФайловойБазыДанных.Количество() = 0 Тогда - Возврат; + Если ТипЗнч(Значение) = Тип("Булево") Тогда + Параметры.Вставить(Ключ, Значение); КонецЕсли; - Конфиг.ЗаписатьСтроку("database:"); - - Для Каждого Параметр Из ПараметрыСервернойБазыДанных Цикл - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Параметр.Значение); - Конфиг.ЗаписатьСтроку(Строка); - КонецЦикла; - - Для Каждого Параметр Из ПараметрыФайловойБазыДанных Цикл - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Параметр.Значение); - Конфиг.ЗаписатьСтроку(Строка); - КонецЦикла; - КонецПроцедуры -Процедура ЗаписатьПараметрыИнформационнойБазы(Конфиг) +Процедура ЗаписатьПараметрыБазыДанных(Конфиг) - Если ПараметрыИБ.Количество() = 0 Тогда + Если ПараметрыСервернойБазыДанных.Количество() = 0 И ПараметрыФайловойБазыДанных.Количество() = 0 Тогда Возврат; КонецЕсли; - Конфиг.ЗаписатьСтроку("infobase:"); - ЗаполнитьСекцию(Конфиг, ПараметрыИБ); + Лог.Отладка("Запись секции 'database' конфигурационного файла"); + + Конфиг.ЗаписатьСтроку("database:"); + + ЗаполнитьСекцию(Конфиг, ПараметрыСервернойБазыДанных); + ЗаполнитьСекцию(Конфиг, ПараметрыФайловойБазыДанных); КонецПроцедуры Процедура ЗаписатьПараметрыВебДоступа(Конфиг) - ПропуститьСекциюHTTP = ПараметрыХТТП.Количество() = 0 + ПропуститьСекциюHTTP = ПараметрыХТТП.Количество() = 0 И ПараметрыВеб_Аутентификация.Количество() = 0 И мсвПараметрыВеб_Разделители.Количество() = 0 + И ПараметрыВеб_Приложение.Количество() = 0 И ПараметрыВеб_ПубликацияOData.Количество() = 0 И ПараметрыВебСервисовОбщие.Количество() = 0 И ПараметрыХТТПСервисовОбщие.Количество() = 0 @@ -615,18 +672,21 @@ Возврат; КонецЕсли; + Лог.Отладка("Запись секции 'http' конфигурационного файла"); + Конфиг.ЗаписатьСтроку("http:"); ЗаписатьПараметрыВеб_ХТТП(Конфиг); ЗаписатьПараметрыВеб_Аутентификация(Конфиг); ЗаписатьПараметрыВеб_Разделители(Конфиг); + ЗаписатьПодсекциюВеб(Конфиг, "application", ПараметрыВеб_Приложение); ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг); - ЗаписатьПараметрыВеб_ВебСервисов(Конфиг); - ЗаписатьПараметрыВеб_ХТТПСервисов(Конфиг); - ЗаписатьПараметрыВеб_ПубликацииДистрибутивов(Конфиг); - + ЗаписатьПараметрыВеб_Сервисов(Конфиг, "web-services", ПараметрыВебСервисовОбщие, мсвПараметрыВебСервисов); + ЗаписатьПараметрыВеб_Сервисов(Конфиг, "http-services", ПараметрыХТТПСервисовОбщие, мсвПараметрыХТТПСервисов); + ЗаписатьПодсекциюВеб(Конфиг, "pubdst", ПараметрыПубликацииДистрибутивов); + КонецПроцедуры -Процедура ЗаписатьПараметрыВеб_ХТТП(Конфиг) +Процедура ЗаписатьПараметрыВеб_ХТТП(Конфиг) Если ПараметрыХТТП.Количество() > 0 Тогда ЗаполнитьСекцию(Конфиг, ПараметрыХТТП); @@ -635,132 +695,101 @@ КонецПроцедуры Процедура ЗаписатьПараметрыВеб_Аутентификация(Конфиг) - - Если ПараметрыВеб_Аутентификация.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" auth:"); - Конфиг.ЗаписатьСтроку(" rely:"); - Значение = ПараметрыВеб_Аутентификация.Получить("url"); - Конфиг.ЗаписатьСтроку(" url: " + Значение); - Значение = ПараметрыВеб_Аутентификация.Получить("lifetime"); - Конфиг.ЗаписатьСтроку(" lifetime: " + Значение); - Конфиг.ЗаписатьСтроку(" provider:"); - Значение = ПараметрыВеб_Аутентификация.Получить("return-to"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" return-to: " + Значение); - КонецЕсли; - Значение = ПараметрыВеб_Аутентификация.Получить("providers"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" providers: " + Значение); - КонецЕсли; - Значение = ПараметрыВеб_Аутентификация.Получить("allow-standard"); - Если Значение = Ложь Тогда - Конфиг.ЗаписатьСтроку(" allow-standard: false"); - КонецЕсли; - КонецЕсли; + + Если ПараметрыВеб_Аутентификация.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Конфиг.ЗаписатьСтроку(" auth:"); + Конфиг.ЗаписатьСтроку(" rely:"); + Значение = ПараметрыВеб_Аутентификация.Получить("url"); + Конфиг.ЗаписатьСтроку(" url: " + Значение); + Значение = ПараметрыВеб_Аутентификация.Получить("lifetime"); + Конфиг.ЗаписатьСтроку(" lifetime: " + Значение); + Конфиг.ЗаписатьСтроку(" provider:"); + Значение = ПараметрыВеб_Аутентификация.Получить("return-to"); + Если Значение <> Неопределено Тогда + Конфиг.ЗаписатьСтроку(" return-to: " + Значение); + КонецЕсли; + Значение = ПараметрыВеб_Аутентификация.Получить("providers"); + Если Значение <> Неопределено Тогда + Конфиг.ЗаписатьСтроку(" providers: " + Значение); + КонецЕсли; + Значение = ПараметрыВеб_Аутентификация.Получить("allow-standard"); + Если Значение = Ложь Тогда + Конфиг.ЗаписатьСтроку(" allow-standard: false"); + КонецЕсли; КонецПроцедуры Процедура ЗаписатьПараметрыВеб_Разделители(Конфиг) - + Если мсвПараметрыВеб_Разделители.Количество() > 0 Тогда Конфиг.ЗаписатьСтроку(" zones:"); Для Каждого Разделитель Из мсвПараметрыВеб_Разделители Цикл Конфиг.ЗаписатьСтроку(" -"); ЗаполнитьСекцию(Конфиг, Разделитель, 3); - КонецЦикла; - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг) - - Если ПараметрыВеб_ПубликацияOData.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" odata:"); - Значение = ПараметрыВеб_ПубликацияOData.Получить("publish"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" publish: " + БулевоВСтроку(Значение)); - КонецЕсли; - Значение = ПараметрыВеб_ПубликацияOData.Получить("reuse-session"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" reuse-session:"); - ЗаполнитьСекцию(Конфиг, Значение, 3); - КонецЕсли; + КонецЦикла; КонецЕсли; КонецПроцедуры -Процедура ЗаписатьПараметрыВеб_ВебСервисов(Конфиг) - - Если ПараметрыВебСервисовОбщие.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" web-services:"); - ЗаполнитьСекцию(Конфиг, ПараметрыВебСервисовОбщие, 2); - Если мсвПараметрыВебСервисов.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" service:"); - Для Каждого ПараметрыВебСервиса Из мсвПараметрыВебСервисов Цикл - Конфиг.ЗаписатьСтроку(" -"); - ЗаполнитьСекцию(Конфиг, ПараметрыВебСервиса, 3); - КонецЦикла; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьПараметрыВеб_ХТТПСервисов(Конфиг) - - Если ПараметрыХТТПСервисовОбщие.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" http-services:"); - ЗаполнитьСекцию(Конфиг, ПараметрыХТТПСервисовОбщие, 2); - Если мсвПараметрыХТТПСервисов.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" service:"); - Для Каждого ПараметрыХТТПСервиса Из мсвПараметрыХТТПСервисов Цикл - Конфиг.ЗаписатьСтроку(" -"); - ЗаполнитьСекцию(Конфиг, ПараметрыХТТПСервиса, 3); - КонецЦикла; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьПараметрыВеб_ПубликацииДистрибутивов(Конфиг) - - Если ПараметрыПубликацииДистрибутивов.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" pubdst:"); - ЗаполнитьСекцию(Конфиг, ПараметрыПубликацииДистрибутивов, 2); - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьПараметрыСпособовДоступаКСерверу(Конфиг) +Процедура ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг) - Если ПараметрыСпособовДоступаКСерверу.Количество() = 0 Тогда + Если ПараметрыВеб_ПубликацияOData.Количество() = 0 Тогда Возврат; КонецЕсли; - Конфиг.ЗаписатьСтроку("gates:"); - ЗаполнитьСекцию(Конфиг, ПараметрыСпособовДоступаКСерверу); + Конфиг.ЗаписатьСтроку(" odata:"); + Значение = ПараметрыВеб_ПубликацияOData.Получить("publish"); + Если Значение <> Неопределено Тогда + Конфиг.ЗаписатьСтроку(" publish: " + БулевоВСтроку(Значение)); + КонецЕсли; + Значение = ПараметрыВеб_ПубликацияOData.Получить("reuse-sessions"); + Если Значение <> Неопределено Тогда + Конфиг.ЗаписатьСтроку(" reuse-sessions:"); + ЗаполнитьСекцию(Конфиг, Значение, 3); + КонецЕсли; КонецПроцедуры -Процедура ЗаписатьПараметрыФункциональностиСервера(Конфиг) +// Записать подсекцию секции http с общими параметрами сервисов +// и массивом описаний отдельных сервисов +// Параметры: +// Конфиг - ЗаписьТекста - файл конфигурации +// ИмяПодсекции - Строка - имя подсекции ("web-services" или "http-services") +// ОбщиеПараметры - Соответствие - общие параметры сервисов +// МассивСервисов - Массив - массив соответствий с параметрами отдельных сервисов +Процедура ЗаписатьПараметрыВеб_Сервисов(Конфиг, Знач ИмяПодсекции, Знач ОбщиеПараметры, Знач МассивСервисов) - Если ПараметрыФункциональностиСервера.Количество() = 0 Тогда + Если ОбщиеПараметры.Количество() = 0 Тогда Возврат; КонецЕсли; - Конфиг.ЗаписатьСтроку("features:"); - ЗаполнитьСекцию(Конфиг, ПараметрыФункциональностиСервера); + Конфиг.ЗаписатьСтроку(СтрШаблон(" %1:", ИмяПодсекции)); + ЗаполнитьСекцию(Конфиг, ОбщиеПараметры, 2); + Если МассивСервисов.Количество() > 0 Тогда + Конфиг.ЗаписатьСтроку(" service:"); + Для Каждого ПараметрыСервиса Из МассивСервисов Цикл + Конфиг.ЗаписатьСтроку(" -"); + ЗаполнитьСекцию(Конфиг, ПараметрыСервиса, 3); + КонецЦикла; + КонецЕсли; КонецПроцедуры -Процедура ЗаписатьПараметрыОтладкиСервера(Конфиг) - - Если ПараметрыОтладкиСервера.Количество() = 0 Тогда - Возврат; +// Записать простую подсекцию секции http +// Параметры: +// Конфиг - ЗаписьТекста - файл конфигурации +// ИмяПодсекции - Строка - имя подсекции +// Параметры - Соответствие - параметры подсекции +Процедура ЗаписатьПодсекциюВеб(Конфиг, Знач ИмяПодсекции, Знач Параметры) + + Если Параметры.Количество() > 0 Тогда + Конфиг.ЗаписатьСтроку(СтрШаблон(" %1:", ИмяПодсекции)); + ЗаполнитьСекцию(Конфиг, Параметры, 2); КонецЕсли; - Конфиг.ЗаписатьСтроку("debug:"); - ЗаполнитьСекцию(Конфиг, ПараметрыОтладкиСервера); - КонецПроцедуры #КонецОбласти From 9a0c44b4b3a6d3ac759651a39f70dd6eaf1115ce Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Mon, 31 Aug 2026 19:25:05 +0300 Subject: [PATCH 3/9] =?UTF-8?q?=D0=A3=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=90=D0=A1:=20=D0=BF=D0=BE=D0=B4=D1=80?= =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=20=D0=B2=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=D1=85=20=D0=BE=D0=B1?= =?UTF-8?q?=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Отладочное логирование установки параметров, командной строки запуска ibsrv, хода ожидания готовности сервера. - Ошибки дополнены контекстом: путь к несуществующим каталогам и файлам, диапазон допустимых портов, идентификатор уже запущенного процесса, файл готовности и время ожидания при неудачном запуске. - Префикс 'Процесс ibsrv не запустился!' сохранён — по нему работает ЭтоИсключенияЗапускаАС. - Общие функции (кавычки, имя лога) перенесены в СлужебныйIbcmdRunner. - Проверка номера порта выделена в общую процедуру. Co-Authored-By: Claude Fable 5 --- .../ibsrvrunner.os" | 140 ++++++++++++------ 1 file changed, 93 insertions(+), 47 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" index 3f263d6..61dcfd7 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" @@ -4,12 +4,13 @@ #Использовать 1commands #Использовать asserts #Использовать fs +#Использовать logos #Область ОписаниеПеременных Перем Лог; // Экземпляр логгера Перем ПутьКIbsrv; // Путь к утилите ibsrv -Перем ПараметрыЗапускаАС; // Коллекция параметров командной строки +Перем ПараметрыЗапускаАС; // Коллекция параметров командной строки Перем Процесс; // Процесс запущенного автономного сервера @@ -26,11 +27,11 @@ // Строка - версия утилиты // Функция Версия() Экспорт - + Если Версия = "8" Тогда ВычислитьВерсиюIbsrv(Версия, Неопределено); КонецЕсли; - + Возврат Версия; КонецФункции @@ -42,12 +43,14 @@ // Разрядность - Строка, Неопределено - разрядность требуемой версии (перечисление из РазрядностьПлатформы) // Процедура УстановитьВерсиюПлатформы(Знач НомерВерсии, Знач Разрядность = Неопределено) Экспорт - + Ожидаем.Что(НомерВерсии).ИмеетТип("Строка"); Если Разрядность <> Неопределено Тогда Ожидаем.Что(Разрядность).ИмеетТип("Строка"); КонецЕсли; + Лог.Отладка("Установка версии платформы для ibsrv: %1 (разрядность: %2)", НомерВерсии, Разрядность); + ВычислитьВерсиюIbsrv(НомерВерсии, Разрядность); КонецПроцедуры @@ -60,7 +63,10 @@ Процедура УстановитьКаталогДанных(Знач КаталогДанныхСервера) Экспорт Ожидаем.Что(КаталогДанныхСервера).ИмеетТип("Строка"); - Ожидаем.Что(ФС.КаталогСуществует(КаталогДанныхСервера)).ЭтоИстина(); + Ожидаем.Что(ФС.КаталогСуществует(КаталогДанныхСервера), + СтрШаблон("Каталог данных автономного сервера не существует: %1", КаталогДанныхСервера)).ЭтоИстина(); + + Лог.Отладка("Установлен каталог данных автономного сервера: %1", КаталогДанныхСервера); КаталогДанных = КаталогДанныхСервера; ПараметрыЗапускаАС.Вставить("data", ОбернутьВКавычки(КаталогДанных)); @@ -75,10 +81,13 @@ Процедура УстановитьПараметрыФайловойИБ(Знач КаталогИБ) Экспорт Ожидаем.Что(КаталогИБ).ИмеетТип("Строка"); - Ожидаем.Что(ФС.КаталогСуществует(КаталогИБ)).ЭтоИстина(); + Ожидаем.Что(ФС.КаталогСуществует(КаталогИБ), + СтрШаблон("Каталог файловой информационной базы не существует: %1", КаталогИБ)).ЭтоИстина(); + + Лог.Отладка("Установлен каталог файловой ИБ: %1", КаталогИБ); ПараметрыЗапускаАС.Вставить("db-path", ОбернутьВКавычки(КаталогИБ)); - + КонецПроцедуры // Устанавливает путь к конфигурационному файлу автономного сервера. @@ -87,9 +96,13 @@ // ПутьККонфигурационномуФайлу - Строка - Путь к конфигурационному файлу. // Процедура УстановитьКонфигурационныйФайл(Знач ПутьККонфигурационномуФайлу) Экспорт - + Ожидаем.Что(ПутьККонфигурационномуФайлу).ИмеетТип("Строка"); - Ожидаем.Что(ФС.ФайлСуществует(ПутьККонфигурационномуФайлу)).ЭтоИстина(); + Ожидаем.Что(ФС.ФайлСуществует(ПутьККонфигурационномуФайлу), + СтрШаблон("Конфигурационный файл автономного сервера не существует: %1", ПутьККонфигурационномуФайлу)) + .ЭтоИстина(); + + Лог.Отладка("Установлен конфигурационный файл автономного сервера: %1", ПутьККонфигурационномуФайлу); ПараметрыЗапускаАС.Вставить("config", ОбернутьВКавычки(ПутьККонфигурационномуФайлу)); @@ -101,10 +114,10 @@ // НомерПорта - Число - порт установки прямого соединения с сервером (от 1000 до 65535) // Процедура УстановитьПортПрямогоДоступа(Знач НомерПорта) Экспорт - - Ожидаем.Что(НомерПорта).ИмеетТип("Число"); - Ожидаем.Что(НомерПорта).Больше(1000); // BSLLS:MagicNumber-off - Ожидаем.Что(НомерПорта).Меньше(65535); // BSLLS:MagicNumber-off + + ПроверитьНомерПорта(НомерПорта); + + Лог.Отладка("Установлен порт прямого доступа: %1", НомерПорта); ПараметрыЗапускаАС.Вставить("direct-regport", НомерПорта); @@ -116,10 +129,10 @@ // НомерПорта - Число - порт установки http соединения с сервером (от 1000 до 65535) // Процедура УстановитьПортHttpДоступа(Знач НомерПорта) Экспорт - - Ожидаем.Что(НомерПорта).ИмеетТип("Число"); - Ожидаем.Что(НомерПорта).Больше(1000); // BSLLS:MagicNumber-off - Ожидаем.Что(НомерПорта).Меньше(65535); // BSLLS:MagicNumber-off + + ПроверитьНомерПорта(НомерПорта); + + Лог.Отладка("Установлен порт http-доступа: %1", НомерПорта); ПараметрыЗапускаАС.Вставить("http-port", НомерПорта); @@ -131,12 +144,17 @@ Процедура Запустить() Экспорт Если Запущен() Тогда - ВызватьИсключение "Процесс ibsrv уже запущен!"; + ВызватьИсключение СтрШаблон("Процесс ibsrv уже запущен! Идентификатор процесса: %1", Процесс.Идентификатор); КонецЕсли; - Ожидаем.Что(КаталогДанных).Заполнено(); + Ожидаем.Что(КаталогДанных, + "Не установлен каталог данных автономного сервера. Вызовите УстановитьКаталогДанных перед запуском.") + .Заполнено(); ПараметрыКоманды = ЗаполнитьПараметрыКоманды(); + + Лог.Информация("Запуск автономного сервера ibsrv (каталог данных: %1)", КаталогДанных); + ЗапуститьПроцессIbsrv(ПараметрыКоманды); ОжидатьЗапускаIbsrv(); @@ -179,15 +197,18 @@ Процедура Остановить() Экспорт Если Не Запущен() Тогда + Лог.Отладка("Остановка не требуется: процесс ibsrv не запущен"); Возврат; КонецЕсли; - + + Лог.Информация("Остановка автономного сервера ibsrv (идентификатор процесса: %1)", Процесс.Идентификатор); + Процесс.Завершить(); ПрочитатьПотокиIbsrv(); - + Лог.Отладка("Процесс %1 ibsrv завершен.", Процесс.Идентификатор); - + Процесс = Неопределено; КонецПроцедуры @@ -202,7 +223,7 @@ Лог = Логирование.ПолучитьЛог(ИмяЛога()); ПараметрыЗапускаАС = Новый Соответствие; КаталогДанных = ""; - + КонецПроцедуры #КонецОбласти @@ -210,29 +231,45 @@ #Область СлужебныеПроцедурыИФункции Функция ИмяЛога() - Возврат "oscript.lib.ibcmdrunner"; + Возврат СлужебныйIbcmdRunner.ИмяЛога(); КонецФункции Функция ОбернутьВКавычки(Строка) - Возврат СтрШаблон("""%1""", Строка); + Возврат СлужебныйIbcmdRunner.ОбернутьВКавычки(Строка); КонецФункции +Процедура ПроверитьНомерПорта(Знач НомерПорта) + + Ожидаем.Что(НомерПорта).ИмеетТип("Число"); + Ожидаем.Что(НомерПорта, СтрШаблон("Номер порта должен быть в диапазоне от 1000 до 65535, получено: %1", НомерПорта)) + .Больше(1000); // BSLLS:MagicNumber-off + Ожидаем.Что(НомерПорта, СтрШаблон("Номер порта должен быть в диапазоне от 1000 до 65535, получено: %1", НомерПорта)) + .Меньше(65535); // BSLLS:MagicNumber-off + +КонецПроцедуры + Процедура ВычислитьВерсиюIbsrv(НомерВерсии, Разрядность) ПутьКIbsrv = Платформа1С.ПутьКIBSRV(НомерВерсии, Разрядность); Ожидаем.Что(ПутьКIbsrv, "Не найдена установленная версия платформы: " + НомерВерсии).Заполнено(); - + + Лог.Отладка("Путь к утилите ibsrv: %1", ПутьКIbsrv); + ПараметрыКоманды = Новый Массив; ПараметрыКоманды.Добавить("--version"); - + ВыводКоманды = ВыполнитьКомандуIbsrv(ПараметрыКоманды); - - Версия = СокрЛП(ВыводКоманды); + + Версия = СокрЛП(ВыводКоманды); + + Лог.Отладка("Версия утилиты ibsrv: %1", Версия); КонецПроцедуры Функция ВыполнитьКомандуIbsrv(ПараметрыКоманды) + Лог.Отладка("Запуск: %1 %2", ПутьКIbsrv, СтрСоединить(ПараметрыКоманды, " ")); + Команда = Новый Команда(); Команда.УстановитьКоманду(ПутьКIbsrv); Команда.ДобавитьПараметры(ПараметрыКоманды); @@ -246,8 +283,8 @@ КонецФункции -Функция ЗапуститьПроцессIbsrv(Знач ПараметрыКоманды) - +Функция ЗапуститьПроцессIbsrv(Знач ПараметрыКоманды) + ПараметрыКоманды.Вставить(0, ОбернутьВКавычки(ПутьКIbsrv)); КоманднаяСтрока = СтрСоединить(ПараметрыКоманды, " "); @@ -256,10 +293,12 @@ ПеренаправлятьПотокВвода = Ложь; КодировкаПотоков = КодировкаТекста.UTF8; - Процесс = СоздатьПроцесс(КоманднаяСтрока, ТекущийКаталог, + Лог.Отладка("Командная строка запуска ibsrv: %1 (текущий каталог: %2)", КоманднаяСтрока, ТекущийКаталог); + + Процесс = СоздатьПроцесс(КоманднаяСтрока, ТекущийКаталог, ПеренаправлятьПотокВывода, ПеренаправлятьПотокВвода, КодировкаПотоков); Процесс.Запустить(); - + Возврат Процесс; КонецФункции @@ -273,21 +312,25 @@ ИмяФайла = ОбъединитьПути(КаталогДанных, "lock.pid"); ЕстьДанные = Ложь; - Пока Запущен() И ТекущийПериодОжидания < ПредельныйПериодОжиданияМс Цикл + Лог.Отладка("Ожидание запуска ibsrv (файл готовности: %1, предельное время ожидания: %2 мс)", + ИмяФайла, ПредельныйПериодОжиданияМс); + + Пока Запущен() И ТекущийПериодОжидания < ПредельныйПериодОжиданияМс Цикл Приостановить(ИнтервалПроверкиМс); ЕстьДанные = ЕстьДанные ИЛИ ПрочитатьПотокиIbsrv(); ФайлСуществует = ФайлСуществует ИЛИ ФС.ФайлСуществует(ИмяФайла); Если ЕстьДанные И ФайлСуществует Тогда - Прервать; - КонецЕсли; + Прервать; + КонецЕсли; ТекущийПериодОжидания = ТекущийПериодОжидания + ИнтервалПроверкиМс; КонецЦикла; Если ФайлСуществует Тогда + Лог.Отладка("Сервер ibsrv готов к работе (время ожидания: %1 мс)", ТекущийПериодОжидания); Возврат; КонецЕсли; @@ -295,8 +338,11 @@ Остановить(); КонецЕсли; - ВызватьИсключение ТекстИсключенияЗапускаАС(); - + ТекстОшибки = СтрШаблон("%1 Файл готовности %2 не появился за %3 мс. Подробности смотрите в отладочном логе %4.", + ТекстИсключенияЗапускаАС(), ИмяФайла, ПредельныйПериодОжиданияМс, ИмяЛога()); + Лог.Ошибка(ТекстОшибки); + ВызватьИсключение ТекстОшибки; + КонецПроцедуры Функция ТекстИсключенияЗапускаАС() @@ -306,38 +352,38 @@ КонецФункции Функция ЗаполнитьПараметрыКоманды() - + ПараметрыКоманды = Новый Массив; Для Каждого КлючИЗначение Из ПараметрыЗапускаАС Цикл Если КлючИЗначение.Значение = Неопределено Тогда // это параметр-флаг - ПараметрыКоманды.Добавить(КлючИЗначение.Ключ); + ПараметрыКоманды.Добавить(КлючИЗначение.Ключ); Продолжить; ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Строка") И ПустаяСтрока(КлючИЗначение.Значение) Тогда - Продолжить; - + Продолжить; + ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Булево") Тогда Значение = ?(КлючИЗначение.Значение, "allow", "deny"); ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Число") Тогда Значение = XMLСтрока(КлючИЗначение.Значение); - + Иначе Значение = КлючИЗначение.Значение; КонецЕсли; - + ПараметрЗапуска = СтрШаблон("--%1=%2", КлючИЗначение.Ключ, Значение); - ПараметрыКоманды.Добавить(ПараметрЗапуска); - + ПараметрыКоманды.Добавить(ПараметрЗапуска); + КонецЦикла; Возврат ПараметрыКоманды; КонецФункции -Функция ПрочитатьПотокиIbsrv() +Функция ПрочитатьПотокиIbsrv() ЕстьДанные = Ложь; From 4ee9fd6d5143e73cf578d0f3b46e32ecb667d205 Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Mon, 31 Aug 2026 19:25:22 +0300 Subject: [PATCH 4/9] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=B8=20=D1=85=D0=B0=D1=80=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B7=20=D1=82=D1=80=D0=B5=D0=B1=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BB=D0=B0=D1=82=D1=84=D0=BE=D1=80=D0=BC=D1=8B?= =?UTF-8?q?=201=D0=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - common_functions_tests: тесты служебного модуля (сравнение версий, кавычки, yes/no и true/false конверсии, проверка имён 1С, шаблоны переменных среды). - configfile_as_tests: характеризационные тесты генератора YAML — фиксируют содержимое всех секций конфигурационного файла автономного сервера, включая исправленные секции application, http-services, allow-standard и reuse-sessions. - ibcmdrunner_unit_tests: тесты УправлениеИБ без создания баз — версия, путь к приложению, разбор списка расширений по фиксированному тексту, контроль исключений при некорректных параметрах. - ibsrvrunner_tests: исправлен вызов несуществующего метода УстановитьВерсию — класс всегда предоставлял только УстановитьВерсиюПлатформы, тест падал. Co-Authored-By: Claude Fable 5 --- tests/common_functions_tests.os | 155 +++++++++++++++ tests/configfile_as_tests.os | 322 ++++++++++++++++++++++++++++++++ tests/ibcmdrunner_unit_tests.os | 208 +++++++++++++++++++++ tests/ibsrvrunner_tests.os | 4 +- 4 files changed, 687 insertions(+), 2 deletions(-) create mode 100644 tests/common_functions_tests.os create mode 100644 tests/configfile_as_tests.os create mode 100644 tests/ibcmdrunner_unit_tests.os diff --git a/tests/common_functions_tests.os b/tests/common_functions_tests.os new file mode 100644 index 0000000..8bbe069 --- /dev/null +++ b/tests/common_functions_tests.os @@ -0,0 +1,155 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +// Модульные тесты общего служебного модуля СлужебныйIbcmdRunner. +// Не требуют установленной платформы 1С. + +#Использовать ".." +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +&Тест +Процедура ТестДолжен_СравнитьРавныеВерсии() Экспорт + + Утверждения.ПроверитьРавенство(0, СлужебныйIbcmdRunner.СравнитьВерсии("8.3.20", "8.3.20")); + Утверждения.ПроверитьРавенство(0, СлужебныйIbcmdRunner.СравнитьВерсии("8.3", "8.3.0.0")); + Утверждения.ПроверитьРавенство(0, СлужебныйIbcmdRunner.СравнитьВерсии("1 002", "1002")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СравнитьБольшуюВерсиюСМеньшей() Экспорт + + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("8.3.21", "8.3.20") > 0, + "8.3.21 должна быть больше 8.3.20"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("8.3.20.1563", "8.3.20") > 0, + "8.3.20.1563 должна быть больше 8.3.20"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("9", "8.3.22.1704") > 0, + "9 должна быть больше 8.3.22.1704"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СравнитьМеньшуюВерсиюСБольшей() Экспорт + + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("8.3.19", "8.3.20") < 0, + "8.3.19 должна быть меньше 8.3.20"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("8.3.20", "8.3.20.100") < 0, + "8.3.20 должна быть меньше 8.3.20.100"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазложитьВерсиюНаКомпоненты() Экспорт + + Компоненты = СлужебныйIbcmdRunner.МассивКомпонентВерсии("8.3.22.1704"); + + Утверждения.ПроверитьРавенство(4, Компоненты.Количество()); + Утверждения.ПроверитьРавенство(8, Компоненты[0]); + Утверждения.ПроверитьРавенство(3, Компоненты[1]); + Утверждения.ПроверитьРавенство(22, Компоненты[2]); + Утверждения.ПроверитьРавенство(1704, Компоненты[3]); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ОбернутьСтрокуВКавычки() Экспорт + + Утверждения.ПроверитьРавенство("""путь к файлу""", СлужебныйIbcmdRunner.ОбернутьВКавычки("путь к файлу")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НеОборачиватьВКавычкиПовторно() Экспорт + + Утверждения.ПроверитьРавенство("""путь""", СлужебныйIbcmdRunner.ОбернутьВКавычки("""путь""")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ОбернутьПустуюСтрокуВКавычки() Экспорт + + Утверждения.ПроверитьРавенство("""""", СлужебныйIbcmdRunner.ОбернутьВКавычки("")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПреобразоватьБулевоВYesNo() Экспорт + + Утверждения.ПроверитьРавенство("yes", СлужебныйIbcmdRunner.БулевоВСтрокуYesNo(Истина)); + Утверждения.ПроверитьРавенство("no", СлужебныйIbcmdRunner.БулевоВСтрокуYesNo(Ложь)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПреобразоватьYesNoВБулево() Экспорт + + Утверждения.ПроверитьРавенство(Истина, СлужебныйIbcmdRunner.СтрокаYesNoВБулево("yes")); + Утверждения.ПроверитьРавенство(Ложь, СлужебныйIbcmdRunner.СтрокаYesNoВБулево("no")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВызватьИсключениеДляНекорректногоYesNo() Экспорт + + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("maybe"); + + Ожидаем.Что(СлужебныйIbcmdRunner) + .Метод("СтрокаYesNoВБулево", ПараметрыМетода) + .ВыбрасываетИсключение("должно быть только 'yes' или 'no'"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПреобразоватьБулевоВTrueFalse() Экспорт + + Утверждения.ПроверитьРавенство("true", СлужебныйIbcmdRunner.БулевоВСтрокуTrueFalse(Истина)); + Утверждения.ПроверитьРавенство("false", СлужебныйIbcmdRunner.БулевоВСтрокуTrueFalse(Ложь)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПроверитьКорректныеИмена() Экспорт + + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.ЯвляетсяИменем("СуперРасширение"), + "Имя 'СуперРасширение' должно быть корректным"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.ЯвляетсяИменем("_служебное1"), + "Имя '_служебное1' должно быть корректным"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.ЯвляетсяИменем("extension_2"), + "Имя 'extension_2' должно быть корректным"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПроверитьНекорректныеИмена() Экспорт + + Утверждения.ПроверитьЛожь(СлужебныйIbcmdRunner.ЯвляетсяИменем(""), + "Пустая строка не должна быть корректным именем"); + Утверждения.ПроверитьЛожь(СлужебныйIbcmdRunner.ЯвляетсяИменем("1Расширение"), + "Имя, начинающееся с цифры, не должно быть корректным"); + Утверждения.ПроверитьЛожь(СлужебныйIbcmdRunner.ЯвляетсяИменем("Имя Расширения"), + "Имя с пробелом не должно быть корректным"); + Утверждения.ПроверитьЛожь(СлужебныйIbcmdRunner.ЯвляетсяИменем("Имя-Расширения"), + "Имя с дефисом не должно быть корректным"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПостроитьШаблонПеременнойСреды() Экспорт + + Утверждения.ПроверитьРавенство("%IBCMD_IB_PSW%", + СлужебныйIbcmdRunner.ШаблонПеременнойСреды("IBCMD_IB_PSW", Истина)); + Утверждения.ПроверитьРавенство("$IBCMD_IB_PSW", + СлужебныйIbcmdRunner.ШаблонПеременнойСреды("IBCMD_IB_PSW", Ложь)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВернутьИмяЛога() Экспорт + + Утверждения.ПроверитьРавенство("oscript.lib.ibcmdrunner", СлужебныйIbcmdRunner.ИмяЛога()); + +КонецПроцедуры + +#КонецОбласти diff --git a/tests/configfile_as_tests.os b/tests/configfile_as_tests.os new file mode 100644 index 0000000..511b06c --- /dev/null +++ b/tests/configfile_as_tests.os @@ -0,0 +1,322 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +// Характеризационные тесты генератора конфигурационного файла +// автономного сервера (класс КонфигурационныйФайлАС). +// Фиксируют формат создаваемого YAML-файла и не требуют установленной платформы 1С. + +#Использовать ".." +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +&Тест +Процедура ТестДолжен_ЗаписатьСекциюСервераИФайловойБазы() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыСервера("127.0.0.1", 8314, "MyServer"); + КонфигФайл.ПараметрыФайловойБД("d:\bases\mybase"); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "server: + | port: 8314 + | address: 127.0.0.1 + | host: MyServer + |database: + | path: d:\bases\mybase + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Конфигурационный файл должен содержать секции server и database"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьСекциюСервернойБазыДанных() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыСервернойБД("PostgreSQL", "db-host", "base1", "dbuser", "dbpwd"); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "database: + | dbms: PostgreSQL + | server: db-host + | name: base1 + | user: dbuser + | password: dbpwd + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Конфигурационный файл должен содержать параметры серверной базы данных"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьСекциюИнформационнойБазы() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыИБ("test", Истина, Ложь, "b4faf1f6-8f9c-40a9-b42d-6a08eb6c99ab"); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "infobase: + | id: b4faf1f6-8f9c-40a9-b42d-6a08eb6c99ab + | name: test + | distribute-licenses: true + | shedule-jobs: false + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Конфигурационный файл должен содержать секцию infobase"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьРазделителиСРазнымиЗначениями() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ДобавитьПараметрыВеб_Разделители("zone1", Истина, Ложь, Истина); + КонфигФайл.ДобавитьПараметрыВеб_Разделители("zone2", Ложь, Истина, Ложь); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "http: + | base: / + | zones: + | - + | value: zone1 + | safe: true + | specify: false + | - + | value: zone2 + | safe: false + | specify: true + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Каждый разделитель должен быть записан со своими значениями"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьСекциюПриложения() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыВеб_Приложение("http://exit.url", Истина); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "http: + | base: / + | application: + | publish: true + | exit-url: http://exit.url + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Конфигурационный файл должен содержать подсекцию application"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьАутентификациюБезСтандартной() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыВеб_Аутентификация("http://openid.local", 86400, , , Ложь); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "http: + | base: / + | auth: + | rely: + | url: http://openid.local + | lifetime: 86400 + | provider: + | allow-standard: false + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "При запрете стандартной аутентификации должна быть записана строка allow-standard: false"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьПубликациюODataСПовторнымИспользованием() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + ПараметрыСеансов = Новый Соответствие; + ПараметрыСеансов.Вставить("mode", "AutoUse"); + ПараметрыСеансов.Вставить("pool-size", 10); + КонфигФайл.ПараметрыВеб_ПубликацияOData(Истина, ПараметрыСеансов); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "http: + | base: / + | odata: + | publish: true + | reuse-sessions: + | mode: AutoUse + | pool-size: 10 + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Параметры повторного использования сеансов OData должны попадать в файл"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьВебИХттпСервисы() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыВебСервисовОбщие(Истина, Ложь); + КонфигФайл.ДобавитьПараметрыВебСервиса(Истина, "ws1", "ws1alias", Неопределено, Истина); + КонфигФайл.ПараметрыХТТПСервисовОбщие(Истина, Истина); + КонфигФайл.ДобавитьПараметрыХТТПСервиса(Истина, "hs1", "/hs1", , Истина); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "http: + | base: / + | web-services: + | publish-by-default: true + | publish-extensions-by-default: false + | service: + | - + | publish: true + | name: ws1 + | alias: ws1alias + | http-services: + | publish-by-default: true + | publish-extensions-by-default: true + | service: + | - + | publish: true + | name: hs1 + | root: /hs1 + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Веб-сервисы и http-сервисы должны быть записаны в свои подсекции"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьШлюзыФункциональностьИОтладку() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыШлюзаПрямогоДоступа(1541, 1560, 1591, 0); + КонфигФайл.ПараметрыШлюзаSSH("localhost", "auto", 8282); + КонфигФайл.ПараметрыФункциональностиСервера(Истина, Ложь); + КонфигФайл.ПараметрыОтладкиСервера("tcp", 1550, "localhost"); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "gates: + | direct: + | regport: 1541 + | range: 1560:1591 + | seclevel: 0 + | ssh: + | address: localhost + | host-key: auto + | port: 8282 + |features: + | direct-gate: true + | http-gate: false + |debug: + | type: tcp + | port: 1550 + | address: localhost + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Секции gates, features и debug должны быть записаны"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьВнешнийСерверОтладки() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыВнешнегоСервераОтладки("http://debug-server:1550"); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "debug: + | type: server + | server: + | url: http://debug-server:1550 + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Секция debug должна содержать адрес внешнего сервера отладки"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьПубликациюДистрибутивов() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыПубликацииДистрибутивов("w32.zip", "w64.zip", "m64.zip"); + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Ожидаемое = "http: + | base: / + | pubdst: + | win32: w32.zip + | win64: w64.zip + | mac64: m64.zip + |"; + + Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, + "Секция pubdst должна быть записана"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СоздатьПустойФайлБезПараметров() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + + Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + + Утверждения.ПроверитьРавенство("", Содержимое, + "Без установленных параметров должен быть создан пустой файл"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьИПрочитатьКонфиг(КонфигФайл) + + ИмяФайла = ОбъединитьПути(КаталогВременныхФайлов(), "configfile_as_test.yml"); + + КонфигФайл.СоздатьКонфигурационныйФайл(ИмяФайла); + + Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); + Текст = Чтение.Прочитать(); + Чтение.Закрыть(); + + УдалитьФайлы(ИмяФайла); + + Если Текст = Неопределено Тогда + Текст = ""; + КонецЕсли; + + Возврат СтрЗаменить(Текст, Символы.ВК, ""); + +КонецФункции + +#КонецОбласти diff --git a/tests/ibcmdrunner_unit_tests.os b/tests/ibcmdrunner_unit_tests.os new file mode 100644 index 0000000..bcb7823 --- /dev/null +++ b/tests/ibcmdrunner_unit_tests.os @@ -0,0 +1,208 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +// Модульные тесты класса УправлениеИБ, не требующие создания информационных баз. +// Для создания объекта требуется установленная платформа 1С (утилита ibcmd). + +#Использовать ".." +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +&Тест +Процедура ТестДолжен_ВернутьНомерВерсииПлатформы() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + НомерВерсии = УправлениеИБ.Версия(); + + // Тогда + РегулярноеВыражение = Новый РегулярноеВыражение("^(\d+)\.(\d+)\.(\d+)\.(\d+)\z"); + Утверждения.ПроверитьИстину(РегулярноеВыражение.Совпадает(НомерВерсии), + "Номер версии должен соответствовать шаблону: " + НомерВерсии); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВернутьПутьКПриложению() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + Путь = УправлениеИБ.ПутьКПриложению(); + + // Тогда + Утверждения.ПроверитьИстину(ЗначениеЗаполнено(Путь), "Путь к приложению ibcmd должен быть заполнен"); + Утверждения.ПроверитьИстину(СтрНайти(НРег(Путь), "ibcmd") > 0, + "Путь к приложению должен содержать 'ibcmd': " + Путь); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СравнитьВерсииЧерезУправлениеИБ() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Тогда + Утверждения.ПроверитьИстину(УправлениеИБ.СравнитьВерсии("8.3.21", "8.3.20") > 0, + "8.3.21 должна быть больше 8.3.20"); + Утверждения.ПроверитьРавенство(0, УправлениеИБ.СравнитьВерсии("8.3.20", "8.3.20")); + Утверждения.ПроверитьИстину(УправлениеИБ.СравнитьВерсии("8.3.19", "8.3.20") < 0, + "8.3.19 должна быть меньше 8.3.20"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазобратьПустойСписокРасширений() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + Описания = УправлениеИБ.РазобратьСписокРасширений(""); + + // Тогда + Утверждения.ПроверитьТип(Описания, "Массив", "Метод должен вернуть массив"); + Утверждения.ПроверитьРавенство(0, Описания.Количество(), "Массив должен быть пустым"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазобратьСписокРасширений() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + ТекстСписка = ТекстВыводаСпискаРасширений(); + + // Когда + Описания = УправлениеИБ.РазобратьСписокРасширений(ТекстСписка); + + // Тогда + Утверждения.ПроверитьРавенство(2, Описания.Количество(), "Должно быть разобрано два описания расширений"); + + ПервоеОписание = Описания[0]; + Утверждения.ПроверитьТип(ПервоеОписание, "Соответствие", "Описание расширения должно быть соответствием"); + Утверждения.ПроверитьРавенство("СуперРасширение", ПервоеОписание.Получить("name")); + Утверждения.ПроверитьРавенство(Истина, ПервоеОписание.Получить("active"), + "Свойство active должно быть преобразовано в Булево"); + Утверждения.ПроверитьРавенство(Ложь, ПервоеОписание.Получить("used-in-distributed-infobase")); + Утверждения.ПроверитьРавенство("add-on", ПервоеОписание.Получить("purpose")); + Утверждения.ПроверитьРавенство("infobase", ПервоеОписание.Получить("scope")); + Утверждения.ПроверитьРавенство("lq86kvw7xY6UpGB33UOtGzx01IQ=", ПервоеОписание.Получить("hash-sum"), + "Хеш-сумма должна быть очищена от кавычек"); + + ВтороеОписание = Описания[1]; + Утверждения.ПроверитьРавенство("ВтороеРасширение", ВтороеОписание.Получить("name")); + Утверждения.ПроверитьРавенство(Ложь, ВтороеОписание.Получить("active")); + Утверждения.ПроверитьРавенство("patch", ВтороеОписание.Получить("purpose")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВызватьИсключениеБезОбщихПараметровИБ() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("c:\tmp\dump.dt"); + + // Тогда + Ожидаем.Что(УправлениеИБ) + .Метод("ВыгрузитьДанныеИБ", ПараметрыМетода) + .ВыбрасываетИсключение("Необходимо установить общие параметры информационной базы"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВызватьИсключениеПриНекорректномИмениРасширения() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("1НекорректноеИмя"); + ПараметрыМетода.Добавить("ср"); + + // Тогда + Ожидаем.Что(УправлениеИБ) + .Метод("СоздатьРасширение", ПараметрыМетода) + .ВыбрасываетИсключение("удовлетворяющая требованиям к имени"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВызватьИсключениеПриНекорректномТипеСУБД() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("MySQL"); + ПараметрыМетода.Добавить("db-host"); + ПараметрыМетода.Добавить("base1"); + ПараметрыМетода.Добавить("user"); + ПараметрыМетода.Добавить("pwd"); + + // Тогда + Ожидаем.Что(УправлениеИБ) + .Метод("УстановитьПараметрыСервернойИБ", ПараметрыМетода) + .ВыбрасываетИсключение("Тип СУБД должен быть один из"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВернутьПустойВыводПоследнейКомандыПоУмолчанию() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда (при создании объекта уже выполнялась команда --version) + Вывод = УправлениеИБ.ВыводПоследнейКоманды(); + + // Тогда + Утверждения.ПроверитьИстину(ЗначениеЗаполнено(Вывод), + "Вывод последней команды должен содержать версию платформы"); + Утверждения.ПроверитьРавенство(0, УправлениеИБ.КодВозвратаПоследнейКоманды(), + "Код возврата успешной команды должен быть равен 0"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ТекстВыводаСпискаРасширений() + + Возврат "name : ""СуперРасширение"" + |version : + |active : yes + |purpose : add-on + |safe-mode : yes + |security-profile-name : + |unsafe-action-protection : yes + |used-in-distributed-infobase : no + |scope : infobase + |hash-sum : ""lq86kvw7xY6UpGB33UOtGzx01IQ="" + | + |name : ""ВтороеРасширение"" + |version : 1.0.0.1 + |active : no + |purpose : patch + |safe-mode : no + |security-profile-name : + |unsafe-action-protection : no + |used-in-distributed-infobase : no + |scope : infobase + |hash-sum : ""XEOqtmInlTN/lMHIp7ylpc4Q2RU="" + |"; + +КонецФункции + +#КонецОбласти diff --git a/tests/ibsrvrunner_tests.os b/tests/ibsrvrunner_tests.os index 659019c..0a420d3 100644 --- a/tests/ibsrvrunner_tests.os +++ b/tests/ibsrvrunner_tests.os @@ -29,10 +29,10 @@ // Когда ПараметрыМетода = Новый Массив; ПараметрыМетода.Добавить("8.3.23.1111"); - + // Тогда Ожидаем.Что(УправлениеАС) - .Метод("УстановитьВерсию", ПараметрыМетода) + .Метод("УстановитьВерсиюПлатформы", ПараметрыМетода) .ВыбрасываетИсключение("Не найдена установленная версия платформы"); КонецПроцедуры From 0669ee0e301de0c3f0d5300fa13946192dc3bc0f Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Mon, 31 Aug 2026 19:25:30 +0300 Subject: [PATCH 5/9] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D0=B8=D1=8F=200.4.?= =?UTF-8?q?0,=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=20=D0=BE=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B2=20Readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- Readme.md | 13 +++++++++++++ packagedef | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 7d29d97..380e989 100644 --- a/Readme.md +++ b/Readme.md @@ -27,6 +27,19 @@ КонфигФайл.СоздатьКонфигурационныйФайл("c:\tmp\my-config.yml"); ``` +## Логирование + +Библиотека пишет подробный отладочный лог через [logos](https://github.com/oscript-library/logos) +в лог с именем `oscript.lib.ibcmdrunner`: командные строки запуска ibcmd/ibsrv, длительность +и коды возврата команд, установку параметров. Значения паролей в лог не выводятся. + +Чтобы включить отладочный вывод: + +```bsl +Лог = Логирование.ПолучитьЛог("oscript.lib.ibcmdrunner"); +Лог.УстановитьУровень(УровниЛога.Отладка); +``` + ## [Программный интерфейс](https://github.com/alex-bob-lip/ibcmdrunner/tree/main/doc/doc.md) ## Лицензия diff --git a/packagedef b/packagedef index 715e03d..bc664b9 100644 --- a/packagedef +++ b/packagedef @@ -1,5 +1,5 @@ Описание.Имя("ibcmdrunner") - .Версия("0.3.3") + .Версия("0.4.0") .Автор("Alexey Bobylkin") .АдресАвтора("alex_bob@lipetsk.ru") .Описание("Библиотека для упрощения работы с утилитами ibcmd и ibsrv из oscript.") From 88013dc2384720b917c277f50bd14def0af7ab69 Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Mon, 31 Aug 2026 19:34:48 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=B2=D0=BE?= =?UTF-8?q?=D0=B9=D1=81=D1=82=D0=B2=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D1=91=D0=BD=20=D0=BA=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=BC=D1=83=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit После переработки ИзменитьСвойстваРасширения (#15) имя профиля безопасности передаётся строкой, а не булевым значением - тест падал на проверке типа параметра. Co-Authored-By: Claude Fable 5 --- tests/ibcmdrunner-test.os | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ibcmdrunner-test.os b/tests/ibcmdrunner-test.os index b6367e9..06a3878 100644 --- a/tests/ibcmdrunner-test.os +++ b/tests/ibcmdrunner-test.os @@ -469,7 +469,7 @@ УправлениеИБ.УстановитьПараметрыАвторизацииИБ("admin", "admin"); УправлениеИБ.СоздатьРасширение("СуперРасширение", "ср", "ru = ""Расширение для всего""", "add-on"); //УправлениеИБ.ОбновитьКонфигурациюБазыДанных("СуперРасширение"); - УправлениеИБ.ИзменитьСвойстваРасширения("СуперРасширение", Ложь, Истина, Истина, Истина, Ложь, Истина); + УправлениеИБ.ИзменитьСвойстваРасширения("СуперРасширение", Ложь, Истина, "", Истина, Ложь, Истина); Результат = УправлениеИБ.ИнформацияОРасширении("СуперРасширение"); Сообщить(Результат); Утверждения.ПроверитьИстину(СтрНайти(Результат, "active : no") > 0, "Вывод команды должен содержать строку active : no."); From 9b820485003437360e26e40607cce22efff6adfc Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Mon, 31 Aug 2026 21:05:38 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=D0=A4?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=90=D0=A1:=20=D1=81=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20YAML=20?= =?UTF-8?q?=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9=20oscript-yaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ручная построчная запись YAML заменена сборкой структуры данных (вложенные Соответствия и Массивы) и сериализацией библиотекой oscript-yaml (ПарсерYaml.ЗаписатьВФайл, UTF-8): - корректное экранирование значений (пути с обратными слэшами, строки с двоеточиями) гарантирует сериализатор; - номера портов записываются числами, а не строками в кавычках (ранее XMLСтрока превращала их в строки); - незаполненные (Неопределено) параметры не попадают в файл; - секции собираются функциями СобратьДанныеКонфигурации, СобратьСекциюHTTP, СобратьСекциюАутентификации, СобратьСекциюСервисов - код записи файла сведен к одному вызову. Тесты генератора переведены с текстовых сравнений на семантические: созданный файл разбирается обратно ПарсерYaml.ПрочитатьИзФайла и проверяется структура. Путь с обратными слэшами проверяется по тексту файла: в oscript-yaml 0.3.0 десериализатор некорректно разбирает последовательность \b (эскейп \b обрабатывается раньше \), сериализация при этом корректна. Требуемая версия среды поднята до 2.0.0 (требование oscript-yaml), добавлена зависимость oscript-yaml 0.3.0. Из служебного модуля удалена более не используемая БулевоВСтрокуTrueFalse. Co-Authored-By: Claude Fable 5 --- packagedef | 3 +- .../configfile_as.os" | 325 +++++++----------- ...261\320\275\321\213\320\271IbcmdRunner.os" | 16 - tests/common_functions_tests.os | 8 - tests/configfile_as_tests.os | 323 ++++++++--------- 5 files changed, 300 insertions(+), 375 deletions(-) diff --git a/packagedef b/packagedef index bc664b9..d635c58 100644 --- a/packagedef +++ b/packagedef @@ -3,7 +3,7 @@ .Автор("Alexey Bobylkin") .АдресАвтора("alex_bob@lipetsk.ru") .Описание("Библиотека для упрощения работы с утилитами ibcmd и ibsrv из oscript.") - .ВерсияСреды("1.9.2") + .ВерсияСреды("2.0.0") .ВключитьФайл("lib.config") .ВключитьФайл("Readme.md") .ВключитьФайл("src") @@ -14,6 +14,7 @@ .ЗависитОт("v8find", "0.3.1") .ЗависитОт("logos", "1.7.0") .ЗависитОт("fs", "1.2.0") + .ЗависитОт("oscript-yaml", "0.3.0") .РазработкаЗависитОт("1testrunner", "1.8.0") .РазработкаЗависитОт("coverage", "0.6.1") diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" index 5ae56c0..483d9a4 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" @@ -3,6 +3,7 @@ // BSLLS:LatinAndCyrillicSymbolInWord-off #Использовать logos +#Использовать oscript-yaml Перем Лог; // Экземпляр логгера @@ -404,10 +405,10 @@ Лог.Отладка("Установка параметров шлюза прямого доступа (основной порт: %1)", ОсновнойПорт); ПараметрыШлюза = Новый Соответствие; - ПараметрыШлюза.Вставить("regport", XMLСтрока(ОсновнойПорт)); + ПараметрыШлюза.Вставить("regport", ОсновнойПорт); ПараметрыШлюза.Вставить("range", - СтрШаблон("%1:%2", XMLСтрока(МинимальныйПортПодключения), XMLСтрока(МаксимальныйПортПодключения))); - ПараметрыШлюза.Вставить("seclevel", XMLСтрока(УровеньБезопасности)); + СтрШаблон("%1:%2", МинимальныйПортПодключения, МаксимальныйПортПодключения)); + ПараметрыШлюза.Вставить("seclevel", УровеньБезопасности); ПараметрыСпособовДоступаКСерверу.Вставить("direct", ПараметрыШлюза); @@ -429,7 +430,7 @@ ПараметрыШлюза = Новый Соответствие; ПараметрыШлюза.Вставить("address", СетевойИнтерфейс); ПараметрыШлюза.Вставить("host-key", ПутьКЗакрытомуКлючу); - ПараметрыШлюза.Вставить("port", XMLСтрока(ПортПодключения)); + ПараметрыШлюза.Вставить("port", ПортПодключения); ПараметрыСпособовДоступаКСерверу.Вставить("ssh", ПараметрыШлюза); @@ -477,7 +478,7 @@ ТипОтладки, ПортОтладки, СетевойИнтерфейс); ПараметрыОтладкиСервера.Вставить("type", ТипОтладки); - ПараметрыОтладкиСервера.Вставить("port", XMLСтрока(ПортОтладки)); + ПараметрыОтладкиСервера.Вставить("port", ПортОтладки); ПараметрыОтладкиСервера.Вставить("address", СетевойИнтерфейс); Если ЗначениеЗаполнено(ПарольОтладки) Тогда @@ -504,26 +505,26 @@ КонецПроцедуры // СоздатьКонфигурационныйФайл -// Создание конфигурационного файла по ранее заполненным параметрам +// Создание конфигурационного файла по ранее заполненным параметрам. +// Файл записывается в формате YAML (сериализация - библиотека oscript-yaml). // Параметры: // ПутьКФайлу - Строка - полный путь к конфигурационному файлу Процедура СоздатьКонфигурационныйФайл(ПутьКФайлу) Экспорт Лог.Информация("Создание конфигурационного файла автономного сервера: %1", ПутьКФайлу); - Конфиг = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8"); + ДанныеКонфигурации = СобратьДанныеКонфигурации(); - ЗаписатьСекциюВерхнегоУровня(Конфиг, "server", ПараметрыСервера); - ЗаписатьПараметрыБазыДанных(Конфиг); - ЗаписатьСекциюВерхнегоУровня(Конфиг, "infobase", ПараметрыИБ); - ЗаписатьПараметрыВебДоступа(Конфиг); - ЗаписатьСекциюВерхнегоУровня(Конфиг, "gates", ПараметрыСпособовДоступаКСерверу); - ЗаписатьСекциюВерхнегоУровня(Конфиг, "features", ПараметрыФункциональностиСервера); - ЗаписатьСекциюВерхнегоУровня(Конфиг, "debug", ПараметрыОтладкиСервера); - - Конфиг.Закрыть(); + Если ДанныеКонфигурации.Количество() = 0 Тогда + // Историческое поведение: без установленных параметров создается пустой файл + Конфиг = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8"); + Конфиг.Закрыть(); + Иначе + Парсер = Новый ПарсерYaml; + Парсер.ЗаписатьВФайл(ПутьКФайлу, ДанныеКонфигурации); + КонецЕсли; - Лог.Отладка("Конфигурационный файл %1 записан", ПутьКФайлу); + Лог.Отладка("Конфигурационный файл %1 записан (секций: %2)", ПутьКФайлу, ДанныеКонфигурации.Количество()); КонецПроцедуры @@ -563,231 +564,171 @@ #Область СлужебныеПроцедурыИФункции -Процедура ЗаполнитьСекцию(КонфигФайл, Параметры, Уровень = 1) - - Если Параметры.Количество() = 0 Тогда - Возврат; - КонецЕсли; +// Собрать полную структуру данных конфигурационного файла +// из ранее установленных параметров секций. +// Незаполненные секции в структуру не включаются. +// Возвращаемое значение: +// Соответствие - данные конфигурационного файла для сериализации в YAML +Функция СобратьДанныеКонфигурации() - Отступ = ""; - Для Счетчик = 1 По Уровень Цикл // BSLLS:UnusedLocalVariable-off - Отступ = Отступ + " "; - КонецЦикла; + ДанныеКонфигурации = Новый Соответствие; - Для Каждого Параметр Из Параметры Цикл - ТипЗнчПараметра = ТипЗнч(Параметр.Значение); + ДобавитьСекцию(ДанныеКонфигурации, "server", ПараметрыСервера); + ДобавитьСекцию(ДанныеКонфигурации, "database", СобратьСекциюБазыДанных()); + ДобавитьСекцию(ДанныеКонфигурации, "infobase", ПараметрыИБ); + ДобавитьСекцию(ДанныеКонфигурации, "http", СобратьСекциюHTTP()); + ДобавитьСекцию(ДанныеКонфигурации, "gates", ПараметрыСпособовДоступаКСерверу); + ДобавитьСекцию(ДанныеКонфигурации, "features", ПараметрыФункциональностиСервера); + ДобавитьСекцию(ДанныеКонфигурации, "debug", ПараметрыОтладкиСервера); - Если Параметр.Значение = Неопределено Тогда - // Незаполненный параметр не попадает в конфигурационный файл - - // автономный сервер использует значение по умолчанию. - Продолжить; + Возврат ДанныеКонфигурации; - ИначеЕсли ТипЗнчПараметра = Тип("Число") ИЛИ - ТипЗнчПараметра = Тип("Строка") Тогда - Значение = Параметр.Значение; - ИначеЕсли ТипЗнчПараметра = Тип("Булево") Тогда - Значение = БулевоВСтроку(Параметр.Значение); - - ИначеЕсли ТипЗнчПараметра = Тип("Соответствие") Тогда - КонфигФайл.ЗаписатьСтроку(СтрШаблон("%1%2:", Отступ, Параметр.Ключ)); - ЗаполнитьСекцию(КонфигФайл, Параметр.Значение, Уровень + 1); - Продолжить; - - Иначе - ВызватьИсключение СтрШаблон( - "Значение параметра '%1' имеет неизвестный тип: %2. Допустимые типы: Число, Строка, Булево, Соответствие.", - Параметр.Ключ, ТипЗнчПараметра); - КонецЕсли; - - Строка = СтрШаблон("%1%2: %3", Отступ, Параметр.Ключ, Значение); - КонфигФайл.ЗаписатьСтроку(Строка); +КонецФункции - КонецЦикла; +// Собрать секцию database из параметров серверной или файловой базы данных +// Возвращаемое значение: +// Соответствие - параметры секции database +Функция СобратьСекциюБазыДанных() -КонецПроцедуры + СекцияБазыДанных = Новый Соответствие; + ПеренестиПараметры(СекцияБазыДанных, ПараметрыСервернойБазыДанных); + ПеренестиПараметры(СекцияБазыДанных, ПараметрыФайловойБазыДанных); + Возврат СекцияБазыДанных; -Функция БулевоВСтроку(Значение) - Возврат СлужебныйIbcmdRunner.БулевоВСтрокуTrueFalse(Значение); КонецФункции -// Записать секцию верхнего уровня конфигурационного файла, -// если параметры секции заполнены -// Параметры: -// Конфиг - ЗаписьТекста - файл конфигурации -// ИмяСекции - Строка - имя секции верхнего уровня (без двоеточия) -// Параметры - Соответствие - параметры секции -Процедура ЗаписатьСекциюВерхнегоУровня(Конфиг, Знач ИмяСекции, Знач Параметры) +// Собрать секцию http со всеми подсекциями веб-доступа +// Возвращаемое значение: +// Соответствие - параметры секции http +Функция СобратьСекциюHTTP() - Если Параметры.Количество() = 0 Тогда - Возврат; + СекцияHTTP = Новый Соответствие; + + ПеренестиПараметры(СекцияHTTP, ПараметрыХТТП); + ДобавитьСекцию(СекцияHTTP, "auth", СобратьСекциюАутентификации()); + Если мсвПараметрыВеб_Разделители.Количество() > 0 Тогда + СекцияHTTP.Вставить("zones", мсвПараметрыВеб_Разделители); КонецЕсли; + ДобавитьСекцию(СекцияHTTP, "application", ПараметрыВеб_Приложение); + ДобавитьСекцию(СекцияHTTP, "odata", ПараметрыВеб_ПубликацияOData); + ДобавитьСекцию(СекцияHTTP, "web-services", + СобратьСекциюСервисов(ПараметрыВебСервисовОбщие, мсвПараметрыВебСервисов)); + ДобавитьСекцию(СекцияHTTP, "http-services", + СобратьСекциюСервисов(ПараметрыХТТПСервисовОбщие, мсвПараметрыХТТПСервисов)); + ДобавитьСекцию(СекцияHTTP, "pubdst", ПараметрыПубликацииДистрибутивов); - Лог.Отладка("Запись секции '%1' конфигурационного файла", ИмяСекции); + Возврат СекцияHTTP; - Конфиг.ЗаписатьСтроку(ИмяСекции + ":"); - ЗаполнитьСекцию(Конфиг, Параметры); +КонецФункции -КонецПроцедуры +// Собрать секцию аутентификации (auth) с подсекциями rely и provider +// Возвращаемое значение: +// Соответствие - параметры секции auth +Функция СобратьСекциюАутентификации() -// Вставить значение в соответствие только если значение имеет тип Булево -// Параметры: -// Параметры - Соответствие - целевое соответствие -// Ключ - Строка - ключ -// Значение - Произвольный - значение -Процедура ВставитьЕслиБулево(Параметры, Знач Ключ, Знач Значение) + СекцияАутентификации = Новый Соответствие; - Если ТипЗнч(Значение) = Тип("Булево") Тогда - Параметры.Вставить(Ключ, Значение); + Если ПараметрыВеб_Аутентификация.Количество() = 0 Тогда + Возврат СекцияАутентификации; КонецЕсли; -КонецПроцедуры + СекцияRely = Новый Соответствие; + СекцияRely.Вставить("url", ПараметрыВеб_Аутентификация.Получить("url")); + СекцияRely.Вставить("lifetime", ПараметрыВеб_Аутентификация.Получить("lifetime")); + СекцияАутентификации.Вставить("rely", СекцияRely); -Процедура ЗаписатьПараметрыБазыДанных(Конфиг) - - Если ПараметрыСервернойБазыДанных.Количество() = 0 И ПараметрыФайловойБазыДанных.Количество() = 0 Тогда - Возврат; + СекцияProvider = Новый Соответствие; + ВставитьЕслиЗаполнено(СекцияProvider, "return-to", ПараметрыВеб_Аутентификация.Получить("return-to")); + ВставитьЕслиЗаполнено(СекцияProvider, "providers", ПараметрыВеб_Аутентификация.Получить("providers")); + Если ПараметрыВеб_Аутентификация.Получить("allow-standard") = Ложь Тогда + СекцияProvider.Вставить("allow-standard", Ложь); КонецЕсли; + ДобавитьСекцию(СекцияАутентификации, "provider", СекцияProvider); - Лог.Отладка("Запись секции 'database' конфигурационного файла"); - - Конфиг.ЗаписатьСтроку("database:"); + Возврат СекцияАутентификации; - ЗаполнитьСекцию(Конфиг, ПараметрыСервернойБазыДанных); - ЗаполнитьСекцию(Конфиг, ПараметрыФайловойБазыДанных); - -КонецПроцедуры +КонецФункции -Процедура ЗаписатьПараметрыВебДоступа(Конфиг) +// Собрать подсекцию сервисов (web-services или http-services): +// общие параметры плюс массив описаний отдельных сервисов под ключом service +// Параметры: +// ОбщиеПараметры - Соответствие - общие параметры сервисов +// МассивСервисов - Массив - массив соответствий с параметрами отдельных сервисов +// Возвращаемое значение: +// Соответствие - параметры подсекции сервисов +Функция СобратьСекциюСервисов(Знач ОбщиеПараметры, Знач МассивСервисов) - ПропуститьСекциюHTTP = ПараметрыХТТП.Количество() = 0 - И ПараметрыВеб_Аутентификация.Количество() = 0 - И мсвПараметрыВеб_Разделители.Количество() = 0 - И ПараметрыВеб_Приложение.Количество() = 0 - И ПараметрыВеб_ПубликацияOData.Количество() = 0 - И ПараметрыВебСервисовОбщие.Количество() = 0 - И ПараметрыХТТПСервисовОбщие.Количество() = 0 - И ПараметрыПубликацииДистрибутивов.Количество() = 0; + СекцияСервисов = Новый Соответствие; - Если ПропуститьСекциюHTTP Тогда - Возврат; + Если ОбщиеПараметры.Количество() = 0 Тогда + Возврат СекцияСервисов; КонецЕсли; - Лог.Отладка("Запись секции 'http' конфигурационного файла"); - - Конфиг.ЗаписатьСтроку("http:"); - ЗаписатьПараметрыВеб_ХТТП(Конфиг); - ЗаписатьПараметрыВеб_Аутентификация(Конфиг); - ЗаписатьПараметрыВеб_Разделители(Конфиг); - ЗаписатьПодсекциюВеб(Конфиг, "application", ПараметрыВеб_Приложение); - ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг); - ЗаписатьПараметрыВеб_Сервисов(Конфиг, "web-services", ПараметрыВебСервисовОбщие, мсвПараметрыВебСервисов); - ЗаписатьПараметрыВеб_Сервисов(Конфиг, "http-services", ПараметрыХТТПСервисовОбщие, мсвПараметрыХТТПСервисов); - ЗаписатьПодсекциюВеб(Конфиг, "pubdst", ПараметрыПубликацииДистрибутивов); - -КонецПроцедуры + ПеренестиПараметры(СекцияСервисов, ОбщиеПараметры); + Если МассивСервисов.Количество() > 0 Тогда + СекцияСервисов.Вставить("service", МассивСервисов); + КонецЕсли; -Процедура ЗаписатьПараметрыВеб_ХТТП(Конфиг) + Возврат СекцияСервисов; - Если ПараметрыХТТП.Количество() > 0 Тогда - ЗаполнитьСекцию(Конфиг, ПараметрыХТТП); - КонецЕсли; +КонецФункции -КонецПроцедуры +// Добавить секцию в структуру данных, если она заполнена +// Параметры: +// Приемник - Соответствие - структура-приемник +// ИмяСекции - Строка - имя секции +// ПараметрыСекции - Соответствие - параметры секции +Процедура ДобавитьСекцию(Приемник, Знач ИмяСекции, Знач ПараметрыСекции) -Процедура ЗаписатьПараметрыВеб_Аутентификация(Конфиг) + Секция = Новый Соответствие; + ПеренестиПараметры(Секция, ПараметрыСекции); - Если ПараметрыВеб_Аутентификация.Количество() = 0 Тогда + Если Секция.Количество() = 0 Тогда Возврат; КонецЕсли; - Конфиг.ЗаписатьСтроку(" auth:"); - Конфиг.ЗаписатьСтроку(" rely:"); - Значение = ПараметрыВеб_Аутентификация.Получить("url"); - Конфиг.ЗаписатьСтроку(" url: " + Значение); - Значение = ПараметрыВеб_Аутентификация.Получить("lifetime"); - Конфиг.ЗаписатьСтроку(" lifetime: " + Значение); - Конфиг.ЗаписатьСтроку(" provider:"); - Значение = ПараметрыВеб_Аутентификация.Получить("return-to"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" return-to: " + Значение); - КонецЕсли; - Значение = ПараметрыВеб_Аутентификация.Получить("providers"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" providers: " + Значение); - КонецЕсли; - Значение = ПараметрыВеб_Аутентификация.Получить("allow-standard"); - Если Значение = Ложь Тогда - Конфиг.ЗаписатьСтроку(" allow-standard: false"); - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьПараметрыВеб_Разделители(Конфиг) + Лог.Отладка("Секция '%1' включена в конфигурационный файл", ИмяСекции); - Если мсвПараметрыВеб_Разделители.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" zones:"); - Для Каждого Разделитель Из мсвПараметрыВеб_Разделители Цикл - Конфиг.ЗаписатьСтроку(" -"); - ЗаполнитьСекцию(Конфиг, Разделитель, 3); - КонецЦикла; - КонецЕсли; + Приемник.Вставить(ИмяСекции, Секция); КонецПроцедуры -Процедура ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг) - - Если ПараметрыВеб_ПубликацияOData.Количество() = 0 Тогда - Возврат; - КонецЕсли; +// Перенести в приемник все заполненные (не Неопределено) параметры источника. +// Незаполненный параметр не попадает в конфигурационный файл - +// автономный сервер использует значение по умолчанию. +// Параметры: +// Приемник - Соответствие - соответствие-приемник +// Источник - Соответствие - соответствие-источник +Процедура ПеренестиПараметры(Приемник, Знач Источник) - Конфиг.ЗаписатьСтроку(" odata:"); - Значение = ПараметрыВеб_ПубликацияOData.Получить("publish"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" publish: " + БулевоВСтроку(Значение)); - КонецЕсли; - Значение = ПараметрыВеб_ПубликацияOData.Получить("reuse-sessions"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" reuse-sessions:"); - ЗаполнитьСекцию(Конфиг, Значение, 3); - КонецЕсли; + Для Каждого Параметр Из Источник Цикл + ВставитьЕслиЗаполнено(Приемник, Параметр.Ключ, Параметр.Значение); + КонецЦикла; КонецПроцедуры -// Записать подсекцию секции http с общими параметрами сервисов -// и массивом описаний отдельных сервисов +// Вставить значение в соответствие, если оно задано (не Неопределено) // Параметры: -// Конфиг - ЗаписьТекста - файл конфигурации -// ИмяПодсекции - Строка - имя подсекции ("web-services" или "http-services") -// ОбщиеПараметры - Соответствие - общие параметры сервисов -// МассивСервисов - Массив - массив соответствий с параметрами отдельных сервисов -Процедура ЗаписатьПараметрыВеб_Сервисов(Конфиг, Знач ИмяПодсекции, Знач ОбщиеПараметры, Знач МассивСервисов) - - Если ОбщиеПараметры.Количество() = 0 Тогда - Возврат; - КонецЕсли; +// Приемник - Соответствие - целевое соответствие +// Ключ - Строка - ключ +// Значение - Произвольный - значение +Процедура ВставитьЕслиЗаполнено(Приемник, Знач Ключ, Знач Значение) - Конфиг.ЗаписатьСтроку(СтрШаблон(" %1:", ИмяПодсекции)); - ЗаполнитьСекцию(Конфиг, ОбщиеПараметры, 2); - Если МассивСервисов.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" service:"); - Для Каждого ПараметрыСервиса Из МассивСервисов Цикл - Конфиг.ЗаписатьСтроку(" -"); - ЗаполнитьСекцию(Конфиг, ПараметрыСервиса, 3); - КонецЦикла; + Если Значение <> Неопределено Тогда + Приемник.Вставить(Ключ, Значение); КонецЕсли; КонецПроцедуры -// Записать простую подсекцию секции http +// Вставить значение в соответствие только если значение имеет тип Булево // Параметры: -// Конфиг - ЗаписьТекста - файл конфигурации -// ИмяПодсекции - Строка - имя подсекции -// Параметры - Соответствие - параметры подсекции -Процедура ЗаписатьПодсекциюВеб(Конфиг, Знач ИмяПодсекции, Знач Параметры) - - Если Параметры.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(СтрШаблон(" %1:", ИмяПодсекции)); - ЗаполнитьСекцию(Конфиг, Параметры, 2); +// Параметры - Соответствие - целевое соответствие +// Ключ - Строка - ключ +// Значение - Произвольный - значение +Процедура ВставитьЕслиБулево(Параметры, Знач Ключ, Знач Значение) + + Если ТипЗнч(Значение) = Тип("Булево") Тогда + Параметры.Вставить(Ключ, Значение); КонецЕсли; КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" index 0e08f53..9559ea1 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" @@ -163,22 +163,6 @@ КонецФункции -// БулевоВСтрокуTrueFalse -// Преобразует Булево в строку "true" или "false" (формат YAML). -// -// Параметры: -// Значение - Булево - преобразуемое значение -// -// Возвращаемое значение: -// Строка - "true" или "false" -// -Функция БулевоВСтрокуTrueFalse(Знач Значение) Экспорт - - Ожидаем.Что(Значение, "Значение должно иметь тип Булево.").ИмеетТип("Булево"); - Возврат ?(Значение, "true", "false"); - -КонецФункции - // ЯвляетсяИменем // Проверяет, что переданная строка удовлетворяет требованиям к именам 1С: // состоит из одного слова, начинается с буквы или "_" и не содержит diff --git a/tests/common_functions_tests.os b/tests/common_functions_tests.os index 8bbe069..96636bf 100644 --- a/tests/common_functions_tests.os +++ b/tests/common_functions_tests.os @@ -101,14 +101,6 @@ КонецПроцедуры -&Тест -Процедура ТестДолжен_ПреобразоватьБулевоВTrueFalse() Экспорт - - Утверждения.ПроверитьРавенство("true", СлужебныйIbcmdRunner.БулевоВСтрокуTrueFalse(Истина)); - Утверждения.ПроверитьРавенство("false", СлужебныйIbcmdRunner.БулевоВСтрокуTrueFalse(Ложь)); - -КонецПроцедуры - &Тест Процедура ТестДолжен_ПроверитьКорректныеИмена() Экспорт diff --git a/tests/configfile_as_tests.os b/tests/configfile_as_tests.os index 511b06c..3efb9ac 100644 --- a/tests/configfile_as_tests.os +++ b/tests/configfile_as_tests.os @@ -1,11 +1,15 @@ // BSLLS:LatinAndCyrillicSymbolInWord-off -// Характеризационные тесты генератора конфигурационного файла -// автономного сервера (класс КонфигурационныйФайлАС). -// Фиксируют формат создаваемого YAML-файла и не требуют установленной платформы 1С. +// Тесты генератора конфигурационного файла автономного сервера +// (класс КонфигурационныйФайлАС). +// Созданный YAML-файл разбирается обратно библиотекой oscript-yaml, +// проверяется структура и значения секций. Установленная платформа 1С не требуется. #Использовать ".." #Использовать asserts +#Использовать oscript-yaml + +Перем ПоследнийТекстКонфигурации; // Строка - текст последнего созданного конфигурационного файла #Область СлужебныйПрограммныйИнтерфейс @@ -16,18 +20,33 @@ КонфигФайл.ПараметрыСервера("127.0.0.1", 8314, "MyServer"); КонфигФайл.ПараметрыФайловойБД("d:\bases\mybase"); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); - Ожидаемое = "server: - | port: 8314 - | address: 127.0.0.1 - | host: MyServer - |database: - | path: d:\bases\mybase - |"; + Сервер = Данные.Получить("server"); + Утверждения.ПроверитьРавенство(8314, Сервер.Получить("port"), "Порт должен быть числом 8314"); + Утверждения.ПроверитьРавенство("127.0.0.1", Сервер.Получить("address")); + Утверждения.ПроверитьРавенство("MyServer", Сервер.Получить("host")); - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Конфигурационный файл должен содержать секции server и database"); + // Путь с обратными слэшами проверяется по тексту файла: + // в oscript-yaml 0.3.0 десериализатор некорректно разбирает "\\b" + // (эскейп "\b" обрабатывается раньше "\\"), хотя сериализация корректна. + ТекстФайла = ПоследнийТекстКонфигурации; + Утверждения.ПроверитьИстину(СтрНайти(ТекстФайла, "path: ""d:\\bases\\mybase""") > 0, + "Путь к файловой базе должен быть корректно экранирован в YAML: " + ТекстФайла); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НеЗаписыватьХостЕслиНеЗадан() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыСервера("localhost", 8314); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Сервер = Данные.Получить("server"); + Утверждения.ПроверитьРавенство(Неопределено, Сервер.Получить("host"), + "Незаданное имя хоста не должно попадать в файл"); КонецПроцедуры @@ -37,18 +56,14 @@ КонфигФайл = Новый КонфигурационныйФайлАС; КонфигФайл.ПараметрыСервернойБД("PostgreSQL", "db-host", "base1", "dbuser", "dbpwd"); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); - Ожидаемое = "database: - | dbms: PostgreSQL - | server: db-host - | name: base1 - | user: dbuser - | password: dbpwd - |"; - - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Конфигурационный файл должен содержать параметры серверной базы данных"); + БазаДанных = Данные.Получить("database"); + Утверждения.ПроверитьРавенство("PostgreSQL", БазаДанных.Получить("dbms")); + Утверждения.ПроверитьРавенство("db-host", БазаДанных.Получить("server")); + Утверждения.ПроверитьРавенство("base1", БазаДанных.Получить("name")); + Утверждения.ПроверитьРавенство("dbuser", БазаДанных.Получить("user")); + Утверждения.ПроверитьРавенство("dbpwd", БазаДанных.Получить("password")); КонецПроцедуры @@ -58,17 +73,14 @@ КонфигФайл = Новый КонфигурационныйФайлАС; КонфигФайл.ПараметрыИБ("test", Истина, Ложь, "b4faf1f6-8f9c-40a9-b42d-6a08eb6c99ab"); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); - - Ожидаемое = "infobase: - | id: b4faf1f6-8f9c-40a9-b42d-6a08eb6c99ab - | name: test - | distribute-licenses: true - | shedule-jobs: false - |"; + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Конфигурационный файл должен содержать секцию infobase"); + ИБ = Данные.Получить("infobase"); + Утверждения.ПроверитьРавенство("b4faf1f6-8f9c-40a9-b42d-6a08eb6c99ab", ИБ.Получить("id")); + Утверждения.ПроверитьРавенство("test", ИБ.Получить("name")); + Утверждения.ПроверитьРавенство(Истина, ИБ.Получить("distribute-licenses"), + "Разрешение выдачи лицензий должно быть булевым true"); + Утверждения.ПроверитьРавенство(Ложь, ИБ.Получить("shedule-jobs")); КонецПроцедуры @@ -80,23 +92,24 @@ КонфигФайл.ДобавитьПараметрыВеб_Разделители("zone1", Истина, Ложь, Истина); КонфигФайл.ДобавитьПараметрыВеб_Разделители("zone2", Ложь, Истина, Ложь); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); - Ожидаемое = "http: - | base: / - | zones: - | - - | value: zone1 - | safe: true - | specify: false - | - - | value: zone2 - | safe: false - | specify: true - |"; + Хттп = Данные.Получить("http"); + Утверждения.ПроверитьРавенство("/", Хттп.Получить("base")); - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Каждый разделитель должен быть записан со своими значениями"); + Зоны = Хттп.Получить("zones"); + Утверждения.ПроверитьТип(Зоны, "Массив", "Разделители должны быть массивом"); + Утверждения.ПроверитьРавенство(2, Зоны.Количество()); + + Утверждения.ПроверитьРавенство("zone1", Зоны[0].Получить("value"), + "Первый разделитель должен сохранить свое значение"); + Утверждения.ПроверитьРавенство(Истина, Зоны[0].Получить("safe")); + Утверждения.ПроверитьРавенство(Ложь, Зоны[0].Получить("specify")); + + Утверждения.ПроверитьРавенство("zone2", Зоны[1].Получить("value"), + "Второй разделитель должен сохранить свое значение"); + Утверждения.ПроверитьРавенство(Ложь, Зоны[1].Получить("safe")); + Утверждения.ПроверитьРавенство(Истина, Зоны[1].Получить("specify")); КонецПроцедуры @@ -107,17 +120,12 @@ КонфигФайл.ПараметрыХТТП("/"); КонфигФайл.ПараметрыВеб_Приложение("http://exit.url", Истина); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); - - Ожидаемое = "http: - | base: / - | application: - | publish: true - | exit-url: http://exit.url - |"; + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Конфигурационный файл должен содержать подсекцию application"); + Приложение = Данные.Получить("http").Получить("application"); + Утверждения.ПроверитьТип(Приложение, "Соответствие", "Секция application должна присутствовать"); + Утверждения.ПроверитьРавенство(Истина, Приложение.Получить("publish")); + Утверждения.ПроверитьРавенство("http://exit.url", Приложение.Получить("exit-url")); КонецПроцедуры @@ -128,20 +136,28 @@ КонфигФайл.ПараметрыХТТП("/"); КонфигФайл.ПараметрыВеб_Аутентификация("http://openid.local", 86400, , , Ложь); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Аутентификация = Данные.Получить("http").Получить("auth"); + Утверждения.ПроверитьРавенство("http://openid.local", Аутентификация.Получить("rely").Получить("url")); + Утверждения.ПроверитьРавенство(86400, Аутентификация.Получить("rely").Получить("lifetime")); + Утверждения.ПроверитьРавенство(Ложь, Аутентификация.Получить("provider").Получить("allow-standard"), + "При запрете стандартной аутентификации должен быть записан allow-standard: false"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НеЗаписыватьРазрешеннуюСтандартнуюАутентификацию() Экспорт - Ожидаемое = "http: - | base: / - | auth: - | rely: - | url: http://openid.local - | lifetime: 86400 - | provider: - | allow-standard: false - |"; + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыВеб_Аутентификация("http://openid.local"); - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "При запрете стандартной аутентификации должна быть записана строка allow-standard: false"); + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Аутентификация = Данные.Получить("http").Получить("auth"); + Утверждения.ПроверитьРавенство(Неопределено, Аутентификация.Получить("provider"), + "При разрешенной стандартной аутентификации подсекция provider не записывается"); КонецПроцедуры @@ -155,19 +171,15 @@ ПараметрыСеансов.Вставить("pool-size", 10); КонфигФайл.ПараметрыВеб_ПубликацияOData(Истина, ПараметрыСеансов); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); - - Ожидаемое = "http: - | base: / - | odata: - | publish: true - | reuse-sessions: - | mode: AutoUse - | pool-size: 10 - |"; + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Параметры повторного использования сеансов OData должны попадать в файл"); + OData = Данные.Получить("http").Получить("odata"); + Утверждения.ПроверитьРавенство(Истина, OData.Получить("publish")); + СеансыИзФайла = OData.Получить("reuse-sessions"); + Утверждения.ПроверитьТип(СеансыИзФайла, "Соответствие", + "Параметры повторного использования сеансов должны попадать в файл"); + Утверждения.ПроверитьРавенство("AutoUse", СеансыИзФайла.Получить("mode")); + Утверждения.ПроверитьРавенство(10, СеансыИзФайла.Получить("pool-size")); КонецПроцедуры @@ -181,30 +193,23 @@ КонфигФайл.ПараметрыХТТПСервисовОбщие(Истина, Истина); КонфигФайл.ДобавитьПараметрыХТТПСервиса(Истина, "hs1", "/hs1", , Истина); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); - - Ожидаемое = "http: - | base: / - | web-services: - | publish-by-default: true - | publish-extensions-by-default: false - | service: - | - - | publish: true - | name: ws1 - | alias: ws1alias - | http-services: - | publish-by-default: true - | publish-extensions-by-default: true - | service: - | - - | publish: true - | name: hs1 - | root: /hs1 - |"; - - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Веб-сервисы и http-сервисы должны быть записаны в свои подсекции"); + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + ВебСервисы = Данные.Получить("http").Получить("web-services"); + Утверждения.ПроверитьРавенство(Истина, ВебСервисы.Получить("publish-by-default")); + Утверждения.ПроверитьРавенство(Ложь, ВебСервисы.Получить("publish-extensions-by-default")); + СписокВебСервисов = ВебСервисы.Получить("service"); + Утверждения.ПроверитьРавенство(1, СписокВебСервисов.Количество()); + Утверждения.ПроверитьРавенство("ws1", СписокВебСервисов[0].Получить("name")); + Утверждения.ПроверитьРавенство("ws1alias", СписокВебСервисов[0].Получить("alias")); + + ХттпСервисы = Данные.Получить("http").Получить("http-services"); + Утверждения.ПроверитьРавенство(Истина, ХттпСервисы.Получить("publish-extensions-by-default")); + СписокХттпСервисов = ХттпСервисы.Получить("service"); + Утверждения.ПроверитьРавенство(1, СписокХттпСервисов.Количество(), + "http-сервис должен попасть в подсекцию http-services, а не web-services"); + Утверждения.ПроверитьРавенство("hs1", СписокХттпСервисов[0].Получить("name")); + Утверждения.ПроверитьРавенство("/hs1", СписокХттпСервисов[0].Получить("root")); КонецПроцедуры @@ -217,28 +222,30 @@ КонфигФайл.ПараметрыФункциональностиСервера(Истина, Ложь); КонфигФайл.ПараметрыОтладкиСервера("tcp", 1550, "localhost"); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); - - Ожидаемое = "gates: - | direct: - | regport: 1541 - | range: 1560:1591 - | seclevel: 0 - | ssh: - | address: localhost - | host-key: auto - | port: 8282 - |features: - | direct-gate: true - | http-gate: false - |debug: - | type: tcp - | port: 1550 - | address: localhost - |"; - - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Секции gates, features и debug должны быть записаны"); + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + ПрямойШлюз = Данные.Получить("gates").Получить("direct"); + Утверждения.ПроверитьРавенство(1541, ПрямойШлюз.Получить("regport"), "Порт шлюза должен быть числом"); + Утверждения.ПроверитьРавенство("1560:1591", ПрямойШлюз.Получить("range")); + Утверждения.ПроверитьРавенство(0, ПрямойШлюз.Получить("seclevel")); + + ШлюзSSH = Данные.Получить("gates").Получить("ssh"); + Утверждения.ПроверитьРавенство("localhost", ШлюзSSH.Получить("address")); + Утверждения.ПроверитьРавенство("auto", ШлюзSSH.Получить("host-key")); + Утверждения.ПроверитьРавенство(8282, ШлюзSSH.Получить("port")); + + Функциональность = Данные.Получить("features"); + Утверждения.ПроверитьРавенство(Истина, Функциональность.Получить("direct-gate")); + Утверждения.ПроверитьРавенство(Ложь, Функциональность.Получить("http-gate")); + Утверждения.ПроверитьРавенство(Неопределено, Функциональность.Получить("ssh-gate"), + "Незаданная функциональность не должна попадать в файл"); + + Отладка = Данные.Получить("debug"); + Утверждения.ПроверитьРавенство("tcp", Отладка.Получить("type")); + Утверждения.ПроверитьРавенство(1550, Отладка.Получить("port")); + Утверждения.ПроверитьРавенство("localhost", Отладка.Получить("address")); + Утверждения.ПроверитьРавенство(Неопределено, Отладка.Получить("password"), + "Пустой пароль отладки не должен попадать в файл"); КонецПроцедуры @@ -248,16 +255,11 @@ КонфигФайл = Новый КонфигурационныйФайлАС; КонфигФайл.ПараметрыВнешнегоСервераОтладки("http://debug-server:1550"); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); - Ожидаемое = "debug: - | type: server - | server: - | url: http://debug-server:1550 - |"; - - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Секция debug должна содержать адрес внешнего сервера отладки"); + Отладка = Данные.Получить("debug"); + Утверждения.ПроверитьРавенство("server", Отладка.Получить("type")); + Утверждения.ПроверитьРавенство("http://debug-server:1550", Отладка.Получить("server").Получить("url")); КонецПроцедуры @@ -268,18 +270,12 @@ КонфигФайл.ПараметрыХТТП("/"); КонфигФайл.ПараметрыПубликацииДистрибутивов("w32.zip", "w64.zip", "m64.zip"); - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); - - Ожидаемое = "http: - | base: / - | pubdst: - | win32: w32.zip - | win64: w64.zip - | mac64: m64.zip - |"; + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); - Утверждения.ПроверитьРавенство(Ожидаемое, Содержимое, - "Секция pubdst должна быть записана"); + Дистрибутивы = Данные.Получить("http").Получить("pubdst"); + Утверждения.ПроверитьРавенство("w32.zip", Дистрибутивы.Получить("win32")); + Утверждения.ПроверитьРавенство("w64.zip", Дистрибутивы.Получить("win64")); + Утверждения.ПроверитьРавенство("m64.zip", Дистрибутивы.Получить("mac64")); КонецПроцедуры @@ -288,9 +284,15 @@ КонфигФайл = Новый КонфигурационныйФайлАС; - Содержимое = СоздатьИПрочитатьКонфиг(КонфигФайл); + ИмяФайла = ИмяВременногоФайлаКонфигурации(); + КонфигФайл.СоздатьКонфигурационныйФайл(ИмяФайла); + + Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); + Текст = Чтение.Прочитать(); + Чтение.Закрыть(); + УдалитьФайлы(ИмяФайла); - Утверждения.ПроверитьРавенство("", Содержимое, + Утверждения.ПроверитьИстину(Текст = Неопределено ИЛИ ПустаяСтрока(Текст), "Без установленных параметров должен быть создан пустой файл"); КонецПроцедуры @@ -299,24 +301,29 @@ #Область СлужебныеПроцедурыИФункции -Функция СоздатьИПрочитатьКонфиг(КонфигФайл) +Функция СоздатьИРазобратьКонфиг(КонфигФайл) - ИмяФайла = ОбъединитьПути(КаталогВременныхФайлов(), "configfile_as_test.yml"); + ИмяФайла = ИмяВременногоФайлаКонфигурации(); КонфигФайл.СоздатьКонфигурационныйФайл(ИмяФайла); Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); - Текст = Чтение.Прочитать(); + ПоследнийТекстКонфигурации = Чтение.Прочитать(); Чтение.Закрыть(); + Парсер = Новый ПарсерYaml; + Данные = Парсер.ПрочитатьИзФайла(ИмяФайла); + УдалитьФайлы(ИмяФайла); - Если Текст = Неопределено Тогда - Текст = ""; - КонецЕсли; + Утверждения.ПроверитьТип(Данные, "Соответствие", "Файл должен содержать корректный YAML-документ"); - Возврат СтрЗаменить(Текст, Символы.ВК, ""); + Возврат Данные; + +КонецФункции +Функция ИмяВременногоФайлаКонфигурации() + Возврат ОбъединитьПути(КаталогВременныхФайлов(), "configfile_as_test.yml"); КонецФункции #КонецОбласти From 9a50ad1777f590cda4b5748af213c90991e440c6 Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Tue, 1 Sep 2026 00:00:17 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BE=D1=82=D0=BB=D0=B8=D1=87=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=82=20=D0=B8=D1=81?= =?UTF-8?q?=D1=85=D0=BE=D0=B4=D0=BD=D0=BE=D0=B9=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Восстановлены байт-в-байт строки оригинала, отличавшиеся только пробелами и табами (хвостовые пробелы, пустые строки, отступы), а также случайно затронутые рефакторингом мелочи (Найти, имена локальных переменных). В диффе с апстримом остались только содержательные изменения. Co-Authored-By: Claude Fable 5 --- .../configfile_as.os" | 64 ++-- .../ibcmdrunner.os" | 287 +++++++++--------- .../ibsrvrunner.os" | 66 ++-- tests/ibsrvrunner_tests.os | 2 +- 4 files changed, 209 insertions(+), 210 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" index 483d9a4..095f53d 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" @@ -46,13 +46,13 @@ Лог.Отладка("Установка параметров сервера (адрес: %1, порт: %2, имя хоста: %3)", Адрес, Порт, ИмяХоста); - ПараметрыСервера.Очистить(); + ПараметрыСервера. Очистить(); ПараметрыСервера.Вставить("port", Порт); ПараметрыСервера.Вставить("address", Адрес); - + Если ЗначениеЗаполнено(ИмяХоста) Тогда ПараметрыСервера.Вставить("host", ИмяХоста); - КонецЕсли; + КонецЕсли; КонецПроцедуры @@ -80,7 +80,7 @@ ПараметрыСервернойБазыДанных.Вставить("name", ИмяДБ); ПараметрыСервернойБазыДанных.Вставить("user", ИмяПользователя); ПараметрыСервернойБазыДанных.Вставить("password", Пароль); - + КонецПроцедуры // ПараметрыФайловойБД @@ -93,7 +93,7 @@ Лог.Отладка("Установка параметров файловой БД (путь: %1)", ПутьКФайлуИБ); ПараметрыФайловойБазыДанных.Вставить("path", ПутьКФайлуИБ); - + КонецПроцедуры // ПараметрыИБ @@ -103,7 +103,7 @@ // ВыдаватьКлиентскиеЛицензии - Булево - разрешить выдавать клиентские лицензии автономному серверу // РазрешитьРегламентныеЗадания - Булево - разрешить выполнение регламентных заданий // ИД - Строка - уникальный идентификатор информационной базы. По умолчанию - значение unique, то есть -// каждый раз при перезапуске будет генерироваться новый уникальный идентификатор. +// каждый раз при перезапуске будет генерироваться новый уникальный идентификатор. Процедура ПараметрыИБ(ИмяИБ, ВыдаватьКлиентскиеЛицензии, РазрешитьРегламентныеЗадания, @@ -132,7 +132,7 @@ ПараметрыХТТП.Очистить(); ПараметрыХТТП.Вставить("base", БазовыйУРЛ); -КонецПроцедуры +КонецПроцедуры // ПараметрыВеб_Аутентификация // Установка параметров веб-аутентификации OpenId (секции rely и provider) @@ -148,7 +148,7 @@ // Описание представляет собой массив объектов, каждый из которых описывает одного // OpenID-провайдера. Массив представлен в виде JSON-сериализации. // Подробнее см. https://its.1c.ru/db/v8314doc#bookmark:adm:TI000000847 -// РазрешитьАутентификацию1С - Булево -указывает возможность применения аутентификации «1С:Предприятия». +// РазрешитьАутентификацию1С - Булево -указывает возможность применения аутентификации «1С:Предприятия». Процедура ПараметрыВеб_Аутентификация(УРИПровайдера, ВремяЖизни = 86400, МаскаРазрешенныхИмен = Неопределено, @@ -190,10 +190,10 @@ ПараметрыВеб_Разделители.Вставить("value", Разделитель); ПараметрыВеб_Разделители.Вставить("safe", РазрешитьИзменение); ПараметрыВеб_Разделители.Вставить("specify", ДобавлятьЗначениеВАдрес); - + Если ЭтоПервоеЗначениеРазделителя Тогда мсвПараметрыВеб_Разделители = Новый Массив; - КонецЕсли; + КонецЕсли; мсвПараметрыВеб_Разделители.Добавить(ПараметрыВеб_Разделители); КонецПроцедуры @@ -202,7 +202,7 @@ // Установка параметров публикации управляемого приложения (application) // Параметры: // УРИВозврата - Строка - адрес (URL), по которому будет выполнен переход после завершения работы веб-клиента. -// Публиковать - Булево - Определяет возможность использовать клиентское приложение для доступа +// Публиковать - Булево - Определяет возможность использовать клиентское приложение для доступа // к информационной базе. Процедура ПараметрыВеб_Приложение(УРИВозврата, Публиковать = Истина) Экспорт @@ -212,7 +212,7 @@ ПараметрыВеб_Приложение = Новый Соответствие; ПараметрыВеб_Приложение.Вставить("publish", Публиковать); ПараметрыВеб_Приложение.Вставить("exit-url", УРИВозврата); -КонецПроцедуры +КонецПроцедуры // ПараметрыВеб_ПубликацияOData // Установка параметров публикации интерфейса OData @@ -231,7 +231,7 @@ ПараметрыВеб_ПубликацияOData.Вставить("reuse-sessions", ПараметрыРежимаПовторногоИспользованияСеансов); КонецЕсли; -КонецПроцедуры +КонецПроцедуры // ПараметрыВеб_РежимПовторногоИспользованияСеансов // Устанавливает параметры повторного использования сеансов @@ -239,11 +239,11 @@ // Режим - Строка - AutoUse, DontUse, Use // ВремяБездействия - Число -Время бездействия сеанса, после которого он завершается принудительно (в секундах). // МаксимальноеКоличествоСеансов - Число - Максимальное количество сеансов, которые могут быть созданы при -// автоматическом управлении сеансами. +// автоматическом управлении сеансами. // ТаймаутОжиданияСвободногоСеанса - Число - Время ожидания появления свободного сеанса после заполнения // пула сеансов (в секундах). -Процедура ПараметрыВеб_РежимПовторногоИспользованияСеансов(Режим = "AutoUse", - ВремяБездействия = 20, +Процедура ПараметрыВеб_РежимПовторногоИспользованияСеансов(Режим = "AutoUse", + ВремяБездействия = 20, МаксимальноеКоличествоСеансов = 10, ТаймаутОжиданияСвободногоСеанса = 5) Экспорт @@ -288,7 +288,7 @@ // pool-size: 10 // pool-timeout: 5s // Подробности: https://its.1c.ru/db/v8314doc#bookmark:adm:TI000000940 -// ЭтоПервыйСервис - Булево - флаг для инициализации массива web-сервисов +// ЭтоПервыйСервис - Булево - флаг для инициализации массива web-сервисов Процедура ДобавитьПараметрыВебСервиса(Публиковать, Имя, Синоним, @@ -344,7 +344,7 @@ // pool-size: 10 // pool-timeout: 5s // Подробности: https://its.1c.ru/db/v8314doc#bookmark:adm:TI000000940 -// ЭтоПервыйСервис - Булево - флаг для инициализации массива http-сервисов +// ЭтоПервыйСервис - Булево - флаг для инициализации массива http-сервисов Процедура ДобавитьПараметрыХТТПСервиса(Публиковать, Имя, КорневойУРЛ, @@ -373,7 +373,7 @@ // Устанавливает параметры публикации клиентских дистрибутивов (pubdst) // Параметры: // ПутьКФайлуВин32 - Строка - Полное имя файла с архивом дистрибутива -// 32-разрядного клиентского приложения для ОС Windows. +// 32-разрядного клиентского приложения для ОС Windows. // ПутьКФайлуВин64 - Строка - Полное имя файла с архивом дистрибутива // 64-разрядного клиентского приложения для ОС Windows. // ПутьКФайлуМак64 - Строка - Полное имя файла с архивом дистрибутива @@ -397,16 +397,16 @@ // МаксимальныйПортПодключения - Число - Верхняя граница диапазона портов для установки соединения // УровеньБезопасности - Число - Уровень безопасности прямого соединения с сервером // -Процедура ПараметрыШлюзаПрямогоДоступа(ОсновнойПорт = 1541, - МинимальныйПортПодключения = 1560, - МаксимальныйПортПодключения = 1591, +Процедура ПараметрыШлюзаПрямогоДоступа(ОсновнойПорт = 1541, + МинимальныйПортПодключения = 1560, + МаксимальныйПортПодключения = 1591, УровеньБезопасности = 0) Экспорт Лог.Отладка("Установка параметров шлюза прямого доступа (основной порт: %1)", ОсновнойПорт); ПараметрыШлюза = Новый Соответствие; ПараметрыШлюза.Вставить("regport", ОсновнойПорт); - ПараметрыШлюза.Вставить("range", + ПараметрыШлюза.Вставить("range", СтрШаблон("%1:%2", МинимальныйПортПодключения, МаксимальныйПортПодключения)); ПараметрыШлюза.Вставить("seclevel", УровеньБезопасности); @@ -421,8 +421,8 @@ // ПутьКЗакрытомуКлючу - Строка - Путь к закрытому ключу хоста. // ПортПодключения - Число - Порт, обслуживаемый данным шлюзом. // -Процедура ПараметрыШлюзаSSH(СетевойИнтерфейс = "localhost", - ПутьКЗакрытомуКлючу = "auto", +Процедура ПараметрыШлюзаSSH(СетевойИнтерфейс = "localhost", + ПутьКЗакрытомуКлючу = "auto", ПортПодключения = 8282) Экспорт Лог.Отладка("Установка параметров шлюза SSH (интерфейс: %1, порт: %2)", СетевойИнтерфейс, ПортПодключения); @@ -433,17 +433,17 @@ ПараметрыШлюза.Вставить("port", ПортПодключения); ПараметрыСпособовДоступаКСерверу.Вставить("ssh", ПараметрыШлюза); - + КонецПроцедуры // Параметры функциональных характеристик автономного сервера. // // Параметры: -// ИспользоватьШлюзПрямогоДоступа - Булево, Неопределено - использовать доступ +// ИспользоватьШлюзПрямогоДоступа - Булево, Неопределено - использовать доступ // по протоколу TCP/IP (прямое подключение). // ИспользоватьШлюзHTTP - Булево, Неопределено - использовать доступ к автономному серверу по протоколу HTTP. // ИспользоватьШлюзSSH - Булево, Неопределено - использовать доступ к автономному серверу по протоколу SSH. -// ИспользоватьРасширеннуюФункциональностьКонифгуратора - Булево, Неопределено - использовать расширенную +// ИспользоватьРасширеннуюФункциональностьКонифгуратора - Булево, Неопределено - использовать расширенную // функциональность Конфигуратора. // Процедура ПараметрыФункциональностиСервера(ИспользоватьШлюзПрямогоДоступа = Неопределено, @@ -493,12 +493,12 @@ // АдресВнешнегоСервераОтладки - Строка - Адрес внешнего сервера отладки. // Процедура ПараметрыВнешнегоСервераОтладки(АдресВнешнегоСервераОтладки) Экспорт - + Лог.Отладка("Установка параметров внешнего сервера отладки (адрес: %1)", АдресВнешнегоСервераОтладки); ПараметрыВнешнегоСервера = Новый Соответствие; ПараметрыВнешнегоСервера.Вставить("url", АдресВнешнегоСервераОтладки); - + ПараметрыОтладкиСервера.Вставить("type", "server"); ПараметрыОтладкиСервера.Вставить("server", ПараметрыВнешнегоСервера); @@ -514,7 +514,7 @@ Лог.Информация("Создание конфигурационного файла автономного сервера: %1", ПутьКФайлу); ДанныеКонфигурации = СобратьДанныеКонфигурации(); - + Если ДанныеКонфигурации.Количество() = 0 Тогда // Историческое поведение: без установленных параметров создается пустой файл Конфиг = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8"); @@ -703,7 +703,7 @@ Для Каждого Параметр Из Источник Цикл ВставитьЕслиЗаполнено(Приемник, Параметр.Ключ, Параметр.Значение); - КонецЦикла; + КонецЦикла; КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" index 7287efd..e42c689 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" @@ -4,21 +4,21 @@ #Использовать logos #Использовать v8find #Использовать asserts -#Использовать 1commands +#Использовать 1commands #Область ОписаниеПеременных -Перем Лог; +Перем Лог; Перем ПутьКПриложению; // Строка - путь к приложению ibcmd Перем ЭтоWindows; // Булево - Это ОС Windows Перем ПараметрыЗапуска; // Массив параметров запуска команды -Перем ПараметрыСервернойИБ; // Массив параметров серверной информационной базы +Перем ПараметрыСервернойИБ; // Массив параметров серверной информационной базы Перем ПараметрыКонфигурацииАС; // Массив параметров конфигурационного файла автономного сервера Перем ПараметрыФайловойИБ; // Массив параметров файловой информационной базы Перем ПараметрыАвторизацииИБ; // Массив параметров авторизации информационной базы Перем ПараметрыАвтономногоСервера; // Массив параметров автономного сервера Перем ПеременныеСредыКоманды; // Соответствие - переменные среды команды - + Перем Версия; // Версия платформы 1С Перем Команда; // Команда исполнения вызова ibcmd @@ -31,16 +31,16 @@ // СнятьСПоддержки // Снимает с поддержки конфигурацию // Параметры: -// +// // Возвращаемое значение: // Процедура СнятьСПоддержки() Экспорт - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); Лог.Информация("Снятие конфигурации с поддержки"); НачатьЗаполнениеПараметровЗапуска("infobase config support disable"); - + ВыполнитьКоманду(); КонецПроцедуры @@ -50,14 +50,14 @@ // Параметры: // ЗавершитьОперацию - Булево - завершить незавершенную операцию. // ВосстановитьМетаданные - Булево - выполнить восстановление структуры метаданных конфигурации. -// +// // Возвращаемое значение: // Процедура ТестированиеИИсправление( Знач ЗавершитьОперацию, Знач ВосстановитьМетаданные ) Экспорт - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); Ожидаем.Что(ЗавершитьОперацию).ИмеетТип("Булево"); Ожидаем.Что(ВосстановитьМетаданные).ИмеетТип("Булево"); @@ -71,24 +71,24 @@ Иначе ПараметрыЗапуска.Добавить("--rollback"); КонецЕсли; - ДобавитьПараметрЕслиЗаполнен("--fix-metadata", Ложь); - + ДобавитьПараметрЕслиЗаполнен("--fix-metadata", Ложь); + ВыполнитьКоманду(); КонецПроцедуры // СписокОбщихРеквизитов // Получение списка имен общих реквизитов прикладного решения. // Параметры: -// +// // Возвращаемое значение: // Строка - список имен общих реквизитов конфигурации. Функция СписокОбщихРеквизитов() Экспорт - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); Лог.Отладка("Получение списка общих реквизитов"); НачатьЗаполнениеПараметровЗапуска("infobase config data-separation list"); - + Результат = ВыполнитьКоманду(); Возврат Результат; КонецФункции @@ -100,13 +100,13 @@ // Возвращаемое значение: // Строка - идентификатор. Функция ИДПоколенияДанных(Знач ИмяРасширения = "") Экспорт - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); Лог.Отладка("Получение идентификатора поколения данных (расширение: '%1')", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config generation-id"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения, ""); - + Результат = ВыполнитьКоманду(); Возврат Результат; КонецФункции @@ -114,7 +114,7 @@ // #Область Работа с расширениями // СоздатьРасширение -// Создать расширение +// Создать расширение // Параметры: // ИмяРасширения - Строка - Имя расширения (обязательный). Строка должна удовлетворять требованиям 1С к именам // ПрефиксИмен - Строка - Префикс имен (обязательный). Должен удовлетворять правилам формирования имени. @@ -122,14 +122,14 @@ // Синоним - Строка - Синоним в формате функции NStr() // НазначениеРасширения - строка - должно быть одним из следующих слов: customization, add-on, patch // Возвращаемое значение: -// +// Процедура СоздатьРасширение( Знач ИмяРасширения, Знач ПрефиксИмен, Знач Синоним = "", Знач НазначениеРасширения = "add-on" ) Экспорт - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); ПроверитьИмя(ИмяРасширения); ПроверитьИмя(ПрефиксИмен); @@ -151,12 +151,12 @@ УспешныеКодыВозврата.Добавить(0); УспешныеКодыВозврата.Добавить(102); // это костыль, но команда падает с таким кодом. При этом расширение создается. - ВыполнитьКоманду(УспешныеКодыВозврата); + ВыполнитьКоманду(УспешныеКодыВозврата); -КонецПроцедуры +КонецПроцедуры // ИнформацияОРасширении -// Получить информацию о расширении +// Получить информацию о расширении // Параметры: // ИмяРасширения - Строка - должна удовлетворять требованиям 1С к именам // Возвращаемое значение: @@ -175,7 +175,7 @@ ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); ПроверитьИмя(ИмяРасширения); - + Лог.Отладка("Получение информации о расширении '%1'", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config extension info"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); @@ -185,17 +185,17 @@ КонецФункции // СписокРасширений -// Получить список расширений, подключенных к конфигурации автономного сервера +// Получить список расширений, подключенных к конфигурации автономного сервера // Параметры: // Возвращаемое значение: -// Строка - Список расширений +// Строка - Список расширений Функция СписокРасширений() Экспорт ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); - + Лог.Отладка("Получение списка расширений"); НачатьЗаполнениеПараметровЗапуска("infobase config extension list"); - + Результат = ВыполнитьКоманду(); Возврат Результат; КонецФункции @@ -223,77 +223,77 @@ Знач ЗащитаОтОпасныхДействий = Неопределено, Знач ИспользуетсяВ_РИБ = Неопределено, Знач ОбластьДействия_ИБ = Неопределено) Экспорт - + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); ПроверитьИмя(ИмяРасширения); Ожидаем.Что(ИмяПрофиляБезопасности).ИмеетТип("Строка"); - + Лог.Информация("Изменение свойств расширения '%1'", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config extension update"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); - + ДобавитьПараметрБулевоЕслиЗадан("--active", Активность); ДобавитьПараметрБулевоЕслиЗадан("--safe-mode", БезопасныйРежим); - + Если НЕ ПустаяСтрока(ИмяПрофиляБезопасности) Тогда ПараметрыЗапуска.Добавить("--security-profile-name=" + ОбернутьВКавычки(ИмяПрофиляБезопасности)); КонецЕсли; - + ДобавитьПараметрБулевоЕслиЗадан("--unsafe-action-protection", ЗащитаОтОпасныхДействий); ДобавитьПараметрБулевоЕслиЗадан("--used-in-distributed-infobase", ИспользуетсяВ_РИБ); - + Если ОбластьДействия_ИБ <> Неопределено Тогда Ожидаем.Что(ОбластьДействия_ИБ).ИмеетТип("Булево"); - + Если ОбластьДействия_ИБ Тогда ПараметрыЗапуска.Добавить("--scope=infobase"); Иначе ПараметрыЗапуска.Добавить("--scope=data-separation"); КонецЕсли; - + КонецЕсли; - + ВыполнитьКоманду(); - + КонецПроцедуры // УдалитьРасширение -// Удалить расширение +// Удалить расширение // Параметры: // ИмяРасширения - Строка - Имя расширения, у которого будем изменять свойства // Возвращаемое значение: -// +// Процедура УдалитьРасширение( Знач ИмяРасширения ) Экспорт ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); ПроверитьИмя(ИмяРасширения); - + Лог.Информация("Удаление расширения '%1'", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config extension delete"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); - + ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // УдалитьВсеРасширения -// Удалить все расширения +// Удалить все расширения // Параметры: // Возвращаемое значение: -// +// Процедура УдалитьВсеРасширения() Экспорт ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); - + Лог.Информация("Удаление всех расширений"); НачатьЗаполнениеПараметровЗапуска("infobase config extension delete --all"); - + ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // #КонецОбласти @@ -308,15 +308,15 @@ // Строка - текущий путь к приложению // Функция ПутьКПриложению(Знач Путь = Неопределено) Экспорт - + Если Путь <> Неопределено Тогда Ожидаем.Что(Путь).ИмеетТип("Строка"); Лог.Отладка("Установка пути к приложению ibcmd: %1", Путь); ПутьКПриложению = Путь; Версия(); - КонецЕсли; + КонецЕсли; Возврат ПутьКПриложению; -КонецФункции +КонецФункции // УстановитьПараметрыСервернойИБ // Установить параметры запуска для клиент-серверной информационной базы @@ -326,14 +326,14 @@ // PostgreSQL - PostgreSQL; // IBMDB2 - IBM DB2; // OracleDatabase - Oracle Database. -// +// // СерверСУБД - строка - Имя сервера СУБД; // ИмяБД - Строка - Имя базы данных в СУБД; // ПользовательБД - Строка - Имя пользователя СУБД; // ПарольБД - Строка - Пароль пользователя в БД; Процедура УстановитьПараметрыСервернойИБ(Знач ТипСУБД,Знач СерверСУБД,Знач ИмяБД,Знач ПользовательБД,Знач ПарольБД) Экспорт - + Ожидаем.Что(СтрНайти("mssqlserver,postgresql,ibmdb2,oracledatabase", НРег(ТипСУБД)) > 0, СтрШаблон("Тип СУБД должен быть один из MSSQLServer, PostgreSQL,IBMDB2,OracleDatabase, получено: '%1'", ТипСУБД)) .ЭтоИстина(); @@ -366,22 +366,22 @@ Лог.Отладка("Установлены параметры файловой ИБ (каталог: %1)", КаталогИБ); ПараметрыФайловойИБ.Добавить("--db-path=" + ОбернутьВКавычки(КаталогИБ)); - -КонецПроцедуры + +КонецПроцедуры // УстановитьКонфигурационныйФайл -// Установить конфигурационный файл автономного сервера +// Установить конфигурационный файл автономного сервера // Параметры: // ИмяФайла - Строка - Полный путь к файлу конфигурации автономного сервера (yml); Процедура УстановитьКонфигурационныйФайл(Знач ИмяФайла) Экспорт ОчиститьОбщиеПараметрыИБ(); - + Лог.Отладка("Установлен конфигурационный файл автономного сервера: %1", ИмяФайла); ПараметрыКонфигурацииАС.Добавить("--config=" + ОбернутьВКавычки(ИмяФайла)); - -КонецПроцедуры + +КонецПроцедуры // УстановитьПараметрыАвторизацииИБ // Установить параметры авторизации информационной базы @@ -408,7 +408,7 @@ Лог.Отладка("Параметры авторизации ИБ не установлены: версия платформы %1 не старше 8.3.18.1563", Версия); КонецЕсли; -КонецПроцедуры +КонецПроцедуры // УстановитьПараметрыАвтономногоСервера // Установить параметры автономного сервера @@ -426,22 +426,22 @@ Лог.Отладка("Каталог данных автономного сервера не установлен: версия платформы %1 не старше 8.3.20", Версия); КонецЕсли; -КонецПроцедуры +КонецПроцедуры // СоздатьИБ // Создать пустую информационную базу без данных и конфигурации. // Для команды автоматом устанавливаются параметры "--create-database" и "--force" // Параметры: -// Локаль - Строка - имя локали +// Локаль - Строка - имя локали // СмещениеДат - Число - Смещение дат в годах (имеет смысл только для MSSQL) Процедура СоздатьИБ( - Знач Локаль = Неопределено, + Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт Лог.Информация("Создание пустой информационной базы"); ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат); - + ВыполнитьКоманду(); КонецПроцедуры @@ -452,17 +452,17 @@ // Параметр "--apply" не устанавливается, предполагается использование отдельной команды // Параметры: // ПутьКФайлуВыгрузки - Строка - Путь к файлу выгрузки информационной базы -// Локаль - Строка - имя локали +// Локаль - Строка - имя локали // СмещениеДат - Число - Смещение дат в годах (имеет смысл только для MSSQL) Процедура СоздатьИБИзФайлаВыгрузки( Знач ПутьКФайлуВыгрузки, Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт - + Лог.Информация("Создание информационной базы из файла выгрузки %1", ПутьКФайлуВыгрузки); - + ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--restore", ПутьКФайлуВыгрузки); - + ВыполнитьКоманду(); КонецПроцедуры @@ -472,17 +472,17 @@ // Параметр "--apply" не устанавливается, предполагается использование отдельной команды // Параметры: // ПутьКФайлуКонфигурации - Строка - Путь к файлу конфигурации информационной базы -// Локаль - Строка - имя локали +// Локаль - Строка - имя локали // СмещениеДат - Число - Смещение дат в годах (имеет смысл только для MSSQL) Процедура СоздатьИБИзФайлаКонфигурации( Знач ПутьКФайлуКонфигурации, Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт - + Лог.Информация("Создание информационной базы из файла конфигурации %1", ПутьКФайлуКонфигурации); - + ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--load", ПутьКФайлуКонфигурации); - + ВыполнитьКоманду(); КонецПроцедуры @@ -492,18 +492,18 @@ // Параметр "--apply" не устанавливается, предполагается использование отдельной команды // Параметры: // ПутьККаталогуВыгрузки - Строка - Путь к каталогу выгрузки конфигурации в файлы -// Локаль - Строка - имя локали +// Локаль - Строка - имя локали // СмещениеДат - Число - Смещение дат в годах (имеет смысл только для MSSQL) Процедура СоздатьИБИзФайловКонфигурации( Знач ПутьККаталогуВыгрузки, Знач Локаль = Неопределено, Знач СмещениеДат = 2000 ) Экспорт - + Лог.Информация("Создание информационной базы из файлов конфигурации (каталог: %1)", ПутьККаталогуВыгрузки); - + ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--import", ПутьККаталогуВыгрузки); - + ВыполнитьКоманду(); КонецПроцедуры @@ -512,11 +512,11 @@ // Параметры: // ПутьКФайлуВыгрузки - Строка - Путь к файлу выгрузки Процедура ВыгрузитьДанныеИБ(Знач ПутьКФайлуВыгрузки) Экспорт - + Лог.Информация("Выгрузка данных информационной базы в файл %1", ПутьКФайлуВыгрузки); НачатьЗаполнениеПараметровЗапуска("infobase dump"); - + ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуВыгрузки)); ВыполнитьКоманду(); @@ -528,11 +528,11 @@ // Параметры: // ПутьКФайлуВыгрузки - Строка - Путь к файлу выгрузки Процедура ЗагрузитьДанныеИБ(Знач ПутьКФайлуВыгрузки) Экспорт - + Лог.Информация("Загрузка данных информационной базы из файла %1", ПутьКФайлуВыгрузки); НачатьЗаполнениеПараметровЗапуска("infobase restore"); - + ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуВыгрузки)); ВыполнитьКоманду(); @@ -550,7 +550,7 @@ Лог.Информация("Загрузка конфигурации из файла %1 (расширение: '%2')", ПутьКФайлуКонфигурации, ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config load"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуКонфигурации)); @@ -574,17 +574,17 @@ Лог.Информация("Выгрузка конфигурации в файл %1 (расширение: '%2')", ПутьКФайлуКонфигурации, ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config save"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); Если ВыгружатьОсновнуюКонфигурацию Тогда // Здесь сохранено историческое поведение: условие срабатывает // для любой версии платформы, кроме равной 8.3.20. Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда ПараметрыЗапуска.Добавить("--db"); - Иначе + Иначе ПараметрыЗапуска.Добавить("--staging"); - КонецЕсли; - КонецЕсли; + КонецЕсли; + КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуКонфигурации)); ВыполнитьКоманду(); @@ -595,18 +595,18 @@ // Параметры: // ИмяРасширения - Строка - имя расширения // Возвращаемое значение: -// Строка - строка консольного вывода команды +// Строка - строка консольного вывода команды Функция ПроверитьКонфигурацию(Знач ИмяРасширения = "") Экспорт - + Лог.Отладка("Проверка конфигурации (расширение: '%1')", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config check"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); - Результат = ВыполнитьКоманду(); - Возврат Результат; -КонецФункции + Рез = ВыполнитьКоманду(); + Возврат Рез; +КонецФункции // ОбновитьКонфигурациюБазыДанных // Обновить конфигурацию @@ -633,22 +633,22 @@ ИмяРасширения, ДинамическоеОбновление, ЗавершатьСеансы); НачатьЗаполнениеПараметровЗапуска("infobase config apply"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); // Здесь сохранено историческое поведение: условие срабатывает // для любой версии платформы, кроме равной 8.3.20. Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда - Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ДинамическоеОбновление) > 0, + Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ДинамическоеОбновление) > 0, СтрШаблон("Должно быть одно из auto, disable, prompt, force, получено: '%1'", ДинамическоеОбновление)) .ЭтоИстина(); - Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ЗавершатьСеансы) > 0, + Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ЗавершатьСеансы) > 0, СтрШаблон("Должно быть одно из auto, disable, prompt, force, получено: '%1'", ЗавершатьСеансы)) .ЭтоИстина(); ДобавитьПараметрЕслиЗаполнен("--dynamic", ДинамическоеОбновление, "auto"); - ДобавитьПараметрЕслиЗаполнен("--session-terminate", ЗавершатьСеансы, "auto"); - КонецЕсли; - + ДобавитьПараметрЕслиЗаполнен("--session-terminate", ЗавершатьСеансы, "auto"); + КонецЕсли; + ВыполнитьКоманду(); КонецПроцедуры @@ -658,11 +658,11 @@ // Параметры: // ИмяРасширения - Строка - имя расширения Процедура ВозвратитьсяККонфигурацииБазыДанных(Знач ИмяРасширения = "") Экспорт - + Лог.Информация("Возврат к конфигурации базы данных (расширение: '%1')", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config reset"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); ВыполнитьКоманду(); @@ -674,16 +674,16 @@ // ПутьКФайлуXML - Строка - Путь к файлу состояния конфигурации (ConfigDumpInfo) // ИмяРасширения - Строка - Имя расширения Процедура ВыгрузитьВФайлСостояниеКонфигурации(Знач ПутьКФайлуXML, Знач ИмяРасширения = "") Экспорт - + Лог.Информация("Выгрузка состояния конфигурации в файл %1 (расширение: '%2')", ПутьКФайлуXML, ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config export info"); - + ДобавитьПараметрЕслиЗаполнен("--out", ОбернутьВКавычки(ПутьКФайлуXML)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - + ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // ВыгрузитьВФайлИзмененияКонфигурации // Вывести информацию о изменениях конфигурации относительно переданного состояния (ConfigDumpInfo) @@ -699,23 +699,23 @@ Знач ИмяРасширения = "", Знач ВыводитьВКраткомФормате = ЛОЖЬ ) Экспорт - + Лог.Информация("Выгрузка изменений конфигурации в файл %1 (базовый файл: %2, расширение: '%3')", ПутьКФайлуXMLИзменений, ПутьКФайлуXMLВыгрузки, ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config export status"); - + ДобавитьПараметрЕслиЗаполнен("--out", ПутьКФайлуXMLИзменений); ДобавитьПараметрЕслиЗаполнен("--base", ПутьКФайлуXMLВыгрузки); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ДобавитьФлагЕслиИстина("--short", ВыводитьВКраткомФормате); ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // ВыгрузитьОбъектыКонфигурацииВФайлы // Экспорт выбранных объектов конфигурации в XML // Параметры: -// КаталогВыгрузки - Строка - Каталог для экспорта +// КаталогВыгрузки - Строка - Каталог для экспорта // ВыгружатьРекурсивно - Булево - Выполнять экспорт дочерних объектов. // Объекты - Массив - Список строк - имен объектов конфигурации для экспорта. // ИмяРасширения - Строка - Имя расширения @@ -723,7 +723,7 @@ // !!! При версии платформы < 8.3.21 параметр игнорируется !!! // НаСервере - Булево - если Истина, то выгружать на сервере.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! -// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, +// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, // по количеству ядер процессоров.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! Процедура ВыгрузитьОбъектыКонфигурацииВФайлы( @@ -741,19 +741,19 @@ КаталогВыгрузки, Объекты.Количество(), ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config export objects"); - + ДобавитьПараметрЕслиЗаполнен("--out", ОбернутьВКавычки(КаталогВыгрузки)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ДобавитьФлагЕслиИстина("--recursive", ВыгружатьРекурсивно); Если Объекты.Количество() > 0 Тогда ДобавитьМассивПараметров(Объекты); Иначе - ВызватьИсключение "Не заданы объекты конфигурации для экспорта в файлы!"; - КонецЕсли; + ВызватьИсключение "Не заданы объекты конфигурации для экспорта в файлы!"; + КонецЕсли; Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); - КонецЕсли; + КонецЕсли; ВыполнитьКоманду(); КонецПроцедуры @@ -765,7 +765,7 @@ // !!! При версии платформы < 8.3.21 параметр игнорируется !!! // НаСервере - Булево - если Истина, то выгружать на сервере.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! -// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, +// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, // по количеству ядер процессоров.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! Процедура ВыгрузитьВсеРасширенияВФайлы( @@ -773,14 +773,14 @@ Знач ВАрхив = Ложь, Знач НаСервере = Ложь, Знач КоличествоПотоков = 0) Экспорт - + Лог.Информация("Выгрузка всех расширений в файлы (каталог: %1)", КаталогВыгрузки); НачатьЗаполнениеПараметровЗапуска("infobase config export all-extensions"); - + Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); - КонецЕсли; + КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); @@ -798,7 +798,7 @@ // !!! При версии платформы < 8.3.21 параметр игнорируется !!! // НаСервере - Булево - если Истина, то выгружать на сервере.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! -// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, +// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, // по количеству ядер процессоров.
// !!! При версии платформы < 8.3.21 параметр игнорируется !!! // НеВыгружатьНеСуществующиеОбъекты - Булево - если Истина, запрещает выгрузку в XML-файлы ссылок на @@ -818,14 +818,14 @@ Лог.Информация("Выгрузка конфигурации в файлы (каталог: %1, расширение: '%2')", КаталогВыгрузки, ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config export"); - + ДобавитьПараметрЕслиЗаполнен("--base", ОбернутьВКавычки(ПутьКФайлуXMLВыгрузки), """"""); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ДобавитьФлагЕслиИстина("--sync", Синхронизировать); Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); ДобавитьФлагЕслиИстина("--ignore-unresolved-refs", НеВыгружатьНеСуществующиеОбъекты); - КонецЕсли; + КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); КонецПроцедуры @@ -846,7 +846,7 @@ Лог.Информация("Загрузка конфигурации из файлов (каталог: %1, расширение: '%2')", КаталогВыгрузки, ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config import"); - + ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); // Здесь сохранено историческое поведение: условие срабатывает @@ -854,9 +854,9 @@ Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда Ожидаем.Что(ОтключитьПроверку).ИмеетТип("Булево"); ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); - КонецЕсли; - - ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); + КонецЕсли; + + ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); КонецПроцедуры @@ -883,7 +883,7 @@ КаталогВыгрузки, ВыбранныеФайлы.Количество(), ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config import files"); - + ДобавитьПараметрЕслиЗаполнен("--base-dir", ОбернутьВКавычки(КаталогВыгрузки)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); @@ -894,13 +894,13 @@ Ожидаем.Что(ИзАрхива).ИмеетТип("Булево"); ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); ДобавитьФлагЕслиИстина("--archive", ИзАрхива); - КонецЕсли; + КонецЕсли; ИмяФайлаПараметров = ВременныеФайлы.НовоеИмяФайла("txt"); Если ВыбранныеФайлы.Количество() = 1 Тогда ВыбранныйФайл = ВыбранныеФайлы[0]; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ВыбранныйФайл)); - + Иначе ЗаписатьСписокФайловВФайлПараметров(ИмяФайлаПараметров, ВыбранныеФайлы); @@ -913,7 +913,7 @@ ВременныеФайлы.УдалитьФайл(ИмяФайлаПараметров); -КонецПроцедуры +КонецПроцедуры // ЗагрузитьВсеРасширенияИзФайлов // Импорт всех расширений конфигурации из XML @@ -926,11 +926,11 @@ Знач ОтключитьПроверку = Ложь, Знач ИзАрхива = Ложь ) Экспорт - + Лог.Информация("Загрузка всех расширений из файлов (каталог: %1)", КаталогВыгрузки); НачатьЗаполнениеПараметровЗапуска("infobase config import all-extensions"); - + // Здесь сохранено историческое поведение: условие срабатывает // для любой версии платформы, кроме равной 8.3.20. Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда @@ -938,11 +938,11 @@ Ожидаем.Что(ИзАрхива).ИмеетТип("Булево"); ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); ДобавитьФлагЕслиИстина("--archive", ИзАрхива); - КонецЕсли; - + КонецЕсли; + ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); -КонецПроцедуры +КонецПроцедуры // Версия // Получить версию платформы 1С @@ -1012,11 +1012,11 @@ // Примеры использования смотрите в тестах. // // Параметры: -// ЭтаВерсия - Строка - номер версии +// ЭтаВерсия - Строка - номер версии // БольшеЧемВерсия - Строка - второй сравниваемый номер версии. // // Возвращаемое значение: -// Число - больше 0, если ЭтаВерсия > БольшеЧемВерсия; +// Число - больше 0, если ЭтаВерсия > БольшеЧемВерсия; // 0, если версии равны. // число меньше 0, если ЭтаВерсия < БольшеЧемВерсия. // @@ -1085,7 +1085,7 @@ // Строка - результат выполнения команды на кластере 1С // Функция ВыполнитьКоманду(УстановленныйКодВозврата = 0) - + Если ТипЗнч(УстановленныйКодВозврата) = Тип("Массив") Тогда УспешныеКодыВозврата = УстановленныйКодВозврата; Иначе @@ -1094,7 +1094,7 @@ КонецЕсли; КомандаВыполнения = ПутьКПриложению; - + Лог.Отладка("Запуск: %1 %2", КомандаВыполнения, СтрСоединить(ПараметрыЗапуска, " ")); Если ПеременныеСредыКоманды.Количество() > 0 Тогда Лог.Отладка("Переменные среды команды: %1 (значения не выводятся в лог)", @@ -1130,7 +1130,7 @@ КонецЕсли; Возврат Команда.ПолучитьВывод(); - + КонецФункции // Начать заполнение параметров запуска. @@ -1143,7 +1143,7 @@ ПараметрыЗапуска.Добавить(СтрокаКоманды); ДобавитьОбщиеПараметрыИБ(); -КонецПроцедуры +КонецПроцедуры // Обернуть строку в кавычки, если это не сделано ранее // Параметры: @@ -1166,7 +1166,7 @@ ДобавитьМассивПараметров(ПараметрыФайловойИБ); ИначеЕсли ПараметрыКонфигурацииАС.Количество() > 0 Тогда ДобавитьМассивПараметров(ПараметрыКонфигурацииАС); - Иначе + Иначе ВызватьИсключение СтрШаблон( "Необходимо установить общие параметры информационной базы! |Перед выполнением команды '%1' вызовите один из методов: @@ -1180,7 +1180,7 @@ ДобавитьМассивПараметров(ПараметрыАвтономногоСервера); -КонецПроцедуры +КонецПроцедуры // Очистить массивы взаимоисключающих общих параметров информационной базы. // Вызывается перед установкой одного из вариантов подключения к ИБ: @@ -1278,12 +1278,11 @@ Знач ИмяПараметра, Знач ЗначениеПараметра, Знач ЗначениеПоУмолчанию = Неопределено) - Ожидаем.Что(ИмяПараметра).ИмеетТип("Строка"); Если ЗначениеПараметра <> ЗначениеПоУмолчанию Тогда Ожидаем.Что(ЗначениеПараметра).ИмеетТип("Строка"); ПараметрыЗапуска.Добавить(СтрШаблон(ИмяПараметра + "=%1", ЗначениеПараметра)); - КонецЕсли; + КонецЕсли; КонецПроцедуры @@ -1481,7 +1480,7 @@ Лог = Логирование.ПолучитьЛог(ИмяЛога()); СистемнаяИнформация = Новый СистемнаяИнформация; - ЭтоWindows = СтрНайти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; ПараметрыЗапуска = Новый Массив; ПараметрыСервернойИБ = Новый Массив; @@ -1499,7 +1498,7 @@ |Убедитесь, что платформа 1С требуемой версии установлена.", ВерсияПлатформы, Разрядность); КонецЕсли; - + Версия(); Лог.Отладка("Инициализирован УправлениеИБ (путь к ibcmd: %1, версия платформы: %2)", ПутьКПриложению, Версия); @@ -1509,7 +1508,7 @@ Функция НовыйОписаниеРасширения() ОписаниеРасширения = Новый Соответствие(); - + ОписаниеРасширения.Вставить("version", ""); ОписаниеРасширения.Вставить("active", Ложь); ОписаниеРасширения.Вставить("purpose", ""); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" index 61dcfd7..ad56233 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" @@ -10,7 +10,7 @@ Перем Лог; // Экземпляр логгера Перем ПутьКIbsrv; // Путь к утилите ibsrv -Перем ПараметрыЗапускаАС; // Коллекция параметров командной строки +Перем ПараметрыЗапускаАС; // Коллекция параметров командной строки Перем Процесс; // Процесс запущенного автономного сервера @@ -27,11 +27,11 @@ // Строка - версия утилиты // Функция Версия() Экспорт - + Если Версия = "8" Тогда ВычислитьВерсиюIbsrv(Версия, Неопределено); КонецЕсли; - + Возврат Версия; КонецФункции @@ -43,7 +43,7 @@ // Разрядность - Строка, Неопределено - разрядность требуемой версии (перечисление из РазрядностьПлатформы) // Процедура УстановитьВерсиюПлатформы(Знач НомерВерсии, Знач Разрядность = Неопределено) Экспорт - + Ожидаем.Что(НомерВерсии).ИмеетТип("Строка"); Если Разрядность <> Неопределено Тогда Ожидаем.Что(Разрядность).ИмеетТип("Строка"); @@ -87,7 +87,7 @@ Лог.Отладка("Установлен каталог файловой ИБ: %1", КаталогИБ); ПараметрыЗапускаАС.Вставить("db-path", ОбернутьВКавычки(КаталогИБ)); - + КонецПроцедуры // Устанавливает путь к конфигурационному файлу автономного сервера. @@ -96,7 +96,7 @@ // ПутьККонфигурационномуФайлу - Строка - Путь к конфигурационному файлу. // Процедура УстановитьКонфигурационныйФайл(Знач ПутьККонфигурационномуФайлу) Экспорт - + Ожидаем.Что(ПутьККонфигурационномуФайлу).ИмеетТип("Строка"); Ожидаем.Что(ФС.ФайлСуществует(ПутьККонфигурационномуФайлу), СтрШаблон("Конфигурационный файл автономного сервера не существует: %1", ПутьККонфигурационномуФайлу)) @@ -114,7 +114,7 @@ // НомерПорта - Число - порт установки прямого соединения с сервером (от 1000 до 65535) // Процедура УстановитьПортПрямогоДоступа(Знач НомерПорта) Экспорт - + ПроверитьНомерПорта(НомерПорта); Лог.Отладка("Установлен порт прямого доступа: %1", НомерПорта); @@ -129,7 +129,7 @@ // НомерПорта - Число - порт установки http соединения с сервером (от 1000 до 65535) // Процедура УстановитьПортHttpДоступа(Знач НомерПорта) Экспорт - + ПроверитьНомерПорта(НомерПорта); Лог.Отладка("Установлен порт http-доступа: %1", НомерПорта); @@ -200,15 +200,15 @@ Лог.Отладка("Остановка не требуется: процесс ibsrv не запущен"); Возврат; КонецЕсли; - + Лог.Информация("Остановка автономного сервера ibsrv (идентификатор процесса: %1)", Процесс.Идентификатор); Процесс.Завершить(); ПрочитатьПотокиIbsrv(); - + Лог.Отладка("Процесс %1 ibsrv завершен.", Процесс.Идентификатор); - + Процесс = Неопределено; КонецПроцедуры @@ -223,7 +223,7 @@ Лог = Логирование.ПолучитьЛог(ИмяЛога()); ПараметрыЗапускаАС = Новый Соответствие; КаталогДанных = ""; - + КонецПроцедуры #КонецОбласти @@ -252,15 +252,15 @@ ПутьКIbsrv = Платформа1С.ПутьКIBSRV(НомерВерсии, Разрядность); Ожидаем.Что(ПутьКIbsrv, "Не найдена установленная версия платформы: " + НомерВерсии).Заполнено(); - + Лог.Отладка("Путь к утилите ibsrv: %1", ПутьКIbsrv); ПараметрыКоманды = Новый Массив; ПараметрыКоманды.Добавить("--version"); - + ВыводКоманды = ВыполнитьКомандуIbsrv(ПараметрыКоманды); - - Версия = СокрЛП(ВыводКоманды); + + Версия = СокрЛП(ВыводКоманды); Лог.Отладка("Версия утилиты ibsrv: %1", Версия); @@ -283,8 +283,8 @@ КонецФункции -Функция ЗапуститьПроцессIbsrv(Знач ПараметрыКоманды) - +Функция ЗапуститьПроцессIbsrv(Знач ПараметрыКоманды) + ПараметрыКоманды.Вставить(0, ОбернутьВКавычки(ПутьКIbsrv)); КоманднаяСтрока = СтрСоединить(ПараметрыКоманды, " "); @@ -295,10 +295,10 @@ Лог.Отладка("Командная строка запуска ibsrv: %1 (текущий каталог: %2)", КоманднаяСтрока, ТекущийКаталог); - Процесс = СоздатьПроцесс(КоманднаяСтрока, ТекущийКаталог, + Процесс = СоздатьПроцесс(КоманднаяСтрока, ТекущийКаталог, ПеренаправлятьПотокВывода, ПеренаправлятьПотокВвода, КодировкаПотоков); Процесс.Запустить(); - + Возврат Процесс; КонецФункции @@ -315,15 +315,15 @@ Лог.Отладка("Ожидание запуска ibsrv (файл готовности: %1, предельное время ожидания: %2 мс)", ИмяФайла, ПредельныйПериодОжиданияМс); - Пока Запущен() И ТекущийПериодОжидания < ПредельныйПериодОжиданияМс Цикл + Пока Запущен() И ТекущийПериодОжидания < ПредельныйПериодОжиданияМс Цикл Приостановить(ИнтервалПроверкиМс); ЕстьДанные = ЕстьДанные ИЛИ ПрочитатьПотокиIbsrv(); ФайлСуществует = ФайлСуществует ИЛИ ФС.ФайлСуществует(ИмяФайла); Если ЕстьДанные И ФайлСуществует Тогда - Прервать; - КонецЕсли; + Прервать; + КонецЕсли; ТекущийПериодОжидания = ТекущийПериодОжидания + ИнтервалПроверкиМс; @@ -342,7 +342,7 @@ ТекстИсключенияЗапускаАС(), ИмяФайла, ПредельныйПериодОжиданияМс, ИмяЛога()); Лог.Ошибка(ТекстОшибки); ВызватьИсключение ТекстОшибки; - + КонецПроцедуры Функция ТекстИсключенияЗапускаАС() @@ -352,38 +352,38 @@ КонецФункции Функция ЗаполнитьПараметрыКоманды() - + ПараметрыКоманды = Новый Массив; Для Каждого КлючИЗначение Из ПараметрыЗапускаАС Цикл Если КлючИЗначение.Значение = Неопределено Тогда // это параметр-флаг - ПараметрыКоманды.Добавить(КлючИЗначение.Ключ); + ПараметрыКоманды.Добавить(КлючИЗначение.Ключ); Продолжить; ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Строка") И ПустаяСтрока(КлючИЗначение.Значение) Тогда - Продолжить; - + Продолжить; + ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Булево") Тогда Значение = ?(КлючИЗначение.Значение, "allow", "deny"); ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Число") Тогда Значение = XMLСтрока(КлючИЗначение.Значение); - + Иначе Значение = КлючИЗначение.Значение; КонецЕсли; - + ПараметрЗапуска = СтрШаблон("--%1=%2", КлючИЗначение.Ключ, Значение); - ПараметрыКоманды.Добавить(ПараметрЗапуска); - + ПараметрыКоманды.Добавить(ПараметрЗапуска); + КонецЦикла; Возврат ПараметрыКоманды; КонецФункции -Функция ПрочитатьПотокиIbsrv() +Функция ПрочитатьПотокиIbsrv() ЕстьДанные = Ложь; diff --git a/tests/ibsrvrunner_tests.os b/tests/ibsrvrunner_tests.os index 0a420d3..5181af3 100644 --- a/tests/ibsrvrunner_tests.os +++ b/tests/ibsrvrunner_tests.os @@ -29,7 +29,7 @@ // Когда ПараметрыМетода = Новый Массив; ПараметрыМетода.Добавить("8.3.23.1111"); - + // Тогда Ожидаем.Что(УправлениеАС) .Метод("УстановитьВерсиюПлатформы", ПараметрыМетода) From ecc067a7dee2a040d8af50d308e442132265ff7d Mon Sep 17 00:00:00 2001 From: Egor Ivanov Date: Tue, 1 Sep 2026 00:20:48 +0300 Subject: [PATCH 9/9] =?UTF-8?q?=D0=A1=D0=BE=D0=BA=D1=80=D0=B0=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BC=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=B1=D0=B5=D0=B7=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - СравнитьВерсии: недостающие компоненты версии считаются нулями на месте вместо предварительного выравнивания массивов; - ЯвляетсяИменем: посимвольный перебор заменен регулярным выражением; - лог имен переменных среды перенесен в ДобавитьСекретныйПараметр, одноразовые хелперы ВыполнитьКоманду свернуты; - подготовка и выполнение команды создания ИБ слиты в ВыполнитьСозданиеИБ; - СобратьСекциюБазыДанных заинлайнена, в ПроверитьНомерПорта устранено дублирование текста ошибки. Итого -76 строк. Co-Authored-By: Claude Fable 5 --- .../configfile_as.os" | 18 ++---- .../ibcmdrunner.os" | 62 +++++-------------- .../ibsrvrunner.os" | 7 +-- ...261\320\275\321\213\320\271IbcmdRunner.os" | 53 +++------------- 4 files changed, 32 insertions(+), 108 deletions(-) diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" index 095f53d..27a4338 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" @@ -573,8 +573,12 @@ ДанныеКонфигурации = Новый Соответствие; + СекцияБазыДанных = Новый Соответствие; + ПеренестиПараметры(СекцияБазыДанных, ПараметрыСервернойБазыДанных); + ПеренестиПараметры(СекцияБазыДанных, ПараметрыФайловойБазыДанных); + ДобавитьСекцию(ДанныеКонфигурации, "server", ПараметрыСервера); - ДобавитьСекцию(ДанныеКонфигурации, "database", СобратьСекциюБазыДанных()); + ДобавитьСекцию(ДанныеКонфигурации, "database", СекцияБазыДанных); ДобавитьСекцию(ДанныеКонфигурации, "infobase", ПараметрыИБ); ДобавитьСекцию(ДанныеКонфигурации, "http", СобратьСекциюHTTP()); ДобавитьСекцию(ДанныеКонфигурации, "gates", ПараметрыСпособовДоступаКСерверу); @@ -585,18 +589,6 @@ КонецФункции -// Собрать секцию database из параметров серверной или файловой базы данных -// Возвращаемое значение: -// Соответствие - параметры секции database -Функция СобратьСекциюБазыДанных() - - СекцияБазыДанных = Новый Соответствие; - ПеренестиПараметры(СекцияБазыДанных, ПараметрыСервернойБазыДанных); - ПеренестиПараметры(СекцияБазыДанных, ПараметрыФайловойБазыДанных); - Возврат СекцияБазыДанных; - -КонецФункции - // Собрать секцию http со всеми подсекциями веб-доступа // Возвращаемое значение: // Соответствие - параметры секции http diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" index e42c689..90f3a03 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" @@ -440,9 +440,7 @@ Лог.Информация("Создание пустой информационной базы"); - ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат); - - ВыполнитьКоманду(); + ВыполнитьСозданиеИБ(Локаль, СмещениеДат); КонецПроцедуры @@ -461,9 +459,7 @@ Лог.Информация("Создание информационной базы из файла выгрузки %1", ПутьКФайлуВыгрузки); - ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--restore", ПутьКФайлуВыгрузки); - - ВыполнитьКоманду(); + ВыполнитьСозданиеИБ(Локаль, СмещениеДат, "--restore", ПутьКФайлуВыгрузки); КонецПроцедуры // СоздатьИБИзФайлаКонфигурации @@ -481,9 +477,7 @@ Лог.Информация("Создание информационной базы из файла конфигурации %1", ПутьКФайлуКонфигурации); - ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--load", ПутьКФайлуКонфигурации); - - ВыполнитьКоманду(); + ВыполнитьСозданиеИБ(Локаль, СмещениеДат, "--load", ПутьКФайлуКонфигурации); КонецПроцедуры // СоздатьИБИзФайловКонфигурации @@ -502,9 +496,7 @@ Лог.Информация("Создание информационной базы из файлов конфигурации (каталог: %1)", ПутьККаталогуВыгрузки); - ПодготовитьКомандуСозданияИБ(Локаль, СмещениеДат, "--import", ПутьККаталогуВыгрузки); - - ВыполнитьКоманду(); + ВыполнитьСозданиеИБ(Локаль, СмещениеДат, "--import", ПутьККаталогуВыгрузки); КонецПроцедуры // ВыгрузитьДанныеИБ @@ -1096,10 +1088,6 @@ КомандаВыполнения = ПутьКПриложению; Лог.Отладка("Запуск: %1 %2", КомандаВыполнения, СтрСоединить(ПараметрыЗапуска, " ")); - Если ПеременныеСредыКоманды.Количество() > 0 Тогда - Лог.Отладка("Переменные среды команды: %1 (значения не выводятся в лог)", - СтрСоединить(ИменаПеременныхСредыКоманды(), ", ")); - КонецЕсли; НачалоВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах(); @@ -1117,12 +1105,16 @@ Лог.Отладка("Команда завершена за %1 мс с кодом возврата %2", ДлительностьМс, КодВозврата); Если УспешныеКодыВозврата.Найти(КодВозврата) = Неопределено Тогда + ОжидаемыеКоды = ""; + Для Каждого Код Из УспешныеКодыВозврата Цикл + ОжидаемыеКоды = ОжидаемыеКоды + ?(ОжидаемыеКоды = "", "", ", ") + Код; + КонецЦикла; ТекстОшибки = СтрШаблон("%1 |Команда ibcmd завершилась с недопустимым кодом возврата %2 (ожидались коды: %3). |Команда: %4 %5", Команда.ПолучитьВывод(), КодВозврата, - СтрСоединить(ПредставленияКодовВозврата(УспешныеКодыВозврата), ", "), + ОжидаемыеКоды, КомандаВыполнения, СтрСоединить(ПараметрыЗапуска, " ")); Лог.Ошибка(ТекстОшибки); @@ -1218,13 +1210,15 @@ Возврат; КонецЕсли; + Лог.Отладка("Значение параметра %1 передается через переменную среды %2", ИмяПараметра, ИмяПеременнойСреды); + ПеременныеСредыКоманды.Вставить(ИмяПеременнойСреды, Значение); МассивПараметров.Добавить(СтрШаблон("%1=%2", ИмяПараметра, СлужебныйIbcmdRunner.ШаблонПеременнойСреды(ИмяПеременнойСреды, ЭтоWindows))); КонецПроцедуры -// Подготовить параметры запуска команды создания информационной базы. +// Выполнить команду создания информационной базы. // Общая часть всех методов СоздатьИБ*: команда "infobase create", // локаль, смещение дат, флаги "--create-database" и "--force" и, // при необходимости, параметр источника данных. @@ -1234,7 +1228,7 @@ // ИмяПараметраИсточника - Строка - имя параметра источника данных // ("--restore", "--load", "--import") или пустая строка // ЗначениеИсточника - Строка - путь к источнику данных -Процедура ПодготовитьКомандуСозданияИБ( +Процедура ВыполнитьСозданиеИБ( Знач Локаль, Знач СмещениеДат, Знач ИмяПараметраИсточника = "", @@ -1252,6 +1246,8 @@ ПараметрыЗапуска.Добавить("--force"); + ВыполнитьКоманду(); + КонецПроцедуры // Добавить параметры фоновой (серверной) выгрузки, доступные с версии 8.3.21: @@ -1444,34 +1440,6 @@ КонецПроцедуры -// Возвращает массив имен переменных среды команды (без значений) -// Возвращаемое значение: -// Массив - имена переменных среды -Функция ИменаПеременныхСредыКоманды() - - Имена = Новый Массив; - Для Каждого КлючИЗначение Из ПеременныеСредыКоманды Цикл - Имена.Добавить(КлючИЗначение.Ключ); - КонецЦикла; - Возврат Имена; - -КонецФункции - -// Возвращает массив строковых представлений кодов возврата -// Параметры: -// КодыВозврата - Массив - коды возврата -// Возвращаемое значение: -// Массив - строковые представления кодов -Функция ПредставленияКодовВозврата(Знач КодыВозврата) - - Представления = Новый Массив; - Для Каждого Код Из КодыВозврата Цикл - Представления.Добавить(XMLСтрока(Код)); - КонецЦикла; - Возврат Представления; - -КонецФункции - // Инициализация работы библиотеки. // Задает минимальные настройки. // diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" index ad56233..90731f5 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" @@ -240,11 +240,10 @@ Процедура ПроверитьНомерПорта(Знач НомерПорта) + ТекстОшибки = СтрШаблон("Номер порта должен быть в диапазоне от 1000 до 65535, получено: %1", НомерПорта); Ожидаем.Что(НомерПорта).ИмеетТип("Число"); - Ожидаем.Что(НомерПорта, СтрШаблон("Номер порта должен быть в диапазоне от 1000 до 65535, получено: %1", НомерПорта)) - .Больше(1000); // BSLLS:MagicNumber-off - Ожидаем.Что(НомерПорта, СтрШаблон("Номер порта должен быть в диапазоне от 1000 до 65535, получено: %1", НомерПорта)) - .Меньше(65535); // BSLLS:MagicNumber-off + Ожидаем.Что(НомерПорта, ТекстОшибки).Больше(1000); // BSLLS:MagicNumber-off + Ожидаем.Что(НомерПорта, ТекстОшибки).Меньше(65535); // BSLLS:MagicNumber-off КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" index 9559ea1..8147d69 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" @@ -62,33 +62,19 @@ КомпонентыЭтойВерсии = МассивКомпонентВерсии(ЭтаВерсия); КомпонентыДругойВерсии = МассивКомпонентВерсии(ДругаяВерсия); - // Выравниваем количество компонент + // Недостающие компоненты считаются нулями: "8.3" = "8.3.0.0" + Для Индекс = 0 По Макс(КомпонентыЭтойВерсии.Количество(), КомпонентыДругойВерсии.Количество()) - 1 Цикл - ВерхняяГраница = Макс(КомпонентыЭтойВерсии.Количество(), КомпонентыДругойВерсии.Количество()) - 1; + ЭтаКомпонента = ?(Индекс < КомпонентыЭтойВерсии.Количество(), КомпонентыЭтойВерсии[Индекс], 0); + ДругаяКомпонента = ?(Индекс < КомпонентыДругойВерсии.Количество(), КомпонентыДругойВерсии[Индекс], 0); - Для Счетчик = КомпонентыЭтойВерсии.Количество() - 1 По ВерхняяГраница Цикл - КомпонентыЭтойВерсии.Добавить(0); - КонецЦикла; - - Для Счетчик = КомпонентыДругойВерсии.Количество() - 1 По ВерхняяГраница Цикл - КомпонентыДругойВерсии.Добавить(0); - КонецЦикла; - - Результат = 0; - - Для Счетчик = 0 По ВерхняяГраница Цикл - - Если КомпонентыЭтойВерсии[Счетчик] > КомпонентыДругойВерсии[Счетчик] Тогда - Результат = 1; - Прервать; - ИначеЕсли КомпонентыЭтойВерсии[Счетчик] < КомпонентыДругойВерсии[Счетчик] Тогда - Результат = -1; - Прервать; + Если ЭтаКомпонента <> ДругаяКомпонента Тогда + Возврат ?(ЭтаКомпонента > ДругаяКомпонента, 1, -1); КонецЕсли; КонецЦикла; - Возврат Результат; + Возврат 0; КонецФункции @@ -176,29 +162,8 @@ // Функция ЯвляетсяИменем(Знач ПроверяемаяСтрока) Экспорт - РазрешенныйПервыйСимвол = "_абвгдеёжзийклмнопрстуфхцчшщьыъэюяabcdefghijklmnopqrstuvwxyz"; - РазрешенныйСимвол = РазрешенныйПервыйСимвол + "0123456789"; - - ДлинаСтроки = СтрДлина(ПроверяемаяСтрока); - Если ДлинаСтроки = 0 Тогда - Возврат Ложь; - КонецЕсли; - - Результат = Истина; - - Для НомерСимвола = 1 По ДлинаСтроки Цикл - - Символ = НРег(Сред(ПроверяемаяСтрока, НомерСимвола, 1)); - ДопустимыеСимволы = ?(НомерСимвола = 1, РазрешенныйПервыйСимвол, РазрешенныйСимвол); - - Если СтрНайти(ДопустимыеСимволы, Символ) = 0 Тогда - Результат = Ложь; - Прервать; - КонецЕсли; - - КонецЦикла; - - Возврат Результат; + РегулярноеВыражение = Новый РегулярноеВыражение("^[a-zа-яёA-ZА-ЯЁ_][a-zа-яёA-ZА-ЯЁ0-9_]*$"); + Возврат РегулярноеВыражение.Совпадает(ПроверяемаяСтрока); КонецФункции