From 300c998b61f923482bd62ff53e9210d73bb61461 Mon Sep 17 00:00:00 2001
From: Anton Myagkov 
Date: Tue, 4 Dec 2018 20:10:03 +0300
Subject: [PATCH 1/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?=
 =?UTF-8?q?=D0=B0=20=D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D1=8C?=
 =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?=
 =?UTF-8?q?=D1=80=D0=BE=D0=B2=20=D0=B8=20=D0=B8=D1=85=20=D0=BF=D1=80=D0=BE?=
 =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?=
 =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20`=D0=9E=D0=B1=D1=8F=D0=B7?=
 =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=D0=9F=D0=B0?=
 =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=D0=97=D0=B0=D0=BF?=
 =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D1=8B`=20=D0=9E=D0=B1=D0=BD?=
 =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D1=91=D0=BD=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?=
 =?UTF-8?q?=D1=8C=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?=
 =?UTF-8?q?=D0=BD=D0=B8=D1=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Обновление тестов
---
 src/cmdline.os        | 172 +++++++++++++++++++++++++-------------
 tests/cmdline-test.os | 186 +++++++++++++++++++++++++++---------------
 2 files changed, 233 insertions(+), 125 deletions(-)
diff --git a/src/cmdline.os b/src/cmdline.os
index ab864ca..e8fd4dd 100644
--- a/src/cmdline.os
+++ b/src/cmdline.os
@@ -1,8 +1,11 @@
 #Использовать logos
 
+#Область ПеременныхМодуля
+
 Перем Лог;
 Перем мПараметры;
 Перем мПозиционныеПараметры;
+Перем мРезультатРазбора;
 
 Перем мКоманды;
 
@@ -10,33 +13,37 @@
 Перем мПозицияПозиционныхПараметров;
 Перем мМассивВходныхПараметров;
 
+#КонецОбласти
+
+#Область ПрограммныйИнтерфейс
+
 Функция ДобавитьПараметр(Знач ИмяПараметра, Знач Пояснение = "") Экспорт
 	
-	Лог.Отладка("ДобавитьПараметр: ИмяПараметра <"+ИмяПараметра+">");		
+	Лог.Отладка(СтрШаблон("ДобавитьПараметр: ИмяПараметра <%1>", ИмяПараметра));
 	
-	Возврат ДобавитьПараметрВТаблицу(мПозиционныеПараметры, ИмяПараметра, Пояснение, Ложь, Ложь);
+	Возврат ДобавитьПараметрВТаблицу(мПозиционныеПараметры, ИмяПараметра, Пояснение, Ложь, Ложь, Ложь);
 	
 КонецФункции
 
-Функция ДобавитьИменованныйПараметр(Знач ИмяПараметра, Знач Пояснение = "", Знач Глобальный = Ложь) Экспорт
+Функция ДобавитьИменованныйПараметр(Знач ИмяПараметра, Знач Пояснение = "", Знач Глобальный = Ложь, Обязательный = Ложь) Экспорт
 	
-	Лог.Отладка("ДобавитьИменованныйПараметр: ИмяПараметра <"+ИмяПараметра+">");		
+	Лог.Отладка(СтрШаблон("ДобавитьИменованныйПараметр: ИмяПараметра <%1>", ИмяПараметра));
 	
-	Возврат ДобавитьПараметрВТаблицу(мПараметры, ИмяПараметра, Пояснение, Ложь, Глобальный);
+	Возврат ДобавитьПараметрВТаблицу(мПараметры, ИмяПараметра, Пояснение, Ложь, Глобальный, Обязательный);
 	
 КонецФункции
 
 Функция ДобавитьПараметрФлаг(Знач ИмяПараметра, Знач Пояснение = "", Знач Глобальный = Ложь) Экспорт
 	
-	Лог.Отладка("ДобавитьПараметрФлаг: ИмяПараметра <"+ИмяПараметра+">");		
+	Лог.Отладка(СтрШаблон("ДобавитьПараметрФлаг: ИмяПараметра <%1>", ИмяПараметра));
 	
-	Возврат ДобавитьПараметрВТаблицу(мПараметры, ИмяПараметра, Пояснение, Истина, Глобальный);
+	Возврат ДобавитьПараметрВТаблицу(мПараметры, ИмяПараметра, Пояснение, Истина, Глобальный, Ложь);
 	
 КонецФункции
 
 Функция ДобавитьПараметрКоллекция(Знач ИмяПараметра, Знач Пояснение = "") Экспорт
 	
-	Лог.Отладка("ДобавитьПараметрКоллекция: ИмяПараметра <"+ИмяПараметра+">");		
+	Лог.Отладка(СтрШаблон("ДобавитьПараметрКоллекция: ИмяПараметра <%1>", ИмяПараметра));
 	
 	Возврат ДобавитьПараметрКоллекцияВТаблицу(мПозиционныеПараметры, ИмяПараметра, Пояснение);
 	
@@ -60,7 +67,7 @@
 	Если мКоманды.Получить(ИмяКоманды) <> Неопределено Тогда
 		ВызватьИсключение СтрШаблон("Команда <%1> уже добавлена ранее, повторное добавление является ошибкой!", ИмяКоманды);
 	КонецЕсли;
-
+	
 	мКоманды.Вставить(ИмяКоманды, ОписаниеКоманды);
 	
 КонецПроцедуры
@@ -72,27 +79,27 @@
 КонецФункции
 
 Функция ДобавитьПозиционныйПараметрКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка("Добавляю позиционный параметр "+ИмяПараметра);
-	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ПозиционныеПараметры, ИмяПараметра, Пояснение, Ложь);
+	Лог.Отладка(СтрШаблон("Добавляю позиционный параметр %1",ИмяПараметра));
+	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ПозиционныеПараметры, ИмяПараметра, Пояснение, Ложь, Ложь, Ложь);
 КонецФункции
 
 Функция ДобавитьИменованныйПараметрКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка("Добавляю именованный параметр "+ИмяПараметра);
-	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение, Ложь);
+	Лог.Отладка(СтрШаблон("Добавляю именованный параметр %1",ИмяПараметра));
+	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение, Ложь, Ложь, Ложь);
 КонецФункции
 
 Функция ДобавитьПараметрФлагКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка("Добавляю параметр-флаг "+ИмяПараметра);
-	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение, Истина);
+	Лог.Отладка(СтрШаблон("Добавляю параметр-флаг %1", ИмяПараметра));
+	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение, Истина, Ложь, Ложь);
 КонецФункции
 
 Функция ДобавитьПараметрКоллекцияКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка("Добавляю параметр-коллекция "+ИмяПараметра);
+	Лог.Отладка(СтрШаблон("Добавляю параметр-коллекция %1", ИмяПараметра));
 	Возврат ДобавитьПараметрКоллекцияВТаблицу(ОписаниеКоманды.ПозиционныеПараметры, ИмяПараметра, Пояснение);
 КонецФункции
 
 Функция ДобавитьИменованныйПараметрКоллекцияКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка("Добавляю параметр-коллекция "+ИмяПараметра);
+	Лог.Отладка(СтрШаблон("Добавляю параметр-коллекция %1",ИмяПараметра));
 	Возврат ДобавитьПараметрКоллекцияВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение);
 КонецФункции
 
@@ -112,7 +119,7 @@
 	Для Каждого СтрГлобальныйПараметр Из ГлобальныеПараметры Цикл
 		СтрСуществующий = ОписаниеКоманды.ИменованныеПараметры.Найти(СтрГлобальныйПараметр.Имя,"Имя");
 		Если СтрСуществующий = Неопределено Тогда
-			Лог.Отладка("Добавляю глобальный параметр: " + СтрГлобальныйПараметр.Имя);
+			Лог.Отладка(СтрШаблон("Добавляю глобальный параметр: %1",СтрГлобальныйПараметр.Имя));
 			ЗаполнитьЗначенияСвойств(ОписаниеКоманды.ИменованныеПараметры.Добавить(), СтрГлобальныйПараметр,, "ЭтоГлобальныйПараметр");
 		КонецЕсли;
 	КонецЦикла;
@@ -137,7 +144,7 @@
 Функция Разобрать(Знач ВходнойМассивПараметров) Экспорт
 	
 	Если Лог.Уровень() = УровниЛога.Отладка Тогда
-		Лог.Отладка("ВходнойМассивПараметров <%1>", СтрокаПараметров(ВходнойМассивПараметров));
+		Лог.Отладка(СтрШаблон("ВходнойМассивПараметров <%1>", СтрокаПараметров(ВходнойМассивПараметров)));
 	КонецЕсли;
 	
 	ОписаниеКоманды = Неопределено;
@@ -156,12 +163,12 @@
 		мПозицияПозиционныхПараметров = 0;
 		мПозицияВСпискеТокенов        = 0;
 		
-		РезультатРазбора = РазобратьАргументы(мПараметры, мПозиционныеПараметры);
+		мРезультатРазбора = РазобратьАргументы(мПараметры, мПозиционныеПараметры);
 		
 		Лог.Отладка("Трассировка РезультатКоманды.ЗначенияПараметров:");
-		ВывестиРезультатРазбора(РезультатРазбора);
+		ВывестиРезультатРазбора(мРезультатРазбора);
 		
-		Возврат РезультатРазбора;
+		Возврат мРезультатРазбора;
 	КонецЕсли;
 	
 КонецФункции
@@ -172,7 +179,7 @@
 		Строка = Строка + Параметр + " ";
 	КонецЦикла;
 	Возврат Строка;
-КонецФункции // СтрокаПараметров()
+КонецФункции
 
 Функция СправкаПоПараметрам() Экспорт
 	Возврат ТаблицаСправкаПоПараметрам(мПараметры, мПозиционныеПараметры, Ложь);
@@ -222,7 +229,7 @@
 Процедура ВывестиСправкуПоКомандам() Экспорт
 	
 	Сообщить("Возможные команды:");
-
+	
 	ВозможныеКоманды = СправкаВозможныеКоманды();
 	
 	МаксШирина = 0;
@@ -233,23 +240,23 @@
 			МаксШирина = ТекШирина;
 		КонецЕсли;
 	КонецЦикла;
-
+	
 	Для Каждого Команда Из ВозможныеКоманды Цикл
-		Сообщить(" " + Лев(Команда.Команда + Поле, МаксШирина + 2) + "- " + Команда.Пояснение);
+		Сообщить(СтрШаблон(" %1 - %2" , Лев(Команда.Команда + Поле, МаксШирина + 2), Команда.Пояснение));
 	КонецЦикла;
 	
 КонецПроцедуры
 
 Процедура ВывестиСправкуПоКоманде(Знач ИмяКоманды) Экспорт
-
+	
 	ВозможныеКоманды = СправкаВозможныеКоманды();
 	ОписаниеКоманды = ВозможныеКоманды.Найти(ИмяКоманды, "Команда");
 	Если ОписаниеКоманды = Неопределено Тогда
-		Сообщить("Команда отсуствует: " + ИмяКоманды);
+		Сообщить(СтрШаблон("Команда отсуствует: %1", ИмяКоманды));
 		Возврат;
 	КонецЕсли;
-
-	Сообщить("" + ОписаниеКоманды.Команда + " - " + ОписаниеКоманды.Пояснение);
+	
+	Сообщить(СтрШаблон("%1 - %2", ОписаниеКоманды.Команда , ОписаниеКоманды.Пояснение));
 	Сообщить("Параметры:");
 	Для Каждого СтрПараметр Из ОписаниеКоманды.Параметры Цикл
 		Если Не СтрПараметр.ЭтоИменованныйПараметр Тогда
@@ -261,6 +268,45 @@
 
 КонецПроцедуры
 
+// Проверяет наличие незаполненных обязательных параметров.
+// Обязательными могут быть только именованные параметры. 
+// Обязательно именованного параметра определяется при добавлении
+//
+// Параметры:
+//   Объект                            - Произвольный - записываемый объект ссылочного типа. Например, СправочникОбъект.
+//   ВыводитьОшибки                    - Булево - Определяет выводить ли через Сообщить() ошибки в консоль,
+//                                                при этом параллельно записывает отладочную информацию в лог. 
+// Возвращаемое значение:
+//   Булево - Если заполнены все параметры, то возвращает Истина, в противном случае Ложь
+//
+Функция ОбязательныеПараметрыЗаполнены(ВыводитьОшибки = Ложь) Экспорт
+	
+	МассивНезаполненныхПараметров = мПараметры.НайтиСтроки(Новый Структура("Обязательный", Истина));
+	
+	ВсеПараметрыЗаполнены = Истина;
+	
+	Для Каждого Строка Из МассивНезаполненныхПараметров Цикл
+		Если мРезультатРазбора[Строка.Имя] = Неопределено Тогда
+			
+			ВсеПараметрыЗаполнены = Ложь;
+			
+			Если ВыводитьОшибки И Лог.Уровень() > 0 Тогда
+				Сообщить(СтрШаблон("Не заполнен обязательный параметр %1", Строка.Имя));
+			Иначе
+				Лог.Отладка(СтрШаблон("Не заполнен обязательный параметр %1", Строка.Имя));
+			КонецЕсли;
+		КонецЕсли;
+		
+	КонецЦикла;
+	
+	Возврат ВсеПараметрыЗаполнены;
+	
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныйПрограммныйИнтерфейс
+
 Функция ТаблицаСправкаПоПараметрам(Знач ИменованныеПараметры, Знач ПозиционныеПараметры, Знач ДобавлятьГлобальныеПараметры)
 	
 	ТабРезультат = НоваяТаблицаПараметров();
@@ -277,7 +323,7 @@
 		ЗаполнитьЗначенияСвойств(СтрРезультат, Стр);
 		СтрРезультат.ЭтоИменованныйПараметр = Истина;
 	КонецЦикла;
-
+	
 	Если ДобавлятьГлобальныеПараметры Тогда
 		
 		ГлобальныеПараметры = мПараметры.НайтиСтроки(Новый Структура("ЭтоГлобальныйПараметр", Истина));
@@ -289,9 +335,9 @@
 				СтрРезультат.ЭтоИменованныйПараметр = Истина;
 			КонецЕсли;
 		КонецЦикла;
-
+	
 	КонецЕсли;
-
+	
 	Для Каждого Стр Из ПозиционныеПараметры.НайтиСтроки(Новый Структура("ЭтоКоллекция", Истина)) Цикл
 		СтрРезультат = ТабРезультат.Добавить();
 		ЗаполнитьЗначенияСвойств(СтрРезультат, Стр);
@@ -304,8 +350,8 @@
 
 Процедура РазобратьИменованныйПараметр(Знач Токен, Значение, Знач ИменованныеПараметры, Знач РезультатРазбора)
 	Перем ЗначениеТокена;
-
-	Лог.Отладка("Это именованный параметр: " + Токен + " ?");
+	
+	Лог.Отладка(СтрШаблон("Это именованный параметр: %1?",  Токен));
 	СтрПараметр = ИменованныеПараметры.Найти(Токен, "Имя");
 	//TODO: для параметров вида --param=value значение получаем сразу и передаем в процедуру,
 	// а в случаи пустого получаем следующий параметр.
@@ -321,8 +367,8 @@
 	Иначе
 		РезультатРазбора[Токен] = ЗначениеТокена;
 	КонецЕсли;
-	Лог.Отладка("Нашли значение именованного параметра: " + РезультатРазбора[Токен]);
-
+	Лог.Отладка(СтрШаблон("Нашли значение именованного параметра: %1", РезультатРазбора[Токен]));
+	
 КонецПроцедуры
 
 Функция РазобратьАргументы(Знач ИменованныеПараметры, Знач ПозиционныеПараметры)
@@ -331,20 +377,25 @@
 	РезультатРазбора = Новый Соответствие;
 	
 	Для Каждого СтрПараметр Из ИменованныеПараметры.НайтиСтроки(Новый Структура("ЭтоФлаг",Истина)) Цикл
-		Лог.Отладка("Сбрасываю параметр-флаг: " + СтрПараметр.Имя);
+		Лог.Отладка(СтрШаблон("Сбрасываю параметр-флаг: %1", СтрПараметр.Имя));
 		РезультатРазбора[СтрПараметр.Имя] = Ложь;
 	КонецЦикла;
-
+	
+	Для Каждого СтрПараметр Из ИменованныеПараметры.НайтиСтроки(Новый Структура("Обязательный",Истина)) Цикл
+		Лог.Отладка(СтрШаблон("Создаю обязательный параметры: %1", СтрПараметр.Имя));
+		РезультатРазбора[СтрПараметр.Имя] = Неопределено;
+	КонецЦикла;
+	
 	Если мМассивВходныхПараметров.Количество() = 0 Тогда 
 		Лог.Отладка("Параметров не передали.");
 		Возврат РезультатРазбора;
 	КонецЕсли;
-
+	
 	ТекущийПараметрКоллекция = Неопределено;
 	Пока Истина Цикл
 		
 		Токен = СледующийТокен();
-		Лог.Отладка("Выбран токен: " + Токен);
+		Лог.Отладка(СтрШаблон("Выбран токен: %1", Токен));
 		Если Токен = Неопределено Тогда
 			Лог.Отладка("Закончились токены");
 			
@@ -362,9 +413,9 @@
 		Если ЭтоИменованныйПараметр(Токен, ИменованныеПараметры) Тогда
 			РазобратьИменованныйПараметр(Токен, Неопределено, ИменованныеПараметры, РезультатРазбора);
 		ИначеЕсли ЭтоПараметрФлаг(Токен, ИменованныеПараметры) Тогда
-			Лог.Отладка("Это параметр-флаг: " + Токен + " ?");
+			Лог.Отладка(СтрШаблон("Это параметр-флаг: %1?",Токен));
 			РезультатРазбора[Токен] = Истина;
-			Лог.Отладка("Нашли параметр-флаг: " + РезультатРазбора[Токен]);
+			Лог.Отладка(СтрШаблон("Нашли параметр-флаг: %1", РезультатРазбора[Токен]));
 		ИначеЕсли СтрНайти(Токен, "=") > 0 И Лев(Токен, 2) = "--" Тогда
 			Индекс = СтрНайти(Токен, "=");
 			КлючТокена = Лев(Токен, Индекс-1);
@@ -372,17 +423,17 @@
 			Если ЭтоИменованныйПараметр(СокрЛП(КлючТокена), ИменованныеПараметры) Тогда
 				РазобратьИменованныйПараметр(КлючТокена, ЗначениеТокена, ИменованныеПараметры, РезультатРазбора);
 			Иначе
-				ВызватьИсключение "Ожидается именованный параметр " + КлючТокена;
+				ВызватьИсключение СтрШаблон("Ожидается именованный параметр %1", КлючТокена);
 			КонецЕсли;
 		Иначе
 			ОписаниеПараметра = СледующийПозиционныйПараметр(ПозиционныеПараметры);
 			Если ОписаниеПараметра.ЭтоКоллекция Тогда
-				Лог.Отладка("Перехожу к чтению параметра-коллекции <"+ОписаниеПараметра.Имя+">");
+				Лог.Отладка(СтрШаблон("Перехожу к чтению параметра-коллекции <%1>",ОписаниеПараметра.Имя));
 				ТекущийПараметрКоллекция = Новый Массив;
 				РезультатРазбора[ОписаниеПараметра.Имя] = ТекущийПараметрКоллекция;
 				ТекущийПараметрКоллекция.Добавить(Токен);
 			Иначе
-				Лог.Отладка("Установлено значение позиционного параметра <" + ОписаниеПараметра.Имя + " = " + Токен + ">");
+				Лог.Отладка(СтрШаблон("Установлено значение позиционного параметра <%1=%2>", ОписаниеПараметра.Имя, Токен));
 				РезультатРазбора[ОписаниеПараметра.Имя] = Токен;
 			КонецЕсли;
 		КонецЕсли;
@@ -415,19 +466,19 @@
 Функция СледующийОбязательныйТокен(Знач ИскомыйПараметр)
 	Токен = СледующийТокен();
 	Если Токен = Неопределено Тогда
-		ВызватьИсключение "Ожидается значение параметра " + ИскомыйПараметр;
+		ВызватьИсключение СтрШаблон("Ожидается значение параметра %1", ИскомыйПараметр);
 	КонецЕсли;
 	Возврат Токен;
 КонецФункции
 
 Функция ЭтоИменованныйПараметр(Знач Токен, Знач ИменованныеПараметры)
-	Лог.Отладка("Ищу именованный параметр "+Токен);
+	Лог.Отладка(СтрШаблон("Ищу именованный параметр %1", Токен));
 	СтрПараметр = ИменованныеПараметры.Найти(Токен, "Имя");
 	Возврат СтрПараметр <> Неопределено и Не СтрПараметр.ЭтоФлаг;
 КонецФункции
 
 Функция ЭтоПараметрФлаг(Знач Токен, Знач ИменованныеПараметры)
-	Лог.Отладка("Ищу параметр-флаг "+Токен);
+	Лог.Отладка(СтрШаблон("Ищу параметр-флаг %1", Токен));
 	СтрПараметр = ИменованныеПараметры.Найти(Токен, "Имя");
 	Возврат СтрПараметр <> Неопределено и СтрПараметр.ЭтоФлаг;
 КонецФункции
@@ -462,30 +513,35 @@
 	Таблица.Колонки.Добавить("Пояснение");
 	Таблица.Колонки.Добавить("ЭтоГлобальныйПараметр");
 	Таблица.Колонки.Добавить("ЭтоКоллекция");
+	Таблица.Колонки.Добавить("Обязательный");
 	
 	Возврат Таблица;
 	
 КонецФункции
 
-Функция ДобавитьПараметрВТаблицу(Знач Таблица, Знач Имя, Знач Пояснение, Знач Флаг, Знач Глобальный = Ложь)
+Функция ДобавитьПараметрВТаблицу(Знач Таблица, Имя, Пояснение, Флаг, Глобальный, Обязательный)
+	
 	СтрПараметр = Таблица.Добавить();
-	СтрПараметр.Имя       = Строка(Имя);
-	СтрПараметр.ЭтоФлаг   = Флаг;
+	
+	СтрПараметр.Имя = Строка(Имя);
+	СтрПараметр.ЭтоФлаг = Флаг;
 	СтрПараметр.Пояснение = Пояснение;
 	СтрПараметр.ЭтоГлобальныйПараметр = Глобальный;
 	СтрПараметр.ЭтоКоллекция = Ложь;
-
-	Возврат СтрПараметр;
+	СтрПараметр.Обязательный = Обязательный;
 	
+	Возврат СтрПараметр;
 КонецФункции
 
 Функция ДобавитьПараметрКоллекцияВТаблицу(Знач Таблица, Знач Имя, Знач Пояснение)
-
-	СтрПараметр = ДобавитьПараметрВТаблицу(Таблица, Имя, Пояснение, Ложь);
+	
+	СтрПараметр = ДобавитьПараметрВТаблицу(Таблица, Имя, Пояснение, Ложь, Ложь, Ложь);
 	СтрПараметр.ЭтоКоллекция = Истина;
-
+	
 	Возврат СтрПараметр;
-
+	
 КонецФункции
 
+#КонецОбласти
+
 Инит();
diff --git a/tests/cmdline-test.os b/tests/cmdline-test.os
index 53f1614..4262a7a 100644
--- a/tests/cmdline-test.os
+++ b/tests/cmdline-test.os
@@ -39,6 +39,8 @@
 	СписокТестов.Добавить("ТестДолжен_ПрочитатьПараметрКоллекцияВКонце");
 	СписокТестов.Добавить("ТестДолжен_ПолучитьЗначениеПараметраЧерезРавно");
 	СписокТестов.Добавить("ТестДолжен_ПолучитьЗначениеПараметраЧерезРавноКомбинацияДругихПараметров");
+	СписокТестов.Добавить("ТестДолжен_УспешноПроверитьУстановкуУстановленногоОбязательногоПараметра");
+	СписокТестов.Добавить("ТестДолжен_ПодтвердитьНезаполненностьОбязательногоПараметра");
 	
 	Возврат СписокТестов;
 	
@@ -47,30 +49,29 @@
 Процедура ПередЗапускомТеста() Экспорт
 	
 	ПарсерКоманднойСтроки = Новый ПарсерАргументовКоманднойСтроки;
-
+	
 	Лог = Логирование.ПолучитьЛог("oscript.lib.cmdline");
 	Лог.УстановитьУровень(УровниЛога.Информация);
 	
 КонецПроцедуры
 
 Процедура ПослеЗапускаТеста() Экспорт
-	
 	ПарсерКоманднойСтроки = Неопределено;
 	юТест.УдалитьВременныеФайлы();
 	Лог = Неопределено;
 КонецПроцедуры
 
 Процедура ТестДолжен_ПолучитьПараметрИЗначение() Экспорт
-
+	
 	// строка запуска - oscript test.os Параметр Значение или oscript test.os "Параметр" "Значение"
 	ВходнойМассивПараметров = Новый Массив;
 	ВходнойМассивПараметров.Добавить("Параметр");
 	ВходнойМассивПараметров.Добавить("Значение");
 	
 	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр("Параметр");
-
+	
 	Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
-
+	
 	Утверждения.ПроверитьРавенство(1, Коллекция.Количество());
 	Утверждения.ПроверитьРавенство("Значение", Коллекция.Получить("Параметр"));
 	Утверждения.ПроверитьРавенство("Значение", Коллекция["Параметр"]);
@@ -78,31 +79,31 @@
 КонецПроцедуры
 
 Процедура ТестДолжен_ПроверитьМетод_ДобавитьПараметрФлаг() Экспорт
-
+	
 	// строка запуска - oscript test.os Параметр или oscript test.os "Параметр"
 	ВходнойМассивПараметров = Новый Массив;
 	ВходнойМассивПараметров.Добавить("Параметр");
 	
 	ПарсерКоманднойСтроки.ДобавитьПараметрФлаг("Параметр");
-
+	
 	Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
-
+	
 	Утверждения.ПроверитьРавенство(1, Коллекция.Количество());
 	Утверждения.ПроверитьРавенство(Истина, Коллекция.Получить("Параметр"), "Параметр");
 	
 КонецПроцедуры
 
 Процедура ТестДолжен_ПроверитьМетод_ДобавитьПараметрФлаг_КогдаПараметрФлагНеЗадан() Экспорт
-
+	
 	ВходнойМассивПараметров = Новый Массив;
 	ВходнойМассивПараметров.Добавить("ДругойПараметр");
 	ВходнойМассивПараметров.Добавить("Значение");
 	
 	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр("ДругойПараметр");
 	ПарсерКоманднойСтроки.ДобавитьПараметрФлаг("Параметр");
-
+	
 	Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
-
+	
 	Утверждения.ПроверитьРавенство(2, Коллекция.Количество(), "Коллекция.Количество()");
 	Утверждения.ПроверитьРавенство(Ложь, Коллекция.Получить("Параметр"), "Параметр");
 	
@@ -118,7 +119,7 @@
 	Аргументы = ПарсерКоманднойСтроки.Разобрать(ВходнойМассив);
 	
 	Флаг = Аргументы["flag"];
-
+	
 	Ожидаем.Что(Флаг, "Значение Флаг").Равно(Ложь);
 КонецПроцедуры
 
@@ -129,13 +130,13 @@
 	
 	ПарсерКоманднойСтроки.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "flag");
 	ПарсерКоманднойСтроки.ДобавитьКоманду(ОписаниеКоманды);
-
+	
 	ВходнойМассив = Новый Массив;
 	ВходнойМассив.Добавить("test");
 	Аргументы = ПарсерКоманднойСтроки.РазобратьКоманду(ВходнойМассив);
 	
 	Флаг = Аргументы.ЗначенияПараметров["flag"];
-
+	
 	Ожидаем.Что(Флаг, "Значение Флаг").Равно(Ложь);
 КонецПроцедуры
 
@@ -150,12 +151,11 @@
 	Для Каждого КлючЗначение Из НаборПараметров Цикл
 		ВходнойМассивПараметров.Добавить(КлючЗначение.Ключ);
 		ВходнойМассивПараметров.Добавить(КлючЗначение.Значение);
-
 		ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(КлючЗначение.Ключ);
 	КонецЦикла;
 	
 	Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
-
+	
 	Утверждения.ПроверитьРавенство(НаборПараметров.Количество(), Коллекция.Количество());
 	Для Каждого КлючЗначение Из НаборПараметров Цикл
 		Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция.Получить(КлючЗначение.Ключ));
@@ -187,7 +187,7 @@
 	Утверждения.ПроверитьНеравенство(Неопределено, Результат, "Команда должна быть разобрана правильно");
 	Утверждения.ПроверитьРавенство("test", Результат.Команда, "Команда");
 	Утверждения.ПроверитьРавенство("testpath-value", Результат.ЗначенияПараметров["testpath"], "Значение позиционного параметра");
-
+	
 	Утверждения.ПроверитьРавенство("1", Результат.ЗначенияПараметров["mode"], "Именованный ключ mode");
 	Утверждения.ПроверитьРавенство("2", Результат.ЗначенияПараметров["output"], "Именованный ключ output");
 	Утверждения.ПроверитьРавенство(Истина, Результат.ЗначенияПараметров["flag"], "Флаг flag");
@@ -204,7 +204,7 @@
 	
 	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "mode");
 	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "verbose");
-
+	
 	ПарсерКоманднойСтроки.ДобавитьКоманду(ОписаниеКоманды);
 	
 	ВходнойМассивПараметров = Новый Массив;
@@ -221,11 +221,11 @@
 	Утверждения.ПроверитьРавенство("add", Результат.Команда, "Команда");
 	Утверждения.ПроверитьРавенство("testpath-value", Результат.ЗначенияПараметров["testpath"], "Значение позиционного параметра команды");
 	Утверждения.ПроверитьРавенство("dest-value", Результат.ЗначенияПараметров["dest"], "Значение позиционного параметра команды");
-
+	
 	Утверждения.ПроверитьРавенство("on", Результат.ЗначенияПараметров["mode"], "Именованный ключ mode");
 	Утверждения.ПроверитьРавенство("2", Результат.ЗначенияПараметров["verbose"], "Именованный ключ verbose");
 	Утверждения.ПроверитьРавенство(4, Результат.ЗначенияПараметров.Количество());
-
+	
 КонецПроцедуры
 
 Процедура ТестДолжен_ПолучитьПараметрыКомандыИменованныйИлиПозиционныйПоВыбору() Экспорт
@@ -281,7 +281,7 @@
 	Утверждения.ПроверитьНеравенство(Неопределено, Результат, "Команда должна быть разобрана правильно");
 	Утверждения.ПроверитьРавенство("test", Результат.Команда, "Команда");
 	Утверждения.ПроверитьРавенство("testpath-value", Результат.ЗначенияПараметров["testpath"], "Значение позиционного параметра");
-
+	
 	Утверждения.ПроверитьРавенство("1", Результат.ЗначенияПараметров["mode"], "Именованный ключ mode");
 	Утверждения.ПроверитьРавенство("2", Результат.ЗначенияПараметров["output"], "Именованный ключ output");
 	Утверждения.ПроверитьРавенство(Истина, Результат.ЗначенияПараметров["flag"], "Флаг flag");
@@ -308,7 +308,7 @@
 	Утверждения.ПроверитьНеравенство(Неопределено, Результат, "Команда должна быть разобрана правильно");
 	Утверждения.ПроверитьРавенство("test", Результат.Команда, "Команда");
 	Утверждения.ПроверитьРавенство("path-value", Результат.ЗначенияПараметров["testpath"], "Значение позиционного параметра testpath");
-
+	
 	Утверждения.ПроверитьРавенство(Истина, Результат.ЗначенияПараметров["flag"], "Глобальный параметр-флаг flag");
 	Утверждения.ПроверитьРавенство(2, Результат.ЗначенияПараметров.Количество());
 	
@@ -318,7 +318,7 @@
 	
 	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр("Параметр", "Это первый тестовый параметр");
 	ПарсерКоманднойСтроки.ДобавитьПараметр("Параметр1", "Это второй тестовый параметр");
-
+	
 	СтрокиСправки = ПарсерКоманднойСтроки.СправкаПоПараметрам();
 	// позиционные параметры идут в справке сначала
 	Утверждения.ПроверитьРавенство("Это второй тестовый параметр", СтрокиСправки[0].Пояснение);
@@ -379,7 +379,7 @@
 	Утверждения.ПроверитьРавенство("пояснение" , Справка[1].Параметры[0].Пояснение);
 	Утверждения.ПроверитьРавенство("описание общего" , Справка[1].Параметры[1].Пояснение);
 	
-	// ПарсерКоманднойСтроки.ВывестиСправкуПоКоманде("ком1");
+	ПарсерКоманднойСтроки.ВывестиСправкуПоКоманде("ком1");
 КонецПроцедуры
 
 Процедура ТестДолжен_ОбработатьНеизвестныйТокен() Экспорт
@@ -462,7 +462,6 @@
 	Утверждения.ПроверитьРавенство("2", Значения["-item"][1]);
 	Утверждения.ПроверитьРавенство("3", Значения["-item"][2]);
 	
-	
 КонецПроцедуры
 
 Процедура ТестДолжен_ПрочитатьПараметрКоллекцияВКонце() Экспорт
@@ -487,57 +486,110 @@
 	Утверждения.ПроверитьРавенство("2", Значения["list"][1]);
 	Утверждения.ПроверитьРавенство("3", Значения["list"][2]);
 	
-	
 КонецПроцедуры
 
 Процедура ТестДолжен_ПолучитьЗначениеПараметраЧерезРавно() Экспорт
 	
-		НаборПараметров = Новый Соответствие;
-		НаборПараметров.Вставить("--Команда", "Значение11");
-		
-		ВходнойМассивПараметров = Новый Массив;
-		Для Каждого КлючЗначение Из НаборПараметров Цикл
-			ВходнойМассивПараметров.Добавить(КлючЗначение.Ключ+"="+КлючЗначение.Значение);
-			
-			ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(КлючЗначение.Ключ);
-		КонецЦикла;
-		
-		Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
+	НаборПараметров = Новый Соответствие;
+	НаборПараметров.Вставить("--Команда", "Значение11");
 	
-		Утверждения.ПроверитьРавенство(НаборПараметров.Количество(), Коллекция.Количество());
-		Для Каждого КлючЗначение Из НаборПараметров Цикл
-			Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция.Получить(КлючЗначение.Ключ));
-			Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция[КлючЗначение.Ключ]);
-		КонецЦикла;
+	ВходнойМассивПараметров = Новый Массив;
+	Для Каждого КлючЗначение Из НаборПараметров Цикл
+		ВходнойМассивПараметров.Добавить(КлючЗначение.Ключ+"="+КлючЗначение.Значение);
 		
+		ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(КлючЗначение.Ключ);
+	КонецЦикла;
+	
+	Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
+	
+	Утверждения.ПроверитьРавенство(НаборПараметров.Количество(), Коллекция.Количество());
+	Для Каждого КлючЗначение Из НаборПараметров Цикл
+		Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция.Получить(КлючЗначение.Ключ));
+		Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция[КлючЗначение.Ключ]);
+	КонецЦикла;
+	
 КонецПроцедуры
 
 Процедура ТестДолжен_ПолучитьЗначениеПараметраЧерезРавноКомбинацияДругихПараметров() Экспорт
 	
-		НаборПараметров = Новый Соответствие;
-		НаборПараметров.Вставить("--Команда", "Значение11");
-		НаборПараметров.Вставить("Команда1", "--Значение11=вввв");
-		НаборПараметров.Вставить("Команда2", "Значение11");
-		НаборПараметров.Вставить("--Команда3", "Значение11=Значение3");
-		НаборПараметров.Вставить("--Команда4", "");
-		
-		ВходнойМассивПараметров = Новый Массив;
-		Для Каждого КлючЗначение Из НаборПараметров Цикл
-			Если Лев(КлючЗначение.Ключ, 2) = "--" Тогда
-				ВходнойМассивПараметров.Добавить(КлючЗначение.Ключ+"="+КлючЗначение.Значение);
-			Иначе
-				ВходнойМассивПараметров.Добавить(КлючЗначение.Ключ);
-				ВходнойМассивПараметров.Добавить(КлючЗначение.Значение);
-			КонецЕсли;
-			ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(КлючЗначение.Ключ);
-		КонецЦикла;
-		
-		Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
+	НаборПараметров = Новый Соответствие;
+	НаборПараметров.Вставить("--Команда", "Значение11");
+	НаборПараметров.Вставить("Команда1", "--Значение11=вввв");
+	НаборПараметров.Вставить("Команда2", "Значение11");
+	НаборПараметров.Вставить("--Команда3", "Значение11=Значение3");
+	НаборПараметров.Вставить("--Команда4", "");
+	
+	ВходнойМассивПараметров = Новый Массив;
+	Для Каждого КлючЗначение Из НаборПараметров Цикл
+		Если Лев(КлючЗначение.Ключ, 2) = "--" Тогда
+			ВходнойМассивПараметров.Добавить(КлючЗначение.Ключ+"="+КлючЗначение.Значение);
+		Иначе
+			ВходнойМассивПараметров.Добавить(КлючЗначение.Ключ);
+			ВходнойМассивПараметров.Добавить(КлючЗначение.Значение);
+		КонецЕсли;
+		ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(КлючЗначение.Ключ);
+	КонецЦикла;
+	
+	Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
+
+	Утверждения.ПроверитьРавенство(НаборПараметров.Количество(), Коллекция.Количество());
+	Для Каждого КлючЗначение Из НаборПараметров Цикл
+		Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция.Получить(КлючЗначение.Ключ));
+		Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция[КлючЗначение.Ключ]);
+	КонецЦикла;
+	
+КонецПроцедуры
+
+Процедура ТестДолжен_УспешноПроверитьУстановкуУстановленногоОбязательногоПараметра() Экспорт
+	
+	ВходнойМассивПараметров = Новый Массив;
+	ВходнойМассивПараметров.Добавить("СтранныйКварк");
+	ВходнойМассивПараметров.Добавить("111");
+	ВходнойМассивПараметров.Добавить("ОчарованныйКварк");
+	ВходнойМассивПараметров.Добавить("222");
+	
+	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(
+		"СтранныйКварк",
+		НСтр("ru='Описание обязательного параметра'"),
+		,
+		Ложь);
+	
+	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(
+		"ОчарованныйКварк",
+		НСтр("ru='Описание обязательного параметра'"),
+		,
+		Истина);
+	
+	Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
+	
+	Утверждения.ПроверитьРавенство(Истина, ПарсерКоманднойСтроки.ОбязательныеПараметрыЗаполнены());
+	Утверждения.ПроверитьРавенство(Истина, ПарсерКоманднойСтроки.ОбязательныеПараметрыЗаполнены(Истина));
+	Утверждения.ПроверитьРавенство(Истина, ПарсерКоманднойСтроки.ОбязательныеПараметрыЗаполнены(Ложь));
 	
-		Утверждения.ПроверитьРавенство(НаборПараметров.Количество(), Коллекция.Количество());
-		Для Каждого КлючЗначение Из НаборПараметров Цикл
-			Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция.Получить(КлючЗначение.Ключ));
-			Утверждения.ПроверитьРавенство(КлючЗначение.Значение, Коллекция[КлючЗначение.Ключ]);
-		КонецЦикла;
-		
 КонецПроцедуры
+
+Процедура ТестДолжен_ПодтвердитьНезаполненностьОбязательногоПараметра() Экспорт
+
+	ВходнойМассивПараметров = Новый Массив;
+	ВходнойМассивПараметров.Добавить("ПрелестныйКварк");
+	ВходнойМассивПараметров.Добавить("111");
+	
+	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(
+		"ПрелестныйКварк",
+		НСтр("ru='Описание обязательного параметра'"),
+		,
+		Ложь);
+	
+	ПарсерКоманднойСтроки.ДобавитьИменованныйПараметр(
+		"ОчарованныйКварк",
+		НСтр("ru='Описание обязательного параметра'"),
+		,
+		Истина);
+	
+	Коллекция = ПарсерКоманднойСтроки.Разобрать(ВходнойМассивПараметров);
+	
+	Утверждения.ПроверитьРавенство(Ложь, ПарсерКоманднойСтроки.ОбязательныеПараметрыЗаполнены());
+	Утверждения.ПроверитьРавенство(Ложь, ПарсерКоманднойСтроки.ОбязательныеПараметрыЗаполнены(Истина));
+	Утверждения.ПроверитьРавенство(Ложь, ПарсерКоманднойСтроки.ОбязательныеПараметрыЗаполнены(Ложь));
+	
+КонецПроцедуры
\ No newline at end of file
From cb87cfcae7e6bf1c7f8df1c955055a321fdeb3b1 Mon Sep 17 00:00:00 2001
From: Anton Myagkov 
Date: Wed, 5 Dec 2018 12:04:31 +0300
Subject: [PATCH 2/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?=
 =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=81=D1=82=D1=80?=
 =?UTF-8?q?=D0=BE=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=20=D0=9B?=
 =?UTF-8?q?=D0=BE=D0=B3.=D0=9E=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B0=20?=
 =?UTF-8?q?=D0=A1=D1=82=D1=80=D0=A8=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 src/cmdline.os | 50 +++++++++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/src/cmdline.os b/src/cmdline.os
index e8fd4dd..f19839d 100644
--- a/src/cmdline.os
+++ b/src/cmdline.os
@@ -19,7 +19,7 @@
 
 Функция ДобавитьПараметр(Знач ИмяПараметра, Знач Пояснение = "") Экспорт
 	
-	Лог.Отладка(СтрШаблон("ДобавитьПараметр: ИмяПараметра <%1>", ИмяПараметра));
+	Лог.Отладка("ДобавитьПараметр: ИмяПараметра <%1>", ИмяПараметра);
 	
 	Возврат ДобавитьПараметрВТаблицу(мПозиционныеПараметры, ИмяПараметра, Пояснение, Ложь, Ложь, Ложь);
 	
@@ -27,7 +27,7 @@
 
 Функция ДобавитьИменованныйПараметр(Знач ИмяПараметра, Знач Пояснение = "", Знач Глобальный = Ложь, Обязательный = Ложь) Экспорт
 	
-	Лог.Отладка(СтрШаблон("ДобавитьИменованныйПараметр: ИмяПараметра <%1>", ИмяПараметра));
+	Лог.Отладка("ДобавитьИменованныйПараметр: ИмяПараметра <%1>", ИмяПараметра);
 	
 	Возврат ДобавитьПараметрВТаблицу(мПараметры, ИмяПараметра, Пояснение, Ложь, Глобальный, Обязательный);
 	
@@ -35,7 +35,7 @@
 
 Функция ДобавитьПараметрФлаг(Знач ИмяПараметра, Знач Пояснение = "", Знач Глобальный = Ложь) Экспорт
 	
-	Лог.Отладка(СтрШаблон("ДобавитьПараметрФлаг: ИмяПараметра <%1>", ИмяПараметра));
+	Лог.Отладка("ДобавитьПараметрФлаг: ИмяПараметра <%1>", ИмяПараметра);
 	
 	Возврат ДобавитьПараметрВТаблицу(мПараметры, ИмяПараметра, Пояснение, Истина, Глобальный, Ложь);
 	
@@ -43,7 +43,7 @@
 
 Функция ДобавитьПараметрКоллекция(Знач ИмяПараметра, Знач Пояснение = "") Экспорт
 	
-	Лог.Отладка(СтрШаблон("ДобавитьПараметрКоллекция: ИмяПараметра <%1>", ИмяПараметра));
+	Лог.Отладка("ДобавитьПараметрКоллекция: ИмяПараметра <%1>", ИмяПараметра);
 	
 	Возврат ДобавитьПараметрКоллекцияВТаблицу(мПозиционныеПараметры, ИмяПараметра, Пояснение);
 	
@@ -79,27 +79,27 @@
 КонецФункции
 
 Функция ДобавитьПозиционныйПараметрКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка(СтрШаблон("Добавляю позиционный параметр %1",ИмяПараметра));
+	Лог.Отладка("Добавляю позиционный параметр %1", ИмяПараметра);
 	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ПозиционныеПараметры, ИмяПараметра, Пояснение, Ложь, Ложь, Ложь);
 КонецФункции
 
 Функция ДобавитьИменованныйПараметрКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка(СтрШаблон("Добавляю именованный параметр %1",ИмяПараметра));
+	Лог.Отладка("Добавляю именованный параметр %1", ИмяПараметра);
 	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение, Ложь, Ложь, Ложь);
 КонецФункции
 
 Функция ДобавитьПараметрФлагКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка(СтрШаблон("Добавляю параметр-флаг %1", ИмяПараметра));
+	Лог.Отладка("Добавляю параметр-флаг %1", ИмяПараметра);
 	Возврат ДобавитьПараметрВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение, Истина, Ложь, Ложь);
 КонецФункции
 
 Функция ДобавитьПараметрКоллекцияКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка(СтрШаблон("Добавляю параметр-коллекция %1", ИмяПараметра));
+	Лог.Отладка("Добавляю параметр-коллекция %1", ИмяПараметра);
 	Возврат ДобавитьПараметрКоллекцияВТаблицу(ОписаниеКоманды.ПозиционныеПараметры, ИмяПараметра, Пояснение);
 КонецФункции
 
 Функция ДобавитьИменованныйПараметрКоллекцияКоманды(Знач ОписаниеКоманды, Знач ИмяПараметра, Знач Пояснение = "") Экспорт
-	Лог.Отладка(СтрШаблон("Добавляю параметр-коллекция %1",ИмяПараметра));
+	Лог.Отладка("Добавляю параметр-коллекция %1", ИмяПараметра);
 	Возврат ДобавитьПараметрКоллекцияВТаблицу(ОписаниеКоманды.ИменованныеПараметры, ИмяПараметра, Пояснение);
 КонецФункции
 
@@ -113,13 +113,13 @@
 	Если ОписаниеКоманды = Неопределено Тогда
 		ВызватьИсключение "Неизвестная команда: " + МассивПараметров[0];
 	КонецЕсли;
-	Лог.Отладка("Разбор команды: " + ОписаниеКоманды.Команда);
+	Лог.Отладка("Разбор команды: %1", ОписаниеКоманды.Команда);
 	
 	ГлобальныеПараметры = мПараметры.НайтиСтроки(Новый Структура("ЭтоГлобальныйПараметр", Истина));
 	Для Каждого СтрГлобальныйПараметр Из ГлобальныеПараметры Цикл
 		СтрСуществующий = ОписаниеКоманды.ИменованныеПараметры.Найти(СтрГлобальныйПараметр.Имя,"Имя");
 		Если СтрСуществующий = Неопределено Тогда
-			Лог.Отладка(СтрШаблон("Добавляю глобальный параметр: %1",СтрГлобальныйПараметр.Имя));
+			Лог.Отладка("Добавляю глобальный параметр: %1", СтрГлобальныйПараметр.Имя);
 			ЗаполнитьЗначенияСвойств(ОписаниеКоманды.ИменованныеПараметры.Добавить(), СтрГлобальныйПараметр,, "ЭтоГлобальныйПараметр");
 		КонецЕсли;
 	КонецЦикла;
@@ -144,7 +144,7 @@
 Функция Разобрать(Знач ВходнойМассивПараметров) Экспорт
 	
 	Если Лог.Уровень() = УровниЛога.Отладка Тогда
-		Лог.Отладка(СтрШаблон("ВходнойМассивПараметров <%1>", СтрокаПараметров(ВходнойМассивПараметров)));
+		Лог.Отладка("ВходнойМассивПараметров <%1>", СтрокаПараметров(ВходнойМассивПараметров));
 	КонецЕсли;
 	
 	ОписаниеКоманды = Неопределено;
@@ -293,7 +293,7 @@
 			Если ВыводитьОшибки И Лог.Уровень() > 0 Тогда
 				Сообщить(СтрШаблон("Не заполнен обязательный параметр %1", Строка.Имя));
 			Иначе
-				Лог.Отладка(СтрШаблон("Не заполнен обязательный параметр %1", Строка.Имя));
+				Лог.Отладка("Не заполнен обязательный параметр %1", Строка.Имя);
 			КонецЕсли;
 		КонецЕсли;
 		
@@ -351,7 +351,7 @@
 Процедура РазобратьИменованныйПараметр(Знач Токен, Значение, Знач ИменованныеПараметры, Знач РезультатРазбора)
 	Перем ЗначениеТокена;
 	
-	Лог.Отладка(СтрШаблон("Это именованный параметр: %1?",  Токен));
+	Лог.Отладка("Это именованный параметр: %1?",  Токен);
 	СтрПараметр = ИменованныеПараметры.Найти(Токен, "Имя");
 	//TODO: для параметров вида --param=value значение получаем сразу и передаем в процедуру,
 	// а в случаи пустого получаем следующий параметр.
@@ -367,7 +367,7 @@
 	Иначе
 		РезультатРазбора[Токен] = ЗначениеТокена;
 	КонецЕсли;
-	Лог.Отладка(СтрШаблон("Нашли значение именованного параметра: %1", РезультатРазбора[Токен]));
+	Лог.Отладка("Нашли значение именованного параметра: %1", РезультатРазбора[Токен]);
 	
 КонецПроцедуры
 
@@ -377,12 +377,12 @@
 	РезультатРазбора = Новый Соответствие;
 	
 	Для Каждого СтрПараметр Из ИменованныеПараметры.НайтиСтроки(Новый Структура("ЭтоФлаг",Истина)) Цикл
-		Лог.Отладка(СтрШаблон("Сбрасываю параметр-флаг: %1", СтрПараметр.Имя));
+		Лог.Отладка("Сбрасываю параметр-флаг: %1", СтрПараметр.Имя);
 		РезультатРазбора[СтрПараметр.Имя] = Ложь;
 	КонецЦикла;
 	
 	Для Каждого СтрПараметр Из ИменованныеПараметры.НайтиСтроки(Новый Структура("Обязательный",Истина)) Цикл
-		Лог.Отладка(СтрШаблон("Создаю обязательный параметры: %1", СтрПараметр.Имя));
+		Лог.Отладка("Создаю обязательный параметры: %1", СтрПараметр.Имя);
 		РезультатРазбора[СтрПараметр.Имя] = Неопределено;
 	КонецЦикла;
 	
@@ -395,7 +395,7 @@
 	Пока Истина Цикл
 		
 		Токен = СледующийТокен();
-		Лог.Отладка(СтрШаблон("Выбран токен: %1", Токен));
+		Лог.Отладка("Выбран токен: %1", Токен);
 		Если Токен = Неопределено Тогда
 			Лог.Отладка("Закончились токены");
 			
@@ -413,9 +413,9 @@
 		Если ЭтоИменованныйПараметр(Токен, ИменованныеПараметры) Тогда
 			РазобратьИменованныйПараметр(Токен, Неопределено, ИменованныеПараметры, РезультатРазбора);
 		ИначеЕсли ЭтоПараметрФлаг(Токен, ИменованныеПараметры) Тогда
-			Лог.Отладка(СтрШаблон("Это параметр-флаг: %1?",Токен));
+			Лог.Отладка("Это параметр-флаг: %1?",Токен);
 			РезультатРазбора[Токен] = Истина;
-			Лог.Отладка(СтрШаблон("Нашли параметр-флаг: %1", РезультатРазбора[Токен]));
+			Лог.Отладка("Нашли параметр-флаг: %1", РезультатРазбора[Токен]);
 		ИначеЕсли СтрНайти(Токен, "=") > 0 И Лев(Токен, 2) = "--" Тогда
 			Индекс = СтрНайти(Токен, "=");
 			КлючТокена = Лев(Токен, Индекс-1);
@@ -428,12 +428,12 @@
 		Иначе
 			ОписаниеПараметра = СледующийПозиционныйПараметр(ПозиционныеПараметры);
 			Если ОписаниеПараметра.ЭтоКоллекция Тогда
-				Лог.Отладка(СтрШаблон("Перехожу к чтению параметра-коллекции <%1>",ОписаниеПараметра.Имя));
+				Лог.Отладка("Перехожу к чтению параметра-коллекции <%1>",ОписаниеПараметра.Имя);
 				ТекущийПараметрКоллекция = Новый Массив;
 				РезультатРазбора[ОписаниеПараметра.Имя] = ТекущийПараметрКоллекция;
 				ТекущийПараметрКоллекция.Добавить(Токен);
 			Иначе
-				Лог.Отладка(СтрШаблон("Установлено значение позиционного параметра <%1=%2>", ОписаниеПараметра.Имя, Токен));
+				Лог.Отладка("Установлено значение позиционного параметра <%1=%2>", ОписаниеПараметра.Имя, Токен);
 				РезультатРазбора[ОписаниеПараметра.Имя] = Токен;
 			КонецЕсли;
 		КонецЕсли;
@@ -447,7 +447,7 @@
 Процедура ВывестиРезультатРазбора(РезультатРазбора)
 	Если Лог.Уровень() = УровниЛога.Отладка Тогда
 		Для Каждого КлючЗначение Из РезультатРазбора Цикл
-			Лог.Отладка("		"+КлючЗначение.Ключ+":"+КлючЗначение.Значение);
+			Лог.Отладка("		%1:%2", КлючЗначение.Ключ, КлючЗначение.Значение);
 		КонецЦикла;
 	КонецЕсли;
 КонецПроцедуры
@@ -472,13 +472,13 @@
 КонецФункции
 
 Функция ЭтоИменованныйПараметр(Знач Токен, Знач ИменованныеПараметры)
-	Лог.Отладка(СтрШаблон("Ищу именованный параметр %1", Токен));
+	Лог.Отладка("Ищу именованный параметр %1", Токен);
 	СтрПараметр = ИменованныеПараметры.Найти(Токен, "Имя");
 	Возврат СтрПараметр <> Неопределено и Не СтрПараметр.ЭтоФлаг;
 КонецФункции
 
 Функция ЭтоПараметрФлаг(Знач Токен, Знач ИменованныеПараметры)
-	Лог.Отладка(СтрШаблон("Ищу параметр-флаг %1", Токен));
+	Лог.Отладка("Ищу параметр-флаг %1", Токен);
 	СтрПараметр = ИменованныеПараметры.Найти(Токен, "Имя");
 	Возврат СтрПараметр <> Неопределено и СтрПараметр.ЭтоФлаг;
 КонецФункции
From 2ea045c739ab83ec9f5f88d1a073bbafe48800bc Mon Sep 17 00:00:00 2001
From: Anton Myagkov 
Date: Wed, 5 Dec 2018 16:44:42 +0300
Subject: [PATCH 3/3] 
 https://github.com/oscript-library/cmdline/pull/14#pullrequestreview-181749249
---
 src/cmdline.os | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/cmdline.os b/src/cmdline.os
index f19839d..4edbe5b 100644
--- a/src/cmdline.os
+++ b/src/cmdline.os
@@ -519,7 +519,7 @@
 	
 КонецФункции
 
-Функция ДобавитьПараметрВТаблицу(Знач Таблица, Имя, Пояснение, Флаг, Глобальный, Обязательный)
+Функция ДобавитьПараметрВТаблицу(Знач Таблица, Имя, Пояснение, Флаг, Глобальный = Ложь, Обязательный = Ложь)
 	
 	СтрПараметр = Таблица.Добавить();