diff --git a/README.md b/README.md index d75b0e1..466e0bb 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ ``` Класс `КомандаGenerate` -Для добавления подкоманды в любую команду используется методы `ДобавитьПодкоманду` или `ДобавитьКоманду` +Для добавления подкоманды в любую команду используются методы `ДобавитьПодкоманду` или `ДобавитьКоманду` ```bsl diff --git a/package-loader.os b/package-loader.os deleted file mode 100644 index 61781d7..0000000 --- a/package-loader.os +++ /dev/null @@ -1,8 +0,0 @@ - -#Использовать "src/core" - -Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ) - - СтандартнаяОбработка = Ложь; - -КонецПроцедуры \ No newline at end of file diff --git a/packagedef b/packagedef index a4a589a..927f73d 100644 --- a/packagedef +++ b/packagedef @@ -12,11 +12,13 @@ .ВключитьФайл("src") .ВключитьФайл("docs") //.ВключитьФайл("tests") - .ВключитьФайл("package-loader.os") - .ВключитьФайл("packagedef") + //.ВключитьФайл("package-loader.os") + //.ВключитьФайл("packagedef") .ЗависитОт("logos") .ЗависитОт("delegate", "0.2.0") - //.ЗависитОт("fluent", "0.2.2") + .ЗависитОт("reflector", "0.5.1") + .ЗависитОт("fluent", "0.3.1") + .ЗависитОт("datetime", "0.1.0") .ЗависитОт("asserts") //.ЗависитОт("1bdd") // Необходимо установил для тестирования //.ЗависитОт("1testrunner") // Необходимо установил для тестирования diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\224\320\260\321\202\320\260\320\222\321\200\320\265\320\274\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\224\320\260\321\202\320\260\320\222\321\200\320\265\320\274\321\217.os" index 130362e..d1fa3c2 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\224\320\260\321\202\320\260\320\222\321\200\320\265\320\274\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\224\320\260\321\202\320\260\320\222\321\200\320\265\320\274\321\217.os" @@ -1,3 +1,4 @@ +#Использовать datetime Перем ОписаниеОшибкиКласса; Перем ФорматДаты; @@ -34,7 +35,9 @@ Функция УстановитьЗначение(Знач ВходящаяСтрока, Значение) Экспорт Попытка - Значение = РаботаСДатой.СтрокаВДату(ВходящаяСтрока, ФорматДаты); + ПроцессорДаты = Новый ДатаВремя(); + + Значение = ПроцессорДаты.СтрокаВДату(ВходящаяСтрока, ФорматДаты); Исключение Значение = Дата("20010101"); ОписаниеОшибкиКласса = ОписаниеОшибки(); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\234\320\260\321\201\321\201\320\270\320\262\320\224\320\260\321\202.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\234\320\260\321\201\321\201\320\270\320\262\320\224\320\260\321\202.os" index b4a56f6..80a87eb 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\234\320\260\321\201\321\201\320\270\320\262\320\224\320\260\321\202.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/internal/types/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\270\320\277\320\234\320\260\321\201\321\201\320\270\320\262\320\224\320\260\321\202.os" @@ -1,3 +1,4 @@ +#Использовать datetime Перем ОписаниеОшибкиКласса; Перем ФорматДаты; @@ -34,7 +35,9 @@ Функция УстановитьЗначение(Знач ВходящееЗначение, Значение) Экспорт Попытка - ВходящееЗначение = РаботаСДатой.СтрокаВДату(ВходящееЗначение, ФорматДаты); + ПроцессорДаты = Новый ДатаВремя(); + + ВходящееЗначение = ПроцессорДаты.СтрокаВДату(ВходящееЗначение, ФорматДаты); Значение.Добавить(ВходящееЗначение); Исключение Значение = Дата("20010101"); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index 5000c08..f1c118d 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -1,10 +1,12 @@ -#Использовать delegate -#Использовать logos #Использовать "./internal/lexer" #Использовать "./internal/parser" #Использовать "./internal/types" #Использовать "./internal/tools" #Использовать "./internal/path" +#Использовать delegate +#Использовать logos +#Использовать reflector +#Использовать fluent // Пользовательская строка использования текущей команды Перем Спек Экспорт; // Строка @@ -30,14 +32,14 @@ Перем КлассРеализации; // Объект Перем НачальноеСостояние; // Класс Совпадение -Перем РефлекторПроверкиКоманд; // Класс Рефлектор +Перем РасширенныйРефлектор; // Класс Рефлектор -Перем ДействиеВыполнения; // Класс Делегат -Перем ДействиеПередВыполнением; // Класс Делегат -Перем ДействиеПослеВыполнения; // Класс Делегат +Перем ИндексДействийКоманды; // Соответствие; Перем Лог; +#Область Публичное_API_класса + // Функция добавляет вложенную команду в текущую и возвращает экземпляр данной команды // // Параметры: @@ -47,13 +49,14 @@ // Так же используется, для автоматической настройки опций и параметров команды // // Возвращаемое значение: -// Команда - объект - класс КомандаПриложения +// объект - класс КомандаПриложения +// Функция ДобавитьПодкоманду(ИмяПодкоманды, ОписаниеПодкоманды, КлассРеализацииПодкоманды) Экспорт Подкоманда = Новый КомандаПриложения(ИмяПодкоманды, ОписаниеПодкоманды, КлассРеализацииПодкоманды, Приложение); - Подкоманда = ВыполнитьОписаниеКоманды(КлассРеализацииПодкоманды, Подкоманда); ВложенныеКоманды.Добавить(Подкоманда); + Возврат Подкоманда; КонецФункции @@ -68,7 +71,8 @@ // Так же используется, для автоматической настройки опций и параметров команды // // Возвращаемое значение: -// Команда - объект - класс КомандаПриложения +// объект - класс КомандаПриложения +// Функция ДобавитьКоманду(ИмяПодкоманды, ОписаниеПодкоманды, КлассРеализацииПодкоманды) Экспорт Возврат ДобавитьПодкоманду(ИмяПодкоманды, ОписаниеПодкоманды, КлассРеализацииПодкоманды); @@ -78,7 +82,8 @@ // Функция массив вложенных команд, текущей команды // // Возвращаемое значение: -// ВложенныеКоманды - массив - элементы класс КомандаПриложения +// Массив - элементы класс КомандаПриложения +// Функция ПолучитьПодкоманды() Экспорт Возврат ВложенныеКоманды; @@ -88,7 +93,8 @@ // Функция возвращает текущее имя команды // // Возвращаемое значение: -// Имя - строка - имя текущей команды +// Строка - имя текущей команды +// Функция ПолучитьИмяКоманды() Экспорт Возврат Имя; КонецФункции @@ -96,7 +102,8 @@ // Функция массив синонимов команды // // Возвращаемое значение: -// Синонимы - массив - элементы строка +// Массив - элементы строка +// Функция ПолучитьСинонимы() Экспорт Возврат Синонимы; КонецФункции @@ -104,7 +111,8 @@ // Функция возвращает описание команды // // Возвращаемое значение: -// Описание - строка - описание текущей команды +// Cтрока - описание текущей команды +// Функция ПолучитьОписание() Экспорт Возврат Описание; КонецФункции @@ -112,16 +120,17 @@ // Функция возвращает значение опции по переданному имени/синониму опции // // Параметры: -// ИмяОпции - строка - имя или синоним опции +// ИмяОпции - Строка - имя или синоним опции // // Возвращаемое значение: -// Значение - Произвольный - полученное значение в результате чтения строки использования или переменных окружения +// Произвольный - полученное значение в результате чтения строки использования или переменных окружения +// Функция ЗначениеОпции(Знач ИмяОпции) Экспорт ОпцияИндекса = ОпцияИзИндекса(ИмяОпции); - + Если ОпцияИндекса = Неопределено Тогда - + ЗначениеОпцииРодителя = ЗначениеОпцииКомандыРодителя(ИмяОпции); Если Не ЗначениеОпцииРодителя = Неопределено Тогда @@ -129,10 +138,10 @@ КонецЕсли; КонецЕсли; - + Если ОпцияИндекса = Неопределено Тогда - - ВызватьИсключение СтрШаблон("Ошибка получение значения опции <%1>. + + ВызватьИсключение СтрШаблон("Ошибка получение значения опции <%1>. |Опция не найдена в индексе опций команды", ИмяОпции); КонецЕсли; @@ -147,7 +156,8 @@ // ИмяАргумента - строка - имя аргумента // // Возвращаемое значение: -// Значение - Произвольный - полученное значение в результате чтения строки использования или переменных окружения +// Произвольный - полученное значение в результате чтения строки использования или переменных окружения +// Функция ЗначениеАргумента(Знач ИмяАргумента) Экспорт АргументИндекса = АргументИзИндекса(ИмяАргумента); @@ -170,25 +180,25 @@ КонецФункции -// Функция возвращает значение опции команды родителя по переданному имени/синониму опции +// Функция возвращает значение опции команды родителя по переданному имени/синониму опции // Возвращает первое из совпадений или неопределенно в случае отсутствия опции // // Параметры: // ИмяОпции - строка - имя или синоним опции // // Возвращаемое значение: -// Значение - Произвольный, Неопределенно - полученное значение в результате чтения строки использования или переменных окружения +// Произвольный, Неопределенно - полученное значение в результате чтения строки использования или переменных окружения // или неопределенно в случае отсутствия в индексе указанной опции Функция ЗначениеОпцииКомандыРодителя(Знач ИмяОпции) Экспорт Лог.Отладка("Ищю опцию <%1> для родителей", ИмяОпции); - + Для каждого РодительКоманды Из КомандыРодители Цикл - + Лог.Отладка(" --> Проверяю родителя <%1>", РодительКоманды.ПолучитьИмяКоманды()); - + ОпцияРодителя = РодительКоманды.ОпцияИзИндекса(ИмяОпции); - + Если НЕ ОпцияРодителя = Неопределено Тогда Возврат ОпцияРодителя.Значение; КонецЕсли; @@ -212,7 +222,7 @@ // ИмяАргумента - строка - имя аргумента // // Возвращаемое значение: -// Значение - Произвольный, Неопределенно - полученное значение в результате чтения строки использования или переменных окружения +// Произвольный, Неопределенно - полученное значение в результате чтения строки использования или переменных окружения // или неопределенно в случае отсутствия в индексе указанного аргумента Функция ЗначениеАргументаКомандыРодителя(Знач ИмяАргумента) Экспорт @@ -244,7 +254,7 @@ // // Возвращаемое значение: // Параметры - Соответствие - содержит Соответствие -// * Ключ - строка - имя или синоним опции/аргумента команды +// * Ключ - Строка - имя или синоним опции/аргумента команды // * Значение - Произвольный - полученное значение в результате чтения строки использования или переменных окружения Функция ПараметрыКоманды() Экспорт @@ -262,28 +272,15 @@ КонецФункции -// Предопределенная процедура ПередВыполнениемКоманды команды, если не задана процедура в классе. -// Содержит код определение необходимости вывода версии приложения -// -// Параметры: -// Команда - Объект - Класс "КомандаПриложения" -// -Процедура ПередВыполнениемКоманды(Знач Команда) Экспорт - Лог.Отладка("Выполнена стандартная обработка <ПередВыполнениемКоманды> для команды %1", Команда.ПолучитьИмяКоманды()); -КонецПроцедуры - -// Предопределенная процедура ПослеВыполненияКоманды команды, если не задана процедура в классе. -// -// Параметры: -// Команда - Объект - Класс "КомандаПриложения" -// -Процедура ПослеВыполненияКоманды(Знач Команда) Экспорт - Лог.Отладка("Выполнена стандартная обработка <ПослеВыполненияКоманды> для команды %1", Команда.ПолучитьИмяКоманды()); -КонецПроцедуры - // Процедура выводит справку по команде в консоль Процедура ВывестиСправку() Экспорт + СправкаВыведена = ВыполнитьДействиеКоманды("ВывестиСправку"); + + Если СправкаВыведена Тогда + Возврат; + КонецЕсли; + Представление = ?(КомандыРодители.Количество() > 0, "Команда", "Приложение"); Сообщить(СтрШаблон("%1: %2 @@ -307,9 +304,9 @@ ШаблонСтрокиИспользования = "Строка запуска: %1 %2 %3"; Сообщить(СтрШаблон(ШаблонСтрокиИспользования, - ПутьИспользования, - СокрЛП(Спек), - СуффиксВложенныхКоманды)); + ПутьИспользования, + СокрЛП(Спек), + СуффиксВложенныхКоманды)); Сообщить(""); @@ -350,7 +347,7 @@ ПредставлениеВлКоманды = СтрСоединить(ВложеннаяКоманда.ПолучитьСинонимы(), ", "); ТекущаяДлина = СтрДлина(ПредставлениеВлКоманды); - + НаименованиеДляСправки = ДополнитьСтрокуПробелами(ПредставлениеВлКоманды, МаксимальнаяДлинаКоманд - ТекущаяДлина); ОписаниеДляСправки = ВложеннаяКоманда.ПолучитьОписание(); Сообщить(СтрШаблон(ШаблонВложеннойКоманды, НаименованиеДляСправки, ОписаниеДляСправки)); @@ -365,36 +362,6 @@ КонецПроцедуры -Процедура ВывестиТаблицуСправки(ТаблицаДанных) - - ДобавочнаяДлинаДополнения = 3; - - ШаблонНаименования = " %1"+ Символы.Таб + "%2"; - - Для каждого СтрокаТаблицы Из ТаблицаДанных Цикл - - Сообщить(СтрШаблон(ШаблонНаименования, СтрокаТаблицы.Наименование, СтрокаТаблицы.Описание)); - - Если Не ПустаяСтрока(СтрокаТаблицы.ДополнительноеОписание) Тогда - - СтрокаНаименования = СтрШаблон(" %2%1%", Символы.Таб, СтрокаТаблицы.Наименование); - - ДлинаДополнения = СтрДлина(СтрокаНаименования) + ДобавочнаяДлинаДополнения; - МассивСтрок = СтрРазделить(СтрокаТаблицы.ДополнительноеОписание, Символы.ПС, Ложь); - - Для каждого СтрокаОписания Из МассивСтрок Цикл - ДопОписаниеСтроки = ДополнитьСтрокуПробеламиДо(СтрокаОписания, ДлинаДополнения); - Сообщить(ДопОписаниеСтроки); - КонецЦикла; - - КонецЕсли; - - КонецЦикла; - - Сообщить(""); - -КонецПроцедуры - // Основная процедура запуска команды приложения // // Параметры: @@ -431,12 +398,12 @@ Возврат; КонецЕсли; - ДействиеПередВыполнением.Исполнить(ЭтотОбъект); + ВыполнитьДействиеКоманды("ПередВыполнениемКоманды"); Если КонечныйИндексКоманды = АргументыCLI.ВГраница() Тогда Лог.Отладка("Выполняю полезную работу %1", Имя); - ДействиеВыполнения.Исполнить(ЭтотОбъект); + ВыполнитьДействиеКоманды("ВыполнитьКоманду"); Возврат; КонецЕсли; @@ -463,7 +430,7 @@ ВложеннаяКоманда.НачалоЗапуска(); ВложеннаяКоманда.Запуск(АргументыПодкоманды); - ДействиеПослеВыполнения.Исполнить(ЭтотОбъект); + ВыполнитьДействиеКоманды("ПослеВыполненияКоманды"); Возврат; @@ -471,7 +438,7 @@ КонецЦикла; - ДействиеПослеВыполнения.Исполнить(ЭтотОбъект); + ВыполнитьДействиеКоманды("ПослеВыполненияКоманды"); Если СтрНачинаетсяС(ПервыйАргумент, "-") Тогда ВывестиСправку(); @@ -488,7 +455,7 @@ // Функция проверяет строку, что она является ли синонимом текущей команды // // Параметры: -// СтрокаПроверки - строка - имя команды, для проверки +// СтрокаПроверки - Строка - имя команды, для проверки // // Возвращаемое значение: // булево - истина. если это синоним или имя текущей команды, иначе ложь @@ -525,27 +492,27 @@ Если Опции.Количество() > 0 Тогда Спек = "[ОПЦИИ] "; КонецЕсли; - + Если Аргументы.Количество() > 0 Тогда Спек = Спек + "-- "; КонецЕсли; Лог.Отладка("Количество аргументы строки: %1", Аргументы.Количество()); Для каждого арг Из Аргументы Цикл - + ИмяАргумента = арг.Ключ.Имя; КлассАргумента = арг.Ключ; ДополнитьИмяАргументаМассива(ИмяАргумента, КлассАргумента); ДополнитьИмяАргументаНеобязательного(ИмяАргумента, КлассАргумента); - + Лог.Отладка("Добавляю аргумет <%1> в спек <%2>", ИмяАргумента, Спек); Спек = Спек + ИмяАргумента + " "; - + КонецЦикла; КонецЕсли; - + Лог.Отладка("Разбираю строку использования с помощью лексера"); Лексер = Новый Лексер(Спек).Прочитать(); @@ -593,9 +560,9 @@ // Функция добавляет аргумент команды и возвращает экземпляр данной аргумента // // Параметры: -// Имя - строка - имя аргумента, в строке допустимо использование только из БОЛЬШИХ латинских букв, например "ARG" -// Значение - строка - значение аргумента по умолчанию -// Описание - объект - описание аргумента для справки. +// Имя - Строка - имя аргумента, в строке допустимо использование только из БОЛЬШИХ латинских букв, например "ARG" +// Значение - Строка - значение аргумента по умолчанию +// Описание - Объект - описание аргумента для справки. // // Возвращаемое значение: // ПараметрКоманды - Созданный параметр команды @@ -613,13 +580,13 @@ // Функция возвращает значение опции по переданному имени/синониму опции // // Параметры: -// ИмяОпции - строка - имя или синоним опции +// ИмяОпции - Строка - имя или синоним опции // // Возвращаемое значение: // ПараметраКоманды, Неопределенно - класс опции, находящийся в индексе Опций команды -// Неопределенно, в случае отсутствия в индексе опций с запрошенным именем +// Неопределенно, в случае отсутствия в индексе опций с запрошенным именем Функция ОпцияИзИндекса(Знач ИмяОпции) Экспорт - + Если СтрНачинаетсяС(ИмяОпции, "-") Или СтрНачинаетсяС(ИмяОпции, "--") Тогда // Ничего не делаем переданы уже нормализированные опции @@ -640,13 +607,13 @@ // Функция возвращает параметры команды для аргумента по переданному имени аргумента // // Параметры: -// ИмяАргумента - строка - имя аргумента +// ИмяАргумента - Строка - имя аргумента // // Возвращаемое значение: // ПараметраКоманды, Неопределенно - класс аргумента, находящийся в индексе Аргументов команды -// Неопределенно, в случае отсутствия в индексе аргумента с запрошенным именем +// Неопределенно, в случае отсутствия в индексе аргумента с запрошенным именем Функция АргументИзИндекса(Знач ИмяАргумента) Экспорт - + АргументИндекса = АргументыИндекс[ВРег(ИмяАргумента)]; Возврат АргументИндекса; @@ -656,16 +623,20 @@ // Процедура устанавливает процедуру "ВыполнитьКоманду" выполнения для команды // // Параметры: -// КлассРеализации - объект - класс, объект реализующий процедуру выполнения команды. -// ИмяПроцедуры - строка - имя процедуры, отличное от стандартного "ВыполнитьКоманду" +// ОбъектРеализации - Объект - класс, объект реализующий процедуру выполнения команды. +// ИмяПроцедуры - Строка - имя процедуры, отличное от стандартного "ВыполнитьКоманду" // -Процедура УстановитьДействиеВыполнения(КлассРеализации, ИмяПроцедуры = "ВыполнитьКоманду") Экспорт +Процедура УстановитьДействиеВыполнения(ОбъектРеализации, ИмяПроцедуры = "ВыполнитьКоманду") Экспорт + + РефлекторПроверки = ПолучитьРефлекторКласса(ОбъектРеализации); + ЕстьМетод = РефлекторПроверки.ЕстьПроцедура(ИмяПроцедуры, 1); - Если ПроверитьМетодВыполнитьКоманду(КлассРеализации, ИмяПроцедуры) Тогда - ВызватьИсключение СтрШаблон("У класса <%1> не задан обязательный метод <%2>", КлассРеализации, ИмяПроцедуры); + Если Не ЕстьМетод Тогда + ВызватьИсключение НоваяИнформацияОбОшибке("Ошибка установки действия <ВыполнитьКоманду>. Объект <%1> не содержит требуемого метода <%2>", ОбъектРеализации, ИмяПроцедуры); КонецЕсли; - ДействиеВыполнения = Делегаты.Создать(КлассРеализации, ИмяПроцедуры); + ДелегатДействия = Делегаты.Создать(ОбъектРеализации, ИмяПроцедуры); + ДобавитьВИндексДействиеКоманды("ВыполнитьКоманду", ДелегатДействия); КонецПроцедуры @@ -673,23 +644,24 @@ // запускаемую перед выполнением "ВыполнитьКоманду" // // Параметры: -// КлассРеализации - объект - класс, объект реализующий процедуру выполнения команды. -// ИмяПроцедуры - строка - имя процедуры, отличное от стандартного "ПередВыполнениемКоманды" +// ОбъектРеализации - Объект - класс, объект реализующий процедуру выполнения команды. +// ИмяПроцедуры - Строка - имя процедуры, отличное от стандартного "ПередВыполнениемКоманды" // -Процедура УстановитьДействиеПередВыполнением(КлассРеализации, ИмяПроцедуры = "ПередВыполнениемКоманды") Экспорт +Процедура УстановитьДействиеПередВыполнением(ОбъектРеализации, ИмяПроцедуры = "ПередВыполнениемКоманды") Экспорт - Лог.Отладка("Установка метода: перед выполнением класс <%1> имя процедуры <%2>", КлассРеализации, ИмяПроцедуры); + Лог.Отладка("Установка метода: перед выполнением класс <%1> имя процедуры <%2>", ОбъектРеализации, ИмяПроцедуры); - Если НЕ ПроверитьМетодПередВыполнениемКоманды(КлассРеализации, ИмяПроцедуры) Тогда - Лог.Отладка(" >> метод %2 у класс <%1> найден", КлассРеализации, ИмяПроцедуры); + РефлекторПроверки = ПолучитьРефлекторКласса(ОбъектРеализации); + ЕстьМетод = РефлекторПроверки.ЕстьПроцедура(ИмяПроцедуры, 1); - ДействиеПередВыполнением = Делегаты.Создать(КлассРеализации, ИмяПроцедуры); + Если Не ЕстьМетод Тогда + ВызватьИсключение НоваяИнформацияОбОшибке("Ошибка установки действия <ПередВыполнениемКоманды>. Объект <%1> не содержит требуемого метода <%2>", ОбъектРеализации, ИмяПроцедуры); + КонецЕсли; - ИначеЕсли ДействиеПередВыполнением = Неопределено Тогда + Лог.Отладка(" >> метод %2 у класс <%1> найден", ОбъектРеализации, ИмяПроцедуры); - Лог.Отладка("Установлен метод перед выполнением в текущий класс"); - ДействиеПередВыполнением = Делегаты.Создать(ЭтотОбъект, ИмяПроцедуры); - КонецЕсли; + ДелегатДействия = Делегаты.Создать(ОбъектРеализации, ИмяПроцедуры); + ДобавитьВИндексДействиеКоманды("ПередВыполнениемКоманды", ДелегатДействия); КонецПроцедуры @@ -697,28 +669,90 @@ // запускаемую после выполнением "ВыполнитьКоманду" // // Параметры: -// КлассРеализации - объект - класс, объект реализующий процедуру выполнения команды. -// ИмяПроцедуры - строка - имя процедуры, отличное от стандартного "ПослеВыполненияКоманды" +// ОбъектРеализации - Объект - класс, объект реализующий процедуру выполнения команды. +// ИмяПроцедуры - Строка - имя процедуры, отличное от стандартного "ПослеВыполненияКоманды" // -Процедура УстановитьДействиеПослеВыполнения(КлассРеализации, ИмяПроцедуры = "ПослеВыполненияКоманды") Экспорт +Процедура УстановитьДействиеПослеВыполнения(ОбъектРеализации, ИмяПроцедуры = "ПослеВыполненияКоманды") Экспорт + + Лог.Отладка("Установка метода: после выполнением класс <%1> имя процедуры <%2>", ОбъектРеализации, ИмяПроцедуры); + + РефлекторПроверки = ПолучитьРефлекторКласса(ОбъектРеализации); + ЕстьМетод = РефлекторПроверки.ЕстьПроцедура(ИмяПроцедуры, 1); + + Если Не ЕстьМетод Тогда + ВызватьИсключение НоваяИнформацияОбОшибке("Ошибка установки действия <ПослеВыполненияКоманды>. Объект <%1> не содержит требуемого метода <%2>", ОбъектРеализации, ИмяПроцедуры); + КонецЕсли; - Лог.Отладка("Установка метода: после выполнением класс <%1> имя процедуры <%2>", КлассРеализации, ИмяПроцедуры); + Лог.Отладка(" >> метод %2 у класс <%1> найден", ОбъектРеализации, ИмяПроцедуры); - Если НЕ ПроверитьМетодПослеВыполнениемКоманды(КлассРеализации, ИмяПроцедуры) Тогда + ДелегатДействия = Делегаты.Создать(ОбъектРеализации, ИмяПроцедуры); + ДобавитьВИндексДействиеКоманды("ПослеВыполненияКоманды", ДелегатДействия); - Лог.Отладка(" >> метод %2 у класс <%1> найден", КлассРеализации, ИмяПроцедуры); +КонецПроцедуры - ДействиеПослеВыполнения = Делегаты.Создать(КлассРеализации, ИмяПроцедуры); +// Процедура устанавливает процедуру "ВывестиСправку" для текущей команды +// +// Параметры: +// ОбъектРеализации - Объект - класс, объект реализующий процедуру вывода справки. +// ИмяПроцедуры - Строка - имя процедуры, отличное от стандартного "ВывестиСправку" +// +Процедура УстановитьДействиеВывестиСправку(ОбъектРеализации, ИмяПроцедуры = "ВывестиСправку") Экспорт - ИначеЕсли ДействиеПослеВыполнения = Неопределено Тогда + Лог.Отладка("Установка метода: после выполнением класс <%1> имя процедуры <%2>", ОбъектРеализации, ИмяПроцедуры); - Лог.Отладка("Установлен метод после выполнением в текущий класс"); - ДействиеПослеВыполнения = Делегаты.Создать(ЭтотОбъект, ИмяПроцедуры); + РефлекторПроверки = ПолучитьРефлекторКласса(ОбъектРеализации); + ЕстьМетод = РефлекторПроверки.ЕстьПроцедура(ИмяПроцедуры, 1); + Если Не ЕстьМетод Тогда + ВызватьИсключение НоваяИнформацияОбОшибке("Ошибка установки действия <ВывестиСправку>. Объект <%1> не содержит требуемого метода <%2>", ОбъектРеализации, ИмяПроцедуры); КонецЕсли; + Лог.Отладка(" >> метод %2 у класс <%1> найден", ОбъектРеализации, ИмяПроцедуры); + + ДелегатДействия = Делегаты.Создать(ОбъектРеализации, ИмяПроцедуры); + + ДобавитьВИндексДействиеКоманды("ВывестиСправку", ДелегатДействия); + КонецПроцедуры +// Возвращает таблицу опций команды +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица с колонками: +// * Наименование - Строка - наименование +// * НаименованияПараметров - Массив - массив строк, с полными наименованиями опции (например, [-f, --force]) +// * Описание - Строка - краткое описание +// * ПодробноеОписание - Строка - подробное описание +// * ПеременнаяОкружения - Строка - переменная окружения, возможно несколько через пробел +// * СкрытьЗначение - Булево - признак скрытия значения по умолчанию +// * Значение - Произвольный - строковое представление значения по умолчанию +// +Функция ПолучитьТаблицуОпций() Экспорт + + Возврат ПолучитьТаблицуПараметров(Опции); + +КонецФункции + +// Возвращает таблицу аргуметов команды +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица с колонками: +// * Наименование - Строка - наименование +// * НаименованияПараметров - Массив - массив строк, с полными наименованиями аргументов (например, [ARG, АРГУМЕНТ1]) +// * Описание - Строка - краткое описание +// * ПодробноеОписание - Строка - подробное описание +// * ПеременнаяОкружения - Строка - переменная окружения, возможно несколько через пробел +// * СкрытьЗначение - Булево - признак скрытия значения по умолчанию +// * Значение - Произвольный - строковое представление значения по умолчанию +// +Функция ПолучитьТаблицуАргументов() Экспорт + + Возврат ПолучитьТаблицуПараметров(Аргументы); + +КонецФункции + +#КонецОбласти + #Область Работа_с_входящими_аргументами Процедура ОчиститьАргументы(АргументыCLI) @@ -812,81 +846,37 @@ КонецПроцедуры -#КонецОбласти +Функция ВыполнитьДействиеКоманды(ИмяДействия) -#Область Работа_с_рефлектором_объектов - -Функция ВыполнитьОписаниеКоманды(КлассКоманды, Подкоманда) + ДелегатДействия = ИндексДействийКоманды[ИмяДействия]; - Если ПроверитьМетодОписаниеКоманды(КлассКоманды) Тогда - Возврат Подкоманда; + Если ДелегатДействия = Неопределено Тогда + Возврат Ложь; КонецЕсли; - ПараметрыВыполнения = Новый Массив; - ПараметрыВыполнения.Добавить(Подкоманда); - - ОписаниеКоманды = Делегаты.Создать(КлассКоманды, "ОписаниеКоманды"); - ОписаниеКоманды.Исполнить(ПараметрыВыполнения); - - Возврат ПараметрыВыполнения[0]; - -КонецФункции - -Функция ПроверитьМетодВыполнитьКоманду(ПроверяемыйКласс, ИмяПроцедуры) - - Возврат НЕ ПроверитьМетодКласса(ПроверяемыйКласс, ИмяПроцедуры , 1, Ложь); - -КонецФункции - -Функция ПроверитьМетодПередВыполнениемКоманды(ПроверяемыйКласс, ИмяПроцедуры) + ДелегатДействия.Исполнить(ЭтотОбъект); - Возврат НЕ ПроверитьМетодКласса(ПроверяемыйКласс, ИмяПроцедуры, 1, Ложь); + Возврат Истина; КонецФункции -Функция ПроверитьМетодПослеВыполнениемКоманды(ПроверяемыйКласс, ИмяПроцедуры) - - Возврат НЕ ПроверитьМетодКласса(ПроверяемыйКласс, ИмяПроцедуры, 1, Ложь); - -КонецФункции +#КонецОбласти -Функция ПроверитьМетодОписаниеКоманды(ПроверяемыйКласс) +#Область Работа_с_рефлектором_объектов - Возврат НЕ ПроверитьМетодКласса(ПроверяемыйКласс, "ОписаниеКоманды", 1, Ложь); +Функция ПолучитьРефлекторКласса(КлассПроверки) -КонецФункции + Если Не КлассПроверки = КлассРеализации Тогда -Функция ПроверитьМетодКласса(Знач ПроверяемыйКласс, - Знач ИмяМетода, - Знач ТребуемоеКоличествоПараметров = 0, - Знач ЭтоФункция = Ложь) + Возврат Новый РефлекторОбъекта(КлассРеализации); - ЕстьМетод = РефлекторПроверкиКоманд.МетодСуществует(ПроверяемыйКласс, ИмяМетода); - Лог.Отладка("Проверяемый метод <%1> найден: %2", ИмяМетода, ЕстьМетод); - Если Не ЕстьМетод Тогда - Возврат Ложь; - КонецЕсли; + Иначе - ТаблицаМетодов = РефлекторПроверкиКоманд.ПолучитьТаблицуМетодов(ПроверяемыйКласс); + Возврат РасширенныйРефлектор; - СтрокаМетода = ТаблицаМетодов.Найти(ИмяМетода, "Имя"); - Лог.Отладка("Поиск строки в таблице методов класса <%1> найдена: %2, общее количество методов класса: %3", - ПроверяемыйКласс, - НЕ СтрокаМетода = Неопределено, - ТаблицаМетодов.Количество()); - - Если СтрокаМетода = Неопределено Тогда - Возврат Ложь; КонецЕсли; - ПроверкаНаФункцию = ЭтоФункция = СтрокаМетода.ЭтоФункция; - ПроверкаНаКоличествоПараметров = ТребуемоеКоличествоПараметров = СтрокаМетода.КоличествоПараметров; - - Лог.Отладка("Проверяемый метод <%1> корректен: %2", ИмяМетода, ПроверкаНаФункцию И ПроверкаНаКоличествоПараметров); - Возврат ПроверкаНаФункцию - И ПроверкаНаКоличествоПараметров; - -КонецФункции // ПроверитьМетодУКласса() +КонецФункции #КонецОбласти @@ -904,12 +894,15 @@ КонецФункции Функция ПолучитьТаблицуДанныхДляСправки() - + Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить("Наименование"); Таблица.Колонки.Добавить("Описание"); - Таблица.Колонки.Добавить("ДлинаНаименования"); - Таблица.Колонки.Добавить("ДополнительноеОписание"); + Таблица.Колонки.Добавить("ПодробноеОписание"); + Таблица.Колонки.Добавить("ПеременнаяОкружения"); + Таблица.Колонки.Добавить("СкрытьЗначение"); + Таблица.Колонки.Добавить("НаименованияПараметров"); + Таблица.Колонки.Добавить("Значение"); Возврат Таблица; @@ -917,80 +910,74 @@ Функция ТаблицаАргументовДляСправки() - Таблица = ПолучитьТаблицуДанныхДляСправки(); - Если Аргументы.Количество() = 0 Тогда - Возврат Таблица; + Возврат ПолучитьТаблицуДанныхДляСправки(); КонецЕсли; - Для каждого КлючЗначение Из Аргументы Цикл + ТаблицаАргументов = ПолучитьТаблицуАргументов(); - АргументСправки = КлючЗначение.Ключ; + ОбработатьТаблицуПараметровДляСправки(ТаблицаАргументов); - НоваяЗапись = Таблица.Добавить(); + Возврат ТаблицаАргументов; +КонецФункции - ИмяОпции = АргументСправки.Имя; - ПеременныеОкружения = ФорматироватьПеременнуюОкруженияОпцииДляСправки(АргументСправки); - ЗначениеОпции = ФорматироватьЗначениеОпцииДляСправки(АргументСправки); - ОписаниеОпции = АргументСправки.Описание + " " + ПеременныеОкружения + " " + ЗначениеОпции; +Функция ТаблицаОпцийДляСправки() - НоваяЗапись.Наименование = ИмяОпции; - НоваяЗапись.Описание = ОписаниеОпции; - НоваяЗапись.ДополнительноеОписание = АргументСправки.ПолучитьПодробноеОписание(); - НоваяЗапись.ДлинаНаименования = СтрДлина(ИмяОпции) + 1; + Если Опции.Количество() = 0 Тогда + Возврат ПолучитьТаблицуДанныхДляСправки(); + КонецЕсли; - КонецЦикла; + ТаблицаОпций = ПолучитьТаблицуОпций(); - ТаблицаДляСортировки = Таблица.Скопировать(, "ДлинаНаименования"); - ТаблицаДляСортировки.Сортировать("ДлинаНаименования УБЫВ"); + ОбработатьТаблицуПараметровДляСправки(ТаблицаОпций); - МаксимальнаяДлина = ТаблицаДляСортировки[0].ДлинаНаименования; + Возврат ТаблицаОпций; - Для каждого СтрокаТаблицы Из Таблица Цикл +КонецФункции - ТекущаяДлина = СтрДлина(СтрокаТаблицы.Наименование); - Если ТекущаяДлина = МаксимальнаяДлина Тогда - Продолжить; - КонецЕсли; +Процедура ВывестиТаблицуСправки(ТаблицаДанных) - СтрокаТаблицы.Наименование = ДополнитьСтрокуПробелами(СтрокаТаблицы.Наименование, МаксимальнаяДлина - ТекущаяДлина); + ДобавочнаяДлинаДополнения = 3; - КонецЦикла; + ШаблонНаименования = " %1"+ Символы.Таб + "%2"; - Возврат Таблица; -КонецФункции + Для каждого СтрокаТаблицы Из ТаблицаДанных Цикл -Функция ТаблицаОпцийДляСправки() + Сообщить(СтрШаблон(ШаблонНаименования, СтрокаТаблицы.Наименование, СтрокаТаблицы.Описание)); - Таблица = ПолучитьТаблицуДанныхДляСправки(); - - Если Опции.Количество() = 0 Тогда - Возврат Таблица; - КонецЕсли; + Если Не ПустаяСтрока(СтрокаТаблицы.ПодробноеОписание) Тогда - Для каждого КлючЗначение Из Опции Цикл + СтрокаНаименования = СтрШаблон(" %2%1%", Символы.Таб, СтрокаТаблицы.Наименование); - ОпцияСправки = КлючЗначение.Ключ; + ДлинаДополнения = СтрДлина(СтрокаНаименования) + ДобавочнаяДлинаДополнения; + МассивСтрок = СтрРазделить(СтрокаТаблицы.ПодробноеОписание, Символы.ПС, Ложь); - НоваяЗапись = Таблица.Добавить(); + Для каждого СтрокаОписания Из МассивСтрок Цикл + ДопОписаниеСтроки = ДополнитьСтрокуПробеламиДо(СтрокаОписания, ДлинаДополнения); + Сообщить(ДопОписаниеСтроки); + КонецЦикла; - ИмяОпции = ФорматироватьИмяОпцииДляСправки(ОпцияСправки); - ПеременныеОкружения = ФорматироватьПеременнуюОкруженияОпцииДляСправки(ОпцияСправки); - ЗначениеОпции = ФорматироватьЗначениеОпцииДляСправки(ОпцияСправки); - ОписаниеОпции = ОпцияСправки.Описание + " " + ПеременныеОкружения + " " + ЗначениеОпции; - - НоваяЗапись.Наименование = ИмяОпции; - НоваяЗапись.Описание = ОписаниеОпции; - НоваяЗапись.ДополнительноеОписание = ОпцияСправки.ПолучитьПодробноеОписание(); - НоваяЗапись.ДлинаНаименования = СтрДлина(ИмяОпции) + 1; + КонецЕсли; КонецЦикла; - ТаблицаДляСортировки = Таблица.Скопировать(, "ДлинаНаименования"); - ТаблицаДляСортировки.Сортировать("ДлинаНаименования УБЫВ"); - МаксимальнаяДлина = ТаблицаДляСортировки[0].ДлинаНаименования; + Сообщить(""); + +КонецПроцедуры + +Процедура ОбработатьТаблицуПараметровДляСправки(ТаблицаПараметров) - Для каждого СтрокаТаблицы Из Таблица Цикл + МаксимальнаяДлина = 9; + + Для каждого СтрокаТаблицы Из ТаблицаПараметров Цикл + + СтрокаТаблицы.Наименование = ФорматироватьНаименованиеПараметраДляСправки(СтрокаТаблицы.НаименованияПараметров); + СтрокаТаблицы.Описание = СформироватьОписаниеДляСправки(СтрокаТаблицы); + МаксимальнаяДлина = Макс(МаксимальнаяДлина, СтрДлина(СтрокаТаблицы.Наименование) + 1); + + КонецЦикла; + + Для каждого СтрокаТаблицы Из ТаблицаПараметров Цикл ТекущаяДлина = СтрДлина(СтрокаТаблицы.Наименование); Если ТекущаяДлина = МаксимальнаяДлина Тогда @@ -1001,7 +988,25 @@ КонецЦикла; - Возврат Таблица; +КонецПроцедуры + +Функция СформироватьОписаниеДляСправки(СтрокаТаблицы) + + ПеременныеОкружения = ФорматироватьПеременнуюОкруженияОпцииДляСправки(СтрокаТаблицы.ПеременнаяОкружения); + ЗначениеОпции = ФорматироватьЗначениеОпцииДляСправки(СтрокаТаблицы.Значение, СтрокаТаблицы.СкрытьЗначение); + + МассивСоединения = Новый Массив; + МассивСоединения.Добавить(СтрокаТаблицы.Описание); + Если Не ПустаяСтрока(ПеременныеОкружения) Тогда + МассивСоединения.Добавить(ПеременныеОкружения); + КонецЕсли; + Если Не ПустаяСтрока(ЗначениеОпции) Тогда + МассивСоединения.Добавить(ЗначениеОпции); + КонецЕсли; + + ОписаниеДляСправки = СтрСоединить(МассивСоединения, " "); + + Возврат ОписаниеДляСправки КонецФункции @@ -1027,58 +1032,57 @@ КонецФункции -Функция ФорматироватьИмяОпцииДляСправки(Знач КлассОпции) - - КороткоеНаименование = ""; - ДлинноеНаименование = ""; +Функция ФорматироватьНаименованиеПараметраДляСправки(Знач НаименованияПараметров) ОграничениеДлины = 2; - Для каждого НаименованиеОпции Из КлассОпции.НаименованияПараметров Цикл + Если НаименованияПараметров.Количество() = 1 Тогда - Если СтрДлина(НаименованиеОпции) = ОграничениеДлины - И ПустаяСтрока(КороткоеНаименование) Тогда - КороткоеНаименование = НаименованиеОпции; - КонецЕсли; + НаименованиеПараметра = НаименованияПараметров[0]; - Если СтрДлина(НаименованиеОпции) > ОграничениеДлины - И ПустаяСтрока(ДлинноеНаименование) Тогда - ДлинноеНаименование = НаименованиеОпции; + Если Не СтрНачинаетсяС(НаименованиеПараметра, "-") Тогда + Возврат НаименованиеПараметра; КонецЕсли; - КонецЦикла; + Если СтрДлина(НаименованиеПараметра) = ОграничениеДлины Тогда + Возврат НаименованиеПараметра; + Иначе + Возврат СтрШаблон(" %1", НаименованиеПараметра); + КонецЕсли; - Если Не ПустаяСтрока(КороткоеНаименование) - И Не ПустаяСтрока(ДлинноеНаименование) Тогда - Возврат СтрШаблон("%1, %2", КороткоеНаименование, ДлинноеНаименование); - ИначеЕсли ЗначениеЗаполнено(КороткоеНаименование) И ПустаяСтрока(ДлинноеНаименование) Тогда - Возврат СтрШаблон("%1", КороткоеНаименование); - ИначеЕсли ЗначениеЗаполнено(ДлинноеНаименование) И ПустаяСтрока(КороткоеНаименование) Тогда - Возврат СтрШаблон(" %1", ДлинноеНаименование); КонецЕсли; - Возврат ""; + ПроцессорКоллекций = Новый ПроцессорКоллекций; + ПроцессорКоллекций.УстановитьКоллекцию(НаименованияПараметров); + СортированныеНаименования = ПроцессорКоллекций + .Сортировать("Результат = СтрДлина(Элемент1) > СтрДлина(Элемент2)") + .Получить(Тип("Массив")); + + НаименованиеПараметра = СтрСоединить(СортированныеНаименования, ", "); + + Лог.Отладка("Наименование опции для справки <%1>", НаименованиеПараметра); + + Возврат НаименованиеПараметра; КонецФункции -Функция ФорматироватьЗначениеОпцииДляСправки(Знач КлассОпции) +Функция ФорматироватьЗначениеОпцииДляСправки(Знач ЗначениеОпции, Знач СкрытьЗначение) - Если КлассОпции.СкрытьЗначение - ИЛИ НЕ ЗначениеЗаполнено(КлассОпции.ЗначениеВСтроку()) Тогда + Если СкрытьЗначение Тогда Возврат ""; КонецЕсли; - Возврат СтрШаблон("(по умолчанию %1)", КлассОпции.ЗначениеВСтроку()); + Возврат СтрШаблон("(по умолчанию %1)", ЗначениеОпции); КонецФункции -Функция ФорматироватьПеременнуюОкруженияОпцииДляСправки(Знач КлассОпции) +Функция ФорматироватьПеременнуюОкруженияОпцииДляСправки(Знач ПеременнаяОкружения) - Если ПустаяСтрока(СокрЛП(КлассОпции.ПеременнаяОкружения)) Тогда + Если ПустаяСтрока(СокрЛП(ПеременнаяОкружения)) Тогда Возврат ""; КонецЕсли; - СтрокаПеременнойОкружения = КлассОпции.ПеременнаяОкружения; + СтрокаПеременнойОкружения = ПеременнаяОкружения; МассивПО = СтрРазделить(СтрокаПеременнойОкружения, " ", Ложь); Результат = "(env"; @@ -1106,13 +1110,13 @@ Процедура ВывестиПутьПарсераВОтладке() Если Лог.Уровень() = УровниЛога.Отладка Тогда - + ОбработчикВыборкиПути = Новый ВыборСовпадений(); Лог.Отладка("Вывожу текущий путь парсинга: "); Лог.Отладка(ОбработчикВыборкиПути.СгенеритьСтрокуПути(НачальноеСостояние)); КонецЕсли; - + КонецПроцедуры // Дополняет признаком "[]" необязательности для аргумента @@ -1122,13 +1126,13 @@ // КлассАргумента - Класс - класс аргумента // Процедура ДополнитьИмяАргументаНеобязательного(ИмяАргумента, КлассАргумента) - + Если НЕ КлассАргумента.ПолучитьОбязательностьВвода() Тогда - + ИмяАргумента = СтрШаблон("[%1]", ИмяАргумента); КонецЕсли; - + КонецПроцедуры // Дополняет признаком "..." для аргумента массива @@ -1137,16 +1141,90 @@ // ИмяАргумента - Строка - Имя аргумента // КлассАргумента - Класс - класс аргумента // -Процедура ДополнитьИмяАргументаМассива(ИмяАргумента, КлассАргумента) - +Процедура ДополнитьИмяАргументаМассива(ИмяАргумента, КлассАргумента) + Если КлассАргумента.ЭтоМассив() Тогда - + ИмяАргумента = СтрШаблон("%1...", ИмяАргумента); КонецЕсли; - + +КонецПроцедуры + +Процедура ДобавитьВИндексДействиеКоманды(ИмяДействия, ДелегатДействия) + + ИндексДействийКоманды.Вставить(ИмяДействия, ДелегатДействия); + +КонецПроцедуры + +Процедура УстановитьСтандартныеОбработчики(РеализованныеМетодыКоманды) + + Если РеализованныеМетодыКоманды.ОписаниеКоманды Тогда + КлассРеализации.ОписаниеКоманды(ЭтотОбъект); + КонецЕсли; + + Если РеализованныеМетодыКоманды.ПередВыполнениемКоманды Тогда + ДелегатДействия = Делегаты.Создать(КлассРеализации, "ПередВыполнениемКоманды"); + ДобавитьВИндексДействиеКоманды("ПередВыполнениемКоманды", ДелегатДействия); + КонецЕсли; + + Если РеализованныеМетодыКоманды.ВыполнитьКоманду Тогда + ДелегатДействия = Делегаты.Создать(КлассРеализации, "ВыполнитьКоманду"); + ДобавитьВИндексДействиеКоманды("ВыполнитьКоманду", ДелегатДействия); + КонецЕсли; + + Если РеализованныеМетодыКоманды.ПослеВыполненияКоманды Тогда + ДелегатДействия = Делегаты.Создать(КлассРеализации, "ПослеВыполненияКоманды"); + ДобавитьВИндексДействиеКоманды("ПослеВыполненияКоманды", ДелегатДействия); + КонецЕсли; + + Если РеализованныеМетодыКоманды.ВывестиСправку Тогда + ДелегатДействия = Делегаты.Создать(КлассРеализации, "ВывестиСправку"); + ДобавитьВИндексДействиеКоманды("ВывестиСправку", ДелегатДействия); + КонецЕсли; + КонецПроцедуры +Функция НоваяИнформацияОбОшибке(Знач ТекстСообщения, + Знач Параметр1 = Неопределено, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) + + Если Параметр1 <> Неопределено Тогда + ТекстСообщения = СтрШаблон(ТекстСообщения, Параметр1, + Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); + КонецЕсли; + + ИнфИсключение = Новый ИнформацияОбОшибке(ТекстСообщения, ЭтотОбъект); + + Возврат ИнфИсключение; + +КонецФункции + +Функция ПолучитьТаблицуПараметров(ИндексПараметров) + + ТаблицаДанных = ПолучитьТаблицуДанныхДляСправки(); + + Для каждого КлючЗначение Из ИндексПараметров Цикл + + ПараметрСправки = КлючЗначение.Ключ; + + НоваяЗапись = ТаблицаДанных.Добавить(); + + НоваяЗапись.Наименование = ПараметрСправки.Имя; + НоваяЗапись.Описание = ПараметрСправки.Описание; + НоваяЗапись.ПодробноеОписание = ПараметрСправки.ПолучитьПодробноеОписание(); + НоваяЗапись.ПеременнаяОкружения = ПараметрСправки.ПеременнаяОкружения; + НоваяЗапись.СкрытьЗначение = ПараметрСправки.СкрытьЗначение; + НоваяЗапись.НаименованияПараметров = ПараметрСправки.НаименованияПараметров; + НоваяЗапись.Значение = ПараметрСправки.ЗначениеВСтроку(); + + КонецЦикла; + + Возврат ТаблицаДанных; + +КонецФункции + #КонецОбласти Процедура ПриСозданииОбъекта(ИмяКоманды, ОписаниеКоманды, КлассРеализацииКоманды, ПриложениеКоманды = Неопределено) @@ -1164,19 +1242,25 @@ ОпцииИндекс = Новый Соответствие; АргументыИндекс = Новый Соответствие; + ИндексДействийКоманды = Новый Соответствие; + Приложение = ПриложениеКоманды; Спек = ""; ПодробноеОписание = ""; - РефлекторПроверкиКоманд = Новый Рефлектор; + РасширенныйРефлектор = Новый РефлекторОбъекта(КлассРеализации); - ДействиеПередВыполнением = Неопределено; - ДействиеПослеВыполнения = Неопределено; + ИнтерфейсКоманды = Новый ИнтерфейсОбъекта(); + ИнтерфейсКоманды.П("ОписаниеКоманды", 1) + .П("ПередВыполнениемКоманды", 1) + .П("ВыполнитьКоманду", 1) + .П("ПослеВыполненияКоманды", 1) + .П("ВывестиСправку", 1) + ; - УстановитьДействиеВыполнения(КлассРеализацииКоманды); - УстановитьДействиеПередВыполнением(КлассРеализацииКоманды); - УстановитьДействиеПослеВыполнения(КлассРеализацииКоманды); + РеализованныеМетодыКоманды = РасширенныйРефлектор.РеализованныеМетодыИнтерфейса(ИнтерфейсКоманды); + УстановитьСтандартныеОбработчики(РеализованныеМетодыКоманды); КонецПроцедуры diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" index afd2d83..d540993 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" @@ -140,8 +140,6 @@ // Подробное описание - строка - вызывает у класса значения параметра функцию "ПодробноеОписание" Функция ПолучитьПодробноеОписание() Экспорт - ПодробноеОписаниеПараметра = ""; - ВстроенныеТипы = ВстроенныеТипЗначенийПараметров(); ОпределенныйТип = ВстроенныеТипы[Строка(ТипЗнч(ТипЗначенияПараметра))]; Если ОпределенныйТип = Неопределено diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\224\320\260\321\202\320\276\320\271.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\224\320\260\321\202\320\276\320\271.os" deleted file mode 100644 index d775e81..0000000 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\224\320\260\321\202\320\276\320\271.os" +++ /dev/null @@ -1,41 +0,0 @@ - -// Процедура СтрокаВДату преобразует строку в дату по шаблону форматной строки -// -// Параметры -// Строка - строка, содержащая дату, -// ФорматДаты - форматная строка вида: -// [dd MM yy] -// [yy-MM-dd HH:mm] -// [dd MM yy HH mm ss] -// [dd MM yyyy] -// [MM dd, yyyy, HH:mm] -// [dd.MM.yy] -// [MM, dd, yyyy] -// [yyyyMMdd] -// [HH-mm-ss, dd-MM-yy] -// [dd] -// [dd MM HH:mm:ss yyyy] -// [HH:mm:ss] -// [HH:mm] -// [yyyy-MM-dd HH:mm:ss] -// [yyyy-MM-dd] -// [yyyy/MM/dd] -// [dd/MM/yy] -// [MM dd yyyy] -// [yyyy-MM] -// [yyyy] -// [MM, dd, yyyy] -// [dd-MM-yyyy] -// [ddMMyyyy] -// -Функция СтрокаВДату(Знач Строка, ФорматДаты) Экспорт - Ч = Новый Соответствие; - Для ё = 1 По СтрДлина(ФорматДаты) + 6 Цикл - Ч[Сред(ФорматДаты + "dMyHms", ё, 1)] = 0 - КонецЦикла; - Для ё = 1 По СтрДлина(ФорматДаты) Цикл - Ч[Сред(ФорматДаты, ё, 1)] = 10 * Ч[Сред(ФорматДаты, ё, 1)] + Найти("123456789", Сред(Строка, ё, 1)); - КонецЦикла; - Ч["y"] = Ч["y"] + ?(0 < Ч["y"] И Ч["y"] < 50, 2000, ?(0 < Ч["y"] И Ч["y"] < 100, 1900, 0)); - Возврат Дата(Макс(Ч["y"], 1), Макс(Ч["M"],1), Макс(Ч["d"],1), Ч["H"], Ч["m"], Ч["s"]); -КонецФункции \ No newline at end of file diff --git a/tasks/coverage.os b/tasks/coverage.os index d58dc9d..41f8364 100644 --- a/tasks/coverage.os +++ b/tasks/coverage.os @@ -1,5 +1,6 @@ #Использовать coverage #Использовать 1commands +#Использовать fs ФС.ОбеспечитьПустойКаталог("coverage"); ПутьКСтат = "coverage/stat.json"; diff --git "a/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" "b/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" index 06c526e..55d6bf1 100644 --- "a/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" +++ "b/tests/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217_test.os" @@ -42,7 +42,7 @@ // ИменаТестов.Добавить("ТестДолжен_СложныеСлучаиФормированияСтрокиИспользования"); - // ИменаТестов.Добавить("ТестДолжен_ПроверитьВыводСправки"); + ИменаТестов.Добавить("ТестДолжен_ПроверитьВыводСправки"); // ИменаТестов.Добавить("ТестДолжен_ПроверитьВыводВерсии"); // ИменаТестов.Добавить("ТестДолжен_ПроверитьВыполнениеОбработчикаПередВыполнениемКоманды"); @@ -354,6 +354,23 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьВыводСправки() Экспорт + + Спек = ""; + Команда = ПодготовитьТестовуюКоманду(Спек); + ОпцияМассив = Команда.Опция("env", Новый Массив, "Тестовый массив опций").ТМассивСтрок(); + АргументСтрока = Команда.Аргумент("ARG", "", "Тестовый простой необязательный аргумент").ТМассивСтрок().Обязательный(Ложь); + АргументСтрока2 = Команда.Аргумент("ARG2", "", "Тестовый простой необязательный аргумент").Обязательный(); + ОпцияПеречисление = Команда.Опция("enum e em", "yellow", "Опция перечисление").ТПеречисление() + .Перечисление("yellow", "yellow", "Это желтый цвет") + .Перечисление("red", "red" , "Это красный цвет") + .Перечисление("blue", "blue", "Это синий цвет") + ; + + Команда.ВывестиСправку(); + +КонецПроцедуры + Функция ПодготовитьТестовуюКоманду(Спек = "") Команда = Новый КомандаПриложения("testapp", "", ЭтотОбъект);